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)
This commit is contained in:
Fedor
2025-11-01 01:02:03 +03:00
parent d7941ac862
commit 269c7ea216
4383 changed files with 282112 additions and 7731 deletions

View File

@@ -0,0 +1,560 @@
# 🚀 NEXTCLOUD - ЛАЙФХАКИ УСКОРЕНИЯ
## 🎯 ЦЕЛЬ: Работать как Google Drive
---
## 💡 ПРЕДЛОЖЕНИЯ ДЛЯ ОБСУЖДЕНИЯ
### 1⃣ **HTTP/2 Push и Preload** ⚡⚡⚡
**Что:** Предзагрузка ресурсов до того как браузер их запросит
**Реализация в Nginx:**
```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)
**Проверка текущего диска:**
```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** для серьёзного ускорения?
**Что выберем?** 😊