✅ ЧТО СДЕЛАНО: - Поднят новый 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)
561 lines
18 KiB
Markdown
561 lines
18 KiB
Markdown
# 🚀 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** для серьёзного ускорения?
|
||
|
||
**Что выберем?** 😊
|
||
|