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

18 KiB
Raw Blame History

🚀 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;
    }
}

Эффект: Меньше латентности при множественных запросах


11 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 раза быстрее


12 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

Эффект: Интерфейс грузится мгновенно после первого раза


13 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)

14 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 на создание соединений


15 Отключение 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

Эффект: Меньше записей в БД при каждом открытии файла


16 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
  • Меньше нагрузки на сервер
  • Быстрее для пользователей

17 Асинхронные операции через 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 не тормозит при открытии файлов


18 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% скорость для больших таблиц

19 Отдельный WOPI сервер для Collabora 📝

Что: Collabora на отдельном сервере/контейнере

Сейчас у вас:

  • Nextcloud + Collabora на одном сервере
  • Конкурируют за ресурсы

Оптимально:

# На другом сервере или с лимитами
collabora:
  cpus: '2.0'
  mem_limit: 2g
  mem_reservation: 1g

Эффект: Nextcloud и Collabora не мешают друг другу


20 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 раз быстрее


🎯 РЕКОМЕНДОВАННЫЙ ПЛАН

БЫСТРЫЕ ПОБЕДЫ (сделать сегодня):

  1. Добавить индексы в MySQL (5 минут)

    docker exec -u www-data nextcloud-fresh php occ db:add-missing-indices
    
  2. 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 &
    
  3. Отключить Activity для CRM папки (2 минуты)

    DELETE FROM oc_activity WHERE object_id IN (
        SELECT fileid FROM oc_filecache WHERE storage = 4
    );
    
  4. Chunked upload (1 минута)

    docker exec -u www-data nextcloud-fresh php occ config:app:set files max_chunk_size --value=10485760
    

Ожидаемое ускорение: +100-200%


СРЕДНЯЯ СЛОЖНОСТЬ (на неделе):

  1. InnoDB Buffer Pool 1GB - требует изменение docker-compose
  2. Partitioning oc_filecache - разделение таблицы
  3. HTTP/2 в Nginx - если ещё не включено
  4. Cron для фоновых задач - вместо webcron

Ожидаемое ускорение: +50-100%


ПРОДВИНУТОЕ (если нужно ещё быстрее):

  1. ProxySQL - пул соединений к MySQL
  2. Varnish Cache - HTTP кеш перед Nextcloud
  3. Отдельный сервер для Collabora - разделение нагрузки
  4. CDN (Cloudflare) - статика через CDN

Ожидаемое ускорение: +200-500%


ЭКСПЕРИМЕНТАЛЬНОЕ:

  1. Direct S3 access для просмотра - обход Nextcloud
  2. Nginx caching для WebDAV - кеш метаданных
  3. 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 ускорение БЕЗ риска!


Потом, если нужно ещё:

  1. Partitioning oc_filecache - разделить таблицу (сложнее, но эффективно)
  2. Direct S3 access - для просмотра файлов (очень быстро!)

🎯 ВОПРОСЫ ДЛЯ ОБСУЖДЕНИЯ:

  1. Хочешь начать с быстрых побед (индексы, preview, activity)?
  2. Готов менять docker-compose для InnoDB Buffer?
  3. Интересует Direct S3 access для просмотра файлов (обход Nextcloud)?
  4. Рассматриваешь Varnish/ProxySQL для серьёзного ускорения?

Что выберем? 😊