N8n: Чтение и запись файлов с диска
N8n — это инструмент для автоматизации рабочих процессов с открытым исходным кодом, который позволяет создавать сложные цепочки задач (workflows). Одной из ключевых возможностей платформы является взаимодействие с файловой системой сервера, на котором она развернута. Это позволяет автоматизировать обработку документов, логирование, генерацию отчетов, управление резервными копиями и множество других задач, связанных с файлами. В отличие от облачных сервисов, которые часто работают в изолированных средах, локальная или самопроверяемая установка n8n предоставляет прямой доступ к диску, что открывает широкие возможности для интеграции.
Принципы работы с файлами в n8n
N8n взаимодействует с файловой системой через два основных узла (nodes): Read/Write Files from Disk и Move/Copy Files. Эти узлы выполняют операции на том сервере, где запущен экземпляр n8n. Это критически важный момент: если n8n развернут в Docker-контейнере, то путь к файлам должен быть корректно смонтирован как volume, иначе файлы будут записываться внутри контейнера и могут быть потеряны после его перезагрузки. Аналогично, для облачных развертываний необходимо понимать структуру эфемерной файловой системы.
Безопасность является paramount. Предоставление n8n прав на чтение и запись файлов требует осторожности, так как workflow потенциально может получить доступ к критическим системным файлам. Рекомендуется использовать выделенные директории и строго контролировать пути, прописанные в узлах.
Узел «Read/Write Files from Disk»
Этот узел является основным инструментом для манипуляции содержимым файлов. Он поддерживает несколько режимов операции, которые кардинально меняют его поведение.
Режимы операции узла Read/Write Files from Disk
| Режим операции (Operation) | Назначение | Входные данные | Результат |
|---|---|---|---|
| Read | Чтение содержимого файла в workflow. | Путь к существующему файлу. | Бинарный буфер или текст, который можно передать следующим узлам (например, для отправки по почте, парсинга и т.д.). |
| Write | Создание нового файла или перезапись существующего. | Данные из предыдущего узла (строка, JSON, бинарные данные) и путь для сохранения. | Информация о записанном файле (путь, размер). Файл создается на диске. |
| Append | Добавление данных в конец существующего файла. Если файл не существует, он будет создан. | Данные для добавления и путь к файлу. | Информация об обновленном файле. Полезно для лог-файлов. |
Детальная настройка параметров
При настройке узла необходимо заполнить следующие ключевые поля:
- File Path (Путь к файлу): Абсолютный или относительный путь к файлу. Например,
/home/user/n8n_data/report.pdfили./data/input.json. Относительный путь отсчитывается от директории, из которой запущен процесс n8n. - Property Name (Имя свойства): Указывает, в какое свойство объекта item будут помещены данные файла при чтении или откуда они будут взяты при записи. По умолчанию используется
data. - File Encoding (Кодировка): Для текстовых файлов. Варианты: UTF-8, Windows-1251, ISO-8859-1 и др. Критически важно для корректного отображения не-ASCII символов.
- File Format (Формат файла): Определяет, как обрабатываются данные.
- Text: Работа со строковыми данными.
- Binary: Работа с любыми данными как с бинарным потоком (изображения, PDF, архивы).
- JSON: Автоматическое преобразование JSON-объекта в строку при записи и парсинг строки в JSON при чтении.
- Шаг 1: Узел Schedule Trigger запускает workflow каждый день в 09:00.
- Шаг 2: Узел Code или Function генерирует текстовый отчет (например, сводку по задачам из других систем).
- Шаг 3: Узел Write Binary File сохраняет отчет в файл
/reports/daily_report_{{$timestamp}}.txt. - Шаг 4: Узел Read Binary File считывает только что созданный файл.
- Шаг 5: Узел Email Send (например, для SMTP) использует считанные данные как вложение и отправляет письмо адресатам.
- Шаг 1: Узел Watch Files in Folder (встроенный в папку) отслеживает появление новых файлов с расширением .csv в директории
/incoming. - Шаг 2: Узел Read Files from Disk в режиме Read загружает содержимое нового файла. Формат устанавливается как Text.
- Шаг 3: Узел Convert from CSV парсит текстовые данные в структурированный JSON.
- Шаг 4: Производится обработка данных (валидация, обогащение) другими узлами.
- Шаг 5: Узел Move/Copy Files в режиме Move перемещает обработанный исходный CSV-файл в архивную папку
/archive. - Шаг 1: Узел Schedule Trigger запускает процесс раз в неделю.
- Шаг 2: Узел n8n API (использующий внутренний API n8n) получает JSON-определения всех активных workflow.
- Шаг 3: Узел Write Files from Disk в режиме Write и формате JSON сохраняет эти данные в файл с именем, содержащим дату:
/backups/workflows_backup_{{ $now.format('YYYY-MM-DD') }}.json. - Шаг 4: Узел Compress Files (если используется Community Node) архивирует файл, либо можно отправить его в облачное хранилище через соответствующий узел (S3, Google Drive).
Узел «Move/Copy Files»
Этот узел предназначен для управления файлами как объектами файловой системы, без изменения их содержимого.
| Режим операции (Operation) | Назначение | Исходный путь (Source) | Целевой путь (Destination) |
|---|---|---|---|
| Copy | Создание копии файла или всей директории. | Путь к существующему файлу/директории. | Путь, куда будет скопирован объект. Для директорий копируется все содержимое рекурсивно. |
| Move | Перемещение файла или директории. Эквивалентно команде «вырезать/вставить». | Путь к существующему файлу/директории. | Новый путь к объекту. После успешного перемещения исходный файл удаляется. |
| Delete | Удаление файла или директории. | Путь к удаляемому файлу/директории. | Не требуется. |
Ключевые настройки включают опцию Overwrite (перезапись) для режимов Copy и Move. Если она выключена, а файл в целевой директории уже существует, узел завершится с ошибкой.
Практические примеры workflow
Пример 1: Ежедневное создание и рассылка текстового отчета
Пример 2: Обработка входящих CSV-файлов
Пример 3: Резервное копирование данных workflow
Особенности работы в Docker-окружении
При запуске n8n через Docker Compose или аналогичные технологии, для работы с файлами необходимо смонтировать volumes (тома). Без этого файлы, созданные внутри контейнера, будут изолированы и потеряны при остановке контейнера.
Пример фрагмента docker-compose.yml для монтирования томов:
version: '3.8'
services:
n8n:
image: n8nio/n8n
volumes:
Для хранения загруженных файлов, логов и т.д.
- ./n8n_data:/home/node/.n8n
Критически важно: монтируем директорию для workflow-файлов
- ./my_workflow_files:/files
environment:
- N8N_USER_FOLDER=/home/node/.n8n
В этом случае в узле n8n нужно указывать пути внутри контейнера, например, /files/reports/my_report.txt, что будет соответствовать локальной папке ./my_workflow_files/reports/my_report.txt на хостовой машине.
Обработка ошибок и лучшие практики
- Валидация путей: Используйте выражения n8n для динамического формирования имен файлов, но проверяйте наличие запрещенных символов.
- Проверка существования файлов: Перед чтением можно использовать узел IF в связке с File Information Node (из community nodes) или обрабатывать ошибки от узла Read.
- Очистка старых файлов: Регулярно удаляйте или архивируйте старые файлы, чтобы избежать переполнения диска. Для этого можно создать workflow с узлом List Files in Folder и Delete.
- Безопасность: Никогда не используйте пути, введенные пользователем напрямую, без санации. Ограничьте корневую директорию для файловых операций, используя относительные пути и контроль доступа на уровне ОС для пользователя, под которым работает n8n.
- Логирование: Для отладки сложных workflow используйте узел Append для записи шагов выполнения в лог-файл.
Ответы на часто задаваемые вопросы (FAQ)
Может ли n8n читать файлы из сети или с FTP/SFTP?
Прямо через узел Read/Write Files from Disk — нет, он работает только с локальной файловой системой. Для работы с сетевыми ресурсами или протоколами передачи файлов необходимо использовать специализированные узлы: FTP и SFTP (доступны как встроенные или community nodes). Эти узлы позволяют загружать (download) файлы на локальный диск n8n, после чего с ними можно работать стандартными методами.
Как обрабатывать большие файлы, чтобы не исчерпать память?
N8n загружает весь файл в оперативную память при использовании стандартного узла Read/Write. Для обработки очень больших файлов (гигабайты) рекомендуется:
- Использовать потоковую обработку, если это поддерживается источником данных (например, читать CSV построчно через специализированный узел).
- Разбивать файлы на части внешними средствами до обработки в n8n.
- Рассмотреть возможность использования специализированных скриптов (через узел Execute Command) для обработки файлов потоковыми утилитами командной строки.
Почему узел выдает ошибку «ENOENT: no such file or directory»?
Это наиболее распространенная ошибка. Причины и решения:
- Неверный путь: Убедитесь, что используется абсолютный путь или корректный относительный путь от рабочей директории процесса n8n.
- Права доступа: Убедитесь, что пользователь, под которым работает процесс n8n, имеет права на чтение/запись в указанной директории и к самому файлу.
- Проблемы с Docker volumes: Проверьте, что volume смонтирован корректно, путь внутри контейнера указан верно, и на хостовой машине существует соответствующая директория с правильными правами.
- Отсутствующие директории: Узел Write не создает отсутствующих родительских директорий автоматически. Перед записью необходимо убедиться, что вся структура папок существует.
Можно ли использовать переменные и выражения в путях к файлам?
Да, это одна из самых мощных возможностей. В поле «File Path» можно использовать выражения n8n, заключенные в двойные фигурные скобки {{ }}. Например:
/data/orders_{{ $now.format('YYYY-MM') }}.json— создаст файл с именем, содержащим текущий год и месяц./uploads/{{ $json["clientId"] }}/contract.pdf— использует значение поляclientIdиз входящего элемента для создания пути.
Это позволяет динамически организовывать файлы по датам, категориям, ID и другим параметрам.
Чем отличается запись в формате Text, Binary и JSON?
- Text: Записывает строку как есть. Если на вход подан объект, он будет автоматически преобразован в строку (через
.toString()), что для объектов выведет[object Object]. - Binary: Ожидает на вход бинарные данные (обычно из поля
binary.dataпредыдущего узла). Подходит для сохранения изображений, PDF и других нетекстовых файлов без изменений. - JSON: Автоматически преобразует переданный JavaScript-объект/массив в отформатированную JSON-строку. При чтении в этом формате содержимое файла автоматически парсится обратно в объект.
Важно выбирать формат, соответствующий типу данных, чтобы избежать их повреждения.
Как организовать обработку файлов, загружаемых пользователями через веб-интерфейс?
Для этого используется комбинация узлов:
- Узел Webhook принимает POST-запрос с файлом (в multipart/form-data).
- Входящие файлы попадают в поле
binaryэлемента. - Узел Write Files from Disk в режиме Write и формате Binary сохраняет полученные бинарные данные в файл на диск, используя оригинальное имя файла или сгенерированное.
- Далее можно запустить workflow по обработке этого файла.
Добавить комментарий