4f3e959805
Per VPS condiviso (es. con Gitea) dove Traefik gestisce già 80/443.
- gateway/Caddyfile: env-aware listen + auto_https + trusted_proxies
(defaults invariati per modalità standalone).
- docker-compose.traefik.yml: overlay che rimuove ports binding host,
attacca gateway alla network esterna di Traefik, set labels per
routing Host(cerbero-mcp.tielogic.xyz) + TLS via certresolver
Traefik. Caddy ascolta plain HTTP :80 interno.
- scripts/deploy.sh: rileva BEHIND_TRAEFIK=true → aggiunge -f
docker-compose.traefik.yml a tutti i docker compose call.
- DEPLOYMENT.md: nuova sezione 2a (topologia standalone vs behind-traefik)
+ sotto-sezione modalità behind-Traefik con env vars richieste.
Uso:
docker compose -f docker-compose.prod.yml -f docker-compose.traefik.yml \
--env-file .env up -d
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
61 lines
2.9 KiB
YAML
61 lines
2.9 KiB
YAML
# docker-compose.traefik.yml — overlay per integrare Cerbero_mcp con un
|
|
# Traefik già esistente sull'host (es. lo stesso VPS che ospita Gitea).
|
|
#
|
|
# USO:
|
|
# docker compose -f docker-compose.prod.yml -f docker-compose.traefik.yml \
|
|
# --env-file .env up -d
|
|
#
|
|
# Differenze vs docker-compose.prod.yml standalone:
|
|
# - Gateway Caddy NON ha ports binding host (Traefik è il punto di ingresso
|
|
# pubblico su 80/443).
|
|
# - Gateway è connesso anche alla network esterna `traefik` (override env
|
|
# TRAEFIK_NETWORK se diversa, es. `gitea_traefik-public`).
|
|
# - Caddy NON fa auto-TLS — Traefik termina TLS e fa ACME Let's Encrypt.
|
|
# Caddy ascolta in chiaro su :80 dentro Docker network.
|
|
# - Trusted proxies: Caddy rispetta X-Forwarded-For ricevuto da Traefik
|
|
# per il match `remote_ip` (rate limit + WRITE_ALLOWLIST).
|
|
# - Labels Traefik su gateway: routing Host(`cerbero-mcp.tielogic.xyz`) +
|
|
# TLS automatic.
|
|
#
|
|
# Variabili .env aggiuntive richieste:
|
|
# TRAEFIK_NETWORK=gitea_traefik-public # nome network di Traefik
|
|
# TRAEFIK_CERTRESOLVER=letsencrypt # nome resolver in tua config Traefik
|
|
# TRAEFIK_ENTRYPOINT=websecure # entrypoint HTTPS Traefik
|
|
|
|
networks:
|
|
traefik:
|
|
external: true
|
|
name: ${TRAEFIK_NETWORK:-gitea_traefik-public}
|
|
|
|
services:
|
|
gateway:
|
|
# Override: niente port binding host, traffica solo via Traefik
|
|
ports: !reset []
|
|
networks:
|
|
- internal
|
|
- traefik
|
|
environment:
|
|
ACME_EMAIL: ${ACME_EMAIL:-adrianodalpastro@tielogic.com}
|
|
WRITE_ALLOWLIST: ${WRITE_ALLOWLIST:-127.0.0.1/32 ::1/128 172.16.0.0/12}
|
|
# Mode behind-proxy: Caddy ascolta plain HTTP su :80, no auto_https
|
|
LISTEN: ":80"
|
|
AUTO_HTTPS: "off"
|
|
# Traefik è il proxy che inoltra; trusta range privati + opz. CIDR Traefik
|
|
TRUSTED_PROXIES: ${TRUSTED_PROXIES:-private_ranges}
|
|
labels:
|
|
com.centurylinklabs.watchtower.enable: "true"
|
|
traefik.enable: "true"
|
|
traefik.docker.network: ${TRAEFIK_NETWORK:-gitea_traefik-public}
|
|
traefik.http.routers.cerbero-mcp.rule: "Host(`cerbero-mcp.tielogic.xyz`)"
|
|
traefik.http.routers.cerbero-mcp.entrypoints: ${TRAEFIK_ENTRYPOINT:-websecure}
|
|
traefik.http.routers.cerbero-mcp.tls: "true"
|
|
traefik.http.routers.cerbero-mcp.tls.certresolver: ${TRAEFIK_CERTRESOLVER:-letsencrypt}
|
|
traefik.http.services.cerbero-mcp.loadbalancer.server.port: "80"
|
|
# Security headers a livello Traefik (ridondante con Caddy ma utile se
|
|
# in futuro Caddy viene rimosso). Commenta se non vuoi duplicazione.
|
|
traefik.http.routers.cerbero-mcp.middlewares: cerbero-mcp-secheaders@docker
|
|
traefik.http.middlewares.cerbero-mcp-secheaders.headers.stsSeconds: "31536000"
|
|
traefik.http.middlewares.cerbero-mcp-secheaders.headers.stsIncludeSubdomains: "true"
|
|
traefik.http.middlewares.cerbero-mcp-secheaders.headers.contentTypeNosniff: "true"
|
|
traefik.http.middlewares.cerbero-mcp-secheaders.headers.referrerPolicy: "no-referrer"
|