Files
crm.clientright.ru/NEXTCLOUD_ОПТИМИЗАЦИЯ_31_10_2025.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

7.7 KiB
Raw Permalink Blame History

🚀 ОПТИМИЗАЦИЯ NEXTCLOUD - 31 ОКТЯБРЯ 2025

🔍 ПРОБЛЕМА

Симптомы:

  • ⏱️ Медленное открытие документов из CRM
  • 🔥 Nextcloud CPU: 50.43% (постоянно)
  • Database Deadlocks при работе с файлами
  • 📊 24,000+ файлов в папке crm2

Найденные проблемы:

1. Database Deadlocks

SQLSTATE[40001]: Serialization failure: 1213 
Deadlock found when trying to get lock; try restarting transaction
  • Nextcloud постоянно сканирует папку crm2 (24K файлов)
  • Обновления таблицы oc_filecache создают блокировки
  • 404 блокировки (Innodb_row_lock_waits)

2. Отсутствие Distributed Cache

  • Был только memcache.local (APCu)
  • Не было memcache.distributed (Redis)
  • Кеш не переживал перезапуски

3. Автоматическое сканирование

  • filesystem_check_changes = 1 (по умолчанию)
  • При каждом запросе Nextcloud сканировал все 24K файлов
  • Огромная нагрузка на БД

4. Маленький InnoDB Buffer Pool

  • Всего 128 MB (должно быть минимум 512MB)
  • Не хватает памяти для кеширования запросов

РЕШЕНИЕ

1. Distributed Cache (Redis)

docker exec -u www-data nextcloud-fresh php occ config:system:set memcache.distributed --value='\OC\Memcache\Redis'

Результат:

  • Кеш между запросами
  • Меньше обращений к БД
  • Быстрее открытие файлов

2. Отключение автосканирования

docker exec -u www-data nextcloud-fresh php occ config:system:set filesystem_check_changes --value=0 --type=integer

Результат:

  • Nextcloud НЕ сканирует 24K файлов при каждом запросе
  • Меньше Deadlocks
  • Меньше нагрузки на БД

Важно: Файлы будут обновляться через:

  • Redis события (crm:file:events)
  • Ручное сканирование при необходимости
  • WebDAV уведомления

3. Оптимизация PHP

# Увеличен memory_limit
echo 'memory_limit=1024M' >> /usr/local/etc/php/conf.d/nextcloud.ini

# Оптимизация OPcache
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=20000
opcache.memory_consumption=256
opcache.revalidate_freq=60

Результат:

  • Больше памяти для PHP скриптов
  • Больше файлов в OPcache
  • Меньше компиляций

4. Оптимизация MySQL

SET GLOBAL max_connections = 300;  -- было 151
SET GLOBAL innodb_lock_wait_timeout = 120;  -- было 50

Примечание: innodb_buffer_pool_size требует изменения в docker-compose и перезапуск.


📊 РЕЗУЛЬТАТ

До оптимизации:

CPU: 50.43%  ❌
Memory: 1005 MiB
Deadlocks: много
Скорость: медленно

После оптимизации:

CPU: 5.29%   ✅ (в 10 раз меньше!)
Memory: 645 MiB
Deadlocks: должны уменьшиться
Скорость: быстрее

🎯 ДОПОЛНИТЕЛЬНЫЕ РЕКОМЕНДАЦИИ

1. Увеличить InnoDB Buffer Pool (требует перезапуск)

Найти docker-compose файл Nextcloud и добавить:

services:
  db:
    environment:
      MYSQL_INNODB_BUFFER_POOL_SIZE: 1073741824  # 1GB
    command:
      - --innodb-buffer-pool-size=1073741824
      - --innodb-log-file-size=268435456  # 256MB
      - --innodb-flush-log-at-trx_commit=2
      - --innodb-flush-method=O_DIRECT

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

2. Добавить индексы в oc_filecache

-- Проверить существующие индексы
SHOW INDEX FROM oc_filecache;

-- Добавить если нужно
CREATE INDEX idx_storage_path ON oc_filecache(storage, path(255));
CREATE INDEX idx_parent_name ON oc_filecache(parent, name(255));

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

3. Настроить Chunked Upload для больших файлов

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

4. Включить Preview Generation в фоне

docker exec -u www-data nextcloud-fresh php occ config:app:set previewgenerator squareSizes --value="256 512"
docker exec -u www-data nextcloud-fresh php occ config:app:set previewgenerator widthSizes --value="256 512 1024"
docker exec -u www-data nextcloud-fresh php occ config:app:set previewgenerator heightSizes --value="256 512 1024"

📈 МОНИТОРИНГ

Проверка производительности:

# CPU/Memory Nextcloud
docker stats nextcloud-fresh --no-stream

# Deadlocks MySQL
docker exec nextcloud-db-fresh mariadb -u root -proot_password -e "SHOW GLOBAL STATUS LIKE 'Innodb_row_lock%';" 2>&1 | grep -v insecure

# Redis статистика
redis-cli -h 127.0.0.1 -p 6380 -a 'Nextcloud_Redis_Pass_2025!' INFO stats 2>&1 | grep -v Warning | head -10

Логи Nextcloud:

docker logs nextcloud-fresh --tail 50 | grep -i "error\|warning\|deadlock"

ТЕКУЩИЕ НАСТРОЙКИ

Nextcloud Config:

'memcache.local' => '\OC\Memcache\APCu',           // Локальный кеш
'memcache.distributed' => '\OC\Memcache\Redis',     // Распределённый кеш ✅ НОВОЕ
'memcache.locking' => '\OC\Memcache\Redis',         // Блокировки через Redis
'filesystem_check_changes' => 0,                    // Автоскан ОТКЛЮЧЕН ✅ НОВОЕ

PHP:

memory_limit = 1024M         (было 512M)
opcache.memory_consumption = 256
opcache.max_accelerated_files = 20000
opcache.interned_strings_buffer = 16

MySQL:

max_connections = 300        (было 151)
innodb_lock_wait_timeout = 120  (было 50)
innodb_buffer_pool_size = 128MB  (⚠️ НУЖНО 1GB)

🚀 СЛЕДУЮЩИЕ ШАГИ

Критично (сделать сегодня):

  1. Distributed cache - ГОТОВО
  2. Отключить автоскан - ГОТОВО
  3. PHP оптимизация - ГОТОВО
  4. Проверить результат - тестируем

Важно (сделать на неделе):

  1. Увеличить InnoDB buffer pool до 1GB
  2. Добавить индексы в oc_filecache
  3. Настроить chunked upload
  4. Preview generation в фоне

Можно (если будет время):

  1. APCu увеличить (apc.shm_size=128M)
  2. Отключить ненужные приложения Nextcloud
  3. Настроить логи на rotation
  4. Мониторинг производительности

🎯 ОЖИДАЕМЫЙ РЕЗУЛЬТАТ

После всех оптимизаций:

  • Открытие документов: в 3-5 раз быстрее
  • 📉 CPU Nextcloud: < 10% (было 50%)
  • Deadlocks: минимум (было много)
  • 💾 Меньше нагрузки на БД

Статус: Критичные оптимизации применены
CPU до: 50.43%
CPU после: 5.29%
Ускорение: ~10x 🚀

Дата: 31 октября 2025, 10:04
Автор: Фёдор + AI Assistant