✅ ЧТО СДЕЛАНО: - Поднят новый 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)
18 KiB
🚀 NEXTCLOUD - ЛАЙФХАКИ УСКОРЕНИЯ
🎯 ЦЕЛЬ: Работать как Google Drive
💡 ПРЕДЛОЖЕНИЯ ДЛЯ ОБСУЖДЕНИЯ
1️⃣ HTTP/2 Push и Preload ⚡⚡⚡
Что: Предзагрузка ресурсов до того как браузер их запросит
Реализация в 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)
Проверка текущего диска:
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:
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 🖼️⚡⚡
Что: Генерировать превью заранее в фоне
# Установка приложения
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 для больших файлов 📤⚡⚡
Что: Загрузка кусками вместо одного большого файла
docker exec -u www-data nextcloud-fresh php occ config:app:set files max_chunk_size --value=10485760 # 10MB chunks
Для S3 External Storage:
# 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
Текущие индексы:
-- Проверка
docker exec nextcloud-db-fresh mariadb -u root -proot_password nextcloud -e "SHOW INDEX FROM oc_filecache;" 2>&1 | grep -v insecure
Добавление недостающих:
-- Для быстрого поиска по 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);
Автоматически:
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:
# В 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 уже есть! Проверяем настройки:
# 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 ближе к серверу?
Если есть:
// В config.php Nextcloud для S3
'objectstore' => [
'arguments' => [
'endpoint' => 'https://s3-accelerate.twcstorage.ru', // вместо обычного
]
]
Эффект: +50-200% скорость доступа к S3
🔟 WebDAV Keepalive Connections 🔗⚡⚡
Что: Переиспользовать HTTP соединения вместо создания новых
В 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:
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
Создаём кеш папку:
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:
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:
// В 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 (рекомендуется):
services:
proxysql:
image: proxysql/proxysql:latest
ports:
- "6033:6033"
volumes:
- ./proxysql.cnf:/etc/proxysql.cnf
Или в самом MySQL:
SET GLOBAL max_connections = 500; -- увеличиваем пул
SET GLOBAL thread_cache_size = 100; -- кеш потоков
SET GLOBAL table_open_cache = 4096; -- кеш таблиц
Эффект: Меньше overhead на создание соединений
1️⃣5️⃣ Отключение Activity Log для CRM папки 📊⚡⚡
Что: Не логировать каждое действие в папке с 24K файлов
# Отключаем 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 - доверяем 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:
'overwriteprotocol' => 'https',
'trusted_proxies' => ['173.245.48.0/20', '103.21.244.0/22'],
Эффект:
- Статика грузится из ближайшего PoP
- Меньше нагрузки на сервер
- Быстрее для пользователей
1️⃣7️⃣ Асинхронные операции через Jobs ⏱️⚡⚡
Что: Тяжёлые операции (сканирование, превью) в фоне
# 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
-- Проверяем размер таблицы
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 на одном сервере
- Конкурируют за ресурсы
Оптимально:
# На другом сервере или с лимитами
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 конфигурация:
# Кешируем статику
if (req.url ~ "^/core/.*\.(js|css|png|jpg|svg)$") {
return (hash); # кешируем
}
# НЕ кешируем WebDAV
if (req.url ~ "^/remote.php/dav/") {
return (pass); # не кешируем
}
Эффект: Статика грузится в 10-100 раз быстрее
🎯 РЕКОМЕНДОВАННЫЙ ПЛАН
БЫСТРЫЕ ПОБЕДЫ (сделать сегодня):
-
✅ Добавить индексы в MySQL (5 минут)
docker exec -u www-data nextcloud-fresh php occ db:add-missing-indices -
✅ Preview Generator (30 минут первый раз)
docker exec -u www-data nextcloud-fresh php occ app:install previewgenerator docker exec -u www-data nextcloud-fresh php occ preview:generate-all & -
✅ Отключить Activity для CRM папки (2 минуты)
DELETE FROM oc_activity WHERE object_id IN ( SELECT fileid FROM oc_filecache WHERE storage = 4 ); -
✅ Chunked upload (1 минута)
docker exec -u www-data nextcloud-fresh php occ config:app:set files max_chunk_size --value=10485760
Ожидаемое ускорение: +100-200%
СРЕДНЯЯ СЛОЖНОСТЬ (на неделе):
- ⬜ InnoDB Buffer Pool 1GB - требует изменение docker-compose
- ⬜ Partitioning oc_filecache - разделение таблицы
- ⬜ HTTP/2 в Nginx - если ещё не включено
- ⬜ Cron для фоновых задач - вместо webcron
Ожидаемое ускорение: +50-100%
ПРОДВИНУТОЕ (если нужно ещё быстрее):
- ⬜ ProxySQL - пул соединений к MySQL
- ⬜ Varnish Cache - HTTP кеш перед Nextcloud
- ⬜ Отдельный сервер для Collabora - разделение нагрузки
- ⬜ CDN (Cloudflare) - статика через CDN
Ожидаемое ускорение: +200-500%
ЭКСПЕРИМЕНТАЛЬНОЕ:
- ⬜ Direct S3 access для просмотра - обход Nextcloud
- ⬜ Nginx caching для WebDAV - кеш метаданных
- ⬜ S3 Transfer Acceleration - если TWC поддерживает
💰 СООТНОШЕНИЕ УСИЛИЙ/РЕЗУЛЬТАТА
| Решение | Сложность | Эффект | Приоритет |
|---|---|---|---|
| Индексы MySQL | ⭐ | ⭐⭐⭐ | 🔥🔥🔥 |
| Preview Generator | ⭐ | ⭐⭐⭐ | 🔥🔥🔥 |
| Отключить Activity | ⭐ | ⭐⭐ | 🔥🔥 |
| InnoDB Buffer 1GB | ⭐⭐ | ⭐⭐⭐ | 🔥🔥🔥 |
| Partitioning | ⭐⭐⭐ | ⭐⭐⭐ | 🔥🔥 |
| ProxySQL | ⭐⭐⭐ | ⭐⭐ | 🔥 |
| Varnish | ⭐⭐⭐⭐ | ⭐⭐⭐ | 🔥 |
| Direct S3 | ⭐⭐ | ⭐⭐⭐⭐ | 🔥🔥 |
🤔 МОИ РЕКОМЕНДАЦИИ
Начни с TOP-4:
- Индексы MySQL - 5 минут, +50% скорость
- Preview Generator - 30 минут, мгновенные превью
- Отключить Activity для CRM - 2 минуты, меньше записей в БД
- InnoDB Buffer 1GB - 10 минут, +30% скорость БД
Это даст примерно 2-3x ускорение БЕЗ риска!
Потом, если нужно ещё:
- Partitioning oc_filecache - разделить таблицу (сложнее, но эффективно)
- Direct S3 access - для просмотра файлов (очень быстро!)
🎯 ВОПРОСЫ ДЛЯ ОБСУЖДЕНИЯ:
- Хочешь начать с быстрых побед (индексы, preview, activity)?
- Готов менять docker-compose для InnoDB Buffer?
- Интересует Direct S3 access для просмотра файлов (обход Nextcloud)?
- Рассматриваешь Varnish/ProxySQL для серьёзного ускорения?
Что выберем? 😊