Files
suaveplan/ops/registry/docker-compose.yml
2026-05-27 23:29:53 +01:00

57 lines
1.7 KiB
YAML

# Single-service Docker Compose for ui.suaveplan.com.
#
# The Caddy container serves /srv/registry from the OVH host as
# read-only. Cert state survives container restarts via the named
# `caddy_data` and `caddy_config` volumes — restarting the container
# does NOT trigger an ACME re-issuance.
#
# Usage on the OVH host:
# cp .env.example .env # fill in placeholder values if any deploy
# # script reads them; runtime needs none.
# docker compose up -d
#
# Verify:
# curl -fsSL https://ui.suaveplan.com/health # → "ok"
# docker compose ps # status: healthy
services:
registry:
build:
context: .
dockerfile: Dockerfile
image: suaveplan/registry:latest
container_name: suaveplan-registry
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
# Static content tree — populated by the GitHub Actions deploy
# job via rsync. Read-only inside the container; Caddy never
# mutates the served files.
- /srv/registry:/srv/registry:ro
# Cert state and config cache. Persists across container
# rebuilds so Let's Encrypt isn't re-hit on every deploy.
- caddy_data:/data
- caddy_config:/config
environment:
# No secrets here. ACME contact email is baked into Caddyfile.
TZ: UTC
healthcheck:
test: ["CMD-SHELL", "wget -q -O- --no-check-certificate https://127.0.0.1/health | grep -q '^ok$$' || exit 1"]
interval: 30s
timeout: 10s
retries: 3
start_period: 15s
logging:
driver: json-file
options:
max-size: "50m"
max-file: "5"
volumes:
caddy_data:
name: suaveplan_registry_caddy_data
caddy_config:
name: suaveplan_registry_caddy_config