Monorepo réunissant l'API Flask de scoring et le dashboard Streamlit. Le projet a été réorganisé pour Railway après une première version déployée sur Heroku.
.
├── api/ API, artefact du modèle, profils synthétiques et tests
├── dashboard/ interface Streamlit et client HTTP
├── training/ règles de réentraînement et de promotion d'un modèle
└── .github/ intégration continue commune
L'API charge une seule fois le modèle et génère de façon déterministe 200 profils entièrement synthétiques à partir des statistiques du scaler. Aucun enregistrement client source n'est embarqué. L'API ne renvoie jamais le DataFrame complet : les histogrammes sont agrégés et les nuages de points sont limités. Le dashboard ne contient aucune dépendance de machine learning et met en cache les lectures pendant cinq minutes.
API, dans un premier terminal :
cd api
python -m venv .venv
python -m pip install -r requirements-dev.txt
pytest
python app.pyDashboard, dans un second terminal :
cd dashboard
python -m venv .venv
python -m pip install -r requirements-dev.txt
pytest
streamlit run app.pyLe dashboard utilise http://127.0.0.1:8000 par défaut. La variable API_URL permet
de changer cette adresse.
Créer un projet Railway et connecter ce même dépôt GitHub à deux services :
- Root Directory :
/api - Railway Config File :
/api/railway.toml - variable
PORT=8000 - variable
WEB_CONCURRENCY=1 - aucun domaine public nécessaire
- Root Directory :
/dashboard - Railway Config File :
/dashboard/railway.toml - domaine public Railway activé
- variable
API_URL=http://${{api.RAILWAY_PRIVATE_DOMAIN}}:8000
Une variable partagée API_KEY peut être ajoutée aux deux services. Elle reste
optionnelle si l'API est exclusivement accessible sur le réseau privé Railway.
Dans les réglages GitHub des deux services, activer Wait for CI. Railway attendra alors la réussite des tests API et dashboard avant le déploiement.
Le déploiement initial utilise les branches générées agent/railway-api et
agent/railway-dashboard, afin que chaque service voie son sous-dossier à la racine.
Après fusion dans main, le workflow sync-railway-branches.yml maintient ces deux
branches automatiquement et chaque push validé déclenche le service correspondant.
L'artefact actuel est une pipeline StandardScaler + LogisticRegression scikit-learn
1.5.2 comportant 100 variables. Son empreinte SHA-256 et le seuil de décision sont
versionnés dans api/artifacts/metadata.json.
Le score produit n'est pas encore calibré sur la population générale. Il doit être
interprété relativement au seuil métier de 30 %, et non comme une fréquence réelle de
défaut. Les conditions requises avant une promotion en production sont documentées dans
training/README.md.