AgentFlow

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

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

ZmiennaPo co
GENERIC_TIMEZONE, TZStrefa czasowa dla Schedule Trigger (cron) i dla systemu w kontenerze. Bez nich „codziennie o 8:00" wykona się o 8:00 UTC.
N8N_ENCRYPTION_KEYKlucz, którym n8n szyfruje poświadczenia w bazie. Zapisz go poza serwerem: bez niego backup bazy jest bezużyteczny.
WEBHOOK_URLPubliczny 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_AGEAutomatyczne 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

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