- Создан API create_document_with_text.php для создания DOCX/XLSX/PPTX с текстом от AI - Поддержка Markdown форматирования (заголовки, жирный, курсив, списки, код) - Установлен PHPWord для красивого форматирования документов - Исправлены пути сохранения (crm2/CRM_Active_Files/... без /crm/ в начале) - Замена пробелов на подчеркивания в именах папок - Создана документация для AI и разработчиков - Добавлены API для работы с шаблонами Nextcloud
283 lines
9.8 KiB
Markdown
283 lines
9.8 KiB
Markdown
# ⚠️ ОПАСНЫЕ НАСТРОЙКИ NEXTCLOUD
|
||
|
||
## 📅 ДАТА ПРОВЕРКИ: 3 ноября 2025
|
||
|
||
---
|
||
|
||
## 🚨 ОБНАРУЖЕННЫЕ ОПАСНЫЕ АВТОМАТИЧЕСКИЕ ЗАДАЧИ:
|
||
|
||
### 1. 🗑️ **ExpireTrash** - Автоочистка корзины
|
||
```
|
||
Job ID: 6
|
||
Class: OCA\Files_Trashbin\BackgroundJob\ExpireTrash
|
||
Last Run: 2025-11-01T20:25:04+00:00
|
||
```
|
||
|
||
**ЧТО ДЕЛАЕТ:**
|
||
- Автоматически удаляет файлы из корзины через определённый период
|
||
- По умолчанию: **30 дней**
|
||
|
||
**ОПАСНОСТЬ:**
|
||
- ⚠️ Файлы из корзины **безвозвратно удаляются**
|
||
- ⚠️ **БЕЗ предупреждения** администратора
|
||
- ⚠️ Может удалить важные данные
|
||
|
||
**ТЕКУЩИЙ СТАТУС:**
|
||
- ✅ Включено (enabled)
|
||
- ⏰ Последний запуск: 1 ноября
|
||
- 📅 Следующий: ~1 декабря 2025
|
||
|
||
**РИСК:**
|
||
```
|
||
🔴 КРИТИЧЕСКИЙ
|
||
Удалённые 30 октября файлы будут безвозвратно удалены ~30 ноября!
|
||
```
|
||
|
||
---
|
||
|
||
### 2. 🧹 **DeleteOrphanedItems** - Удаление "сиротских" файлов
|
||
```
|
||
Job ID: 31
|
||
Class: OCA\Files\BackgroundJob\DeleteOrphanedItems
|
||
Last Run: 2025-11-03T06:48:13+00:00
|
||
```
|
||
|
||
**ЧТО ДЕЛАЕТ:**
|
||
- Удаляет файлы, которые **не связаны** с записями в БД Nextcloud
|
||
- Ищет "потерянные" файлы в файловой системе
|
||
|
||
**ОПАСНОСТЬ:**
|
||
- ⚠️ Может удалить файлы, которые **не проиндексированы**
|
||
- ⚠️ При проблемах с External Storage может удалить **ВСЁ**
|
||
- ⚠️ **ВЕРОЯТНАЯ ПРИЧИНА** нашего факапа!
|
||
|
||
**ТЕКУЩИЙ СТАТУС:**
|
||
- ✅ Включено (enabled)
|
||
- ⏰ Запускается **ЕЖЕДНЕВНО**
|
||
- 📅 Последний запуск: **сегодня утром**
|
||
|
||
**РИСК:**
|
||
```
|
||
🔴 КРИТИЧЕСКИЙ
|
||
Это скорее всего и удалило наши 1,003 проекта!
|
||
```
|
||
|
||
**ЛОГИКА:**
|
||
1. 22 октября - миграция на S3
|
||
2. Файлы на S3, но **не проиндексированы** в Nextcloud
|
||
3. 30 октября - `DeleteOrphanedItems` запустился
|
||
4. Увидел 1,003 папки без записей в БД
|
||
5. Решил: "это мусор" → удалил в корзину
|
||
|
||
---
|
||
|
||
### 3. 📦 **ExpireVersions** - Удаление старых версий
|
||
```
|
||
Job ID: 25
|
||
Class: OCA\Files_Versions\BackgroundJob\ExpireVersions
|
||
Last Run: 2025-11-02T15:48:50+00:00
|
||
```
|
||
|
||
**ЧТО ДЕЛАЕТ:**
|
||
- Удаляет старые версии файлов
|
||
|
||
**ОПАСНОСТЬ:**
|
||
- ⚠️ Может удалить все версии файла
|
||
- ⚠️ Без возможности восстановления
|
||
|
||
**ТЕКУЩИЙ СТАТУС:**
|
||
- ✅ Включено
|
||
- ⏰ Запускается регулярно
|
||
|
||
**РИСК:**
|
||
```
|
||
🟡 СРЕДНИЙ
|
||
Влияет только на версии, не на основные файлы
|
||
```
|
||
|
||
---
|
||
|
||
### 4. 🔄 **ExpireShares** - Удаление истёкших расшариваний
|
||
```
|
||
Job ID: 3
|
||
Class: OCA\Files_Sharing\ExpireSharesJob
|
||
Last Run: 2025-10-31T16:47:07+00:00
|
||
```
|
||
|
||
**ЧТО ДЕЛАЕТ:**
|
||
- Удаляет истёкшие публичные ссылки
|
||
|
||
**ОПАСНОСТЬ:**
|
||
- ⚠️ Низкая (удаляет только ссылки, не файлы)
|
||
|
||
**РИСК:**
|
||
```
|
||
🟢 НИЗКИЙ
|
||
```
|
||
|
||
---
|
||
|
||
## 🔧 НАСТРОЙКИ EXTERNAL STORAGE:
|
||
|
||
```json
|
||
{
|
||
"mount_point": "/crm",
|
||
"storage": "Amazon S3",
|
||
"configuration": {
|
||
"bucket": "f9825c87-4e3558f6-f9b6-405c-ad3d-d1535c49b61c",
|
||
"hostname": "s3.twcstorage.ru",
|
||
"filesystem_check_changes": "1" ← ОПАСНО!
|
||
},
|
||
"options": {
|
||
"readonly": false, ← Nextcloud может удалять файлы!
|
||
"filesystem_check_changes": 0
|
||
}
|
||
}
|
||
```
|
||
|
||
**ОПАСНОСТЬ:**
|
||
- ⚠️ `filesystem_check_changes: 1` - Nextcloud **сверяет** файлы на S3
|
||
- ⚠️ `readonly: false` - Nextcloud может **удалять** файлы на S3
|
||
- ⚠️ Если файлы не проиндексированы → Nextcloud думает их нет → удаляет
|
||
|
||
---
|
||
|
||
## 🎯 ЧТО ВЫЗВАЛО ФАКАП (ВЕРОЯТНОСТЬ):
|
||
|
||
### 🔴 99% - DeleteOrphanedItems
|
||
**Сценарий:**
|
||
1. 22 октября - загрузили файлы на S3
|
||
2. НЕ проиндексировали в Nextcloud (`occ files:scan`)
|
||
3. 30 октября - `DeleteOrphanedItems` запустился
|
||
4. Не нашёл записи в БД Nextcloud для файлов
|
||
5. Решил: "orphaned items" → удалил в корзину
|
||
|
||
### 🟡 10% - Ручное удаление через Web UI
|
||
- Маловероятно (1,003 папки одновременно)
|
||
|
||
### 🟢 1% - Другая причина
|
||
- Баг Nextcloud
|
||
- Проблема с External Storage
|
||
|
||
---
|
||
|
||
## 🛡️ РЕКОМЕНДАЦИИ ПО ЗАЩИТЕ:
|
||
|
||
### 🔴 КРИТИЧНО - СДЕЛАТЬ СЕЙЧАС:
|
||
|
||
#### 1. Отключить DeleteOrphanedItems (самое опасное!)
|
||
```bash
|
||
# НЕ ЗАПУСКАЙ! Только для информации:
|
||
docker exec -u www-data nextcloud-fresh php occ background-job:delete 31
|
||
```
|
||
|
||
**ЗАЧЕМ:** Это job удаляет "сиротские" файлы. При проблемах с индексацией может удалить ВСЁ!
|
||
|
||
---
|
||
|
||
#### 2. Настроить retention для корзины
|
||
```bash
|
||
# Увеличить период хранения корзины с 30 до 365 дней
|
||
docker exec -u www-data nextcloud-fresh php occ config:app:set files trashbin_retention_obligation --value="auto, 365"
|
||
```
|
||
|
||
**ЗАЧЕМ:** Даёт больше времени на восстановление при проблемах
|
||
|
||
---
|
||
|
||
#### 3. Включить readonly для External Storage
|
||
```bash
|
||
# Запретить Nextcloud удалять файлы на S3
|
||
docker exec -u www-data nextcloud-fresh php occ files_external:option 1 readonly true
|
||
```
|
||
|
||
**ЗАЧЕМ:** Nextcloud сможет только ЧИТАТЬ с S3, не удалять
|
||
|
||
---
|
||
|
||
### 🟡 ВАЖНО - СДЕЛАТЬ В БЛИЖАЙШЕЕ ВРЕМЯ:
|
||
|
||
#### 4. Настроить регулярный бэкап
|
||
```bash
|
||
# Добавить в crontab
|
||
0 2 * * * tar -czf /backup/nextcloud_$(date +\%Y\%m\%d).tar.gz /var/lib/docker/volumes/*nextcloud*
|
||
```
|
||
|
||
#### 5. Мониторинг корзины
|
||
```bash
|
||
# Проверять размер корзины раз в день
|
||
0 9 * * * du -sh /var/lib/docker/volumes/*/files_trashbin/ | mail -s "Nextcloud Trash" admin@domain.com
|
||
```
|
||
|
||
---
|
||
|
||
## 📊 ИТОГОВАЯ ТАБЛИЦА РИСКОВ:
|
||
|
||
| Job | Опасность | Действие | Рекомендация |
|
||
|-----|-----------|----------|--------------|
|
||
| **DeleteOrphanedItems** | 🔴 КРИТИЧЕСКАЯ | Удаляет неиндексированные файлы | **ОТКЛЮЧИТЬ** |
|
||
| **ExpireTrash** | 🔴 ВЫСОКАЯ | Очищает корзину через 30 дней | Увеличить до 365 дней |
|
||
| **ExpireVersions** | 🟡 СРЕДНЯЯ | Удаляет старые версии | Настроить retention |
|
||
| **External Storage RW** | 🟡 СРЕДНЯЯ | Может удалять на S3 | Включить readonly |
|
||
|
||
---
|
||
|
||
## 🔍 ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:
|
||
|
||
### Когда запускаются Jobs:
|
||
- **Каждый час:** DeleteOrphanedItems, CleanupFileLocks
|
||
- **Каждый день:** ExpireTrash, ExpireVersions
|
||
- **Зависит от настроек:** ExpireShares
|
||
|
||
### Как работает DeleteOrphanedItems:
|
||
1. Сканирует файловую систему Nextcloud
|
||
2. Проверяет есть ли запись в `oc_filecache`
|
||
3. Если **НЕТ** → помечает как "orphaned"
|
||
4. Перемещает в корзину
|
||
|
||
### Почему не сработала защита:
|
||
- External Storage не был проиндексирован
|
||
- `filesystem_check_changes: 1` не помог (проверка была, но индекса нет)
|
||
- Job решил что файлы = мусор
|
||
|
||
---
|
||
|
||
## ✅ ЧТО СЕЙЧАС ЗАЩИЩАЕТ:
|
||
|
||
1. **Redis индексатор** - каждую минуту обновляет индекс
|
||
2. **Файлы на S3** - восстановлены и проиндексированы
|
||
3. **Бэкап корзины** - на случай проблем
|
||
|
||
---
|
||
|
||
## ⚠️ ЧТО НУЖНО СДЕЛАТЬ (ТВОЙ ВЫБОР):
|
||
|
||
### Вариант 1: БЕЗОПАСНЫЙ (рекомендую)
|
||
```bash
|
||
# 1. Отключить DeleteOrphanedItems
|
||
docker exec -u www-data nextcloud-fresh php occ background-job:delete 31
|
||
|
||
# 2. Увеличить retention корзины до года
|
||
docker exec -u www-data nextcloud-fresh php occ config:app:set files trashbin_retention_obligation --value="auto, 365"
|
||
|
||
# 3. Включить readonly для S3
|
||
docker exec -u www-data nextcloud-fresh php occ files_external:option 1 readonly true
|
||
```
|
||
|
||
### Вариант 2: ПАРАНОИДАЛЬНЫЙ
|
||
```bash
|
||
# Отключить все cleanup jobs
|
||
docker exec -u www-data nextcloud-fresh php occ background-job:delete 31 # DeleteOrphanedItems
|
||
docker exec -u www-data nextcloud-fresh php occ background-job:delete 6 # ExpireTrash
|
||
docker exec -u www-data nextcloud-fresh php occ background-job:delete 25 # ExpireVersions
|
||
```
|
||
|
||
### Вариант 3: ОСТАВИТЬ КАК ЕСТЬ
|
||
- Риск: может повториться при проблемах с индексацией
|
||
- Защита: Redis индексатор работает автоматически
|
||
|
||
---
|
||
|
||
**Какой вариант выбираешь?** Я рекомендую **Вариант 1** (безопасный).
|
||
|