Configuration, déploiement et dépannage
Mise en service d'une consigne
1. Central
bash scripts/docker-project.sh up central-saturn central-venus
# Saturn : http://localhost:8130 gRPC : 9130
# Venus : http://localhost:8135
Le port 9130 doit être publié (docker-compose.central.yml) et joignable depuis le
réseau des nodes.
2. SMTP
Depuis Venus (Consignes → Email SMTP) ou via l'API (voir Saturn).
Pour Gmail : smtp.gmail.com, port 587, STARTTLS, mot de passe d'application
(pas le mot de passe du compte). Utiliser ensuite Envoyer un email de test.
3–4. Node
/etc/leukos/node.json (extrait) :
{
"grpc": { "enabled": true, "bind": "0.0.0.0", "port": 9080 },
"central": { "saturn_grpc": "192.168.0.12:9130", "saturn_http": "http://192.168.0.12:8130" },
"consigne": { "layout_path": "/etc/leukos/consigne.json", "lockers": [] }
}
/etc/leukos/consigne.json décrit le mur (numéros et positions des portes) ; il est lu à la
fois par l'IHM et par le daemon. Modèle : nodes/ui/config/consigne.example.json.
5. Déploiement des binaires
L'image BusyBox n'a pas de sftp-server : scp échoue, on transfère par flux SSH.
T=.build/buildroot/output/target/usr/bin
H=supervisor@192.168.0.9
ssh $H 'cat > /tmp/leukos-node.new' < $T/leukos-node
ssh $H 'cat > /tmp/leukos-consigne.new' < $T/leukos-consigne
ssh $H 'cat > /tmp/leukos-ui.new' < $T/leukos-ui
sha256sum $T/leukos-node $T/leukos-consigne $T/leukos-ui
ssh $H 'sha256sum /tmp/leukos-*.new' # doit être identique
ssh $H 'cat > /tmp/S93leukos-consigne.new' \
< nodes/os/board/leukos/rpi3plus/rootfs-overlay/etc/init.d/S93leukos-consigne
ssh $H 'set -e; TS=$(date +%Y%m%d-%H%M%S)
sudo -n cp /usr/bin/leukos-node /usr/bin/leukos-node.bak.$TS
sudo -n cp /usr/bin/leukos-consigne /usr/bin/leukos-consigne.bak.$TS 2>/dev/null || true
sudo -n cp /usr/bin/leukos-ui /usr/bin/leukos-ui.bak.$TS
sudo -n /etc/init.d/S90leukos-node stop
sudo -n /etc/init.d/S93leukos-consigne stop || true
sudo -n install -m 0755 /tmp/leukos-node.new /usr/bin/leukos-node
sudo -n install -m 0755 /tmp/leukos-consigne.new /usr/bin/leukos-consigne
sudo -n install -m 0755 /tmp/S93leukos-consigne.new /etc/init.d/S93leukos-consigne
sudo -n install -m 0755 /tmp/leukos-ui.new /usr/bin/leukos-ui
sudo -n /etc/init.d/S90leukos-node start
sudo -n /etc/init.d/S93leukos-consigne start
sudo -n /etc/init.d/S91leukos-ui restart'
Toujours vérifier le hash avant install : un transfert interrompu peut produire un
binaire vide et empêcher l'IHM de démarrer.
6–8. Vérifications
# Sur le node
curl -s localhost:8080/consigne/status
# → "enabled":true, "last_sync_channel":"grpc", "last_sync_error":""
# vérifier aussi : ps | grep leukos-consigne
# Sur le central
curl -s localhost:8130/api/consignes
# → online:true, last_channel:"grpc"
Sécurité
Facteurs d'authentification au retrait
Dans Consigne → Configuration, un opérateur disposant de consignes:write peut
activer le QR à usage unique et/ou le PIN. Il faut conserver au moins un facteur actif.
Le PIN est dérivé avec PBKDF2-HMAC-SHA256 (600 000 itérations), jamais journalisé en
clair, et les vérifications sont bloquées après cinq échecs. L'enrôlement d'une personne
requiert la validation explicite d'un opérateur habilité.
La vérification faciale reste indisponible et son switch est désactivé tant qu'une caméra, un moteur de comparaison 1:1 et un contrôle de vivacité n'ont pas été intégrés et évalués. Ne pas traiter le nom ou l'email comme une preuve biométrique.
Les mutations d'administration node nécessitent une clé aléatoire partagée de 256 bits :
- Saturn :
PICKUP_MANAGEMENT_KEYdans le fichier local ignoré par Gitconfig/env/dev/central-saturn.local(permissions0600). Compose charge ce fichier s'il existe; ne jamais mettre la valeur dans le fichier env versionné. - Node :
/etc/leukos/pickup-management.key, propriétaireroot:root, permissions0600. Installer la même valeur de manière sécurisée sur chaque node concerné. - Production : fournir la clé via le gestionnaire de secrets du déploiement, sans la stocker dans le dépôt ni dans les journaux.
| Sujet | Mesure |
|---|---|
| Code de retrait | Généré par crypto/rand, 8 car. ; seul sha256 stocké (PostgreSQL et SQLite) |
| Usage unique | Le colis passe à picked_up ; un second scan renvoie Code inconnu ou déjà utilisé |
| PIN | PBKDF2-HMAC-SHA256, sel aléatoire, blocage après cinq échecs ; aucune valeur claire dans les logs |
| Gestion des facteurs | Clé de gestion 256 bits, séparée du dépôt, protégée par permissions système |
| Mot de passe SMTP | Stocké côté Saturn, jamais renvoyé par l'API (pass_set) ; à saisir via Venus, pas dans le dépôt |
| Injections | Requêtes SQL paramétrées (Postgres + SQLite), échappement HTML des emails, validation des adresses |
| Taille des requêtes | MaxBytesReader côté Saturn, 64 Kio max côté LocalApi |
| Transport | gRPC/REST en clair sur le LAN : prévoir WireGuard (S89wireguard) ou mTLS si le réseau n'est pas de confiance |
Dépannage
| Symptôme | Cause probable | Action |
|---|---|---|
| Consigne absente de Venus | Mode non activé ou Saturn injoignable | /consigne/status : enabled, last_sync_error |
last_sync_channel: "rest" | Port 9130 non joignable | Publier 9130:9130, vérifier le pare-feu |
node_delivery: failed | gRPC du node désactivé ou node éteint | grpc.enabled: true dans node.json ; le retry Saturn relivre automatiquement |
email_status: failed | SMTP non configuré / authentification refusée | Voir email_error, tester depuis Email SMTP |
| Scan sans effet | Focus perdu ou lecteur sans suffixe Entrée | Application Scanner de l'accueil pour vérifier la lecture |
Mode consigne désactivé au scan | Interrupteur coupé | Configuration → Consignes |
actuator: "none" | Casier sans relay / lock_plugin | Compléter consigne.lockers dans node.json |
| Événements datés de 1970 sur le node | Horloge non synchronisée (pas de NTP) | Saturn remplace par l'heure de réception ; configurer chronyd |
Logs utiles
docker logs leukos-central-saturn 2>&1 | grep -i consigne
ssh supervisor@192.168.0.9 'sudo -n sqlite3 /var/lib/leukos/node.db \
"SELECT id,level,kind,message,sent FROM consigne_events ORDER BY id DESC LIMIT 20;"'