Files
gesthub/docker-compose.yml
2026-08-21 09:12:02 +02:00

158 lines
4.8 KiB
YAML

# =============================================================================
# docker-compose.yml — Infrastructure as Code de GestHub (Bloc 4 - C5).
# =============================================================================
# Décrit l'état désiré de l'infrastructure complète : services, réseau interne,
# volumes persistants. Reproductible sur n'importe quelle machine Linux avec
# Docker installé, via `docker compose up -d` (voir procédure de déploiement,
# Bloc 2 - C2 "avant/après").
#
# Seul Caddy expose des ports publics — tous les autres services communiquent
# uniquement via le réseau Docker interne `gesthub-net` (mitigation du risque
# "exposition des ports internes", tableau OWASP du dossier technique).
# =============================================================================
services:
# --- Tier présentation : reverse proxy + HTTPS automatique ---
caddy:
image: caddy:2.8-alpine
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data
- caddy_config:/config
depends_on:
- flask
networks:
- gesthub-net
# --- Tier applicatif : application Flask (routes/services/models) ---
flask:
build: ./web
restart: unless-stopped
env_file:
- ./web/.env
depends_on:
mariadb:
condition: service_healthy
volumes:
- uploads_data:/app/static/assets/uploads
expose:
- "5000"
networks:
- gesthub-net
# --- Tier données : base applicative MariaDB ---
mariadb:
image: mariadb:10.11
restart: unless-stopped
environment:
- MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD:-changeme}
- MYSQL_DATABASE=gesthub
- MYSQL_USER=flaskuser
- MYSQL_PASSWORD=${DB_PASSWORD:-changeme}
volumes:
- mariadb_data:/var/lib/mysql
- ./web/init.sql:/docker-entrypoint-initdb.d/init.sql:ro
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 10s
timeout: 5s
retries: 6
expose:
- "3306"
networks:
- gesthub-net
# --- Tier identité : SSO Keycloak (realm gesthub) ---
keycloak:
image: quay.io/keycloak/keycloak:24.0.3
restart: unless-stopped
command:
- start
- --hostname=keycloak.ninolbt.com
- --proxy-headers=xforwarded
environment:
- KEYCLOAK_ADMIN=${KC_ADMIN_USER:-admin}
- KEYCLOAK_ADMIN_PASSWORD=${KC_ADMIN_PASSWORD:-changeme}
- KC_DB=postgres
- KC_DB_URL_HOST=keycloak-db
- KC_DB_URL_DATABASE=keycloak
- KC_DB_USERNAME=keycloak
- KC_DB_PASSWORD=${KC_DB_PASSWORD:-changeme}
depends_on:
- keycloak-db
expose:
- "8080"
networks:
- gesthub-net
keycloak-db:
image: postgres:16-alpine
restart: unless-stopped
environment:
- POSTGRES_DB=keycloak
- POSTGRES_USER=keycloak
- POSTGRES_PASSWORD=${KC_DB_PASSWORD:-changeme}
volumes:
- keycloakdb_data:/var/lib/postgresql/data
networks:
- gesthub-net
# --- Chat & Kanban : réutilisation d'outils matures plutôt que
# réimplémentation (choix DRY documenté, Bloc 2 - C6) ---
#
# Déploiement cible = Raspberry Pi (ARM64/aarch64, OS 64 bits) : toutes les
# images de ce fichier sont multi-arch officielles (Caddy, MariaDB,
# Keycloak, Postgres) SAUF mattermost/mattermost-team-edition, qui n'existe
# qu'en linux/amd64 (voir issue mattermost/mattermost#21979 — aucune image
# ARM officielle à ce jour). On utilise donc un build communautaire arm64,
# à la même version (9.11), quasi drop-in (mêmes variables d'env
# MM_SQLSETTINGS_*, mêmes ports/volumes) :
# https://github.com/ngrie/mattermost-team-edition-arm-docker
# Sur un hôte amd64 (CI, dev sur PC), repasser à l'image officielle
# mattermost/mattermost-team-edition:9.11.
mattermost:
image: ngrie/mattermost-team-edition-arm:9.11
restart: unless-stopped
environment:
- MM_SQLSETTINGS_DRIVERNAME=postgres
- MM_SQLSETTINGS_DATASOURCE=postgres://mmuser:${MM_DB_PASSWORD:-changeme}@mattermost-db:5432/mattermost?sslmode=disable
- MM_SERVICESETTINGS_SITEURL=https://chat.ninolbt.com
depends_on:
- mattermost-db
volumes:
- mattermost_data:/mattermost/data
expose:
- "8065"
networks:
- gesthub-net
mattermost-db:
image: postgres:16-alpine
restart: unless-stopped
environment:
- POSTGRES_DB=mattermost
- POSTGRES_USER=mmuser
- POSTGRES_PASSWORD=${MM_DB_PASSWORD:-changeme}
volumes:
- mattermostdb_data:/var/lib/postgresql/data
networks:
- gesthub-net
networks:
gesthub-net:
driver: bridge
volumes:
mariadb_data:
caddy_data:
caddy_config:
uploads_data:
keycloakdb_data:
mattermost_data:
mattermostdb_data: