EQVPS
Inizia

Come distribuire uno stack Docker Compose su un VPS

Distribuisci uno stack multi-container su un VPS con Docker Compose: scrivi docker-compose.yml, tieni i segreti in .env, avvialo con riavvio-dopo-reboot e pubblica solo le porte che intendi davvero. Esempio copia-incolla con un'app web, database e reverse proxy.

Docker Compose descrive uno stack multi-container in un solo file e lo esegue con un comando. Questa è la guida al deploy; prima installa Docker se non l'hai fatto. Per uno stack specifico per agenti IA (agente + DB vettoriale + Redis), vedi docker-compose per agenti IA.

1. Uno stack: app + database + reverse proxy

# /opt/stack/docker-compose.yml
services:
  app:
    image: your/app:latest
    restart: unless-stopped
    env_file: [.env]
    depends_on: [db]
    # no ports: — reached only through the proxy below

  db:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    volumes: ["pg:/var/lib/postgresql/data"]   # internal only

  caddy:                                        # HTTPS automatically
    image: caddy:2
    restart: unless-stopped
    ports: ["80:80", "443:443"]                 # the only public entrypoint
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data

volumes: { pg: {}, caddy_data: {} }

I segreti vivono in .env, mai nel file compose:

# /opt/stack/.env  (chmod 600, git-ignored)
DB_PASSWORD=a-long-random-string

Un Caddyfile minimo fa da proxy del tuo dominio all'app e ottiene HTTPS da solo:

app.yourdomain.com {
  reverse_proxy app:8080
}

2. Avvialo

cd /opt/stack
docker compose up -d
docker compose ps
docker compose logs -f app

restart: unless-stopped su ogni servizio + Docker abilitato al boot = lo stack torna da solo dopo un reboot.

3. Comandi di ogni giorno

docker compose pull && docker compose up -d   # update images
docker compose down                            # stop the stack
docker compose restart app                     # restart one service

La parte che la gente sbaglia: porte esposte

Docker pubblica le porte tramite iptables, quindi un container con ports: ["5432:5432"] è raggiungibile da internet anche dietro un firewall UFW che credevi chiuso. Pubblica solo il punto d'ingresso pubblico (il proxy su 80/443); tieni database e cache sulla rete compose o vincolati a 127.0.0.1. Tutto ciò che serve traffico web richiede un piano a IP dedicato; abbinalo a un firewall UFW.

Per un intero stack dietro un IP, vedi self-host di più servizi. Root in circa un minuto, NVMe, niente KYC, pagamento in cripto.

FAQ

Come distribuisco uno stack Docker Compose su un VPS?

Installa Docker con il plugin Compose, scrivi un docker-compose.yml che descrive ogni servizio, tieni i segreti in un .env ignorato da git, poi docker compose up -d. Metti restart: unless-stopped su ogni servizio e abilita Docker al boot così lo stack sopravvive ai reboot. L'esempio sotto esegue un'app web, Postgres e un reverse proxy Caddy.

Dove vanno i segreti — nel file compose?

No. Mettili in un file .env (chmod 600, ignorato da git) e referenziali come ${VAR} in compose, oppure usa i Docker secrets. Non committare mai password o chiavi API in docker-compose.yml — un file trapelato con credenziali attive è l'errore classico.

Lo stack tornerà dopo un reboot?

Solo se glielo dici. Metti restart: unless-stopped (o always) su ogni servizio e abilita Docker al boot (systemctl enable docker). Allora docker compose up -d sopravvive ai reboot e riavvia i container caduti.

Quali porte vengono esposte?

Solo ciò che pubblichi con ports:. Vincola i servizi interni (database, cache) alla rete compose o a 127.0.0.1 e pubblica solo il punto d'ingresso pubblico — di solito un reverse proxy su 80/443. Docker pubblica tramite iptables, quindi una riga ports: accidentale è raggiungibile da internet anche dietro UFW.

Chiedete un documento o una carta?

No. Un'email per registrarti, pagamento in USDC o USDT — niente documenti, niente carta. Root in circa un minuto.

Commenti

Ancora nessun commento. Sii il primo.

Lascia un commento

I commenti sono moderati prima di comparire.