Skip to content

Infrastructure ​

Les ressources Google Cloud ​

RessourceValeur
Projettimemanager-eh28
Région / zoneeurope-west1 / europe-west1-b (Belgique)
RéseauVPC default
VMType de machineDisqueRôle
tm-prode2-medium (2 vCPU, 4 Go)30 Go « balanced »l'application
tm-toolinge2-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-nodes sans 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 :

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-prodtm-tooling
IP publique (statique)34.140.149.18734.156.3.169
IP interne10.132.0.210.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 :

DeVersPour
Traefik (tm-prod)10.132.0.3:8080Afficher Jenkins sur ci.time.jostud.com
Jenkins (tm-tooling)deploy@10.132.0.2 en SSHDé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ègleAutoriseCible
tm-allow-webTCP 80 et 443 depuis partoutles VM avec le tag web (tm-prod seulement)
default-allow-sshTCP 22 depuis partouttoutes les VM
default-allow-internaltout le trafic à l'intérieur du VPCtoutes les VM
default-allow-icmppingtoutes 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) ​

VMPorts entrants autorisés
tm-prod22, 80, 443
tm-tooling22

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 :

EnregistrementTypeCible
time.jostud.comAtm-prod
api.time.jostud.comAtm-prod
ci.time.jostud.comAtm-prod
docs.time.jostud.comAtm-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 ​

PortOùQui écouteOuvert sur internet
22les deux VMSSHOui
80tm-prodTraefik (redirige vers 443)Oui
443tm-prodTraefikOui
8080conteneur frontnginxNon, via Traefik
8080conteneur docsnginxNon, via Traefik
4000conteneur backPhoenixNon, via Traefik
5432conteneur dbPostgreSQLNon, seulement depuis back
8080tm-tooling, IP interneJenkinsNon, 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 ​

UtilisateurMachineRôle
eliashounnoules deuxL'administrateur, utilisé par Ansible (ansible_user). SSH par clé, sudo.
deploytm-prodCelui qu'utilise Jenkins pour déployer. Membre du groupe docker, propriétaire de /opt/timemanager/app, n'accepte que la clé publique de Jenkins.