Les trois environnements passent sur enervision-g3.duckdns.org, rec. et dev. : noms publics qui visent l'IP privée de la VM, donc résolus sans /etc/hosts sur le réseau de l'école et injoignables ailleurs (ADR 0018). - infra/front : nginx sur le réseau de l'hôte, seul exposé en 80 et 443. Aiguille par SNI vers la stack visée sans déchiffrer le TLS, et lui transmet l'IP du client en PROXY protocol. - Proxy de stack : écouteur 4443 en PROXY protocol, real_ip_header ; sans lui, limit_req et get_client_ip() compteraient tous les postes comme un seul. PROXY_FRONT_PORT le publie sur 127.0.0.1. - make tls-duckdns : Let's Encrypt par défi DNS-01 via l'API DuckDNS (acme.sh 3.1.6), rejouable, rejoué à chaque déploiement et chaque nuit. - provision-host.sh fait foi pour l'adressage et les secrets : un .env existant garde ses secrets, reçoit ceux qui manquent (supervision) et voit hôte et ports réalignés. Planifie le renouvellement des certificats. - deploy.yml : nouvelles URL, sonde prod sur 10443, front-up en prod. - Terraform : variable domaine. CI : validation du frontal.
108 lines
3.9 KiB
YAML
108 lines
3.9 KiB
YAML
name: Infra
|
|
|
|
# Pourquoi : rien de ce qui décrit l'infrastructure ne s'exécute avant le déploiement. Terraform est
|
|
# resté cassé sans que rien ne le dise, faute de job qui le joue : ce workflow n'applique rien, il
|
|
# vérifie le Terraform, les fichiers Compose et les workflows eux-mêmes - jobs terraform, compose,
|
|
# workflows. ci.yml choisit par ses entrées ceux qui tournent (ADR 0014).
|
|
# Piège : la boucle Terraform parcourt `environments/*`, pour qu'une racine ajoutée soit couverte
|
|
# sans toucher à ce fichier.
|
|
|
|
on:
|
|
workflow_call:
|
|
inputs:
|
|
terraform:
|
|
type: boolean
|
|
default: false
|
|
compose:
|
|
type: boolean
|
|
default: false
|
|
workflows:
|
|
type: boolean
|
|
default: false
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
jobs:
|
|
terraform:
|
|
name: Formatage et validation Terraform
|
|
if: inputs.terraform
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 10
|
|
|
|
steps:
|
|
- name: Récupère le dépôt
|
|
uses: actions/checkout@v7
|
|
|
|
# Action tierce, épinglée sur le commit du tag (règle Sonar githubactions:S7637).
|
|
- name: Installe Terraform
|
|
uses: hashicorp/setup-terraform@dfe3c3f87815947d99a8997f908cb6525fc44e9e # v4.0.1
|
|
with:
|
|
terraform_version: 1.16.3
|
|
terraform_wrapper: false
|
|
|
|
- name: Vérifie le formatage
|
|
run: terraform fmt -check -recursive infra/terraform
|
|
|
|
- name: Valide chaque racine
|
|
run: |
|
|
for racine in infra/terraform/environments/*/; do
|
|
echo "::group::${racine}"
|
|
terraform -chdir="${racine}" init -backend=false -input=false
|
|
terraform -chdir="${racine}" validate
|
|
echo "::endgroup::"
|
|
done
|
|
|
|
compose:
|
|
name: Validation des fichiers Compose et de la supervision
|
|
if: inputs.compose
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 10
|
|
|
|
steps:
|
|
- name: Récupère le dépôt
|
|
uses: actions/checkout@v7
|
|
|
|
# Compose interpole tout le fichier : les `:?` exigent une valeur, pas un vrai secret.
|
|
- name: Prépare un .env d'exemple
|
|
run: cp .env.example .env
|
|
|
|
- name: Valide la stack de développement
|
|
run: docker compose config --quiet
|
|
|
|
- name: Valide la stack déployée, profils compris
|
|
run: docker compose -f docker-compose.yml -f docker-compose.prod.yml --profile acme --profile monitoring --profile load config --quiet
|
|
|
|
- name: Valide le frontal SNI de la VM
|
|
run: |
|
|
docker compose -f infra/front/compose.yml config --quiet
|
|
docker run --rm -v "$PWD/infra/front/nginx.conf:/etc/nginx/nginx.conf:ro" nginx:1.31-alpine nginx -t
|
|
|
|
# Mêmes commandes que `make monitoring-check` : images et montages viennent du fichier Compose.
|
|
- name: Valide la configuration de Prometheus et ses règles
|
|
run: docker compose --profile monitoring run --rm --no-deps --entrypoint promtool prometheus check config /etc/prometheus/prometheus.yml
|
|
|
|
- name: Joue les tests unitaires des règles d'alerte
|
|
run: docker compose --profile monitoring run --rm --no-deps --entrypoint promtool prometheus test rules /etc/prometheus/tests/enervision.test.yml
|
|
|
|
- name: Valide la configuration d'Alertmanager
|
|
run: docker compose --profile monitoring run --rm --no-deps --entrypoint amtool alertmanager check-config /etc/alertmanager/alertmanager.yml
|
|
|
|
- name: Valide les tableaux de bord Grafana
|
|
run: for tableau in monitoring/grafana/dashboards/*.json; do jq empty "$tableau"; done
|
|
|
|
workflows:
|
|
name: Analyse des workflows
|
|
if: inputs.workflows
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 10
|
|
|
|
steps:
|
|
- name: Récupère le dépôt
|
|
uses: actions/checkout@v7
|
|
|
|
# Image épinglée par tag, comme les images des fichiers Compose. Elle embarque shellcheck,
|
|
# qui analyse aussi les blocs `run:`.
|
|
- name: actionlint
|
|
run: docker run --rm -v "$PWD:/repo" --workdir /repo rhysd/actionlint:1.7.12 -color
|