Aller au contenu

Développement & exploitation

Comment lancer la stack en local, la configuration, et le dépannage des pannes déjà rencontrées.

Lancer tous les services — dev.sh

dev.sh (racine) pilote tous les services en arrière-plan, sans tmux :

./dev.sh start            # tout démarrer (demande sudo 1× pour Caddy/443)
./dev.sh stop             # tout arrêter
./dev.sh restart          # tout redémarrer
./dev.sh restart control  # redémarrer UN service
./dev.sh status           # état (● up / ○ down)
./dev.sh logs backend     # suivre les logs d'un service (Ctrl-C pour sortir)

Services gérés : backend (microservice), control (control center), frontend (Vite), caddy (reverse proxy 443, sudo), guac (tunnel SSH Guacamole 18080), + auth (Dex/GLAuth docker). Logs dans .devlogs/.

flowchart LR
    DEV["dev.sh"] --> BK["backend :50052"]
    DEV --> CTL["control :50051/:50055"]
    DEV --> FRT["frontend :5173"]
    DEV --> CAD["caddy :443 (sudo)"]
    DEV --> GUA["guac (tunnel :18080)"]

Alternative historique : le Taskfile.yaml (task dev, task control, task backend, task frontend, task caddy, task guac, task auth).

Configuration (.env)

Copier .env.example.env. Variables clés :

Variable Rôle
POSTGRES_* connexion PostgreSQL centrale
OS_CLOUD projet OpenStack de création des VMs (ipp-idcs-vmpool)
INFRA_OS_CLOUD projet OpenStack de listing images/flavors/réseaux (ipp-idcs-vmpoolmanager)
SSH_PUBLIC/PRIVATE_KEY_PATH clés SSH d'accès admin aux VMs
REGISTRAR_CONTROL_CENTER_URL URL que les VMs appellent au boot (/api/register)
GUACAMOLE_URL API Guacamole vue par le control center (http://127.0.0.1:18080/guacamole)
GUACAMOLE_PUBLIC_URL URL Guacamole vue par le navigateur (http://<IP>:18080/guacamole)
GITHUB_CLIENT_ID/SECRET/REDIRECT_URL OAuth GitHub étudiant

Identifiants OpenStack : clouds.yaml (depuis clouds.yaml.template). Configs auth (auth/dex.yaml, auth/glauth.cfg) : gitignored, ne jamais committer.

Les deux .env ⚠️

Le Control Center charge control_center/.env en priorité (godotenv.Load()), puis ../.env en repli (control_center/main.go). Le microservice utilise la racine .env (DOTENV_PATH). Garder les deux cohérents — un GUACAMOLE_URL périmé (:8080 au lieu de :18080) dans control_center/.env a déjà cassé Guacamole.

Bases de données

BDD Service Notes
PostgreSQL Control Center AutoMigrate au démarrage (config/database.go)
SQLite PoolManagerVM.db Microservice AutoMigrate au démarrage ; file de jobs + miroir pools/servers

Dépannage — symptômes déjà rencontrés

Symptôme Cause Correctif
Pool absent de l'inventaire, 0 VM 400 Can not find requested image (UUID périmé/inter-projets) resolveImageRef (via config_id)
Sur-provisionnement (3 → 13 VMs) serverisinpool comparait l'image match sur serverpool_id+user_id ; scale-down > MaxVM
« Démarrage de l'application… » infini (Ubuntu) port app forcé ≥ 1 sur une VM sans app port optionnel (0 = aucun)
Conteneur jupyter en crash-loop start-notebook.sh absent (repo2docker) / packaging trop vieux jupyter lab + pip -U packaging
Formgrader 404 / création d'assignment KO dossier nbgrader root-owned chown -R 1000:1000 + nbgrader_config monté
[unimplemented] missing message au join erreur gRPC « trailers-only » mal ré-encodée par Caddy renvoyer success=false + message
Crash formgrader (CompoundSelect … mapper) vieux nbgrader (0.7) pip install -U nbgrader dans le snapshot
Pas de bouton Terminal / Guacamole tunnel :18080 éteint ou .env périmé ./dev.sh start guac + GUACAMOLE_URL/PUBLIC_URL :18080
Login GitHub nécessite plusieurs clics routeur SPA SvelteKit intercepte data-sveltekit-reload sur le lien
Exec format error cloud-init espace avant #!/bin/bash dans une config dupliquée réécrire les configs + préférer user_id='system'
Off-days sans effet OffDays stocké mais jamais relu enforcement dans le crawler (stop/start)

Démarrage à froid (ordre conseillé)

flowchart LR
    A["PostgreSQL + Colima/Docker"] --> B["auth (Dex/GLAuth)"]
    B --> C["./dev.sh start\n(backend, control, frontend, caddy, guac)"]
    C --> D["Accès : https://<IP>"]

⚠️ Caddy n'écoute que sur :443 ; il faut sudo. Le check lsof -i :443 de task caddy peut afficher un faux échec (lsof sans sudo ne voit pas le socket root) alors que Caddy tourne — dev.sh status teste la connexion TCP et est fiable.