Files
ENI-projet-piscine/infra
Johan LEROY 3e871a3e8b feat(deploy): URL sans port et certificats Let's Encrypt sur la VM ENI
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.
2026-09-23 11:21:12 +02:00
..

Infrastructure

Provisionnement Terraform des machines on-premise. Terraform prepare la machine, GitHub Actions deploie l'application : voir l'ADR 0010. Rien ici ne construit d'image ni ne lance de conteneur.

  • terraform/modules : modules reutilisables.
    • k3s : installe un cluster k3s single-node sur une machine distante via SSH (script officiel get.k3s.io) et rapatrie le kubeconfig en local.
  • terraform/environments/<racine> : une racine par machine provisionnee.
    • vm-eni : la VM eadl-2025-nantes-g3, qui porte les environnements dev, rec et prod (ADR 0009, ADR 0017). Installe Docker, execute scripts/provision-host.sh, enregistre le runner GitHub Actions.
    • k3s-cible : le cluster k3s, cible a terme de docs/architecture/10-infra.md. Jamais applique.

Usage (environments/vm-eni)

cd infra/terraform/environments/vm-eni
cp terraform.tfvars.example terraform.tfvars
terraform init
terraform apply

terraform.tfvars est ignore par git. Trois valeurs sont a renseigner avant l'apply :

  • proprietaire : l'utilisateur qui possede /srv/enervision et fait tourner le runner. Il doit deja exister sur la machine.
  • runner_version : a epingler depuis https://github.com/actions/runner/releases.
  • runner_token : jeton d'enregistrement, valable une heure et pour une seule inscription. Parametres du depot, Actions, Runners, New self-hosted runner. Seul un administrateur du depot peut le creer.

Apres l'apply, la machine porte /srv/enervision/dev, /srv/enervision/rec et /srv/enervision/prod, chacun avec son .env et son certificat. Le premier demarrage reste manuel, make stack-up dans chaque dossier ; les suivants sont joues par le runner a chaque push sur dev et sur main, et a chaque lancement manuel d'une autre branche pour dev.

Noms et certificats (ADR 0018) : avant l'apply, l'enregistrement DuckDNS de domaine doit viser ssh_host, et son jeton se trouver dans <racine>/duckdns.token (600, proprietaire). L'apply obtient alors un certificat Let's Encrypt par environnement et planifie leur renouvellement ; sans jeton, chaque environnement garde un certificat auto-signe. Le frontal SNI (infra/front) se demarre une fois depuis le dossier de la prod, make front-up.

Retirer le runner se fait a la main, depuis les parametres du depot : terraform destroy ne le desinscrit pas.

Usage (environments/k3s-cible)

cd infra/terraform/environments/k3s-cible
cp terraform.tfvars.example terraform.tfvars   # renseigner ssh_host / ssh_private_key_path
terraform init
terraform apply

Le kubeconfig est ecrit localement au chemin defini par kubeconfig_output_path (par defaut ./kubeconfig, ignore par git).