Architecture

Une installation Aetheus, ce sont trois processus et une base de données, plus un agent par serveur géré. Savoir qui fait quoi est ce qui rend les pages d'installation lisibles.

Les processus

ComposantCe que c'estÉcoute sur
Backend Application ASP.NET Core. Propriétaire de la base, de l'API REST, de l'authentification, de l'ordonnancement des pipelines, du stockage des artefacts et du serveur Git interne. HTTP, boucle locale en production
Frontend Application Blazor WebAssembly, compilée en fichiers statiques. Elle s'exécute entièrement dans le navigateur du visiteur et appelle l'API du backend en HTTPS. Fichiers statiques, servis par n'importe quel serveur web
Base de données PostgreSQL. Source de vérité unique pour tout, sauf les blobs d'artefacts et les dépôts Git. 5432, réseau privé
Agent Processus .NET sur chaque serveur géré. Interroge le backend, remonte l'inventaire et les battements de cœur, exécute les tâches de pipeline. Rien. HTTPS sortant uniquement.

Comment circule le trafic

Deux noms d'hôte publics interviennent, et ils doivent être distincts :

  • l'hôte applicatif sert les fichiers statiques du frontend ;
  • l'hôte API sert le backend.

Le navigateur télécharge le frontend depuis l'hôte applicatif, puis effectue des appels cross-origin vers l'hôte API. Deux conséquences expliquent la plupart des problèmes de première installation :

  • il faut indiquer au frontend l'URL publique de l'API, via ApiBaseUrl ;
  • il faut que le backend accepte l'hôte applicatif comme origine CORS, via Cors__Origins__0.

Si l'un des deux est faux, l'application se charge mais chaque requête échoue. Les deux sont traités sur chaque page d'installation.

Les agents ne parlent qu'à l'hôte API. Ils ne reçoivent jamais de connexion entrante, ce qui explique qu'un agent fonctionne sur une machine sans adresse publique.

TLS et reverse proxy

Ni le backend ni le frontend ne terminent TLS. Dans toutes les configurations prises en charge, un reverse proxy porte le certificat et transmet du HTTP en clair vers la boucle locale. Lier les ports applicatifs à 127.0.0.1 plutôt qu'à 0.0.0.0 est délibéré : sur un hôte mutualisé, les publier sur toutes les interfaces exposerait l'API en clair et contournerait les journaux et les en-têtes du proxy.

L'hôte API nécessite en plus que la mise à niveau WebSocket soit relayée, sans quoi la sortie des exécutions en direct et les tableaux de bord cessent silencieusement de se rafraîchir.

Où vit l'état

Quatre éléments survivent à un redémarrage et doivent faire partie de votre sauvegarde :

ÉtatEmplacement par défautLe perdre signifie
Données PostgreSQLVolume de base, ou votre propre clusterTout est perdu.
Dépôts Git/app/data/git-reposLes dépôts hébergés en interne sont perdus, définitions de pipelines comprises.
Artefacts/app/data/artifactsLes builds passés ne peuvent plus être redéployés ni servir de cible de retour arrière.
Clés de protection de données/app/data/dp-keysLes sessions existantes et les charges protégées deviennent indéchiffrables.

Les clés de chiffrement, la clé de signature JWT et le mot de passe administrateur initial viennent de la configuration, pas de la base. Ce sont des entrées de l'installation, pas des valeurs que le produit régénère à chaque démarrage.

Migrations de schéma

Le backend applique ses migrations Entity Framework au démarrage. Une base vierge se crée donc simplement en démarrant le backend contre une base PostgreSQL vide ; il n'y a pas de commande de migration à lancer au préalable.

Dans l'image conteneur, les migrations sont exécutées par le point d'entrée plutôt que par l'application, afin qu'un seul processus les joue. C'est ce qu'expriment Database__SkipMigrations=true et AETHEUS_RUN_MIGRATIONS=true dans le fichier Compose.

Points de santé

  • /health/live : le processus est démarré. Anonyme et peu coûteux, c'est ce qu'un healthcheck de conteneur doit utiliser.
  • /health/ready : le processus est démarré et la base est joignable. C'est celui à interroger avant d'envoyer du trafic vers une instance fraîchement démarrée.

Pour aller plus loin