Ves al contingut
Tornar al blog

Desplegar una aplicació Docker Compose en un VPS: xarxa privada, HTTPS i còpies

Guia pràctica per executar una pila Docker Compose al teu VPS, aïllar PostgreSQL i preparar actualitzacions, còpies i recuperació.

  • Docker
  • VPS
  • Desplegament

Que docker compose up -d acabi sense errors no vol dir que ja tinguis l’aplicació preparada per a producció. En un VPS també t’encarregues del sistema operatiu, el tallafoc, el domini, els certificats, les actualitzacions, les dades i la recuperació si alguna cosa falla. Aquesta guia pressuposa que ja tens un repositori amb Dockerfile i una aplicació que escolta a 0.0.0.0:8080 dins del contenidor i entén les variables de base de dades de l’exemple. Comprova l’adreça d’escolta del framework: si només s’enllaça a 127.0.0.1 o localhost, Caddy no la podrà contactar des d’un altre contenidor. És un esquema per adaptar al teu projecte, no un desplegament automàtic ni una garantia que qualsevol aplicació encaixi en qualsevol servidor.

Si només tens una web estàtica i no cal mantenir cap procés actiu, mira primer Hostbrid Projects. Un VPS pot ser adequat quan necessites control del sistema i pots administrar-lo. Hostbrid ofereix VPS; la instal·lació i el manteniment de Docker i de les aplicacions són responsabilitat teva. Consulta les mides i la disponibilitat actuals a la pàgina de VPS abans de decidir els recursos.

Abans de contractar, consulta la guia per mesurar RAM, CPU i disc d’una app Docker; aquesta pàgina se centra en desplegar la pila i protegir-ne els serveis.

Per desplegar n8n, consulta la guia de n8n en un VPS, amb les opcions d’instal·lació ràpida i Docker Compose.

Decideix quins serveis són públics

El navegador ha de connectar-se a un proxy invers, no al port de la base de dades. En aquest exemple Caddy rep les peticions web i les reenvia a l’aplicació; PostgreSQL no publica cap port al servidor. Compose dona noms DNS als serveis dins d’una xarxa compartida, així que l’aplicació pot arribar a db:5432 sense exposar PostgreSQL a Internet. La guia de xarxes Docker explica com es comuniquen els contenidors, i Docker documenta l’ús de Compose en producció.

Crea compose.yaml al costat del Dockerfile de l’aplicació i un Caddyfile com el següent. Canvia les variables de app perquè coincideixin amb les que el teu codi suporta. La imatge ha de llegir DB_HOST, DB_NAME, DB_USER i DB_PASSWORD; afegir variables a Compose no fa que un programa sàpiga connectar-se a PostgreSQL.

services:
  app:
    build: .
    restart: unless-stopped
    environment:
      PORT: "8080"
      DB_HOST: db
      DB_PORT: "5432"
      DB_NAME: ${DB_NAME:?set DB_NAME in .env}
      DB_USER: ${DB_USER:?set DB_USER in .env}
      DB_PASSWORD: ${DB_PASSWORD:?set DB_PASSWORD in .env}
    expose: ["8080"]
    networks: [edge, data]
    depends_on:
      db:
        condition: service_healthy

  db:
    image: postgres:17
    restart: unless-stopped
    environment:
      POSTGRES_DB: ${DB_NAME:?set DB_NAME in .env}
      POSTGRES_USER: ${DB_USER:?set DB_USER in .env}
      POSTGRES_PASSWORD: ${DB_PASSWORD:?set DB_PASSWORD in .env}
    volumes: [postgres_data:/var/lib/postgresql/data]
    networks: [data]
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"]
      interval: 10s
      timeout: 5s
      retries: 5

  caddy:
    image: caddy:2
    restart: unless-stopped
    environment:
      SITE_DOMAIN: ${SITE_DOMAIN:?set SITE_DOMAIN in .env}
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data
      - caddy_config:/config
    networks: [edge]
    depends_on: [app]

networks:
  edge: {}
  data:
    internal: true

volumes:
  postgres_data: {}
  caddy_data: {}
  caddy_config: {}
{$SITE_DOMAIN} {
    encode zstd gzip
    reverse_proxy app:8080
}

La xarxa data és interna i només uneix l’aplicació i la base de dades. L’aplicació també forma part d’edge perquè Caddy hi pugui accedir; PostgreSQL no comparteix la xarxa pública del servidor ni la de Caddy. expose descriu el port de l’aplicació dins la pila, però no el publica a l’host. Només Caddy obre els ports 80 i 443. El volum de PostgreSQL conserva les dades quan substitueixes el contenidor. Docker explica que els volums tenen un cicle de vida separat dels contenidors, però un volum al mateix VPS no és una còpia de seguretat.

Prepara el VPS, el domini i el tallafoc

Tria una versió de Linux amb manteniment, instal·la les actualitzacions i crea un usuari d’administració sense privilegis de root amb claus SSH. Instal·la Docker Engine i el complement Compose seguint les instruccions oficials de la distribució. Mantén oberta una segona sessió SSH abans d’endurir el tallafoc: una regla errònia pot deixar-te fora. Si és possible, restringeix SSH a adreces de confiança i permet el trànsit web quan la pàgina hagi de ser pública. Docker avisa que els ports publicats poden interactuar amb les regles del tallafoc d’una manera que no és evident. Verifica el comportament amb la versió de Docker i el tallafoc que fas servir; no donis per fet que una regla d’UFW filtra tots els ports publicats. Consulta la documentació sobre publicació de ports.

Apunta el registre A del domini a la IPv4 del VPS. Afegeix un registre AAAA només si IPv6 està configurat i té ruta fins al servidor. Comprova el DNS des d’una altra xarxa. L’HTTPS automàtic de Caddy necessita un domini públic i els ports de validació accessibles. Permet TCP 80 i 443 tant al tallafoc de xarxa del proveïdor com al del sistema. No publiquis el port 5432 perquè et sigui més còmode connectar-t’hi de tant en tant. Si has d’administrar la base a distància, fes servir una xarxa privada o un túnel autenticat amb l’accés limitat.

Crea un .env privat amb SITE_DOMAIN, DB_NAME, DB_USER i una contrasenya llarga generada per a DB_PASSWORD. Limita els permisos del fitxer, exclou-lo de Git i afegeix-lo a .dockerignore, perquè build: . envia un context al constructor. No enganxis els valors en incidències ni captures de pantalla. El .env de Compose és configuració, no una caixa forta de secrets: qui tingui accés root o a Docker pot inspeccionar els paràmetres dels contenidors. Canvia les credencials si es filtren. Des de dins d’un contenidor, localhost vol dir el mateix contenidor; en aquest exemple l’aplicació ha de trobar la base amb el nom db.

Comprova la configuració i l’aplicació

Des del directori del projecte, executa:

docker compose config -q
docker compose up -d --build
docker compose ps
docker compose logs --tail=100 app db caddy

config -q detecta errors de sintaxi i variables obligatòries absents, però no comprova que l’aplicació funcioni. Verifica que la base arribi a l’estat saludable, que els registres de l’aplicació mostrin una connexió correcta i que Caddy pugui obtenir el certificat. Des d’una connexió externa, obre el domini amb HTTPS i prova l’inici de sessió, els formularis, les càrregues de fitxers i el recorregut important dels usuaris. Comprova també que 80 i 443 siguin accessibles i que 5432 no ho sigui. Que el contenidor aparegui com a actiu no demostra que la web respongui bé ni que puguis recuperar les dades.

Actualitza amb un pla de retorn

Desa el codi i els fitxers Compose en un repositori privat, però deixa .env i les dades reals fora de Git. Abans de cada canvi, apunta quina versió o quin commit està en producció. Construeix o descarrega la versió nova, valida la configuració final i aplica el canvi expressament. La guia de producció de Compose de Docker explica com separar els ajustos de producció i recrear serveis concrets. Abans d’una actualització arriscada, prova-la sobre una còpia restaurada de les dades. Tornar al codi anterior no desfà necessàriament una migració de base de dades; tracta el canvi d’esquema a part.

Fes còpies de PostgreSQL amb una eina que conegui el motor i desa-les fora del VPS. Practica la restauració en un entorn aïllat. Inclou els fitxers que hagin pujat els usuaris, la configuració i les dades de Caddy quan siguin importants. Una còpia en calent del volum de PostgreSQL pot quedar inconsistent: segueix el procediment recomanat pel motor. Xifra les còpies externes i defineix quant de temps les conservaràs. Abans de recrear contenidors, comprova que les dades duradores siguin en un volum o un emmagatzematge persistent. No facis servir docker compose down -v com a neteja habitual: -v pot esborrar els volums amb nom i les dades que contenen.

Aquest patró no inclou desplegament automàtic Docker de Hostbrid, supervisió, aplicació de pedaços, servei de còpies, garantia de disponibilitat ni recomanació de capacitat. Si vols administrar el teu propi servidor, compara els plans VPS de Hostbrid; per parlar de quin s’ajusta al projecte, pots contactar amb l’equip. La guia per diagnosticar un servei Node amb Docker tracta el port i la salut d’un procés; no cobreix el desplegament d’aquesta pila amb diversos serveis.

Gestiona els teus webs, servidors i correu.

És gratis i triga un minut.

Mínim 8 caràcters. Ni només números ni una contrasenya comuna.

T’enviarem un correu per confirmar el compte.