n8n: инсталация с Docker и първият ти workflow
От нулата до работеща автоматизация. Поставяме n8n на твоя компютър с Docker Compose и собствена база Postgres, разглеждаме интерфейса и правим първия си работен процес: взема курса евро/долар от публично API и го записва ред по ред във файл.
.env вместо latest, а образът е docker.n8n.io/n8nio/n8n. Compose файлът е преработен: махнат е остарелият ред version:; махната е основната автентикация (N8N_BASIC_AUTH_* не съществува в днешния n8n — при първо отваряне си правиш собственически акаунт); паролата на базата и ключът за криптиране не са в текста, а се генерират; Postgres е в същия проект (версия 18, с PGDATA), а не на друга машина, и няма публикуван порт; редакторът е достъпен само от 127.0.0.1. Махнати са N8N_HOST, WEBHOOK_URL, N8N_METRICS и настройките за изчистване на изпълнения (те не трябват за локален старт; изчистването е включено по подразбиране). Интерфейсът е описан по днешния вид: „Activate“ е заменено с Publish (n8n пише промените автоматично, няма нужда от Ctrl+S); бутонът е Execute Workflow, а на отделен нод — Execute step; панелът с нодове се отваря с N. Практическият пример е променен: вместо USD/BGN курсът е EUR/USD и EUR/GBP (България е в еврозоната от 01.01.2026), с актуален адрес на API-то (api.frankfurter.dev); добавен е нодът Convert to File, защото записът на файл иска двоични данни; файлът се пише в /home/node/.n8n-files, защото от n8n 2.0 файловите нодове по подразбиране имат достъп само до тази папка (споделената папка /data/shared е махната). Премахнати са справките за отделни сървъри в частна мрежа, обратният прокси и настройката на достъпа до Postgres отвън; уебхукът е тема на Обучение 2.
01Какво ще научиш
- Как да вдигнеш n8n с Docker Compose и Postgres и да пазиш тайните в
.env. - Как изглежда интерфейсът: платно, нодове, изпълнения (executions).
- Разликата между тригер (започва процеса) и действие (върши работа).
- Как да свържеш нодове и да предаваш данни между тях с израз (expression).
- Как да изпълняваш и тестваш стъпка по стъпка и как да закачиш (pin) данни.
- Какво е „Publish“ и кога ти трябва.
- Как да четеш историята на изпълненията, когато нещо се счупи.
02Преди да започнеш
- Docker с Compose v2 🔒 локално. Провери с
docker compose version. На Windows: Docker Desktop с WSL2 — виж Обучение 3 от серията DevStation. - Папката на проекта да е вътре във файловата система на Linux/WSL (например
~/n8n-lab), не под/mnt/c/…— през границата папките са бавни и дават грешки с права (така пише документацията на n8n). - Документацията на n8n за пълния стек иска около 4 GB RAM и 2 процесора; нашият стек е по-малък, но с толкова си на сигурно.
- Интернет за първото теглене на образите и за примерното API.
- Мениджър на пароли — ще пазиш в него ключа за криптиране.
03Стъпки
-
Какво ще построим
Два контейнера в един проект: n8n (редакторът и двигателят) и Postgres (там n8n пази работните процеси, достъпите и историята). После — работен процес от пет нода. Защо контейнери? Защото всяка програма идва с всичко нужно, не пречи на другите и се маха с една команда.
Нод Вид Какво прави Manual Trigger тригер Стартира процеса, когато натиснеш „Execute Workflow“ HTTP Request действие Взема курсовете от публично API Edit Fields данни Подрежда един ред за журнала Convert to File данни Превръща текста във файл (двоични данни) Read/Write Files from Disk действие Дописва реда към файл -
Папка и файл с тайните
Тайните (парола на базата, ключ за криптиране) не се пишат в compose файла. Държим ги в
.env— Compose го чете сам. Генерираме ги на място, за да няма две инсталации с една и съща „тайна“.bash · ~/n8n-lab/.envmkdir -p ~/n8n-lab && cd ~/n8n-lab cat > .env <<EOF N8N_VERSION=2.41.4 POSTGRES_USER=n8n POSTGRES_PASSWORD=$(openssl rand -hex 24) POSTGRES_DB=n8n N8N_ENCRYPTION_KEY=$(openssl rand -hex 32) TZ=Europe/Sofia EOF chmod 600 .env✅Запази ключа извън стекаN8N_ENCRYPTION_KEYшифрова всички достъпи, които ще запишеш в n8n. Ако го загубиш, след възстановяване от копие достъпите не могат да се разшифроват. Препиши го в мениджъра на пароли (cat .envго показва). Числото2.41.4е текущата стабилна версия към 01.10.2026 — виж „Обновяване“ по-долу. -
Файлът compose.yaml
Един файл описва целия стек. Правилата в него: версията е закачена (не
latest), данните са в именувани томове, редакторът е достъпен само от твоята машина (127.0.0.1), а n8n чака Postgres да е „здрав“, преди да стартира.yaml · ~/n8n-lab/compose.yamlname: n8n-lab services: postgres: image: postgres:18 restart: unless-stopped environment: POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} PGDATA: /var/lib/postgresql/data volumes: - db_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -h localhost -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] interval: 5s timeout: 5s retries: 10 n8n: image: docker.n8n.io/n8nio/n8n:${N8N_VERSION} restart: unless-stopped depends_on: postgres: condition: service_healthy environment: TZ: ${TZ} GENERIC_TIMEZONE: ${TZ} DB_TYPE: postgresdb DB_POSTGRESDB_HOST: postgres DB_POSTGRESDB_PORT: "5432" DB_POSTGRESDB_DATABASE: ${POSTGRES_DB} DB_POSTGRESDB_USER: ${POSTGRES_USER} DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD} N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY} N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: "true" ports: - "127.0.0.1:5678:5678" volumes: - n8n_data:/home/node/.n8n volumes: db_data: n8n_data:💡Защо точно такаPGDATA — Postgres 18 смени мястото на данните по подразбиране; без този ред базата се връща празна. 127.0.0.1 — портът не се вижда от другите в мрежата ти; Postgres изобщо няма публикуван порт, n8n го намира по иметоpostgres. TZ и GENERIC_TIMEZONE — по подразбиране n8n работи във времева зона America/New_York; без тях часовете в изразите и графиците ще са американски.Провери, че файлът е четим (Compose замества променливите и показва резултата — тайните също, затова не го пращай никому):
bashdocker compose config --quiet && echo "compose: OK" -
Стартирай и провери
bashcd ~/n8n-lab docker compose up -d docker compose psПървия път се теглят образите — нужни са минути и интернет. После
docker compose psтрябва да покажеpostgresкатоhealthy, аn8nкатоrunning. Проверка дали n8n отговаря:bashcurl -sf http://localhost:5678/healthz && echo " n8n е жив"Ако нещо не стои, виж логовете:
docker compose logs -f n8n(изход сCtrl+C). -
Първо влизане
Отвори
http://localhost:5678в браузъра. При първо отваряне n8n те кара да създадеш собственически акаунт (имейл, име, парола) — друга „основна автентикация“ няма. Акаунтът е локален, в твоята база.Създай нов работен процес: бутонът за създаване горе вляво в страничното меню → Workflow. Празното платно ти предлага Add first step…
-
Обиколка на интерфейса
Елемент Какво прави Workflows Списък на твоите работни процеси; публикуваните са отбелязани със знак Credentials Запазени достъпи (ключове, пароли, OAuth) — шифровани с ключа от .envExecutions История на изпълненията на процеса — успешни и грешки; може да се филтрира по статус Платно (canvas) Тук строиш процеса; двоен клик върху нод го отваря Add node / N Отваря панела за търсене и добавяне на нод Execute Workflow Изпълнява целия процес (Ctrl/Cmd+Enter), без да го публикуваш Execute step Изпълнява само избрания нод Pin / P Запазва изхода на нод за тестове — само за разработка Publish Пуска процеса „на живо“ — виж по-долу Settings (на нод) Always Output Data, Execute Once, Retry On Fail, On Error, бележки ✅Запазването е автоматичноn8n записва промените сам (за няколко секунди). Няма бутон „Save“, който да забравиш. „Publish“ е друго нещо: то пуска конкретна версия в производство — но само ако процесът има тригер, който се задейства сам (график, уебхук). Процес само с Manual Trigger се пуска от редактора и няма какво да публикуваш.За история: старият бутон „Activate“ вече е „Publish“, а нодът „Start“ е премахнат от n8n 2.0 — заменен с Manual Trigger.
-
Първи нод: Manual Trigger
Натисни Add first step… (или N) → търси Manual Trigger → добави. Този нод стартира процеса при натискане на Execute Workflow.
💡Тригер и действиеТригерът започва процеса, действието върши нещо. Ръчният тригер е идеален за тест; в производство го заменяш с график или уебхук (Обучение 7 и 2). -
HTTP Request: вземи курса
Натисни + след тригера → HTTP Request. Задай:
Поле Стойност Method GETURL https://api.frankfurter.dev/v1/latest?base=EUR&symbols=USD,GBPAuthentication None (публично API, без ключ) Натисни Execute step. В изхода трябва да видиш обект като този (датата и числата ще са различни):
json · изход на HTTP Request{"amount":1.0,"base":"EUR","date":"2026-09-30","rates":{"GBP":0.85463,"USD":1.1355}}След като имаш данните, натисни Pin (P) в изхода: n8n ще ползва запомнените данни при следващите тестове и няма да вика API-то всеки път. Това работи само за разработка и само ако изходът не е двоичен файл. Ако искаш свежи данни — Unpin.
⚠️Версията на API-тоИзползваме/v1/: отговорът има обектrates, удобен за първи урок. Авторите на API-то са го обявили за остаряло в полза на/v2/, но казват, чеv1остава достъпно за неопределено време;v2връща списък с друга форма. Ако някога смениш наv2, изразите по-долу трябва да се променят. -
Edit Fields: подреди ред за журнала
Добави нод Edit Fields (Set) след HTTP Request. Режим Manual Mapping → добави поле с име
logLine. Задръж курсора над стойността и избери Expression, после постави:израз · стойност на logLine{{ $now.toFormat('yyyy-MM-dd HH:mm') + ' | EUR/USD: ' + $json.rates.USD + ' | EUR/GBP: ' + $json.rates.GBP + '\n' }}Какво значи това. Каквото е в
{{ }}, е JavaScript.$nowе сегашният момент,.toFormat(…)го оформя като текст,$jsonса данните от предишния нод.'\n'в края е нов ред — без него следващият запис ще залепне към предишния. Натисни Execute step — полетоlogLineтрябва да покаже един ред текст. -
Convert to File и запис на файла
Нодът за запис работи с двоични данни (файл), а при нас има текст. Затова първо добави Convert to File → Operation: Convert to Text File → Text Input Field:
logLine. После добави Read/Write Files from Disk → Operation: Write File to Disk:Поле Стойност File Path and Name /home/node/.n8n-files/eur_rates_log.txtInput Binary Field полето с файла от предния нод — по подразбиране data(виж изхода на Convert to File и сложи същото име)Options → Append включено (дописва, не презаписва) ⚠️Защо точно тази папкаОт n8n 2.0 променливатаN8N_RESTRICT_FILE_ACCESS_TOе по подразбиране~/.n8n-files: файловите нодове могат да пишат само там. Пътят е вътре в контейнера, не на твоята машина. Файлът оцелява при рестарт на контейнера, но се губи приdocker compose down— за трайно място на файловете трябва отделен том (отделна тема). Преди първото изпълнение подготви папката:bashdocker compose exec n8n mkdir -p /home/node/.n8n-files⚠️ Не сме проверили дали n8n сам създава тази папка — командата е безобидна и гарантира, че я има.
-
Изпълни целия процес и провери
Натисни Execute Workflow (или Ctrl/Cmd+Enter). Всеки нод трябва да стане зелен. Провери файла от терминала:
bashdocker compose exec n8n cat /home/node/.n8n-files/eur_rates_log.txt # Трябва да видиш нещо като: # 2026-10-01 14:32 | EUR/USD: 1.1355 | EUR/GBP: 0.85463Изпълни още веднъж — във файла трябва да се появи втори ред. Това показва, че „Append“ работи.
-
Преименувай нодовете и дай име на процеса
Добра практика: избери нод и натисни F2 (или десен бутон → Rename) и му дай описателно име, за да разбираш процеса след месеци:
- Manual Trigger → „Ръчен старт“
- HTTP Request → „Вземи курс EUR“
- Edit Fields → „Подреди ред за журнала“
- Convert to File → „Текст във файл“
- Read/Write Files from Disk → „Запиши в журнала“
Дай име и на самия процес, например „Курс EUR — дневен журнал“ (n8n го записва автоматично).
-
Когато нещо се счупи: история на изпълненията
Нарочно счупи процеса: в HTTP Request смени
symbols=USD,GBPсsymbols=XXX(несъществуваща валута). API-то отговаря с грешка 404, а нодът се проваля, защото успех за него е само отговор от клас 2xx. Изпълни процеса — нодът става червен. После отвори Executions горе, избери последното изпълнение (филтър Status → Failed) и виж кой нод е паднал и защо. Върниsymbols=USD,GBP.По подразбиране n8n изчиства стари изпълнения след 336 часа (14 дни) или когато са над 10 000 — така базата не расте безкрайно.
-
Всекидневни команди, копие и обновяване
bash · от ~/n8n-labdocker compose up -d # стартирай всичко docker compose ps # състояние docker compose logs -f n8n # логове на n8n (Ctrl+C за изход) docker compose restart n8n # рестарт само на n8n docker compose down # спри; данните остават в томоветеКопие на данните. Две части: базата и ключът за криптиране (той е във
.env— копирай и този файл на сигурно място).bash · копиеmkdir -p backups docker compose exec -T postgres sh -c 'pg_dump -U "$POSTGRES_USER" "$POSTGRES_DB"' > backups/n8n-db-$(date +%Y%m%d).sql docker compose exec n8n n8n export:workflow --backup --output=/home/node/.n8n/backups/ docker compose cp n8n:/home/node/.n8n/backups ./backups/workflowsОбновяване. Сменяш числото
N8N_VERSIONв.envпо текущите издания на n8n, после:bashdocker compose pull docker compose up -d⚠️Преди всяко обновяване — копиеПрегледай бележките към изданията за несъвместими промени. Postgres не се надгражда със смяна на числото: скок между основни версии не отваря старите данни — първоpg_dumpи официалният наръчник на PostgreSQL. -
Чести грешки
❌n8n не стартира — връзка към PostgresHealthcheck-ът на Postgres още не е минал. Изчакай половин минута, вижdocker compose logs postgres | tail -20, послеdocker compose restart n8n. Ако си сменял потребителя или паролата във.envслед първото пускане, базата пази старите — върни стойностите (docker compose down -vтрие всички томове, само в тестова среда!).❌Записът на файл дава грешка за достъп или за липсваща папкаПътят трябва да е в/home/node/.n8n-files/(виж стъпката за запис) и папката да съществува. Пътят е в контейнера; n8n вижда само своята файлова система.❌В полето излиза [object Object]Опитваш се да покажеш цял обект като текст. Вземи конкретното поле:{{ $json.rates.USD }}, не{{ $json.rates }}. Ако искаш целия обект като текст —{{ JSON.stringify($json.rates) }}.❌localhost:5678 не се отваряПървоdocker compose ps— работи ли контейнерът? Послеcurl -sf http://localhost:5678/healthz. На Windows, ако работи в Ubuntu, но не в браузъра, в PowerShell пусниwsl --shutdownи стартирай Docker Desktop наново.🔐Не отваряй стека към интернет „така“Всичко е вързано към127.0.0.1нарочно. За достъп отвън ти трябват HTTPS, обратен прокси и отделна работа по сигурността.
04Проверка
Чеклист
docker compose versionпоказва v2.x..envсъществува с генерирани тайни, права 600, а ключът е преписан на сигурно място.docker compose config --quietне дава грешка;docker compose psпоказваpostgreshealthy иn8nrunning./healthzотговаря; собственическият акаунт е създаден.- HTTP Request връща обект с
rates; редът за журнала се подрежда с израз. - Във файла се добавя нов ред при всяко изпълнение.
- Разбираш защо нарочно счупеното изпълнение се вижда в Executions.
- Има копие на базата и на работните процеси.
Тест
1. Как се влиза в n8n 2.x за първи път?
2. Кой нод започва процес, който пускаш ръчно от редактора?
3. Защо записът на файл иска първо Convert to File?
4. Какво става, ако загубиш N8N_ENCRYPTION_KEY?
05Какво следва
06Източници
- n8n: инсталиране с Docker Compose — Compose v2, бележката за WSL, секцията за Postgres и
PGDATA; още: n8n-hosting: Compose с Postgres. - n8n 2.0: несъвместими промени — публикуване, достъп до файлове, премахнатият нод „Start“.
- Запазване и публикуване · Създаване и пускане на работни процеси · бързи клавиши · pin и тестови данни.
- Нодове: HTTP Request · Edit Fields (Set) · Convert to File · Read/Write Files from Disk.
- Променливи за средата: изпълнения · сигурност · часова зона; копия и възстановяване.
- n8n: справочник за изразите —
$now,$json. - n8n: издания в GitHub — текуща стабилна 2.41.4 към 01.10.2026.
- Frankfurter 🌐 глобален — публичното API за валутни курсове.