Ghid · 30 de minute · Debian · Ubuntu
Instalare n8n pe VPS, cu Docker și HTTPS
Ghidul ăsta e pentru cine vrea să controleze fiecare piesă: n8n cu PostgreSQL în containere separate, în spatele unui reverse proxy care se ocupă singur de certificat. Dacă vrei doar să folosești n8n, nu să-l administrezi, ia o configurație cu el deja instalat și sari peste tot ce urmează.
Ai nevoie de
- Un VPS securizat (vezi ghidul anterior), cu porturile 80 și 443 deschise
- Un domeniu sau subdomeniu cu înregistrare A către IP-ul serverului
- Docker și Docker Compose instalate
- 01
Instalează Docker
Scriptul oficial e cea mai scurtă cale pe Debian și Ubuntu. Verifică după instalare că serviciul pornește la boot.
curl -fsSL https://get.docker.com | sh systemctl enable --now docker docker compose version - 02
Verifică DNS-ul înainte de orice
Certificatul se emite doar dacă domeniul arată deja către server. Verifică asta acum, ca să nu depanezi două lucruri deodată mai târziu.
dig +short n8n.domeniul-tau.ro - 03
Scrie fișierul de configurare
Variabilele de mai jos nu sunt opționale. N8N_HOST, N8N_PROTOCOL și WEBHOOK_URL determină ce adresă pune n8n în webhook-urile pe care le dai serviciilor externe. Greșite, primești URL-uri către localhost și integrările nu ajung niciodată la tine.
N8N_ENCRYPTION_KEY criptează credențialele în baza de date. Generează-l o dată și păstrează-l: fără el, credențialele salvate devin necitibile.
.env DOMENIU=n8n.domeniul-tau.ro EMAIL=tu@domeniul-tau.ro POSTGRES_PASSWORD=$(openssl rand -base64 24) N8N_ENCRYPTION_KEY=$(openssl rand -base64 32)AtențieSalvează N8N_ENCRYPTION_KEY în afara serverului, în managerul tău de parole. Dacă îl pierzi, pierzi toate credențialele configurate în workflow-uri.
- 04
Scrie docker-compose.yml
Caddy face reverse proxy și obține certificatul singur, fără certbot și fără cron. n8n ascultă doar pe rețeaua internă, deci nu e expus direct.
Postgres are healthcheck, iar n8n pornește abia după ce baza de date răspunde. Fără asta, primul pornire eșuează la migrări.
docker-compose.yml services: postgres: image: postgres:16-alpine restart: unless-stopped environment: POSTGRES_DB: n8n POSTGRES_USER: n8n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} volumes: [postgres:/var/lib/postgresql/data] healthcheck: test: ["CMD-SHELL", "pg_isready -U n8n"] interval: 10s retries: 5 n8n: image: docker.n8n.io/n8nio/n8n restart: unless-stopped environment: DB_TYPE: postgresdb DB_POSTGRESDB_HOST: postgres DB_POSTGRESDB_DATABASE: n8n DB_POSTGRESDB_USER: n8n DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD} N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY} N8N_HOST: ${DOMENIU} N8N_PROTOCOL: https WEBHOOK_URL: https://${DOMENIU}/ GENERIC_TIMEZONE: Europe/Bucharest EXECUTIONS_DATA_MAX_AGE: 336 EXECUTIONS_DATA_PRUNE: "true" volumes: [n8n:/home/node/.n8n] depends_on: postgres: {condition: service_healthy} caddy: image: caddy:alpine restart: unless-stopped ports: ["80:80", "443:443"] volumes: - ./Caddyfile:/etc/caddy/Caddyfile:ro - caddy:/data depends_on: [n8n] volumes: postgres: n8n: caddy: - 05
Configurează reverse proxy-ul
Trei rânduri. Caddy cere certificatul la prima pornire și îl reînnoiește singur.
Caddyfile {$DOMENIU} { reverse_proxy n8n:5678 } - 06
Pornește și verifică
Prima pornire durează mai mult: se descarcă imaginile, se rulează migrările și se emite certificatul.
Dacă certificatul nu se emite, aproape întotdeauna e DNS-ul sau portul 80 blocat de firewall.
docker compose up -d docker compose logs -f caddy # urmărește emiterea certificatului docker compose ps - 07
Fă backup la ce contează
Ce trebuie salvat: baza de date Postgres și cheia de criptare. Volumul n8n conține setări, dar credențialele sunt în baza de date, criptate cu cheia.
Pune comanda într-un cron zilnic și trimite arhiva în altă parte. Un backup care stă pe același server nu e backup.
docker compose exec -T postgres pg_dump -U n8n n8n | gzip > n8n-$(date +%F).sql.gz
Întrebări frecvente
+De ce aș instala manual, dacă îl oferiți preinstalat?
Pentru control. Instalarea manuală îți lasă versiunea de n8n, structura containerelor și configurația reverse proxy-ului în mâinile tale, plus poți pune alte servicii pe aceeași mașină. Dacă nu ai nevoie de asta, varianta preinstalată costă la fel și te scutește de treabă.
+De ce Postgres și nu SQLite?
SQLite e implicit și merge pentru încercat. În producție, cu execuții concurente, Postgres se comportă previzibil la scrieri simultane și e mult mai ușor de salvat consistent. Migrarea ulterioară de la SQLite la Postgres e muncă în plus.
+Ce fac dacă webhook-urile nu primesc apeluri?
Verifică în interfața n8n ce URL afișează pentru webhook. Dacă arată localhost sau un port intern, WEBHOOK_URL nu e setat corect. Verifică apoi că portul 443 e deschis și că certificatul e valid.
+Când trec pe queue mode?
Când o execuție lungă blochează celelalte workflow-uri sau când vrei să scalezi pe mai mulți workeri. Adaugă Redis și pornește procese worker separate. Ține cont că fiecare worker e un proces Node cu consumul lui de memorie.
+Cât RAM îmi trebuie?
Pentru configurația din acest ghid, 4 GB acoperă confortabil n8n plus Postgres. Cu 2 GB pornești, dar fără marjă pentru workflow-uri care încarcă fișiere mari.