EUR
european

EUR

usa

USD

Ex. VAT Ex. VAT 0%

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.

Warning

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.

Warning

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

Info

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

Tip

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:

  1. zaprosić innych użytkowników do instancji;
  2. skonfigurować SMTP, aby n8n mógł wysyłać zaproszenia i e-maile z resetowaniem hasła;
  3. 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.

VAT

  • Other

    Ex. VAT

    0%
  • austria

    Austria

    20%
  • Belgium

    Belgium

    21%
  • Bulgaria

    Bulgaria

    20%
  • Croatia

    Croatia

    25%
  • Cyprus

    Cyprus

    19%
  • Czech Republic

    Czech Republic

    21%
  • Denmark

    Denmark

    25%
  • Estonia

    Estonia

    22%
  • France

    France

    20%
  • Finland

    Finland

    24%
  • Germany

    Germany

    19%
  • Greece

    Greece

    24%
  • Hungary

    Hungary

    27%
  • Ireland

    Ireland

    23%
  • Italy

    Italy

    22%
  • Latvia

    Latvia

    21%
  • Lithuania

    Lithuania

    21%
  • Luxembourg

    Luxembourg

    17%
  • Malta

    Malta

    18%
  • Netherlands

    Netherlands

    21%
  • Poland

    Poland

    23%
  • Portugal

    Portugal

    23%
  • Romania

    Romania

    19%
  • Slovakia

    Slovakia

    20%
  • Slovenia

    Slovenia

    22%
  • Spain

    Spain

    21%
  • Sweden

    Sweden

    25%
  • USA

    USA

    0%
european
states
  • kingdom
  • germany
  • Español
  • French
  • Hrvatska
  • Italiano
  • Poland
  • Slovenski
  • ukraine
  • Türkçe
  • Other
  • Austria
  • Belgium
  • Bulgaria
  • Croatia
  • Cyprus
  • Czech Republic
  • Denmark
  • Estonia
  • Finland
  • France
  • Germany
  • Greece
  • Hungary
  • Ireland
  • Italy
  • Latvia
  • Lithuania
  • Luxembourg
  • Malta
  • Netherlands
  • Poland
  • Portugal
  • Romania
  • Slovakia
  • Slovenia
  • Spain
  • Sweden
  • USA