# 🚀 NEXTCLOUD - ЛАЙФХАКИ УСКОРЕНИЯ ## 🎯 ЦЕЛЬ: Работать как Google Drive --- ## 💡 ПРЕДЛОЖЕНИЯ ДЛЯ ОБСУЖДЕНИЯ ### 1️⃣ **HTTP/2 Push и Preload** ⚡⚡⚡ **Что:** Предзагрузка ресурсов до того как браузер их запросит **Реализация в Nginx:** ```nginx location ~ \.php$ { # Предзагрузка JS/CSS add_header Link "; rel=preload; as=style"; add_header Link "; 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** для серьёзного ускорения? **Что выберем?** 😊