# Déploiement OpenPanel — right-sizing (2026-06-08)

Note de mise en prod du `prod.docker-compose.yaml` right-sized + correctifs env.
Contexte complet : `../docs/superpowers/specs/2026-06-08-openpanel-compose-rightsizing-design.md`.

> ⚠️ Ce repo est un **miroir partiel**. Éditer les fichiers ici ne déploie rien.
> La vérité prod vit dans **Dokploy** (UI + serveur). Suis les étapes ci-dessous.

---

## Checklist de déploiement (dans l'ordre)

### 1. 🔴 URGENT — fermer les inscriptions publiques
Dans **Dokploy → ton app OpenPanel → Environment** : corrige
```
ALLOW_REGISTRATION=false
```
(le typo `fasle` laissait l'inscription **ouverte** — la logique source est
`process.env.ALLOW_REGISTRATION !== 'false'`, donc tout sauf exactement `false`
autorise l'inscription). Vérifie ensuite dans le dashboard OpenPanel qu'aucune
org/compte inconnu n'a été créé.

### 2. Mettre à jour l'env Dokploy
Toujours dans **Environment**, aligne sur `variables-env.env` :
```
ALLOW_REGISTRATION=false
EVENT_JOB_CONCURRENCY=20          # marge de pic (défaut OpenPanel = 10)
MAXMIND_LICENSE_KEY=...           # déjà posée — désormais câblée → géoloc active
```
`EVENT_BUFFER_BATCH_SIZE` / `EVENT_BUFFER_CHUNK_SIZE` peuvent rester (defaults
4000/1000) ou être retirés : le compose fournit ces defaults en fallback.

### 3. Reporter le compose
**Dokploy → app → Compose → Advanced** : colle le contenu de
`openpanel/prod.docker-compose.yaml` (remplace l'ancien).

### 4. Borner la mémoire ClickHouse — bornage SOFT (PAS de limite Docker dure)
⚠️ **Ne mets PAS de `deploy.resources.limits.memory` sur op-ch** : une limite
cgroup dure compte le page cache et, l'observateur cgroup étant désactivé par
`op-config.xml`, CH la dépasse → **OOM-kill / crash-loop (exit 137)** (vécu le
2026-06-08). Le compose n'a donc plus de bloc `deploy` sur op-ch.

Le bornage se fait par la compta interne de CH : déposer `low-memory.xml`
**à côté** du `op-config.xml` existant, dans `files/clickhouse_config` du serveur.
**Ne pas remplacer** `op-config.xml` (ClickHouse merge tous les `.xml`). Contenu :
`openpanel/low-memory.xml` (copie pratique) = `files/clickhouse_config/low-memory.xml`
(`max_server_memory_usage` 3 GiB + caches réduits). Voir « Localiser le dossier ».

### 5. Déployer + redémarrer ClickHouse
```bash
docker compose pull && docker compose up -d
# ou via l'UI Dokploy (Deploy / Redeploy)
```
ClickHouse ne lit `config.d` **qu'au démarrage** → après l'étape 4, il faut
recréer/redémarrer op-ch (le redeploy s'en charge ; sinon `docker restart <op-ch>`).

---

## Localiser `files/clickhouse_config` sur le serveur

Le compose monte `../files/clickhouse_config` (chemin **relatif** à l'emplacement
du compose). Plutôt que de deviner le layout Dokploy, demande au conteneur où ce
montage pointe réellement sur l'hôte. **En SSH sur le serveur :**

```bash
# 1. Trouver le conteneur ClickHouse (le nom varie selon le projet Dokploy)
docker ps --filter "name=op-ch" --format '{{.Names}}'

# 2. Afficher la source HÔTE du montage config.d (remplace <op-ch> par le nom obtenu)
docker inspect <op-ch> \
  --format '{{ range .Mounts }}{{ .Source }} -> {{ .Destination }}{{ "\n" }}{{ end }}' \
  | grep config.d
```
La colonne de gauche en face de `/etc/clickhouse-server/config.d` est le **dossier
hôte** = ton `files/clickhouse_config`. Exemple typique Dokploy :
`/etc/dokploy/compose/<app-id>/code/files/clickhouse_config`.

```bash
# 3. Vérifier que op-config.xml y est, puis y déposer low-memory.xml
DIR="<le chemin trouvé ci-dessus>"
ls -la "$DIR"        # tu dois voir op-config.xml
# copie low-memory.xml dedans (scp depuis ton poste, ou crée-le à la main)
```

**Alternative sans SSH (idiomatique Dokploy)** : **Advanced → Mounts → Add File
Mount**, monter le contenu de `low-memory.xml` vers
`/etc/clickhouse-server/config.d/low-memory.xml` sur le service `op-ch`. C'est la
même mécanique que les `[[config.mounts]]` du template officiel.

---

## Vérifications post-déploiement

```bash
# Tous les services healthy
docker compose ps          # ou Dokploy → Logs/Status

# Worker : concurrence appliquée (doit afficher concurrency: 20)
docker compose logs op-worker | grep -i "Started worker for events"

# Géoloc : téléchargement GeoIP au boot (présent si MAXMIND câblé + clé valide)
docker compose logs op-api op-worker | grep -i "maxmind\|geoip\|geo"

# ClickHouse : borne mémoire prise en compte
docker exec <op-ch> clickhouse-client -q \
  "SELECT value FROM system.settings WHERE name='max_server_memory_usage'"
# attendu : 2147483648 (2 GiB)

# Inscriptions bien fermées : tente de t'inscrire en navigation privée → refus attendu
```

---

## Rollback

Compose original sauvegardé :
`openpanel/optimisations/prod.docker-compose.yaml.2026-06-08-pre-rightsizing.bak`
→ le recoller dans Dokploy (Compose → Advanced) et redeployer.
Pour l'env, remettre les anciennes valeurs (⚠️ **sauf** `ALLOW_REGISTRATION` :
garder `false`, l'ancien `fasle` était le bug).
