# Installation PRO — Passerelle OmniRoute + DeepSeek V4.1 Flash

- **Date** : 2026-09-12
- **Serveur** : kvm8 (srv1742178) — Ubuntu 24.04.4 LTS, 8 vCPU, 31 Go RAM, sans GPU
- **IP publique** : 72.62.26.63
- **Accès** : `ssh -F ~/.ssh/config -i ~/.ssh/id_kvm8_vps kvm8-direct`

---

## 1. Ce qui a été réalisé (OUI, effectué et testé)

### 1.1 OmniRoute — passerelle IA centrale
- Version **3.8.50** (dernière publiée, `omniroute update --check` = à jour)
- Service systemd **actif** sur `0.0.0.0:20128`
- Fichiers : `/root/.omniroute/` (`storage.sqlite`, `.env`), `/etc/systemd/system/omniroute.service`
- Catalogue provider **DeepSeek** synchronisé : `deepseek-flash`, `deepseek-v4-pro`

### 1.2 DeepSeek V4.1 Flash (nouveau modèle)
- Modèle canonique : **`deepseek-flash`** = *DeepSeek-V41-Flash*, `inputModalities: ["text","image"]` (vision)
- **Anciennes versions Flash supprimées** : `deepseek-v4-flash`, `deepseek-v4-flash-vision-exp`
- Tests : **texte OK**, **image OK** (lecture exacte d'une image test via OmniRoute)

### 1.3 `dsh` (agent) — mis à jour et branché sur OmniRoute
- `@deepseek-ai/dsh` : **0.1.2-rc.1 → 0.1.5-rc.1** (entraîne `dsh-llm-deepseek` 0.1.5-rc.2)
- `/root/.dsh/settings.yaml` : provider `omniroute`, modèle `ds/deepseek-flash`
- `/root/.dsh/.credentials.yaml` : ajout de la référence `OMNIROUTE_API_KEY`
- Service `dsh-web.service` (systemd **--user**) redémarré, sans erreur
- Sauvegardes : `settings.yaml.bak-20260912-1541`, `.credentials.yaml.bak-20260912-1541`

### 1.4 Caddy — préparation (NON actif)
- **Caddy 2.11.4** installé (dépôt officiel), service **désactivé**
- `/etc/caddy/Caddyfile.prod-draft` : **validé** (`Valid configuration`)
- Modules présents : `basic_auth`, `headers`, `reverse_proxy`
- Modules **absents** du binaire standard : rate-limit, DNS Cloudflare/Hostinger (build `xcaddy` requis)

### 1.5 Nginx — inchangé, toujours en production
- `dsh.assemblee-citoyenne.net` : basic-auth (bcrypt) + rate-limit + TLS Let's Encrypt
- Routes : `/`→3080, `/omni-api/`→20128, `/omniroute/`→20128, `/multi/`→8090, `/terminal/`→8091

---

## 2. Branchement OmniRoute → DeepSeek V4.1 Flash

| Élément | Valeur |
|---|---|
| Base URL publique | `https://dsh.assemblee-citoyenne.net/omni-api/v1` |
| Base URL locale (kvm8) | `http://127.0.0.1:20128/v1` |
| Modèle | `ds/deepseek-flash` |
| Capacités | texte + image (vision) |
| Clé API | `OMNIROUTE_API_KEY` dans `/root/.omniroute/.env` |

Exemple :
```bash
curl "$OMNIROUTE_BASE_URL/chat/completions" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OMNIROUTE_API_KEY" \
  -d '{"model":"ds/deepseek-flash","messages":[{"role":"user","content":"Bonjour"}]}'
```

---

## 3. Emplacements (dossiers de réalisation)

| Contenu | Chemin |
|---|---|
| Déploiement serveur kvm8 | `/root/Production-vps8/` |
| Workspace projet (local) | `/home/c3b/dsh-workspace/` |
| Config hébergement | `/home/c3b/configs-hebergement/` |
| Sauvegarde OmniRoute | `/home/c3b/sauvegarde-omniroute-20260830/` |
| Sauvegarde config OmniRoute | `/home/c3b/backup-omniroute-config-20260830/` |
| Backup interne OmniRoute | `/root/.omniroute/db_backups/` |
| Backups dsh | `/root/.dsh/*.bak-20260912-1541` |

---

## 4. Capacité de duplication

Oui. La configuration est entièrement reproductible. Fichiers à copier :

| Fichier | Rôle |
|---|---|
| `/root/.omniroute/.env` | secrets + config OmniRoute (⚠ contient des secrets) |
| `/root/.omniroute/storage.sqlite` | catalogue providers/modèles, clés, combos |
| `/etc/systemd/system/omniroute.service` | unité systemd système |
| `/root/.dsh/settings.yaml` | providers + modèle par défaut de dsh |
| `/root/.dsh/.credentials.yaml` | références de credentials (⚠ secrets en clair, mode 600) |
| `/root/.config/systemd/user/dsh-web.service` | unité systemd utilisateur dsh web |
| `/etc/caddy/Caddyfile.prod-draft` | façade Caddy (à activer plus tard) |
| `/etc/nginx/sites-available/dsh` | façade nginx actuelle |

Script de sauvegarde : `dupliquer-gateway-omniroute.sh` (voir §6).
Le bundle généré est stocké dans `/root/Production-vps8/backups/`.
**Recommandation** : chiffrer le bundle (GPG) car il contient des secrets.

---

## 5. En attente / à décider

1. **DNS** : créer les A records `omniroute / multi / terminal / api .assemblee-citoyenne.net` → `72.62.26.63` (DNS chez **Hostinger**, NS `dns-parking.com`)
2. **Bascule nginx → Caddy** : stratégie A (un bloc par sous-domaine, binaire standard) ou B (wildcard `*.assemblee-citoyenne.net`, build `xcaddy` + module DNS Hostinger + token)
3. **Rate-limit** : Caddy standard ne l'a pas → garder fail2ban/Cloudflare ou build `caddy-ratelimit`
4. **`admin2`** (hash `$apr1$`) incompatible Caddy → re-hacher en bcrypt ou supprimer
5. **Nommage** : le résultat central s'appelle désormais **OmniRoute** (la passerelle) ; `dsh` n'est plus qu'un client

---

## 6. Rollback

- dsh : restaurer `settings.yaml.bak-20260912-1541` et `.credentials.yaml.bak-20260912-1541`, puis `systemctl --user restart dsh-web.service`
- Caddy : `systemctl stop caddy` (jamais activé) — nginx reste maître
- OmniRoute : les modèles custom supprimés se ré-ajoutent via `POST /api/provider-models`
