# 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_*, пустые имена) - Помечает проблемные файлы вместо удаления записей - Логирует все операции для аудита