Automatyzacja

n8n Self-Hosted na Hetzner: Instrukcja Krok po Kroku

P
Patryk
CEO & Founder
25.05.20263 min
n8n Self-Hosted na Hetzner: Instrukcja Krok po Kroku

Pełna instrukcja wdrożenia n8n self-hosted na serwerze Hetzner: Docker Compose, reverse proxy, SSL, backupy, cron i checklista utrzymaniowa dla SMB.

Jeśli rozważasz automatyzację firmy i jednocześnie chcesz kontrolować dane, n8n self-hosted jest jednym z najlepszych wyborów. Dla zespołu SMB oznacza to prosty rachunek: niskie koszty infrastruktury, pełna kontrola nad workflow i brak lock-inu na pojedynczym dostawcy SaaS.

Ten przewodnik prowadzi Cię od zera do działającej instancji n8n na Hetzner. Bez skrótów typu "kliknij tutaj i zaufaj". Każdy krok ma uzasadnienie, a na końcu dostajesz checklistę utrzymaniową na pierwsze 30 dni.

Dla kogo ten setup ma sens

  • Dla firm, które chcą trzymać dane na własnej infrastrukturze (RODO, audyt, bezpieczeństwo).
  • Dla zespołów, które planują więcej niż 2-3 proste automatyzacje.
  • Dla organizacji, które chcą przewidywalny koszt zamiast rosnących opłat per operacja.

Jeśli masz pojedynczy prosty workflow i zero czasu na utrzymanie, n8n Cloud może być szybszy na start. Jeśli budujesz system na lata, self-host zwykle wygrywa.

Architektura minimalna (produkcyjna, ale lekka)

W tej instrukcji używamy:

  • VPS Hetzner (CPX21 lub CX22)
  • Ubuntu LTS
  • Docker + Docker Compose
  • n8n
  • PostgreSQL
  • Nginx (reverse proxy + SSL)
  • Certbot
  • Backup bazy przez cron

To jest "minimum sensowne". Nie enterprise, ale stabilny punkt startowy.

Krok 1: Przygotuj serwer w Hetzner

  1. 01Załóż projekt i utwórz VPS.
  2. 02Region: Falkenstein lub Nuremberg (EU).
  3. 03System: Ubuntu 24.04 LTS.
  4. 04Włącz klucz SSH (nie hasło).
  5. 05Dodaj DNS A record: automation.twojadomena.pl -> IP serwera.

Minimalne parametry:

  • 2 vCPU
  • 4 GB RAM
  • 40 GB dysku

To wystarczy na kilkanaście-kilkadziesiąt workflow SMB, jeśli nie robisz ciężkiego OCR/video.

Krok 2: Hardenowanie systemu

Po SSH:

sudo apt update && sudo apt upgrade -y
sudo apt install -y ufw fail2ban ca-certificates curl gnupg
sudo ufw allow OpenSSH
sudo ufw allow 80
sudo ufw allow 443
sudo ufw --force enable

Dodaj użytkownika technicznego i wyłącz logowanie rootem przez hasło. To zajmuje 10 minut, a oszczędza dużo nerwów.

Krok 3: Instalacja Docker i Compose

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo $VERSION_CODENAME) stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo usermod -aG docker $USER

Wyloguj i zaloguj się ponownie, żeby grupa docker zadziałała.

Krok 4: Struktura katalogów

mkdir -p ~/n8n-stack/{n8n,postgres,backups}
cd ~/n8n-stack

Teraz przygotuj plik .env:

DOMAIN=automation.twojadomena.pl
POSTGRES_DB=n8n
POSTGRES_USER=n8n
POSTGRES_PASSWORD=ZMIEN_TO_NA_MOCNE_HASLO
N8N_ENCRYPTION_KEY=ZMIEN_TO_NA_DLUGI_LOSOWY_KLUCZ
N8N_BASIC_AUTH_USER=admin
N8N_BASIC_AUTH_PASSWORD=ZMIEN_TO_NA_MOCNE_HASLO
TZ=Europe/Warsaw

Najważniejsze: N8N_ENCRYPTION_KEY musi być stały. Jeśli go stracisz, stracisz dostęp do zaszyfrowanych credentiali.

Krok 5: Docker Compose (n8n + Postgres)

Utwórz docker-compose.yml:

services:
  postgres:
    image: postgres:16-alpine
    container_name: n8n-postgres
    restart: unless-stopped
    environment:
      - POSTGRES_DB=<POSTGRES_DB>
      - POSTGRES_USER=<POSTGRES_USER>
      - POSTGRES_PASSWORD=<POSTGRES_PASSWORD>
      - TZ=<TZ>
    volumes:
      - ./postgres:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U <POSTGRES_USER> -d <POSTGRES_DB>"]
      interval: 10s
      timeout: 5s
      retries: 6

  n8n:
    image: n8nio/n8n:latest
    container_name: n8n-app
    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
      - WEBHOOK_URL=https://<DOMAIN>/
      - N8N_PORT=5678
      - GENERIC_TIMEZONE=<TZ>
      - TZ=<TZ>
      - N8N_BASIC_AUTH_ACTIVE=true
      - N8N_BASIC_AUTH_USER=<N8N_BASIC_AUTH_USER>
      - N8N_BASIC_AUTH_PASSWORD=<N8N_BASIC_AUTH_PASSWORD>
      - N8N_SECURE_COOKIE=true
      - N8N_EDITOR_BASE_URL=https://<DOMAIN>/
    volumes:
      - ./n8n:/home/node/.n8n
    expose:
      - "5678"

Start:

docker compose up -d
docker compose logs -f n8n

Krok 6: Reverse proxy Nginx

Instalacja:

sudo apt install -y nginx

Konfiguracja /etc/nginx/sites-available/n8n:

server {
  listen 80;
  server_name automation.twojadomena.pl;

  location / {
    proxy_pass http://127.0.0.1:5678;
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_read_timeout 3600;
  }
}

Aktywacja:

sudo ln -s /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/n8n
sudo nginx -t
sudo systemctl reload nginx

Krok 7: SSL z Let's Encrypt

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d automation.twojadomena.pl

Po sukcesie sprawdź automatyczne odnowienie:

sudo systemctl list-timers | grep certbot

Krok 8: Backupy bazy danych

Utwórz skrypt ~/n8n-stack/backup-postgres.sh:

#!/usr/bin/env bash
set -euo pipefail

DATE=$(date +%F-%H%M)
BACKUP_DIR="$HOME/n8n-stack/backups"
mkdir -p "$BACKUP_DIR"

docker exec n8n-postgres pg_dump -U n8n -d n8n > "$BACKUP_DIR/n8n-$DATE.sql"
find "$BACKUP_DIR" -type f -name "n8n-*.sql" -mtime +14 -delete

Nadaj prawa:

chmod +x ~/n8n-stack/backup-postgres.sh

Krok 9: Cron harmonogram backupów

Otwórz crontab:

crontab -e

Dodaj:

0 */6 * * * /bin/bash $HOME/n8n-stack/backup-postgres.sh >> $HOME/n8n-stack/backups/backup.log 2>&1
30 3 * * 1 docker compose -f $HOME/n8n-stack/docker-compose.yml pull && docker compose -f $HOME/n8n-stack/docker-compose.yml up -d

Pierwsza linia: backup co 6 godzin. Druga: cotygodniowy rolling update kontenerów.

Krok 10: Pierwsze uruchomienie i testy

Wejdź na https://automation.twojadomena.pl, zaloguj się Basic Auth i zrób:

  1. 01Utwórz prosty workflow testowy (Manual Trigger -> Set -> NoOp).
  2. 02Zapisz i uruchom.
  3. 03Sprawdź, czy execution pojawia się poprawnie.
  4. 04Dodaj testowy webhook i wywołaj curl.

Jeśli to działa, masz stabilny fundament.

Najczęstsze problemy i szybkie diagnozy

Problem: pusta strona po logowaniu

Sprawdź N8N_HOST, WEBHOOK_URL, N8N_EDITOR_BASE_URL. Najczęściej URL-e nie zgadzają się z domeną.

Problem: webhook działa lokalnie, nie działa z internetu

Sprawdź czy DNS wskazuje poprawne IP oraz czy porty 80/443 są otwarte w UFW.

Problem: credentials "znikają" po restarcie

Najczęściej zmienił się N8N_ENCRYPTION_KEY albo volume ./n8n nie jest montowane.

Problem: duże opóźnienia workflow

Sprawdź obciążenie CPU/RAM i rozdziel workflow czasochłonne na osobne kolejki.

Utrzymanie: checklista 30 dni

  • Co tydzień: aktualizacja obrazów kontenerów.
  • Co tydzień: test odtwarzania jednego backupu.
  • Co tydzień: przegląd execution errors.
  • Co miesiąc: rotacja haseł Basic Auth.
  • Co miesiąc: przegląd aktywnych credentials i usunięcie nieużywanych.

Jeśli automatyzacje rosną, dodaj:

  • zewnętrzny monitoring uptime,
  • alerty Slack/email na błędy,
  • oddzielny serwer PostgreSQL przy większym obciążeniu.

Ile to kosztuje realnie

Przykładowy koszt miesięczny:

  • VPS Hetzner: 8-16 EUR
  • Domena: zwykle już posiadasz
  • SSL: 0 EUR (Let's Encrypt)
  • n8n: 0 EUR (self-hosted)

To poziom często 3-8x tańszy niż rozbudowane plany automatyzacji SaaS przy rosnącej liczbie operacji.

Kiedy to robić samodzielnie, a kiedy z partnerem

Samodzielnie:

  • masz techniczną osobę w zespole,
  • potrzebujesz 3-10 workflow,
  • akceptujesz 1-2 dni na setup i testy.

Z partnerem:

  • chcesz od razu wersję "production-ready" z monitoringiem i polityką backupu,
  • planujesz workflow krytyczne biznesowo (lead routing, faktury, SLA support),
  • potrzebujesz szybkiego handoveru dla zespołu.

Jeśli chcesz, możemy pomóc od razu z architekturą i pierwszymi workflow. Zobacz usługę automatyzacji albo napisz do nas.

Tagi:

#n8n#hetzner#self-hosted#docker#cron#automatyzacja#SMB
Memoji autora: Patryk

Patryk

CEO & Founder

Ekspert w dziedzinie Automatyzacja, dzieli się wiedzą i doświadczeniem przez tworzenie wartościowych treści dla DigitalQuest.

Podobał Ci się ten artykuł?

Idź dalej — pobierz bezpłatny przewodnik lub porozmawiaj z nami o pierwszym oknie danych.

BEZPŁATNY E-BOOK

Przewodnik AI Marketingu

Strategie, narzędzia i scenariusze wdrożeń dla polskich firm — od pierwszego ruchu do decyzji po danych.

Odbierz swój przewodnik
30-MIN ROZMOWA

Porozmawiaj o swoim marketingu

30 minut o tym, co mierzyć najpierw i czy warto skalować. Bez zobowiązań, bez prezentacji sprzedażowej.

Umów 30-min rozmowę