Files
crm.clientright.ru/ИСТОРИЯ_КОСЯКА_С_REDIS.md
Fedor cd90b0d58a feat: Добавлен инструмент генерации документов для AI Ассистента
- Создан API create_document_with_text.php для создания DOCX/XLSX/PPTX с текстом от AI
- Поддержка Markdown форматирования (заголовки, жирный, курсив, списки, код)
- Установлен PHPWord для красивого форматирования документов
- Исправлены пути сохранения (crm2/CRM_Active_Files/... без /crm/ в начале)
- Замена пробелов на подчеркивания в именах папок
- Создана документация для AI и разработчиков
- Добавлены API для работы с шаблонами Nextcloud
2025-11-12 19:46:06 +03:00

11 KiB
Raw Permalink Blame History

🔥 ИСТОРИЯ КОСЯКА С REDIS КЕШЕМ

Дата косяка: 31 октября 2025
Что я сделал: FLUSHALL в Redis Nextcloud
Последствия: Удалил весь файловый кеш на хуй! 😱


📚 ЧТО БЫЛО ДО ЭТОГО

Шаг 1: Оптимизация Nextcloud

Мы с тобой оптимизировали Nextcloud, потому что он тормозил:

Проблема:

  • Nextcloud сканировал S3 External Storage при каждом запросе
  • 24,000+ файлов в папке crm2
  • PROPFIND занимал 20-30 секунд
  • Database deadlocks
  • CPU 50%+

Решение:

# 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
  • Всё быстро и шустро!

💥 ЧТО Я СЛОМАЛ

Мой косяк:

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: Временно включить сканирование (что я и сделал)

# Шаг 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! 😱

💡 ЧЕМУ НАУЧИЛИСЬ

НИКОГДА НЕ ДЕЛАТЬ:

redis-cli FLUSHALL  # Удаляет ВСЁ
redis-cli FLUSHDB   # Удаляет текущую БД

ПРАВИЛЬНО:

# Очистить только конкретные ключи
redis-cli --scan --pattern "*richdocuments*" | xargs redis-cli DEL

# Или удалить по маске
redis-cli DEL "specific_key"

🔍 КАК ПРОВЕРИТЬ СОСТОЯНИЕ КЕША

1. Сколько файлов в MySQL:

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:

docker exec nextcloud-redis redis-cli -a 'Nextcloud_Redis_Pass_2025!' INFO keyspace

Нормально: ~1,500+ ключей

3. Проверить конкретный файл:

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 настройки:

{
  "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 не сканируется постоянно

И да, я помню этот косяк! Больше не повторю! 🙏😊