Infrastructure
Les ressources Google Cloud
| Ressource | Valeur |
|---|---|
| Projet | timemanager-eh28 |
| Région / zone | europe-west1 / europe-west1-b (Belgique) |
| Réseau | VPC default |
| VM | Type de machine | Disque | Rôle |
|---|---|---|---|
tm-prod | e2-medium (2 vCPU, 4 Go) | 30 Go « balanced » | l'application |
tm-tooling | e2-standard-2 (2 vCPU, 8 Go) | 50 Go « balanced » | Jenkins et les builds |
Les deux VM tournent sous Ubuntu 24.04 LTS et ont été créées avec :
- Shielded VM activé : démarrage sécurisé, vTPM et contrôle d'intégrité ;
- un compte de service dédié
tm-nodessans aucun rôle IAM, au lieu du compte Compute par défaut, qui a le rôle Éditeur sur tout le projet ; - une IP externe statique, pour que les adresses survivent à un arrêt et un redémarrage de la VM.
Les commandes de création sont dans Mise en place.
Les adresses
Définies dans ansible/inventory.ini :
[prod]
tm-prod ansible_host=34.140.149.187 private_ip=10.132.0.2
[tooling]
tm-tooling ansible_host=34.156.3.169 private_ip=10.132.0.3| tm-prod | tm-tooling | |
|---|---|---|
| IP publique (statique) | 34.140.149.187 | 34.156.3.169 |
| IP interne | 10.132.0.2 | 10.132.0.3 |
Les IP internes ne sont écrites que dans inventory.ini. Les autres fichiers les lisent avec hostvars : si une adresse change, il n'y a qu'un endroit à modifier.
Les échanges entre les deux machines passent toujours par le réseau interne :
| De | Vers | Pour |
|---|---|---|
| Traefik (tm-prod) | 10.132.0.3:8080 | Afficher Jenkins sur ci.time.jostud.com |
| Jenkins (tm-tooling) | deploy@10.132.0.2 en SSH | Déployer |
Le pare-feu
Deux couches de filtrage s'appliquent l'une après l'autre.
Le pare-feu Google Cloud (devant les VM)
| Règle | Autorise | Cible |
|---|---|---|
tm-allow-web | TCP 80 et 443 depuis partout | les VM avec le tag web (tm-prod seulement) |
default-allow-ssh | TCP 22 depuis partout | toutes les VM |
default-allow-internal | tout le trafic à l'intérieur du VPC | toutes les VM |
default-allow-icmp | ping | toutes les VM |
La règle par défaut default-allow-rdp a été supprimée : les VM sont sous Linux et n'ont pas besoin du bureau à distance Windows.
UFW (sur chaque VM, géré par Ansible)
| VM | Ports entrants autorisés |
|---|---|
tm-prod | 22, 80, 443 |
tm-tooling | 22 |
Docker passe avant UFW
Docker publie ses ports en écrivant ses propres règles iptables, qui contournent UFW. C'est pour ça que seul Traefik publie des ports sur tm-prod, et que Jenkins publie son port uniquement sur l'IP interne de tm-tooling. Tous les autres conteneurs ne sont joignables que par les réseaux Docker.
Le DNS
Les enregistrements DNS sont gérés chez le registraire (Hostinger). Tous les noms pointent vers l'IP statique de tm-prod, où Traefik aiguille chaque requête :
| Enregistrement | Type | Cible |
|---|---|---|
time.jostud.com | A | tm-prod |
api.time.jostud.com | A | tm-prod |
ci.time.jostud.com | A | tm-prod |
docs.time.jostud.com | A | tm-prod |
Jenkins est joint à travers tm-prod : Traefik transmet ci.time.jostud.com à tm-tooling par le réseau interne. tm-tooling n'expose donc aucun port web sur internet.
Les ports
| Port | Où | Qui écoute | Ouvert sur internet |
|---|---|---|---|
| 22 | les deux VM | SSH | Oui |
| 80 | tm-prod | Traefik (redirige vers 443) | Oui |
| 443 | tm-prod | Traefik | Oui |
| 8080 | conteneur front | nginx | Non, via Traefik |
| 8080 | conteneur docs | nginx | Non, via Traefik |
| 4000 | conteneur back | Phoenix | Non, via Traefik |
| 5432 | conteneur db | PostgreSQL | Non, seulement depuis back |
| 8080 | tm-tooling, IP interne | Jenkins | Non, via Traefik |
Les dossiers sur les serveurs
tm-prod
/opt/timemanager/
├── traefik/
│ ├── docker-compose.yml
│ ├── traefik.yml
│ ├── dynamic/ api.yml, frontend.yml, docs.yml, jenkins.yml
│ └── acme.json les certificats (0600)
└── app/ propriétaire : deploy
├── docker-compose.yml
└── .env les secrets de l'application (0600)tm-tooling
/opt/timemanager/
└── jenkins/
├── Dockerfile, docker-compose.yml, casc.yml, job_dsl.groovy, pipelines/, Plugins/
├── .env mots de passe et jetons de Jenkins (0600)
└── secrets/
└── deploy_key la clé SSH de déploiement (0600)Les utilisateurs Linux
| Utilisateur | Machine | Rôle |
|---|---|---|
eliashounnou | les deux | L'administrateur, utilisé par Ansible (ansible_user). SSH par clé, sudo. |
deploy | tm-prod | Celui qu'utilise Jenkins pour déployer. Membre du groupe docker, propriétaire de /opt/timemanager/app, n'accepte que la clé publique de Jenkins. |