187 lines
5.7 KiB
Markdown
187 lines
5.7 KiB
Markdown
|
|
# n8n S3 Migration JSON API
|
|||
|
|
|
|||
|
|
## Описание
|
|||
|
|
|
|||
|
|
Скрипт `n8n_s3_migration_json.php` предназначен для автоматической миграции файлов из локального хранилища в S3 с выводом результатов в формате JSON для удобного парсинга в n8n.
|
|||
|
|
|
|||
|
|
## Использование
|
|||
|
|
|
|||
|
|
### Прямой вызов PHP
|
|||
|
|
```bash
|
|||
|
|
php n8n_s3_migration_json.php [LIMIT] [DRY_RUN]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Через bash wrapper
|
|||
|
|
```bash
|
|||
|
|
./n8n_migration_json.sh
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Переменные окружения
|
|||
|
|
- `LIMIT` - количество файлов для обработки (по умолчанию: 20)
|
|||
|
|
- `DRY_RUN` - режим тестирования без изменений (0/1, по умолчанию: 0)
|
|||
|
|
|
|||
|
|
## Формат JSON ответа
|
|||
|
|
|
|||
|
|
### Успешное выполнение
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"status": "success",
|
|||
|
|
"timestamp": "2025-09-22 14:21:06",
|
|||
|
|
"summary": {
|
|||
|
|
"total_processed": 1,
|
|||
|
|
"successfully_migrated": 1,
|
|||
|
|
"failed": 0,
|
|||
|
|
"marked_problematic": 0,
|
|||
|
|
"dry_run": false
|
|||
|
|
},
|
|||
|
|
"migrated_files": [
|
|||
|
|
{
|
|||
|
|
"notesid": 393084,
|
|||
|
|
"filename": "Отказ_от_иска_по_делу__2-3265-2024_1_стр.pdf",
|
|||
|
|
"s3_url": "https://s3.twcstorage.ru/...",
|
|||
|
|
"s3_key": "crm2/CRM_Active_Files/Documents/393084/...",
|
|||
|
|
"local_file_deleted": true
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"problematic_files": [],
|
|||
|
|
"exit_code": 0
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Предупреждение (проблемные файлы)
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"status": "warning",
|
|||
|
|
"timestamp": "2025-09-22 14:21:06",
|
|||
|
|
"summary": {
|
|||
|
|
"total_processed": 2,
|
|||
|
|
"successfully_migrated": 1,
|
|||
|
|
"failed": 0,
|
|||
|
|
"marked_problematic": 1,
|
|||
|
|
"dry_run": false
|
|||
|
|
},
|
|||
|
|
"migrated_files": [...],
|
|||
|
|
"problematic_files": [
|
|||
|
|
{
|
|||
|
|
"notesid": 393085,
|
|||
|
|
"original_filename": "problematic_file.pdf",
|
|||
|
|
"problematic_filename": "[PROBLEM_2025-09-22_14-21-06] problematic_file.pdf",
|
|||
|
|
"reason": "Physical file not found"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"exit_code": 1
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Частичная ошибка
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"status": "partial_error",
|
|||
|
|
"timestamp": "2025-09-22 14:21:06",
|
|||
|
|
"summary": {
|
|||
|
|
"total_processed": 2,
|
|||
|
|
"successfully_migrated": 1,
|
|||
|
|
"failed": 1,
|
|||
|
|
"marked_problematic": 0,
|
|||
|
|
"dry_run": false
|
|||
|
|
},
|
|||
|
|
"migrated_files": [...],
|
|||
|
|
"problematic_files": [],
|
|||
|
|
"exit_code": 2
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Критическая ошибка
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"status": "error",
|
|||
|
|
"timestamp": "2025-09-22 14:21:06",
|
|||
|
|
"error": "Database connection failed: ...",
|
|||
|
|
"exit_code": 3
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Коды выхода
|
|||
|
|
|
|||
|
|
- `0` - Успех
|
|||
|
|
- `1` - Предупреждение (есть проблемные файлы)
|
|||
|
|
- `2` - Частичная ошибка (есть неудачные миграции)
|
|||
|
|
- `3` - Критическая ошибка (проблемы с БД или S3)
|
|||
|
|
|
|||
|
|
## Поля ответа
|
|||
|
|
|
|||
|
|
### summary
|
|||
|
|
- `total_processed` - общее количество обработанных файлов
|
|||
|
|
- `successfully_migrated` - успешно мигрированных
|
|||
|
|
- `failed` - неудачных миграций
|
|||
|
|
- `marked_problematic` - помеченных как проблемные
|
|||
|
|
- `dry_run` - режим тестирования
|
|||
|
|
|
|||
|
|
### migrated_files
|
|||
|
|
Массив успешно мигрированных файлов:
|
|||
|
|
- `notesid` - ID записи в БД
|
|||
|
|
- `filename` - имя файла
|
|||
|
|
- `s3_url` - URL в S3 (только для реальной миграции)
|
|||
|
|
- `s3_key` - ключ в S3 (только для реальной миграции)
|
|||
|
|
- `local_file_deleted` - удален ли локальный файл (только для реальной миграции)
|
|||
|
|
- `local_file_path` - путь к локальному файлу (только для dry_run)
|
|||
|
|
- `dry_run` - режим тестирования (только для dry_run)
|
|||
|
|
|
|||
|
|
### problematic_files
|
|||
|
|
Массив проблемных файлов:
|
|||
|
|
- `notesid` - ID записи в БД
|
|||
|
|
- `original_filename` - оригинальное имя файла
|
|||
|
|
- `problematic_filename` - новое имя с префиксом (только для реальной миграции)
|
|||
|
|
- `reason` - причина проблемы
|
|||
|
|
|
|||
|
|
## Интеграция с n8n
|
|||
|
|
|
|||
|
|
### SSH Node
|
|||
|
|
```bash
|
|||
|
|
ssh user@server "/var/www/fastuser/data/www/crm.clientright.ru/crm_extensions/file_storage/n8n_migration_json.sh"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Парсинг JSON
|
|||
|
|
```javascript
|
|||
|
|
// В n8n JavaScript Code
|
|||
|
|
const result = JSON.parse($input.all()[0].json.stdout);
|
|||
|
|
|
|||
|
|
if (result.status === 'success') {
|
|||
|
|
return {
|
|||
|
|
success: true,
|
|||
|
|
migrated: result.summary.successfully_migrated,
|
|||
|
|
problematic: result.summary.marked_problematic
|
|||
|
|
};
|
|||
|
|
} else if (result.status === 'warning') {
|
|||
|
|
return {
|
|||
|
|
warning: true,
|
|||
|
|
migrated: result.summary.successfully_migrated,
|
|||
|
|
problematic: result.problematic_files
|
|||
|
|
};
|
|||
|
|
} else {
|
|||
|
|
return {
|
|||
|
|
error: true,
|
|||
|
|
message: result.error || 'Unknown error'
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Мониторинг
|
|||
|
|
|
|||
|
|
### Логи
|
|||
|
|
- Основной лог: `/var/www/fastuser/data/www/crm.clientright.ru/logs/n8n_s3_migration.log`
|
|||
|
|
- JSON лог: `/var/www/fastuser/data/www/crm.clientright.ru/logs/n8n_migration_json.log`
|
|||
|
|
|
|||
|
|
### Cron задача
|
|||
|
|
```bash
|
|||
|
|
# Каждые 5 минут
|
|||
|
|
*/5 * * * * /var/www/fastuser/data/www/crm.clientright.ru/crm_extensions/file_storage/n8n_migration_json.sh
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Безопасность
|
|||
|
|
|
|||
|
|
- Скрипт работает только с файлами типа 'I' (Internal)
|
|||
|
|
- Исключает системные файлы (file_15_*, пустые имена)
|
|||
|
|
- Помечает проблемные файлы вместо удаления записей
|
|||
|
|
- Логирует все операции для аудита
|