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

250 lines
7.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 🚀 ОПТИМИЗАЦИЯ 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)
```bash
docker exec -u www-data nextcloud-fresh php occ config:system:set memcache.distributed --value='\OC\Memcache\Redis'
```
**Результат:**
- ✅ Кеш между запросами
- ✅ Меньше обращений к БД
- ✅ Быстрее открытие файлов
### 2. Отключение автосканирования
```bash
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
```bash
# Увеличен 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
```sql
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 и добавить:
```yaml
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
```sql
-- Проверить существующие индексы
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 для больших файлов
```bash
docker exec -u www-data nextcloud-fresh php occ config:app:set files max_chunk_size --value=10485760 # 10MB
```
### 4. Включить Preview Generation в фоне
```bash
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"
```
---
## 📈 МОНИТОРИНГ
### Проверка производительности:
```bash
# 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:
```bash
docker logs nextcloud-fresh --tail 50 | grep -i "error\|warning\|deadlock"
```
---
## ✅ ТЕКУЩИЕ НАСТРОЙКИ
### Nextcloud Config:
```php
'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