n8n w Dockerze: instalacja self-host krok po kroku (2026)
Najkrótsza droga do własnego n8n to Docker. Poniżej dwa warianty z oficjalnej dokumentacji: szybki docker run do testów i docker compose do produkcji z PostgreSQL i automatycznym HTTPS. Wersja stabilna n8n w dniu sprawdzenia: 2.42.7.
Wymagania
- Serwer lub komputer z Dockerem (Docker Desktop na Mac/Windows/Linux albo Docker Engine + Compose na Linuksie). Node.js nie jest potrzebny.
- Na produkcji: domena wskazująca na serwer (webhooki muszą być osiągalne z internetu) i 2 GB RAM.
Wariant 1: jedno polecenie (testy)
docker volume create n8n_data
docker run -it --rm \
--name n8n \
-p 5678:5678 \
-e GENERIC_TIMEZONE="Europe/Warsaw" \
-e TZ="Europe/Warsaw" \
-e N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true \
-v n8n_data:/home/node/.n8n \
n8nio/n8n
Otwórz http://localhost:5678 i załóż konto właściciela. Dane (workflow, poświadczenia, historia wykonań) żyją w wolumenie n8n_data, więc przetrwają usunięcie kontenera.
Wariant 2: docker compose z PostgreSQL (produkcja)
SQLite wystarcza do testów; na produkcji n8n zaleca PostgreSQL. Plik docker-compose.yml:
services:
postgres:
image: postgres:16
restart: always
environment:
POSTGRES_USER: n8n
POSTGRES_PASSWORD: ZMIEN_TO_HASLO
POSTGRES_DB: n8n
volumes:
- pg_data:/var/lib/postgresql/data
n8n:
image: n8nio/n8n:2.42.7
restart: always
ports:
- "127.0.0.1:5678:5678"
environment:
DB_TYPE: postgresdb
DB_POSTGRESDB_HOST: postgres
DB_POSTGRESDB_PORT: 5432
DB_POSTGRESDB_DATABASE: n8n
DB_POSTGRESDB_USER: n8n
DB_POSTGRESDB_PASSWORD: ZMIEN_TO_HASLO
N8N_HOST: n8n.twojafirma.pl
N8N_PROTOCOL: https
WEBHOOK_URL: https://n8n.twojafirma.pl/
GENERIC_TIMEZONE: Europe/Warsaw
TZ: Europe/Warsaw
N8N_ENCRYPTION_KEY: WYGENERUJ_DLUGI_LOSOWY_CIAG
N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: "true"
volumes:
- n8n_data:/home/node/.n8n
depends_on:
- postgres
volumes:
pg_data:
n8n_data:
Uruchom docker compose up -d. Port jest przypięty do 127.0.0.1, więc n8n nie jest widoczne z internetu bezpośrednio: przed nim stawiasz reverse proxy (Caddy albo Nginx z certyfikatem Let's Encrypt), który kieruje https://n8n.twojafirma.pl na port 5678. Najprostszy Caddyfile to dwie linie: n8n.twojafirma.pl { reverse_proxy 127.0.0.1:5678 }.
Zmienne środowiskowe, które mają znaczenie
| Zmienna | Po co |
|---|---|
GENERIC_TIMEZONE, TZ | Strefa czasowa dla Schedule Trigger (cron) i dla systemu w kontenerze. Bez nich „codziennie o 8:00" wykona się o 8:00 UTC. |
N8N_ENCRYPTION_KEY | Klucz, którym n8n szyfruje poświadczenia w bazie. Zapisz go poza serwerem: bez niego backup bazy jest bezużyteczny. |
WEBHOOK_URL | Publiczny adres, pod którym n8n generuje URL-e webhooków. Zmiana domeny bez aktualizacji tej zmiennej = wszystkie webhooki przestają działać. |
DB_TYPE, DB_POSTGRESDB_* | Przełączenie z SQLite na PostgreSQL. |
EXECUTIONS_DATA_PRUNE, EXECUTIONS_DATA_MAX_AGE | Automatyczne czyszczenie historii wykonań; bez tego baza rośnie bez końca. |
Aktualizacja
cd /sciezka/do/compose
docker compose pull
docker compose down
docker compose up -d
Przy pojedynczym kontenerze: docker pull n8nio/n8n, potem docker stop, docker rm i ponowny docker run z tymi samymi opcjami. Dane w wolumenie zostają. Przed dużą aktualizacją (np. 1.x → 2.x) zrób kopię wolumenu i bazy.
Kopia zapasowa
docker run --rm -v n8n_data:/data -v $(pwd):/backup alpine tar czf /backup/n8n_data.tgz -C /data .
docker compose exec postgres pg_dump -U n8n n8n > n8n.sql
Do odtworzenia potrzebujesz trzech rzeczy: archiwum wolumenu, zrzutu bazy i N8N_ENCRYPTION_KEY.
Najczęstsze problemy po instalacji
- Webhook testowy działa, produkcyjny nie — brak
WEBHOOK_URLalbo proxy nie przekazuje nagłówków; sprawdź przewodnik po webhookach. - Workflow „zawiesza się" przy dużych plikach — za mało RAM; ustaw limit pamięci kontenera i rozbij przetwarzanie na partie.
- Cron odpala się o złej godzinie — brak
GENERIC_TIMEZONE. - Więcej: dlaczego automatyzacje n8n przestają działać.
Najczęstsze pytania
Czy n8n działa na Synology, Raspberry Pi albo tanim VPS?
Tak, obraz n8nio/n8n jest wieloarchitekturowy (amd64, arm64). Na Raspberry Pi 4 z 4 GB RAM działa do testów; na produkcję z webhookami wygodniejszy jest VPS z publicznym IP i domeną.
Czy muszę mieć PostgreSQL?
Nie. Domyślnie n8n używa SQLite w wolumenie. PostgreSQL ma sens przy wielu równoległych wykonaniach i dużej historii.
Jak przenieść workflow z n8n Cloud na self-host?
W edytorze: menu workflow → Download (JSON), na nowej instancji Import from file. Poświadczenia trzeba założyć ponownie; nie eksportują się z kluczami.
Źródła
- n8n docs: Docker installation (dostęp 2026-10-13)
- n8n docs: environment variables (dostęp 2026-10-13)
- n8n-hosting (docker-compose examples) (dostęp 2026-10-13)