Przejdź do głównej zawartości

n8n w produkcji - bezpiecznie i niezawodnie

Moduł 7 · Poziom: zaawansowanyCzas czytania: ~20 minProdukcja i bezpieczeństwo

Działający workflow na laptopie a instancja, której powierzasz prawdziwe dane klientów i biznesowe procesy 24/7 - to dwa różne światy. W tym module przechodzimy w tryb "produkcyjnie i bezpiecznie": zabezpieczenie dostępu, RODO, backupy które naprawdę da się odtworzyć, monitoring, skalowanie przez tryb kolejkowy oraz dyscyplinę środowisk dev/prod.

Instancja n8n trzyma credentials (klucze API, tokeny OAuth) i może wykonywać dowolny kod oraz żądania w Twoim imieniu. To czyni ją łakomym celem. Zabezpieczenie to nie jedno ustawienie, lecz kilka warstw - od logowania, przez sieć, po aktualizacje.

Nigdy nie wystawiaj n8n bez uwierzytelniania. Od pierwszego startu skonfiguruj właściciela instancji (owner) i odrębne konta dla każdej osoby - wspólne hasło to proszenie się o kłopoty. W planach Enterprise dostępne są RBAC (role, projekty, role własne), SSO (SAML, OIDC) oraz LDAP do centralnego zarządzania kontami zgodnie z zasadą najmniejszych uprawnień.

Włącz 2FA dla wszystkich kont, a przynajmniej dla właściciela i administratorów. Hasło, które wyciekło, samo w sobie nie wpuści wtedy atakującego do panelu pełnego credentials.

Im mniej powierzchni ataku, tym lepiej. W praktyce:

  • Nie otwieraj portu n8n (5678) na świat. Na zewnątrz wystaw tylko reverse proxy (80/443), a do n8n niech proxy łączy się lokalnie.
  • Firewall (ufw / iptables / Security Group) - domyślnie blokuj wszystko, otwórz wyłącznie 22 (SSH), 80 i 443.
  • Panel logowania ogranicz do swojego IP lub schowaj za VPN, jeśli n8n ma być dostępny tylko wewnętrznie. Webhooki mogą pozostać publiczne - to dwie różne ścieżki.
  • SSH na klucze, bez logowania hasłem i bez roota.

Produkcyjny n8n musi działać po HTTPS z prawdziwym certyfikatem - wymaga tego nie tylko bezpieczeństwo, ale i OAuth (Google, Microsoft, Slack odrzucają http:// i certyfikaty samopodpisane). Standardowy układ to reverse proxy (Nginx, Caddy lub Traefik) terminujący TLS przed n8n. Certyfikat zdobędziesz darmowo z Let's Encrypt (Caddy i Traefik potrafią go pozyskać i odnawiać automatycznie).

Ustaw też zmienne, by n8n wiedział, że stoi za proxy i pod jakim adresem:

N8N_HOST=n8n.twojadomena.pl
N8N_PROTOCOL=https
N8N_PORT=5678
WEBHOOK_URL=https://n8n.twojadomena.pl/
N8N_SECURE_COOKIE=true

N8N_SECURE_COOKIE (domyślnie włączone) pilnuje, by ciasteczko sesji było wysyłane tylko po HTTPS. Wyłączaj je wyłącznie w lokalnym dev - nie na produkcji.

Nieaktualny n8n to znane podatności. Regularnie aktualizuj obraz/wersję - ale najpierw zrób backup (patrz sekcję "Backupy 3-2-1 i testowane odtwarzanie" niżej) i sprawdź changelog, bo nowsze wersje czasem wprowadzają migracje schematu bazy lub zmiany łamiące kompatybilność.

Jeśli przez n8n przepływają dane osobowe (maile, telefony, dane klientów, CV), podlegasz RODO. Self-hosting daje przewagę: dane fizycznie zostają tam, gdzie chcesz - ale odpowiedzialność też przechodzi na Ciebie.

  • Gdzie fizycznie leżą dane? Hosting w UE/EOG to najprostsza ścieżka. Poza UE (USA, UK po Brexicie) potrzebujesz Standardowych Klauzul Umownych (SCC) i analizy ryzyka transferu.
  • Administrator czy procesor? Przy własnym hostingu zwykle jesteś administratorem danych, a dostawca infrastruktury jest tylko (pod)procesorem.
  • Czy masz DPA? Z dostawcą hostingu i z każdą usługą zewnętrzną, której powierzasz dane (np. dostawca LLM), podpisz umowę powierzenia (DPA).
  • Czy szyfrujesz credentials? n8n szyfruje zapisane poświadczenia kluczem N8N_ENCRYPTION_KEY - bez bezpiecznego przechowania tego klucza ochrona jest pozorna.

Pamiętaj o minimalizacji danych: nie loguj pełnych payloadów z danymi osobowymi "na wszelki wypadek" i kontroluj retencję wykonań (executions), by nie trzymać wrażliwych danych bez końca.

Self-hosting znaczy "backupy to Twoja sprawa". A backup ma jeden cel - żeby dało się z niego odtworzyć instancję. To brzmi oczywisto, dopóki nie nadejdzie dzień awarii.

  1. Klucz szyfrujący N8N_ENCRYPTION_KEY - raz, do menedżera haseł. Bez niego backup bazy jest bezużyteczny, bo nie odszyfrujesz credentials.
  2. Baza danych - plik SQLite albo pg_dump z PostgreSQL. Tu mieszkają workflow, credentials (zaszyfrowane), historia wykonań.
  3. Wolumen ~/.n8n (w kontenerze zwykle /home/node/.n8n) - config, dane binarne, ustawienia.
  4. Konfiguracja wdrożenia - docker-compose.yml, plik .env, konfiguracja reverse proxy i certyfikaty. To często "jest gdzieś", ale nie w backupie.

Trzy kopie danych, na dwóch różnych nośnikach, jedna poza lokalizacją (off-site). Off-site oznacza: backup nie może zginąć od tej samej awarii co produkcja - nie ta sama partycja, nie ten sam dysk VPS-a, najlepiej inny dostawca lub fizycznie inne miejsce.

Sam plik backup-2026-05-15.sql w katalogu nic nie gwarantuje. Realne odtwarzanie wykonuj cyklicznie na czystej maszynie: tylko wtedy wiesz, że backup się przywraca, że masz wszystkie elementy (klucz, .env, certyfikaty, custom nodes) i że potrafisz to zrobić, zanim padnie produkcja.

RTO (Recovery Time Objective) to maksymalny akceptowalny czas przywrócenia usługi po awarii. Zanim ustalisz strategię backupu, odpowiedz: jeśli serwer padnie o 9:00, do której godziny n8n musi znowu działać? Z tej odpowiedzi wynika, jak często robić kopie i jak szybko musisz umieć odtworzyć (czyli - czy odtwarzanie jest przećwiczone).

Produkcja bez monitoringu to jazda z zasłoniętymi oczami. Chodzi o dwie rzeczy: widzieć, co się dzieje (logi), i dostawać alarm, gdy coś przestaje działać (healthcheck).

Szczegółowość logów ustawiasz zmienną N8N_LOG_LEVEL. Dostępne wartości (od najcichszej do najgłośniejszej):

Wartość Co zobaczysz Kiedy używać
silent Nic. Raczej nigdy na produkcji.
error Tylko błędy. Minimalny szum.
warn Błędy + ostrzeżenia. Spokojna produkcja.
info Postęp + powyższe. Domyślne. Sensowny standard.
debug Najwięcej szczegółów. Diagnostyka problemu (czasowo).

Domyślnie n8n loguje do konsoli (N8N_LOG_OUTPUT=console) - w Dockerze odczytasz je przez docker logs. Możesz zapisywać też do pliku, ustawiając N8N_LOG_OUTPUT=file i lokalizację N8N_LOG_FILE_LOCATION. W planach Enterprise dostępny jest log streaming do zewnętrznych systemów (audyt zdarzeń).

N8N_LOG_LEVEL=info
N8N_LOG_OUTPUT=console
# zapis do pliku (opcjonalnie):
# N8N_LOG_OUTPUT=file
# N8N_LOG_FILE_LOCATION=/home/node/.n8n/logs/n8n.log

n8n udostępnia endpoint /healthz, którym sprawdzisz, czy proces żyje. Dwa uzupełniające się podejścia:

  • Uptime "z zewnątrz" - Uptime Kuma (self-hosted) lub usługa zewnętrzna co minutę pinguje /healthz i alarmuje, gdy instancja przestaje odpowiadać.
  • Monitoring zadań cyklicznych (dead man's switch) - healthchecks.io: skrypt backupu / kluczowy workflow pinguje URL po sukcesie. Brak pingu w oknie czasu = alarm. To wyłapuje ciche awarie, których zwykły uptime nie zauważy.

Domyślnie jeden proces n8n robi wszystko - to wystarcza na większość wdrożeń. Gdy obciążenie rośnie (dużo wykonań naraz, długie zadania, potrzeba równoległości), przechodzisz na tryb kolejkowy i rozkładasz pracę na wiele workerów.

  • Duża liczba wykonań w krótkim czasie i wąskie gardło na jednym procesie.
  • Potrzeba równoległego przetwarzania wielu workflow.
  • Ciężkie/długie wykonania, które blokowałyby resztę.
  • Chcesz skalować poziomo (dokładać workery) i zwiększyć odporność.

Main (główny)

Obsługuje UI, triggery i webhooki, a wykonania wrzuca do kolejki zamiast wykonywać sam.

Workers (workery)

Pobierają zadania z kolejki i faktycznie wykonują workflow. Możesz dokładać kolejne.

Redis

Bardzo szybka baza działająca w pamięci; tu pełni rolę kolejki zadań między main a workerami (oparta o Bull). Niezbędna w tym trybie.

Tryb kolejkowy: proces główny wrzuca wykonania do Redis, a pula workerów pobiera je i przetwarza równolegle. Dokładasz workery, by skalować poziomo.

Tryb włączasz zmienną EXECUTIONS_MODE=queue na procesie głównym i na workerach, wskazujesz Redis i uruchamiasz workery komendą n8n worker:

EXECUTIONS_MODE=queue
QUEUE_BULL_REDIS_HOST=redis
QUEUE_BULL_REDIS_PORT=6379
QUEUE_BULL_REDIS_PASSWORD=twoje-haslo
# liczba równoległych zadań na workera:
N8N_CONCURRENCY_PRODUCTION_LIMIT=10
# start workera:
# n8n worker

Edycja workflow bezpośrednio na produkcji to przepis na katastrofę. Profesjonalne wdrożenie rozdziela środowisko deweloperskie (gdzie eksperymentujesz) od produkcyjnego (gdzie działają sprawdzone wersje) i wersjonuje zmiany.

n8n w planach Enterprise oferuje Source Control & Environments: łączysz instancję z repozytorium Git (Git to system kontroli wersji - przechowuje historię każdej zmiany i pozwala cofnąć się do wcześniejszej wersji), a workflow i credentials (jako referencje, nie sekrety) są pod kontrolą wersji. Pracujesz w gałęziach, przeglądasz zmiany i promujesz je z dev do prod w kontrolowany sposób. Dokumentacja: Source control and environments.

Nie masz Enterprise? Wersjonować i tak warto. Każdy workflow możesz wyeksportować jako JSON (z edytora) i trzymać w repozytorium Git. Daje to historię zmian, możliwość cofnięcia i odtworzenia workflow oraz prosty transfer między instancjami dev i prod.

Zanim ruszysz dalej, odpowiedz sobie na te pytania - na głos albo w dwóch zdaniach na kartce. Jeśli przy którymś się zawahasz, wróć do podlinkowanej sekcji.

  1. Potrafisz wymienić przynajmniej trzy niezależne warstwy zabezpieczeń instancji n8n - i wyjaśnić, czemu samo silne hasło do panelu nie wystarczy? Jeśli nie masz pewności - Zabezpieczenie instancji.
  2. Kiedy przy self-hostingu jesteś administratorem danych osobowych, a kiedy tylko procesorem - i dlaczego to rozróżnienie ma znaczenie dla RODO? Jeśli nie masz pewności - Cztery pytania, które musisz sobie zadać.
  3. Masz plik backup-2026-05-15.sql w katalogu - dlaczego to samo w sobie "nic nie gwarantuje"? Co musisz zrobić, by mieć pewność, że backup zadziała w dniu awarii? Jeśli nie masz pewności - testowane odtwarzanie backupu.
  4. Healthcheck pokazuje, że n8n "żyje", ale kluczowa automatyzacja od trzech dni nic nie zsynchronizowała - jak to możliwe, i jakiego mechanizmu monitoringu Ci brakuje? Jeśli nie masz pewności - Healthcheck i monitoring czasu działania.
Mini-zadanie: przetestuj dead man's switch na swojej instancji
  1. Załóż darmowe konto na healthchecks.io i utwórz nowy check z oczekiwanym interwałem (np. co godzinę).
  2. W dowolnym cyklicznym workflow (albo nowym, testowym ze Schedule Triggerem) dodaj na końcu HTTP Request, który pinguje wygenerowany URL checku po udanym wykonaniu.
  3. Uruchom workflow raz ręcznie i sprawdź w panelu healthchecks.io, że status zmienił się na "Up".
  4. Wyłącz workflow (albo poczekaj dłużej niż ustawiony interwał) i sprawdź, czy przychodzi alert o braku pingu - to właśnie różnica między "proces żyje" a "workflow robi to, co ma", opisana w sekcji Healthcheck i monitoring czasu działania.

Co warto zapamiętać z tego modułu

  • Bezpieczeństwo to warstwy: konta + 2FA, reverse proxy + HTTPS, firewall, aktualizacje.
  • Nie wystawiaj portu 5678 na świat - na zewnątrz tylko proxy z certyfikatem Let's Encrypt.
  • Przy self-hostingu zwykle jesteś administratorem danych - zadbaj o DPA i szyfrowanie credentials (RODO).
  • Backup 3-2-1 ma sens tylko, jeśli regularnie testujesz odtwarzanie; bez klucza szyfrującego backup bazy jest bezużyteczny.
  • Monitoruj logi (N8N_LOG_LEVEL) i zdrowie (/healthz, Uptime Kuma, healthchecks.io) - także efekt, nie tylko proces.
  • Queue mode (main + workery + Redis) skaluje pod obciążenie - wszystkie workery muszą mieć ten sam N8N_ENCRYPTION_KEY.
  • Rozdziel dev od prod i wersjonuj workflow (Git / eksport JSON) - koniec z edycją na żywca.

Częste pytania

Czy do produkcji muszę używać PostgreSQL zamiast SQLite?

Dla pojedynczej, niewielkiej instancji SQLite bywa wystarczający, ale dla poważnej produkcji - a obowiązkowo w trybie kolejkowym - używaj PostgreSQL. Lepiej znosi obciążenie, równoległy dostęp i jest wymagany, gdy wiele procesów (main + workery) korzysta ze wspólnej bazy.

Co się stanie, jeśli zgubię N8N_ENCRYPTION_KEY?

Stracisz dostęp do wszystkich zapisanych credentials - n8n nie odszyfruje ich z bazy. Workflow zostaną, ale każde połączenie z usługą zewnętrzną trzeba będzie skonfigurować od nowa. Dlatego klucz backupujesz osobno (menedżer haseł) i to on jest najważniejszym elementem kopii.

Kiedy realnie potrzebuję trybu kolejkowego?

Gdy pomiary pokazują, że jeden proces n8n nie wyrabia: wykonania się piętrzą, potrzebujesz równoległości albo masz długie, ciężkie zadania blokujące resztę. Dopóki pojedyncza instancja sobie radzi, queue mode dodaje tylko niepotrzebną złożoność (Redis, wiele procesów).

Jak wersjonować workflow bez planu Enterprise?

Eksportuj każdy workflow jako JSON i trzymaj te pliki w repozytorium Git. Dostajesz historię zmian, możliwość cofnięcia i prosty transfer między instancją dev a prod. Pełny Source Control z gałęziami i promocją środowisk to funkcja Enterprise, ale podstawową dyscyplinę zapewnisz samym eksportem do Gita.

Czy webhooki też muszą być schowane za logowaniem?

Nie - to dwie różne ścieżki. Panel n8n warto ograniczyć (IP / VPN / SSO + 2FA), ale endpointy webhooków zwykle muszą być publiczne, by usługi zewnętrzne mogły je wywołać. Zabezpiecz je inaczej: trudny do odgadnięcia URL, weryfikacja podpisu/sekretu w workflow i HTTPS.

Następny krok

Utknąłeś w tym module albo coś jest nieaktualne? Napisz do mnie - poprawię materiał.

made with ❤️ by aitomate.pl - Łukasz Podgórski