Instalacja n8n z Dockerem i PostgreSQL
n8n to platforma do automatyzacji przepływów pracy, którą możesz uruchomić na własnym serwerze. Instancja hostowana lokalnie (self-hosted) utrzymuje Twoje przepływy pracy, poświadczenia i dane wykonania pod Twoją kontrolą i nie ma limitów liczby przepływów pracy ani wykonań, poza tym, co serwer jest w stanie obsłużyć.
Ten przewodnik konfiguruje n8n na dedykowanym serwerze z PostgreSQL, HTTPS i kopiami zapasowymi. Wykorzystuje trzy kontenery zarządzane przez Docker Compose:
- n8n, sama platforma automatyzacji;
- PostgreSQL, baza danych dla przepływów pracy, poświadczeń i historii wykonań;
- Caddy, odwrotne proxy, które automatycznie pobiera i odnawia certyfikat HTTPS.
Domyślnie n8n przechowuje swoje dane w SQLite. Ten przewodnik używa zamiast tego PostgreSQL: można go zbackupować, gdy n8n działa, i jest to baza danych zalecana przez n8n do hostowania lokalnego.
Kroki zostały przetestowane na Ubuntu 24.04 LTS z n8n 2.46.7, PostgreSQL 17, Docker 29 i Docker Compose v5.
Zanim zaczniesz
Będziesz potrzebować:
- serwera z systemem Ubuntu 24.04 LTS z dostępem root przez SSH;
- domeny lub subdomeny dla n8n, na przykład
n8n.example.com; - rekordu A dla tej nazwy wskazującego na adres IPv4 serwera.
Jeśli domena ma również rekord AAAA, serwer musi być osiągalny przez IPv6 pod tym adresem. W przeciwnym razie Let's Encrypt może najpierw spróbować IPv6 i nie uda mu się wystawić certyfikatu.
Sprawdź, czy rekord rozwiązuje się na Twój serwer, zanim przejdziesz dalej:
dig +short n8n.example.com
Polecenie powinno zwrócić adres IP serwera. Wystawianie certyfikatu w Caddy zależy od tego, więc poczekaj, aż DNS się zpropaguje.
Wszystkie poniższe polecenia są uruchamiane jako root. Jeśli pracujesz jako zwykły użytkownik z uprawnieniami sudo, dodaj sudo przed każdym poleceniem.
Instalacja Docker
Zainstaluj Docker Engine i wtyczkę Compose z oficjalnego repozytorium Docker. Pakiet docker.io z repozytorium Ubuntu jest starszy i nie zawiera Compose v2.
apt update && apt install -y ca-certificates curl install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc chmod a+r /etc/apt/keyrings/docker.asc
Dodaj repozytorium:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" > /etc/apt/sources.list.d/docker.list
Zainstaluj pakiety:
apt update apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Sprawdź, czy oba narzędzia są dostępne:
docker --version docker compose version
Utwórz katalog projektu i sekrety
Wszystkie pliki n8n będą znajdować się w /opt/n8n:
mkdir -p /opt/n8n && cd /opt/n8n
Utwórz plik .env z Twoją domeną, strefą czasową i wygenerowanymi sekretami. Zastąp n8n.example.com i strefę czasowa swoimi wartościami:
cat > .env <<EOF DOMAIN=n8n.example.com GENERIC_TIMEZONE=Europe/Amsterdam POSTGRES_USER=n8n POSTGRES_DB=n8n POSTGRES_PASSWORD=$(openssl rand -hex 24) N8N_ENCRYPTION_KEY=$(openssl rand -hex 32) EOF chmod 600 .env
GENERIC_TIMEZONE ustawia strefę czasową używaną przez węzeł Schedule Trigger i inne węzły oparte na czasie. Bez tego n8n używa America/New_York.
N8N_ENCRYPTION_KEY to klucz, którego n8n używa do szyfrowania poświadczeń, które w nim zapisujesz: tokenów API, haseł, sekretów OAuth. Jeśli ten klucz zostanie utracony, poświadczenia w przywróconej bazie danych nie mogą zostać odszyfrowane i każde z nich będzie trzeba wprowadzić ponownie.
Skopiuj plik .env w bezpieczne miejsce poza serwerem natychmiast, na przykład do menedżera haseł. Kopia zapasowa bazy danych bez N8N_ENCRYPTION_KEY przywróci Twoje przepływy pracy, ale nie poświadczenia.
Utwórz plik Docker Compose
Utwórz /opt/n8n/compose.yaml:
services: postgres: image: postgres:17 restart: unless-stopped environment: POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] interval: 10s timeout: 5s retries: 5 n8n: image: docker.n8n.io/n8nio/n8n restart: unless-stopped depends_on: postgres: condition: service_healthy environment: 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_HOST: ${DOMAIN} N8N_PROTOCOL: https N8N_PROXY_HOPS: 1 N8N_WEBHOOK_URL: https://${DOMAIN}/ GENERIC_TIMEZONE: ${GENERIC_TIMEZONE} TZ: ${GENERIC_TIMEZONE} ports: - "127.0.0.1:5678:5678" volumes: - n8n_data:/home/node/.n8n caddy: image: caddy:2 restart: unless-stopped ports: - "80:80" - "443:443" volumes: - ./Caddyfile:/etc/caddy/Caddyfile:ro - caddy_data:/data - caddy_config:/config volumes: postgres_data: n8n_data: caddy_data: caddy_config:
Kilka szczegółów w tym pliku ma znaczenie dla bezpieczeństwa i stabilności.
PostgreSQL nie ma sekcji ports. Baza danych jest osiągalna tylko dla innych kontenerów w projekcie, nigdy z internetu.
Port n8n jest publikowany jako 127.0.0.1:5678. Użytkownicy docierają do n8n tylko przez Caddy przez HTTPS, podczas gdy Ty nadal możesz sprawdzać n8n lokalnie na serwerze.
Nie skracaj linii portu n8n do 5678:5678. Docker dodaje własne reguły zapory sieciowej dla opublikowanych portów, które omijają UFW. Bez prefiksu 127.0.0.1 n8n staje się osiągalny przez zwykłe HTTP z dowolnego miejsca, nawet jeśli UFW blokuje port 5678.
Warunek depends_on z healthcheck sprawia, że n8n czeka, aż PostgreSQL będzie gotowy do akceptowania połączeń. Bez tego n8n może uruchomić się jako pierwszy przy zimnym starcie i nie połączyć się z bazą danych.
N8N_PROXY_HOPS informuje n8n, że działa za jednym odwrotnym proxy, więc odczytuje rzeczywisty adres klienta z nagłówków proxy. N8N_WEBHOOK_URL ustawia publiczny adres, który n8n wyświetla dla adresów URL webhooków. W wersjach n8n przed 2.30 ta zmienna nazywa się WEBHOOK_URL.
Konfiguracja HTTPS z Caddy
Utwórz /opt/n8n/Caddyfile ze swoją domeną:
n8n.example.com { reverse_proxy n8n:5678 }
To cała konfiguracja. Przy pierwszym uruchomieniu Caddy żąda certyfikatu Let's Encrypt dla domeny, przekierowuje HTTP na HTTPS i odnawia certyfikat przed jego wygaśnięciem. Porty 80 i 443 muszą być otwarte, aby to zadziałało.
Konfiguracja zapory sieciowej
Zezwól najpierw na SSH, następnie na HTTP i HTTPS, i włącz UFW:
ufw allow OpenSSH ufw allow 80/tcp ufw allow 443/tcp ufw --force enable ufw status
Jeśli UFW był już włączony z Twoimi własnymi regułami, uruchom ufw status przed wprowadzeniem zmian i zachowaj reguły, których potrzebujesz. Zezwolenie na OpenSSH przed włączeniem UFW zapobiega rozłączeniu bieżącej sesji SSH.
Uruchomienie n8n
Uruchom kontenery w tle:
cd /opt/n8n docker compose up -d
Pierwsze uruchomienie pobiera obrazy i zajmuje minutę lub dwie. Sprawdź, czy wszystkie trzy kontenery działają, a PostgreSQL jest zdrowy (healthy):
docker compose ps
Spójrz na log n8n:
docker compose logs n8n --tail 50
Log powinien kończyć się linią taką jak:
Editor is now accessible via: https://n8n.example.com
Sprawdź, czy n8n odpowiada lokalnie i przez Caddy:
curl -s http://127.0.0.1:5678/healthz curl -s https://n8n.example.com/healthz
Oba polecenia powinny zwrócić {"status":"ok"}.
Jeśli drugie polecenie nie powiedzie się, sprawdź log Caddy za pomocą docker compose logs caddy. Najczęstszą przyczyną jest rekord DNS, który jeszcze nie wskazuje na ten serwer, lub zamknięte porty 80 i 443.
Utwórz konto właściciela
Otwórz https://n8n.example.com w przeglądarce. Przy pierwszej wizycie n8n poprosi Cię o utworzenie konta właściciela. To konto ma pełne prawa do instancji i zarządza wszystkimi innymi użytkownikami.

Wprowadź swój e-mail, imię i nazwisko oraz hasło, a następnie kliknij Dalej (Next). Hasło musi mieć co najmniej 8 znaków i zawierać co najmniej jedną cyfrę i jedną wielką literę. Użyj silnego hasła: edytor n8n jest otwarty na internet, a każdy, kto się do niego dostanie, może uruchamiać polecenia na serwerze za pośrednictwem Twoich przepływów pracy.
Po pierwszym zalogowaniu n8n wyświetla krótką ankietę: Customize n8n to you. Pytania są opcjonalne. Kliknij Rozpocznij (Get started), aby ją zamknąć, z odpowiedzią lub bez.

Następnie n8n oferuje darmowy klucz licencyjny do kilku funkcji Community Edition: zaawansowane debugowanie, wyszukiwanie i tagowanie wykonań oraz foldery dla przepływów pracy. Klucz jest wysyłany na podany e-mail. Kliknij Send me a free license key, aby go otrzymać, lub Pomiń (Skip), jeśli nie potrzebujesz tych funkcji.

Otwiera się strona przeglądu. Instalacja jest zakończona i możesz utworzyć swój pierwszy przepływ pracy.

Tworzenie kopii zapasowej n8n
Kopia zapasowa n8n składa się z dwóch części: zrzutu (dump) PostgreSQL z Twoimi przepływami pracy, poświadczeniami, użytkownikami i historią wykonań oraz pliku .env z N8N_ENCRYPTION_KEY. Żadna z tych części nie jest przydatna bez drugiej.
W tej konfiguracji n8n przechowuje cały swój stan w PostgreSQL. Wolumin n8n_data nie musi być backupowany: pełne przywrócenie działa tylko na podstawie zrzutu bazy danych i pliku .env.
Utwórz katalog kopii zapasowej i zrzuć bazę danych:
mkdir -p /opt/n8n-backup cd /opt/n8n docker compose exec -T postgres pg_dump -U n8n -d n8n -Fc > /opt/n8n-backup/n8n-db.dump cp .env compose.yaml Caddyfile /opt/n8n-backup/
Zrzut jest wykonywany, gdy n8n działa, więc nie jest wymagany czas przestoju.
Kopia zapasowa pozostająca na tym samym serwerze nie pomoże, jeśli dysk serwera ulegnie awarii. Regularnie kopiuj /opt/n8n-backup do zewnętrznej pamięci masowej. Możesz do tego użyć INTROSERV Cloud Storage, jak opisano w przewodniku Podłączanie usługi Introserv Cloud Storage do serwera.
Przywracanie z kopii zapasowej
Aby przywrócić n8n na nowym serwerze, zainstaluj Docker zgodnie z powyższym opisem i skopiuj katalog kopii zapasowej do /opt/n8n-backup na tym serwerze. Następnie umieść pliki konfiguracyjne na miejscu:
mkdir -p /opt/n8n cp /opt/n8n-backup/.env /opt/n8n-backup/compose.yaml /opt/n8n-backup/Caddyfile /opt/n8n/ chmod 600 /opt/n8n/.env
Jeśli nowy serwer ma inny adres IP, najpierw zaktualizuj rekord A domeny.
Uruchom tylko bazę danych:
cd /opt/n8n docker compose up -d postgres
Poczekaj, aż docker compose ps pokaże PostgreSQL jako zdrowy (healthy), a następnie przywróć zrzut:
docker compose exec -T postgres pg_restore -U n8n -d n8n --clean --if-exists < /opt/n8n-backup/n8n-db.dump
Uruchom resztę stosu:
docker compose up -d
Zaloguj się tym samym kontem właściciela i sprawdź, czy Twoje przepływy pracy i poświadczenia są na miejscu. Zapisane poświadczenia są odszyfrowywane za pomocą N8N_ENCRYPTION_KEY z przywróconego pliku .env, więc działają bez konieczności ponownego ich wprowadzania.
Aktualizacja n8n
n8n często wypuszcza aktualizacje. Aby zaktualizować do najnowszej wersji, pobierz nowe obrazy i odtwórz kontenery:
cd /opt/n8n docker compose pull docker compose up -d docker image prune -f
Ostatnie polecenie usuwa stare obrazy, które nie są już używane.
Sprawdź nową wersję:
docker compose exec n8n n8n --version
Zrób kopię zapasową przed każdą aktualizacją. Przy uruchamianiu nowa wersja n8n może migrować schemat bazy danych, więc niezawodnym sposobem powrotu do poprzedniej wersji jest przywrócenie zrzutu wykonanego przed aktualizacją.
Obraz PostgreSQL jest przypięty do głównej wersji 17, więc docker compose pull instaluje tylko drobne aktualizacje PostgreSQL. Przejście do nowej wersji głównej wymaga zrzutu i przywrócenia i nie jest wykonywane automatycznie.
Co dalej
Twoja instancja n8n jest gotowa do pracy. Od teraz możesz:
- zaprosić innych użytkowników do instancji;
- skonfigurować SMTP, aby n8n mógł wysyłać zaproszenia i e-maile z resetowaniem hasła;
- połączyć swoje usługi i zbudować swoje pierwsze przepływy pracy.
Jeśli planujesz uruchamiać przepływy pracy AI z lokalnymi modelami językowymi, zobacz przewodnik Instalacja n8n AI Starter Kit z Ollama.