# Session Resume — 2026-06-01 (final) ## Objectif Session continue : fixes Kafka, Trino, JupyterHub. Résolution du problème de spawn. ## Actions réalisées ### 1. Kafka restart loop — CORRIGÉ ✅ - **Cause**: `KAFKA_CFG_*` env vars (Bitnami) au lieu de `KAFKA_*` (apache/kafka). `CLUSTER_ID` manquant. - **Fix**: Rewrote env vars in `/home/eric/lakehouse/docker-compose/docker-compose.yml` - **Action**: Volumes corrompus supprimés, cluster recréé - **Résultat**: kafka-1 + kafka-2 UP, KRaft controller élu ### 2. Trino restart loop — CORRIGÉ ✅ - **Cause**: `config/trino/` directory manquante, `node.id=_internal_` invalide, `plugin.bundles` incompatible - **Fix**: `node.properties` créé proprement, `plugin.bundles` retiré - **Résultat**: Trino UP sur port 8084 ### 3. JupyterHub spawn — CORRIGÉ ✅ - **Causes multiples**: 1. `SimpleLocalProcessSpawner` ne passait pas `JUPYTERHUB_SERVICE_URL` (bug JH 5.3.0) 2. Hash du mot de passe eric en PBKDF2 au lieu de bcrypt 3. User `eric` n'existait pas comme OS user dans le container 4. DB path malformé (3 slashes au lieu de 4) 5. Docker cache servait l'ancien COPY layer du config - **Fixes**: - Switch à `LocalProcessSpawner` (gère correctement les env vars) - Hash bcrypt pour eric et admin - Dockerfile: `useradd eric` + sudo NOPASSWD - `jupyterhub_config.py`: 4 slashes pour le path SQLite - `docker cp` du config dans le volume (contournement cache Docker) - `ARG BUILD_DATE` pour forcer cache invalidation - **Résultat**: JupyterHub 5.3.0 healthy, spawn fonctionnel pour eric, admin, erol ### 4. Credentials JupyterHub | Utilisateur | Mot de passe | Rôle | |---|---|---| | admin | Digitribe972 | Admin | | eric | Digitribe972 | Admin | | erol | erol | Admin | ### 5. Commits/Push - smart-city-digital-twin-martinique: pushé sur Gitea (commits: cb45b89, 85199fc, cca9e4a) - lakehouse: pushé sur Gitea (commit: 650a632) ## Infrastructure finale - Kafka-1, Kafka-2 = UP ✅ - Trino = UP ✅ - JupyterHub = UP ✅ (healthy, spawn fonctionnel) - Tous les autres services principaux = UP ✅ ## Leçons apprises 1. **apache/kafka:3.9.0** utilise `KAFKA_*` (pas `KAFKA_CFG_*` qui est Bitnami) 2. **JupyterHub 5.3.0** `SimpleLocalProcessSpawner` a un bug avec `JUPYTERHUB_SERVICE_URL` → utiliser `LocalProcessSpawner` 3. **NativeAuthenticator** nécessite des hash bcrypt dans `users_info.password` 4. **Docker volume overlay** peut cacher les fichiers COPY du Dockerfile → copier manuellement dans le volume 5. **LocalProcessSpawner** nécessite que l'OS user existe dans le container (`useradd`)