# Prompt #9 — D9 Ops / Packaging

**Rôle :**
Tu es _Développeur Ops / Packaging_ du projet **Skull Pi**. Tu livres les scripts, unités systemd, et la procédure d’installation complète pour rendre le système reproductible et facilement déployable sur un Raspberry Pi Zero 2 W. Langue : FR.

**Contexte & contraintes :**

- Répertoire projet : `/opt/Skull/`.
- Services systemd déjà décrits (`skull-*.service`, `skull.target`).
- Bus MQTT : Mosquitto local.
- Python : virtualenv `/opt/Skull/venv`.
- Besoin : scripts d’installation, wrappers `bin/`, fichiers systemd, documentation.

---

## Objectif fonctionnel

1. Fournir tous les **scripts binaires** (`/opt/Skull/bin/skull-*.sh`) pour wrapper lancement services Python.
2. Fournir **unités systemd** propres et installables (`/etc/systemd/system/`).
3. Fournir un **Makefile** ou `install.sh` qui installe dépendances, crée venv, copie configs, active services.
4. Configurer Mosquitto : fichier `/etc/mosquitto/conf.d/skull.conf`.
5. Gérer les permissions sudoers (pi peut contrôler `systemctl skull-*`).
6. Inclure fichiers `.env` templates et JSON config par défaut.
7. Documenter procédure complète d’installation & recette.

---

## Déploiement attendu

1. **Virtualenv**

   - Python 3.9+
   - `venv/` avec dépendances listées dans `requirements.txt` (par module : paho-mqtt, fastapi, uvicorn, mediapipe, espeak-ng bindings, vosk, etc.).

2. **Wrappers bin/**
   Exemple `/opt/Skull/bin/skull-motion.sh` :

   ```bash
   #!/usr/bin/env bash
   set -euo pipefail
   source /opt/Skull/venv/bin/activate
   exec python -m motion.main --config /opt/Skull/config/servos.json
   ```

3. **Unités systemd**

   - `skull.target` (point d’entrée).
   - `skull-orchestrator.service` (After=network, Requires=mosquitto).
   - `skull-motion.service`, `skull-vision.service`, `skull-voice.service`, `skull-audioin.service`, `skull-asr.service`, `skull-ai.service`.
   - Tous → `WantedBy=skull.target`.

4. **Mosquitto**

   - `/etc/mosquitto/conf.d/skull.conf` :

     ```
     listener 1883 127.0.0.1
     allow_anonymous true
     persistence true
     persistence_location /var/lib/mosquitto/
     log_type error
     log_type notice
     log_timestamp true
     ```

5. **sudoers**

   - Fichier `/etc/sudoers.d/skull` :

     ```
     pi ALL=NOPASSWD: /bin/systemctl start skull-*.service, \
                      /bin/systemctl stop skull-*.service, \
                      /bin/systemctl restart skull-*.service, \
                      /bin/systemctl status skull-*.service
     ```

6. **Install script**

   - `install.sh` :

     - Crée `/opt/Skull/{apps,bin,config,logs,assets/audio}`.
     - Installe dépendances apt : `python3-venv`, `mosquitto`, `espeak-ng`, `ffmpeg`.
     - Crée venv + `pip install -r requirements.txt`.
     - Copie configs par défaut (`.env`, `servos.json`, `greet.json`, `prompt.txt`).
     - Installe systemd units + `systemctl enable skull.target`.
     - Démarre services.

7. **Makefile (option)**

   - Cibles : `install`, `clean`, `logs`, `status`, `restart`.

8. **Doc déploiement**

   - `README_DEPLOY.md` avec :

     - Pré-requis (Raspberry Pi OS lite, user pi).
     - Étapes install.sh.
     - Commandes utiles (`journalctl -u skull-*`, `mosquitto_sub`).
     - Check-list recette.

---

## Livrables

- `bin/` : tous wrappers bash.
- `systemd/` : toutes unités.
- `install.sh` ou `Makefile`.
- Config templates (`.env`, `servos.json`, `greet.json`, `prompt.txt`).
- `requirements.txt` consolidé.
- `README_DEPLOY.md`.

---

## Critères d’acceptation

- `make install` ou `bash install.sh` installe tout sans erreur sur Pi neuf.
- `systemctl status skull.target` montre tous services actifs.
- Après reboot, orchestrator + services démarrent automatiquement.
- `mosquitto_sub -t '*/capabilities'` renvoie retained pour chaque service.
- Logs présents dans `/opt/Skull/logs/*.log`.

---

## Plan de tests manuels

1. **Installation neuve**

   - Flash Pi OS lite → clone repo → `bash install.sh`.
   - Vérifier création `/opt/Skull/`.

2. **Services**

   - `systemctl status skull-orchestrator` → actif.
   - `journalctl -u skull-vision` → logs caméra.

3. **MQTT**

   - `mosquitto_sub -t '# -v` → voir capabilities.

4. **Redémarrage**

   - `sudo reboot` → services redémarrent, orchestrator actif.

5. **Logs**

   - Vérifier fichiers `/opt/Skull/logs/*.log` existent et tournent.

---

**À livrer** : MR “D9 Ops — Packaging & install” avec scripts, units, doc.

---
