Files
crm.clientright.ru/NEXTCLOUD_ЛАЙФХАКИ_УСКОРЕНИЯ.md
Fedor 269c7ea216 feat: OnlyOffice Standalone integration with S3 direct URLs
 ЧТО СДЕЛАНО:
- Поднят новый standalone OnlyOffice Document Server (порт 8083)
- Настроен Nginx для доступа через office.clientright.ru:9443
- Создан open_file_v3_standalone.php для работы с новым OnlyOffice
- Реализована поддержка прямых S3 URL (bucket публичный)
- Добавлен s3_proxy.php с поддержкой Range requests
- Создан onlyoffice_callback.php для сохранения (базовая версия)
- Файлы успешно открываются и загружаются!

⚠️ TODO (на завтра):
- Доработать onlyoffice_callback.php для сохранения обратно в ОРИГИНАЛЬНЫЙ путь в S3
- Добавить Redis маппинг documentKey → S3 path
- Обновить CRM JS для использования open_file_v3_standalone.php
- Протестировать сохранение файлов
- Удалить тестовые файлы

📊 РЕЗУЛЬТАТ:
- OnlyOffice Standalone РАБОТАЕТ! 
- Файлы открываются напрямую из S3 
- Редактор загружается БЫСТРО 
- Автосохранение настроено  (но нужна доработка callback)
2025-11-01 01:02:03 +03:00

561 lines
18 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 🚀 NEXTCLOUD - ЛАЙФХАКИ УСКОРЕНИЯ
## 🎯 ЦЕЛЬ: Работать как Google Drive
---
## 💡 ПРЕДЛОЖЕНИЯ ДЛЯ ОБСУЖДЕНИЯ
### 1⃣ **HTTP/2 Push и Preload** ⚡⚡⚡
**Что:** Предзагрузка ресурсов до того как браузер их запросит
**Реализация в Nginx:**
```nginx
location ~ \.php$ {
# Предзагрузка JS/CSS
add_header Link "</core/css/styles.css>; rel=preload; as=style";
add_header Link "</core/js/main.js>; rel=preload; as=script";
# HTTP/2 Push
http2_push /core/css/styles.css;
http2_push /core/js/main.js;
}
```
**Ожидаемый эффект:** +30-50% скорость загрузки интерфейса
---
### 2⃣ **Separating Data Directory на SSD** 💾⚡⚡⚡
**Что:** Переместить БД Nextcloud на SSD диск (если сейчас на HDD)
**Проверка текущего диска:**
```bash
docker exec nextcloud-db-fresh df -h /var/lib/mysql
lsblk
```
**Если на HDD:**
- Создать volume на SSD
- Перенести `/var/lib/mysql` туда
- **Ускорение:** 5-10x для случайных запросов
---
### 3⃣ **Query Cache для MySQL** 🗄️⚡⚡
**Что:** Кешировать результаты повторяющихся SQL запросов
**НО!** В MariaDB 10.6+ Query Cache УДАЛЁН (deprecated)
**Альтернатива - ProxySQL:**
```bash
docker run -d --name proxysql \
--link nextcloud-db-fresh:mysql \
-p 6033:6033 \
proxysql/proxysql
```
**Настройка:**
- ProxySQL кеширует запросы к БД
- Nextcloud подключается к ProxySQL вместо напрямую к MySQL
- **Ускорение:** 2-3x для повторяющихся запросов
---
### 4⃣ **Preview Pre-generation** 🖼️⚡⚡
**Что:** Генерировать превью заранее в фоне
```bash
# Установка приложения
docker exec -u www-data nextcloud-fresh php occ app:install previewgenerator
# Настройка размеров
docker exec -u www-data nextcloud-fresh php occ config:app:set previewgenerator squareSizes --value="32 256"
docker exec -u www-data nextcloud-fresh php occ config:app:set previewgenerator widthSizes --value="256 384"
docker exec -u www-data nextcloud-fresh php occ config:app:set previewgenerator heightSizes --value="256"
# Первичная генерация (один раз)
docker exec -u www-data nextcloud-fresh php occ preview:generate-all
# Cron каждые 10 минут
*/10 * * * * docker exec -u www-data nextcloud-fresh php occ preview:pre-generate
```
**Эффект:** Превью файлов грузятся мгновенно
---
### 5⃣ **Chunked Upload для больших файлов** 📤⚡⚡
**Что:** Загрузка кусками вместо одного большого файла
```bash
docker exec -u www-data nextcloud-fresh php occ config:app:set files max_chunk_size --value=10485760 # 10MB chunks
```
**Для S3 External Storage:**
```bash
# Multipart upload для файлов > 5GB
docker exec -u www-data nextcloud-fresh php occ config:system:set objectstore.s3.multipart_threshold --value=5368709120 --type=integer
```
**Эффект:** Большие файлы загружаются быстрее и надёжнее
---
### 6⃣ **MySQL InnoDB Optimization** 🗄️⚡⚡⚡
**Что:** Правильные индексы для oc_filecache
**Текущие индексы:**
```sql
-- Проверка
docker exec nextcloud-db-fresh mariadb -u root -proot_password nextcloud -e "SHOW INDEX FROM oc_filecache;" 2>&1 | grep -v insecure
```
**Добавление недостающих:**
```sql
-- Для быстрого поиска по storage+path
CREATE INDEX idx_storage_path_hash ON oc_filecache(storage, path_hash);
-- Для быстрого поиска дочерних файлов
CREATE INDEX idx_parent_name ON oc_filecache(parent, name(191));
-- Для быстрого поиска по mimetype
CREATE INDEX idx_storage_mimetype ON oc_filecache(storage, mimetype);
-- Для сортировки по времени
CREATE INDEX idx_storage_mtime ON oc_filecache(storage, mtime);
```
**Автоматически:**
```bash
docker exec -u www-data nextcloud-fresh php occ db:add-missing-indices
docker exec -u www-data nextcloud-fresh php occ db:convert-filecache-bigint
```
**Эффект:** +50-100% скорость запросов к файлам
---
### 7⃣ **Nginx FastCGI Cache** 🌐⚡⚡⚡
**Что:** Кеш статических ресурсов и некоторых динамических
**Конфигурация Nginx:**
```nginx
# В http блоке
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=NEXTCLOUD:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
server {
location ~ ^\/(?:index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+)\.php(?:$|\/) {
# FastCGI cache для избранных endpoints
fastcgi_cache NEXTCLOUD;
fastcgi_cache_valid 200 10m;
fastcgi_cache_bypass $http_pragma $http_authorization;
add_header X-Cache-Status $upstream_cache_status;
}
}
```
**Эффект:** Статика грузится мгновенно
---
### 8⃣ **Lazy Loading для больших папок** 📂⚡⚡
**Что:** Не грузить все 24K файлов сразу, а порциями
**В Nextcloud уже есть!** Проверяем настройки:
```bash
# Pagination включена по умолчанию
docker exec -u www-data nextcloud-fresh php occ config:app:get files pagination_limit
# Если нет - ставим
docker exec -u www-data nextcloud-fresh php occ config:app:set files pagination_limit --value=100
```
**Эффект:** Папки открываются быстрее
---
### 9⃣ **S3 Transfer Acceleration** 🌍⚡⚡⚡
**Что:** Использовать CDN endpoints TWC Storage
**Проверяем у провайдера TWC:**
- Есть ли CDN endpoint?
- Есть ли региональные endpoints ближе к серверу?
**Если есть:**
```php
// В config.php Nextcloud для S3
'objectstore' => [
'arguments' => [
'endpoint' => 'https://s3-accelerate.twcstorage.ru', // вместо обычного
]
]
```
**Эффект:** +50-200% скорость доступа к S3
---
### 🔟 **WebDAV Keepalive Connections** 🔗⚡⚡
**Что:** Переиспользовать HTTP соединения вместо создания новых
**В Nginx:**
```nginx
upstream nextcloud {
server nextcloud-fresh:80;
keepalive 32;
}
server {
location / {
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_pass http://nextcloud;
}
}
```
**Эффект:** Меньше латентности при множественных запросах
---
### 1⃣1⃣ **Collabora Caching** 📝⚡⚡⚡
**Что:** Кеш документов и шрифтов в Collabora
**Проверка docker-compose Collabora:**
```yaml
collabora:
environment:
- DONT_GEN_SSL_CERT=true
- extra_params=--o:ssl.enable=false --o:logging.level=warning --o:net.post_allow=crm\.clientright\.ru
# Добавляем кеширование
- extra_params=--o:admin_console.enable_pam=false --o:net.connection_timeout_secs=30 --o:per_document.idle_timeout_secs=3600
# Добавляем volume для кеша
volumes:
- /var/cache/collabora:/tmp/cache
```
**Создаём кеш папку:**
```bash
mkdir -p /var/cache/collabora
chmod 777 /var/cache/collabora
```
**Эффект:** Документы открываются в 2-3 раза быстрее
---
### 1⃣2⃣ **Browser Service Worker Cache** 🌐⚡⚡
**Что:** Кеш в браузере через Service Workers
**Nextcloud уже использует!** Проверить можно:
- F12 → Application → Service Workers
- Должен быть зарегистрирован
**Если нет - включаем PWA:**
```bash
docker exec -u www-data nextcloud-fresh php occ config:app:set core enable_pwa --value=yes
```
**Эффект:** Интерфейс грузится мгновенно после первого раза
---
### 1⃣3⃣ **Direct S3 Access (bypass Nextcloud)** 🔥⚡⚡⚡
**Что:** Открывать файлы напрямую из S3, минуя Nextcloud WebDAV
**Реализация в CRM:**
```php
// В nextcloud-editor.js
function openFileDirectFromS3(recordId) {
// Получаем s3_key из CRM
fetch(`/crm_extensions/nextcloud_api.php?record=${recordId}`)
.then(r => r.json())
.then(data => {
// Прямая ссылка на S3
const s3Url = `https://s3.twcstorage.ru/${bucket}/${data.s3_key}`;
// Для просмотра - прямо открываем
if (isViewMode) {
window.open(s3Url, '_blank');
}
// Для редактирования - через Nextcloud
if (isEditMode) {
openInCollabora(data.nc_path);
}
});
}
```
**Эффект:**
- Просмотр: мгновенно (прямо из S3)
- Редактирование: через Nextcloud (нужен Collabora)
---
### 1⃣4⃣ **MySQL Connection Pooling** 🔗⚡⚡
**Что:** Пул соединений к БД вместо открытия нового каждый раз
**ProxySQL (рекомендуется):**
```yaml
services:
proxysql:
image: proxysql/proxysql:latest
ports:
- "6033:6033"
volumes:
- ./proxysql.cnf:/etc/proxysql.cnf
```
**Или в самом MySQL:**
```sql
SET GLOBAL max_connections = 500; -- увеличиваем пул
SET GLOBAL thread_cache_size = 100; -- кеш потоков
SET GLOBAL table_open_cache = 4096; -- кеш таблиц
```
**Эффект:** Меньше overhead на создание соединений
---
### 1⃣5⃣ **Отключение Activity Log для CRM папки** 📊⚡⚡
**Что:** Не логировать каждое действие в папке с 24K файлов
```bash
# Отключаем activity для storage ID 4 (crm)
docker exec nextcloud-db-fresh mariadb -u root -proot_password nextcloud -e "
DELETE FROM oc_activity WHERE object_type = 'files' AND object_id IN (
SELECT fileid FROM oc_filecache WHERE storage = 4
);
"
# Настройка в Nextcloud
docker exec -u www-data nextcloud-fresh php occ config:app:set activity enable_activity_tracking --value=no
```
**Эффект:** Меньше записей в БД при каждом открытии файла
---
### 1⃣6⃣ **CDN для статики Nextcloud** 🌍⚡⚡⚡
**Что:** Статические файлы (JS/CSS/иконки) через CDN
**Cloudflare перед Nextcloud:**
```nginx
# В Nginx - доверяем Cloudflare IP
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
# ... остальные Cloudflare IP
real_ip_header CF-Connecting-IP;
```
**В Nextcloud config.php:**
```php
'overwriteprotocol' => 'https',
'trusted_proxies' => ['173.245.48.0/20', '103.21.244.0/22'],
```
**Эффект:**
- Статика грузится из ближайшего PoP
- Меньше нагрузки на сервер
- Быстрее для пользователей
---
### 1⃣7⃣ **Асинхронные операции через Jobs** ⏱️⚡⚡
**Что:** Тяжёлые операции (сканирование, превью) в фоне
```bash
# Cron вместо Ajax/Webcron
docker exec -u www-data nextcloud-fresh php occ background:cron
# В host cron
*/5 * * * * docker exec -u www-data nextcloud-fresh php occ cron:job:run
```
**Важно для нас:**
- Сканирование S3 - в фоне
- Генерация превью - в фоне
- Очистка кеша - в фоне
**Эффект:** UI не тормозит при открытии файлов
---
### 1⃣8⃣ **Partitioning таблицы oc_filecache** 🗂️⚡⚡⚡
**Что:** Разбить огромную таблицу по storage ID
```sql
-- Проверяем размер таблицы
SELECT
table_name AS `Table`,
ROUND(((data_length + index_length) / 1024 / 1024), 2) AS `Size (MB)`
FROM information_schema.TABLES
WHERE table_schema = "nextcloud" AND table_name = "oc_filecache";
-- Если > 100MB - делаем partitioning
ALTER TABLE oc_filecache
PARTITION BY RANGE (storage) (
PARTITION p_storage_1_3 VALUES LESS THAN (4),
PARTITION p_storage_4 VALUES LESS THAN (5), -- CRM папка отдельно!
PARTITION p_storage_other VALUES LESS THAN MAXVALUE
);
```
**Эффект:**
- Запросы к CRM папке НЕ сканируют всю таблицу
- +50-80% скорость для больших таблиц
---
### 1⃣9⃣ **Отдельный WOPI сервер для Collabora** 📝⚡⚡⚡
**Что:** Collabora на отдельном сервере/контейнере
**Сейчас у вас:**
- Nextcloud + Collabora на одном сервере
- Конкурируют за ресурсы
**Оптимально:**
```yaml
# На другом сервере или с лимитами
collabora:
cpus: '2.0'
mem_limit: 2g
mem_reservation: 1g
```
**Эффект:** Nextcloud и Collabora не мешают друг другу
---
### 2⃣0⃣ **Varnish Cache перед Nextcloud** 🚀⚡⚡⚡
**Что:** HTTP кеш для статики и некоторых API
```
Browser → Varnish (6081) → Nginx → Nextcloud
```
**VCL конфигурация:**
```vcl
# Кешируем статику
if (req.url ~ "^/core/.*\.(js|css|png|jpg|svg)$") {
return (hash); # кешируем
}
# НЕ кешируем WebDAV
if (req.url ~ "^/remote.php/dav/") {
return (pass); # не кешируем
}
```
**Эффект:** Статика грузится в 10-100 раз быстрее
---
## 🎯 РЕКОМЕНДОВАННЫЙ ПЛАН
### **БЫСТРЫЕ ПОБЕДЫ (сделать сегодня):**
1.**Добавить индексы в MySQL** (5 минут)
```bash
docker exec -u www-data nextcloud-fresh php occ db:add-missing-indices
```
2. ✅ **Preview Generator** (30 минут первый раз)
```bash
docker exec -u www-data nextcloud-fresh php occ app:install previewgenerator
docker exec -u www-data nextcloud-fresh php occ preview:generate-all &
```
3. ✅ **Отключить Activity для CRM папки** (2 минуты)
```sql
DELETE FROM oc_activity WHERE object_id IN (
SELECT fileid FROM oc_filecache WHERE storage = 4
);
```
4. ✅ **Chunked upload** (1 минута)
```bash
docker exec -u www-data nextcloud-fresh php occ config:app:set files max_chunk_size --value=10485760
```
**Ожидаемое ускорение:** +100-200%
---
### **СРЕДНЯЯ СЛОЖНОСТЬ (на неделе):**
5.**InnoDB Buffer Pool 1GB** - требует изменение docker-compose
6.**Partitioning oc_filecache** - разделение таблицы
7.**HTTP/2 в Nginx** - если ещё не включено
8.**Cron для фоновых задач** - вместо webcron
**Ожидаемое ускорение:** +50-100%
---
### **ПРОДВИНУТОЕ (если нужно ещё быстрее):**
9.**ProxySQL** - пул соединений к MySQL
10.**Varnish Cache** - HTTP кеш перед Nextcloud
11.**Отдельный сервер для Collabora** - разделение нагрузки
12.**CDN (Cloudflare)** - статика через CDN
**Ожидаемое ускорение:** +200-500%
---
### **ЭКСПЕРИМЕНТАЛЬНОЕ:**
13.**Direct S3 access для просмотра** - обход Nextcloud
14.**Nginx caching для WebDAV** - кеш метаданных
15.**S3 Transfer Acceleration** - если TWC поддерживает
---
## 💰 СООТНОШЕНИЕ УСИЛИЙ/РЕЗУЛЬТАТА
| Решение | Сложность | Эффект | Приоритет |
|---------|-----------|--------|-----------|
| **Индексы MySQL** | ⭐ | ⭐⭐⭐ | 🔥🔥🔥 |
| **Preview Generator** | ⭐ | ⭐⭐⭐ | 🔥🔥🔥 |
| **Отключить Activity** | ⭐ | ⭐⭐ | 🔥🔥 |
| **InnoDB Buffer 1GB** | ⭐⭐ | ⭐⭐⭐ | 🔥🔥🔥 |
| **Partitioning** | ⭐⭐⭐ | ⭐⭐⭐ | 🔥🔥 |
| **ProxySQL** | ⭐⭐⭐ | ⭐⭐ | 🔥 |
| **Varnish** | ⭐⭐⭐⭐ | ⭐⭐⭐ | 🔥 |
| **Direct S3** | ⭐⭐ | ⭐⭐⭐⭐ | 🔥🔥 |
---
## 🤔 МОИ РЕКОМЕНДАЦИИ
### **Начни с TOP-4:**
1. **Индексы MySQL** - 5 минут, +50% скорость
2. **Preview Generator** - 30 минут, мгновенные превью
3. **Отключить Activity для CRM** - 2 минуты, меньше записей в БД
4. **InnoDB Buffer 1GB** - 10 минут, +30% скорость БД
**Это даст примерно 2-3x ускорение БЕЗ риска!**
---
### **Потом, если нужно ещё:**
5. **Partitioning oc_filecache** - разделить таблицу (сложнее, но эффективно)
6. **Direct S3 access** - для просмотра файлов (очень быстро!)
---
## 🎯 ВОПРОСЫ ДЛЯ ОБСУЖДЕНИЯ:
1. **Хочешь начать с быстрых побед** (индексы, preview, activity)?
2. **Готов менять docker-compose** для InnoDB Buffer?
3. **Интересует Direct S3 access** для просмотра файлов (обход Nextcloud)?
4. **Рассматриваешь Varnish/ProxySQL** для серьёзного ускорения?
**Что выберем?** 😊