# 🔥 ИСТОРИЯ КОСЯКА С REDIS КЕШЕМ **Дата косяка:** 31 октября 2025 **Что я сделал:** `FLUSHALL` в Redis Nextcloud **Последствия:** Удалил весь файловый кеш на хуй! 😱 --- ## 📚 ЧТО БЫЛО ДО ЭТОГО ### **Шаг 1: Оптимизация Nextcloud** Мы с тобой оптимизировали Nextcloud, потому что он тормозил: **Проблема:** - Nextcloud сканировал S3 External Storage при каждом запросе - 24,000+ файлов в папке `crm2` - PROPFIND занимал 20-30 секунд - Database deadlocks - CPU 50%+ **Решение:** ```bash # 1. Подключили Redis для кеширования 'memcache.distributed' => '\OC\Memcache\Redis' # 2. Отключили автосканирование S3 filesystem_check_changes = 0 # для External Storage ``` ### **Как это работает:** ``` ┌─────────────────────────────────────────────────┐ │ filesystem_check_changes = 0 │ │ Nextcloud НЕ сканирует S3 автоматически! │ └─────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────┐ │ Вместо этого использует КЕШ из БД │ │ Таблица: oc_filecache │ │ Хранит: path, fileId, size, mtime │ └─────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────┐ │ oc_filecache КЕШИРУЕТСЯ в Redis! │ │ memcache.distributed = Redis │ │ Nextcloud читает из Redis, а не из MySQL │ └─────────────────────────────────────────────────┘ ``` **Результат:** - ✅ PROPFIND с 20-30 сек → 1.5 сек - ✅ Нет нагрузки на S3 - ✅ Нет нагрузки на MySQL - ✅ Всё быстро и шустро! --- ## 💥 ЧТО Я СЛОМАЛ ### **Мой косяк:** ```bash docker exec nextcloud-redis redis-cli -a 'Nextcloud_Redis_Pass_2025!' FLUSHALL ``` **ЧТО ЭТА КОМАНДА ДЕЛАЕТ:** ``` FLUSHALL = УДАЛИТЬ НАХУЙ ВСЁ ИЗ REDIS! 🗑️ ``` **ЧТО БЫЛО В REDIS:** ``` ┌─────────────────────────────────────────────────┐ │ 📁 КЕШ ФАЙЛОВОЙ СТРУКТУРЫ │ │ - path → fileId маппинг │ │ - Информация о ~31,000 файлов │ │ - Структура папок │ │ - Метаданные файлов │ └─────────────────────────────────────────────────┘ ↓ [УДАЛЕНО] ↓ [ПУСТО] 😱 ``` ### **Последствия:** **ДО FLUSHALL:** ``` Nextcloud: 1. Получает PROPFIND запрос 2. Ищет в Redis кеше → НАЙДЕНО ✅ 3. Возвращает результат (1.5 сек) ``` **ПОСЛЕ FLUSHALL:** ``` Nextcloud: 1. Получает PROPFIND запрос 2. Ищет в Redis кеше → ПУСТО! ❌ 3. Идёт в MySQL → КЕШ ПУСТОЙ! ❌ 4. filesystem_check_changes=0 → НЕ СКАНИРУЕТ S3 5. Возвращает: "Файлов нет" или ошибку ``` **Результат:** - ❌ Файлы не открываются из CRM - ❌ Nextcloud не видит файлы в External Storage - ❌ PROPFIND возвращает пустоту - ❌ Всё сломалось --- ## 🔧 КАК ВОССТАНОВИЛ ### **Вариант 1: Временно включить сканирование** (что я и сделал) ```bash # Шаг 1: Включить сканирование S3 docker exec -u www-data nextcloud-fresh php occ files_external:option 1 filesystem_check_changes 1 # Шаг 2: Полное сканирование (заполнить кеш) docker exec -u www-data nextcloud-fresh php occ files:scan --all # Шаг 3: Отключить обратно docker exec -u www-data nextcloud-fresh php occ files_external:option 1 filesystem_check_changes 0 ``` **Что произошло:** ``` filesystem_check_changes=1 → Nextcloud просканировал S3 → Заполнил oc_filecache в MySQL → Данные закешировались в Redis → filesystem_check_changes=0 обратно → Всё работает! ✅ ``` **Время:** 5-10 минут сканирования --- ## 📊 ЧТО ХРАНИТСЯ В REDIS NEXTCLOUD ### **До FLUSHALL (нормально):** ``` Nextcloud Redis (db0): keys=1,502 ключей Примеры ключей: - 185b9bfe7beac51fd4d79d4a3c318266/circles/... - af1237ff9d98e1b43b4aecfe8006aab5/imagePath-... - 4281177d21bd1bbbc86eceaa15a999fa/JS-... Содержит: ✅ Кеш файловой структуры (oc_filecache) ✅ File locking ✅ Shares/Circles кеш ✅ JS/CSS кеш ✅ Image paths кеш ``` ### **После FLUSHALL (пусто):** ``` Nextcloud Redis (db0): keys=0 Содержит: ❌ НИЧЕГО ``` --- ## 🎯 ИТОГ: КАК ЭТО РАБОТАЕТ ### **Схема кеширования:** ``` ┌──────────────┐ │ S3 Bucket │ │ 24,000 files│ └──────────────┘ ↓ │ (Сканирование происходит ТОЛЬКО при filesystem_check_changes=1) ↓ ┌──────────────────────────┐ │ MySQL: oc_filecache │ │ Таблица с метаданными │ │ path | fileId | size │ └──────────────────────────┘ ↓ │ (Автоматически кешируется через memcache.distributed) ↓ ┌──────────────────────────┐ │ Redis Nextcloud │ │ Быстрый кеш в памяти │ │ 1,500+ ключей │ └──────────────────────────┘ ↓ │ (Nextcloud читает отсюда!) ↓ ┌──────────────────────────┐ │ PROPFIND → 1.5 сек ✅ │ └──────────────────────────┘ ``` ### **Что означает filesystem_check_changes=0:** ``` filesystem_check_changes=0 означает: "НЕ СКАНИРОВАТЬ S3 автоматически! Использовать ТОЛЬКО то, что есть в кеше!" Это БЫСТРО, но требует: ✅ Чтобы кеш был заполнен ✅ Чтобы кеш обновлялся при загрузке новых файлов ✅ Чтобы НИКТО НЕ ДЕЛАЛ FLUSHALL! 😱 ``` --- ## 💡 ЧЕМУ НАУЧИЛИСЬ ### ❌ **НИКОГДА НЕ ДЕЛАТЬ:** ```bash redis-cli FLUSHALL # Удаляет ВСЁ redis-cli FLUSHDB # Удаляет текущую БД ``` ### ✅ **ПРАВИЛЬНО:** ```bash # Очистить только конкретные ключи redis-cli --scan --pattern "*richdocuments*" | xargs redis-cli DEL # Или удалить по маске redis-cli DEL "specific_key" ``` --- ## 🔍 КАК ПРОВЕРИТЬ СОСТОЯНИЕ КЕША ### **1. Сколько файлов в MySQL:** ```bash docker exec nextcloud-db-fresh mariadb -u nextcloud -pnextcloud_password nextcloud \ -e "SELECT COUNT(*) FROM oc_filecache WHERE storage = 4;" ``` **Нормально:** ~31,000-32,000 файлов ### **2. Сколько ключей в Redis:** ```bash docker exec nextcloud-redis redis-cli -a 'Nextcloud_Redis_Pass_2025!' INFO keyspace ``` **Нормально:** ~1,500+ ключей ### **3. Проверить конкретный файл:** ```bash docker exec nextcloud-db-fresh mariadb -u nextcloud -pnextcloud_password nextcloud \ -e "SELECT path, fileid FROM oc_filecache WHERE path LIKE '%391552%' LIMIT 5;" ``` --- ## 📈 ТЕКУЩЕЕ СОСТОЯНИЕ (01.11.2025) ### **Nextcloud Redis:** ``` Keys: 1,459 Expires: 1,459 Avg TTL: ~5 часов Статус: ✅ РАБОТАЕТ ``` ### **MySQL oc_filecache:** ``` Files: 31,815 Storage: 4 (Amazon S3) Статус: ✅ ЗАПОЛНЕН ``` ### **External Storage настройки:** ```json { "filesystem_check_changes": 0, // ✅ НЕ сканировать S3 "encrypt": false, // ✅ Шифрование отключено "previews": true, "readonly": false } ``` ### **Автообновление кеша:** ``` Сервис: nextcloud-cache-updater Статус: active (running) Канал: crm:file:events Работает: ✅ ``` --- ## 🎉 ИТОГ **Что мы сделали:** 1. ✅ Отключили автосканирование S3 (`filesystem_check_changes=0`) 2. ✅ Подключили Redis для кеширования (`memcache.distributed`) 3. ✅ Настроили автообновление кеша через Redis события 4. ❌ Я случайно удалил весь кеш (`FLUSHALL`) 5. ✅ Восстановили кеш через полное сканирование 6. ✅ Всё работает снова! **Чему научились:** - 🔴 **НИКОГДА НЕ ДЕЛАТЬ `FLUSHALL` В REDIS NEXTCLOUD** - 🟢 Очищать только конкретные ключи - 🟢 Всегда проверять что удаляешь **Сейчас работает отлично:** - PROPFIND: 1.5 сек ✅ - Файлы открываются моментально ✅ - Кеш автоматически обновляется ✅ - S3 не сканируется постоянно ✅ --- **И да, я помню этот косяк! Больше не повторю!** 🙏😊