158 lines
4.8 KiB
YAML
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:
|