# ============================================================================= # 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: