Sari la conținut
servervps.roPanou client

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
  1. 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
  2. 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
  3. 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.

  4. 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:
  5. 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
    }
  6. 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
  7. 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.