1. Dlaczego własny VPS zamiast n8n Cloud?
Zmieniam tekst - Oficjalny hosting n8n Cloud kosztuje od 20€ do nawet 120€ miesięcznie i narzuca sztuczne limity na liczbę wykonań potoków (tzw. executions). Własny serwer VPS z wirtualizacją KVM kosztuje ułamek tej kwoty (od ok. 25-35 zł/mies.) i oferuje:
• **Brak limitów wykonań**: możesz przetwarzać miliony webhooków miesięcznie bez dopłat.
• **Prywatność i bezpieczeństwo danych**: Twoje klucze API (OpenAI, Claude, bazy danych klientów) nie opuszczają Twojego serwera, co spełnia restrykcyjne wymogi RODO i umów poufności (NDA).
• **Własna baza PostgreSQL**: pełna kontrola nad historią wykonań i stanem potoków bez ograniczeń retencji.
2. Wymagania sprzętowe i wybór serwera
Do podstawowych automatyzacji bez ciężkich webhooków wystarczą 2 GB RAM. Jednak jeśli planujesz podłączać agentów AI, przetwarzać duże pliki JSON lub uruchamiać węzły wektorowe (np. Qdrant / Pinecone), absolutnym standardem jest maszyna z **minimum 4 GB do 8 GB RAM** oraz dyskiem NVMe, aby uniknąć zabicia kontenera przez systemowy OOM Killer.
3. Przygotowanie Ubuntu i instalacja Dockera
Po zalogowaniu się na serwer przez SSH jako użytkownik root zaktualizuj pakiety i zainstaluj oficjalny silnik Docker wraz z wtyczką Docker Compose:
apt update && apt upgrade -y
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
mkdir -p /opt/n8n && cd /opt/n8n
4. Plik docker-compose.yml z PostgreSQL i Caddy
Wykorzystujemy nowoczesny stos produkcyjny: kontener n8n, bazę PostgreSQL 16 oraz serwer Caddy, który w 100% automatycznie pobiera i odnawia certyfikat Let's Encrypt SSL.
version: '3.8'
services:
postgres:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASS}
POSTGRES_DB: n8n
volumes:
- postgres_storage:/var/lib/postgresql/data
healthcheck:
test: ['CMD-SHELL', 'pg_isready -h localhost -U ${DB_USER} -d n8n']
interval: 5s
timeout: 5s
retries: 10
n8n:
image: docker.n8n.io/n8nio/n8n:latest
restart: unless-stopped
environment:
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_USER=${DB_USER}
- DB_POSTGRESDB_PASSWORD=${DB_PASS}
- N8N_HOST=${SUBDOMAIN}
- N8N_PORT=5678
- N8N_PROTOCOL=https
- NODE_ENV=production
- WEBHOOK_URL=https://${SUBDOMAIN}/
- GENERIC_TIMEZONE=Europe/Warsaw
- EXECUTIONS_DATA_PRUNE=true
- EXECUTIONS_DATA_MAX_AGE=168
volumes:
- n8n_storage:/home/node/.n8n
depends_on:
postgres:
condition: service_healthy
caddy:
image: caddy:latest
restart: unless-stopped
ports:
- '80:80'
- '443:443'
volumes:
- caddy_data:/data
- caddy_config:/config
command: caddy reverse-proxy --from https://${SUBDOMAIN} --to http://n8n:5678
volumes:
postgres_storage:
n8n_storage:
caddy_data:
caddy_config:
5. Plik zmiennych środowiskowych .env
Utwórz plik `.env` w katalogu `/opt/n8n` i uzupełnij swoją domenę oraz silne hasło bazy danych:
SUBDOMAIN=n8n.twojadomena.pl
DB_USER=n8n_admin
DB_PASS=SuperBezpieczneHasloPostgres2026!
💡 TIP: Pamiętaj, aby przed uruchomieniem skierować rekord A w DNS domeny (np. n8n.twojadomena.pl) na adres IP Twojego serwera VPS.
6. Uruchomienie i weryfikacja certyfikatu SSL
Uruchom potok w tle jednym poleceniem. Caddy automatycznie wynegocjuje darmowy certyfikat SSL z Let's Encrypt w około 10 sekund:
docker compose up -d
docker compose logs -f caddy
7. Optymalizacja RAM pod potoki agentów AI
Domyślnie n8n zapisuje każde pojedyncze wykonanie w bazie. Przy tysiącach zapytań baza PostgreSQL może szybko urosnąć. W powyższej konfiguracji dodaliśmy dwie kluczowe flagi: `EXECUTIONS_DATA_PRUNE=true` oraz `EXECUTIONS_DATA_MAX_AGE=168` (automatyczne czyszczenie logów starszych niż 7 dni), co gwarantuje stałe, niskie zużycie RAM-u i dysku.