SPB Git

spb/admin-ka

Public

docs: README ultra détaillé + visite guidée en 10 captures

Simon-Pierre Boucher committed (Aug 29, 2026) parent af81ba2 Browse files

11 changed files +305 −17

modified README.md +305 −17
@@ -1,31 +1,291 @@
1−# admin-ka — administration-ka.com 1+<p align="center">
2+ <img src="docs/screenshots/01-accueil.jpg" alt="Admin-Ka — écran de connexion" width="720">
3+</p>
2 4
3−Console chat mobile-first pour piloter **Claude Code** sur le nœud **M3U96a** et gérer l'écosystème Groupe KA à distance. 5+<h1 align="center">Admin-Ka — administration-ka.com</h1>
6+
7+<p align="center">
8+ <strong>Le Control Center du Groupe Ka.</strong><br>
9+ Console d'administration privée qui pilote le <em>vrai</em> Claude Code CLI sur le cluster MacLustr,<br>
10+ surveille les 19 sites de l'écosystème en temps réel et mesure le trafic humain de toutes les plateformes.
11+</p>
12+
13+<p align="center">
14+ <a href="https://www.administration-ka.com">www.administration-ka.com</a> · nœud <strong>M3U96a</strong> · port <strong>3300</strong> · launchd + ngrok
15+</p>
16+
17+---
18+
19+> **Console privée.** L'accès est protégé par un mot de passe d'application (haché scrypt, cookie de session HttpOnly/Secure). Il n'y a pas d'inscription : c'est l'outil interne d'exploitation du Groupe Ka. Aucun secret n'est présent dans ce dépôt — la configuration sensible vit dans `data/config.json` (non versionné) et la clé Anthropic est lue depuis `~/.claude/.env` sur le nœud.
20+
21+---
22+
23+## Sommaire
24+
25+1. [C'est quoi, Admin-Ka ?](#cest-quoi-admin-ka-)
26+2. [Visite guidée en 10 captures](#visite-guidée-en-10-captures)
27+3. [Les modules, en détail](#les-modules-en-détail)
28+ - [Claude Code — pilotage du vrai CLI](#1-claude-code--pilotage-du-vrai-cli)
29+ - [Sessions — détachées, reprenables, rejouables](#2-sessions--détachées-reprenables-rejouables)
30+ - [Prompts — bibliothèque + upgradeur](#3-prompts--bibliothèque--upgradeur-de-prompts)
31+ - [Écosystème — monitoring 19 sites](#4-écosystème--monitoring-des-19-sites)
32+ - [Visiteurs — analytics v2 « humains d'abord »](#5-visiteurs--analytics-v2--trafic-humain)
33+ - [Vue d'ensemble — le cockpit](#6-vue-densemble--le-cockpit)
34+ - [Studio — module Social](#7-studio--module-social-facebook--reels)
35+ - [Gardiens KA Guardian (ka2 / ka4 / ka6)](#8-gardiens-ka-guardian-ka2--ka4--ka6)
36+ - [Écran du nœud (noVNC)](#9-écran-du-nœud-novnc)
37+4. [Identité visuelle](#identité-visuelle)
38+5. [Architecture](#architecture)
39+6. [Modes de permission](#modes-de-permission)
40+7. [Auth & sécurité](#auth--sécurité)
41+8. [Structure du dépôt](#structure-du-dépôt)
42+9. [Déploiement & exploitation](#déploiement--exploitation-sur-m3u96a)
43+10. [Apps natives compagnes](#apps-natives-compagnes)
44+11. [Contact](#contact)
45+
46+---
47+
48+## C'est quoi, Admin-Ka ?
49+
50+Admin-Ka est né comme une console chat mobile-first pour lancer **Claude Code** sur le nœud M3U96a depuis un iPhone. C'est devenu, au fil des versions (v2 puis **v3 « Control Center »**), le poste de commandement complet du Groupe Ka :
51+
52+```
53+iPhone / Mac ⇄ https://www.administration-ka.com (ngrok) ⇄ backend :3300 (M3U96a)
54+ ├── claude CLI local (apps M3U96a)
55+ ├── ssh <nœud> → claude CLI (apps distantes, repo de prod)
56+ ├── monitor.js → health checks 19 sites, sweep nœuds
57+ ├── analytics.js → trafic humain des plateformes Ka
58+ └── social.js → Studio (posts FB, Reels, musique)
59+```
60+
61+**Principe fondateur — rien de simulé** : le chat parle au vrai binaire `claude` (jamais à l'API Messages pour coder), le monitoring frappe les vrais sites en HTTPS, les analytics comptent les vrais visiteurs, les actions d'admin exécutent de vrais `pm2 restart` / `git log` sur les nœuds.
62+
63+Un seul opérateur, dix-neuf sites, vingt nœuds : tout se pilote depuis cette page.
64+
65+---
66+
67+## Visite guidée en 10 captures
68+
69+> Les captures 03 à 10 montrent la console **connectée** (après authentification) ; les captures 01, 02 et le login mobile montrent ce que voit un visiteur non authentifié : un simple mot de passe, rien d'autre.
70+
71+### 01 — Écran de connexion (desktop)
72+
73+![Écran de connexion](docs/screenshots/01-accueil.jpg)
74+
75+La porte d'entrée : pastille « Ka » orange, un champ mot de passe, un bouton. Aucune information n'est exposée avant l'authentification — la mention discrète `M3U96a · MacLustr` rappelle seulement sur quel nœud la console tourne.
76+
77+### 02 — Écran de connexion (mobile)
78+
79+<img src="docs/screenshots/02-accueil-mobile.jpg" alt="Connexion mobile" width="390">
80+
81+Le même login, pensé iPhone d'abord : carte centrée, safe-areas respectées, champ à 16 px (anti-zoom iOS).
82+
83+### 03 — Console connectée : la Vue d'ensemble
84+
85+![Console connectée](docs/screenshots/03-console-connectee.jpg)
86+
87+Premier écran après connexion : le **cockpit**. Sidebar de navigation à gauche (Vue d'ensemble, Claude Code, Sessions, Prompts, Écosystème, Visiteurs, Studio, Réglages), KPIs en tuiles (humains en ligne / aujourd'hui, sessions, pages vues, **19/19 sites en ligne**, incidents, uptime 24 h, latence moyenne, sessions Claude actives, **coût Claude cumulé**), graphique « Visiteurs humains — 30 jours » avec l'ancienne série v1 en pointillé, chips d'état des 19 sites avec leur latence live, et le journal des incidents récents.
88+
89+### 04 — Onglet Sessions
90+
91+![Onglet Sessions](docs/screenshots/04-onglet-sessions.jpg)
92+
93+Toutes les conversations Claude Code, filtrables par recherche, application et statut. Chaque ligne affiche le premier prompt, l'app cible (ou « Orchestrateur multi-sites »), le modèle, la taille de contexte (`ctx`), le **coût en dollars** et l'ancienneté — avec un bouton **Reprendre** (le `--resume` du CLI, transcript rejoué) et une suppression.
94+
95+### 05 — Onglet Écosystème
96+
97+![Onglet Écosystème](docs/screenshots/05-onglet-ecosysteme.jpg)
98+
99+Le monitoring temps réel : bandeau global (19/19 en ligne, uptime 24 h, latence moyenne, 36,5 k checks/24 h, échecs, incidents), puis une carte par site — sparkline de latence, barre d'uptime, p95/p99, nombre de checks, et la ligne d'infrastructure : **nœud, état du process (pm2/launchd), âge du dernier commit, jours restants sur le certificat SSL**.
100+
101+### 06 — Console mobile
102+
103+<img src="docs/screenshots/06-console-mobile.jpg" alt="Console mobile" width="390">
104+
105+La même console sur iPhone : bottom nav 5 entrées (Vue d'ensemble, Claude Code, Écosystème, Visiteurs, Plus), cartes empilées, tout le contenu de l'Écosystème accessible au pouce. C'est l'usage d'origine d'Admin-Ka : administrer le groupe depuis n'importe où.
106+
107+### 07 — Vue d'ensemble (rafraîchie)
108+
109+![Vue d'ensemble](docs/screenshots/07-onglet-vue-d-ensemble.jpg)
110+
111+Le cockpit se met à jour en continu (horodatage `maj` en haut à droite) : latences recalculées à chaque cycle de checks, ligne de synthèse du filtrage de trafic du jour (ex. « 92 humains · trafic filtré : 51 149 crawler + 36 datacenter + 274 automation »), anomalies de la dernière heure.
112+
113+### 08 — Onglet Claude Code
114+
115+![Onglet Claude Code](docs/screenshots/08-onglet-claude-code.jpg)
116+
117+Le cœur historique : « **Le vrai Claude Code, lancé sur le nœud de chaque app du Groupe KA** ». Picker de cible (une app précise, ou **Tous les sites KA (20)** = mode orchestrateur multi-sites), choix du modèle et du mode de permissions, suggestions de démarrage, reprise en un tap des dernières sessions, et le champ « Demander à Claude Code… » avec son bouton d'envoi orange.
118+
119+### 09 — Onglet Prompts
120+
121+![Onglet Prompts](docs/screenshots/09-onglet-prompts.jpg)
122+
123+La bibliothèque de prompts réutilisables : chaque prompt a un titre, une app cible (ou « app au choix »), un aperçu, et quatre actions — **Lancer** (démarre une session Claude Code avec ce prompt), **✨ Améliorer** (l'upgradeur de prompts réécrit la demande via l'API Anthropic avec la connaissance du Groupe Ka injectée), **Éditer**, **Dupliquer**, plus favoris ★ et compteur d'usage.
124+
125+### 10 — Onglet Visiteurs
126+
127+![Onglet Visiteurs](docs/screenshots/10-onglet-visiteurs.jpg)
128+
129+Les analytics v2 : bascule **Humains / Tout le trafic**, KPIs (en ligne < 2 min, humains du jour avec variation vs hier, sessions, pages vues, uniques 7 j / 30 j), **barre de répartition par classe** (humains / crawlers / datacenter / automation / interne — ici 900 humains pour 51 153 hits de crawlers filtrés), temps réel, panneau d'anomalies avec inspecteur d'IP/visiteur, puis les cartes **par application** (humains, sessions, pages, 7 j, tendance vs hier).
130+
131+---
132+
133+## Les modules, en détail
134+
135+### 1) Claude Code — pilotage du vrai CLI
136+
137+L'exigence non négociable du projet : **jamais l'API Messages pour coder, toujours le binaire `claude`**, en mode headless :
4 138
5 ``` 139 ```
6−iPhone ⇄ https://www.administration-ka.com (ngrok) ⇄ backend :3300 (M3U96a) ⇄ claude -p --output-format stream-json 140+claude -p --output-format stream-json --verbose --include-partial-messages
7 ``` 141 ```
8 142
9−## Composants 143+- **`cwd` = le repo de prod de l'app choisie**, sur son nœud de déploiement. Les apps de M3U96a tournent en local ; les autres (lou-ka sur M3U96b, immo-ka sur M4M64a, house-ka sur M4M64b, trouve-ka sur M2M32…) sont pilotées **via SSH sur leur nœud** — le repo de prod est la seule source de vérité, aucun clone.
144+- **Streaming intégral** : chaque événement du stream (texte, thinking, `tool_use`, `tool_result`, result) est relayé au navigateur et rendu comme dans le terminal — diffs colorés pour Edit/Write, blocs outils repliables, TodoWrite en checklist, Markdown (marked) + coloration syntaxique (highlight.js), copie des blocs de code.
145+- **Options exposées dans l'UI** : modèle par session (Fable 5 par défaut, Opus, Sonnet, Haiku — `--model` toujours passé explicitement, sinon les nœuds retombent sur leur défaut local), mode de permissions, choix du projet, `/clear` `/compact` `/cost` `/resume`, modèle actif, session ID, **coût cumulé en direct**, tokens de contexte (+ %), file d'attente de messages, chrono d'exécution.
146+- **Mode orchestrateur multi-sites** : la cible « Tous les sites KA » lance une session qui coordonne des changements sur l'ensemble du parc (c'est le mode utilisé pour les campagnes transverses — mobile, stats, README…).
147+- Chaque run reçoit un `--append-system-prompt` maison : après toute modification → rebuild + `pm2 restart` + healthcheck + commit/push **spbgit** (origin, jamais GitHub).
148+
149+### 2) Sessions — détachées, reprenables, rejouables
150+
151+Le process `claude` **ne dépend jamais du WebSocket** :
152+
153+- On peut fermer l'onglet, verrouiller l'iPhone, perdre le réseau — la tâche continue sur le nœud.
154+- Le transcript est persisté en JSONL (`data/transcripts/*.jsonl`) ; à la reconnexion, l'app **rejoue l'historique manqué puis reprend le live**.
155+- **Reprise auto durcie** : la console rouvre la dernière conversation au lancement (`lastChatId`) et force reconnexion + resync au retour au premier plan (`visibilitychange` / `online` — iOS coupe le WS à l'écran verrouillé). Reconnexion avec backoff + indicateur d'état.
156+- États clairs : en cours / en attente de permission / inactive ; notifications in-app en fin de tâche ou quand une permission attend.
157+- `--resume <session-id>` pour continuer une session CLI existante, coût et contexte conservés.
158+
159+### 3) Prompts — bibliothèque + upgradeur de prompts
160+
161+- Prompts réutilisables associés à une app (ou « app au choix »), avec favoris ★, duplication, compteur d'usage, recherche et filtre par app.
162+- **Upgradeur de prompts** : le bouton ✨ Améliorer envoie la demande brute à l'API Anthropic (modèle configurable, Opus par défaut) avec un système de connaissance du Groupe Ka injecté (les 19 sites, leurs nœuds, leurs process managers, les conventions remote-first) — et renvoie un prompt excellent, prêt pour Claude Code. L'upgradeur ne répond jamais lui-même : il ne fait que réécrire.
163+
164+### 4) Écosystème — monitoring des 19 sites
165+
166+`server/monitor.js`, zéro dépendance native (`node:sqlite` intégré) :
167+
168+- **Health checks HTTPS toutes les 45 s** de chacun des 19 sites du groupe depuis M3U96a : latence, code HTTP, jours restants sur le certificat SSL.
169+- **Sweep des nœuds toutes les 5 min** : charge / RAM / disque + statut, CPU et mémoire des process PM2 + âge du dernier commit git. Les sites sous launchd (KA Guardian sur M4M36) sont gérés spécifiquement — pas de pm2 sur ce nœud.
170+- **Historique SQLite** (`data/eco.sqlite`, rétention 35 j) : uptime 24 h / 7 j / 30 j, latence moyenne et p95/p99, sparklines, graphique 24 h, barres d'uptime 14 j.
171+- **Incidents** : 2 échecs consécutifs → alerte ; rétablissement → alerte verte ; vue Incidents globale avec durées.
172+- **Actions d'admin par site**, exécutées localement ou via ssh sur le nœud du site : redémarrer PM2 (`/api/admin/action`), logs récents (`/api/admin/logs`), git & derniers commits (`/api/admin/commits`).
173+- Push temps réel vers l'UI via le même WebSocket que le chat.
174+
175+### 5) Visiteurs — analytics v2 « trafic humain »
176+
177+`server/analytics.js` + le beacon `public/ka-a.js`, déployé sur les sites du groupe. Définitions officielles :
178+
179+- **Visiteur humain** : identifiant classé `human` = UA navigateur + JS réellement exécuté + réseau non-datacenter/non-proxy + pas interne + pas de flood.
180+- **Session** : trou > 30 min = nouvelle session. **Page vue** : événement `pv` réel (navigation, SPA incluse) — un heartbeat n'est **jamais** une page vue. **En ligne** : dernier événement humain < 120 s, expire tout seul.
181+- **5 classes** : `human / crawler / datacenter / automation / internal`, classées à l'insertion (regex UA + cache IP-intelligence avec hosting/proxy/ASN, reclassement rétroactif, anti-flood). Les métriques principales n'affichent **que les humains** ; le reste vit dans la barre de répartition et le toggle « Tout le trafic ».
182+- **Beacon v2** (`ka-a.js`) : vid/sid en localStorage, pv SPA via `pushState`, heartbeat 25 s seulement onglet visible + interaction récente. Le beacon v1 reste supporté (dé-duplication côté serveur) et l'ancienne série s'affiche en pointillé « ancien comptage v1 (non filtré) » — jamais comparée directement.
183+- Tables SQLite : `events` (brut, 45 j), `ipinfo` (cache), `daily2` (rollup quotidien par classe, long terme). Anomalies de trafic + **inspecteur d'IP / de visiteur** intégré.
184+- Suite de tests : `node server/test-analytics.mjs` — 28 scénarios (humain/refresh/SPA, Googlebot, bot d'uptime, IP AWS, curl, interne, dédup v1, invariants uniques ≤ sessions ≤ pv, expiration en ligne). À lancer depuis une **copie** du dépôt (écrit dans `data/`).
185+
186+### 6) Vue d'ensemble — le cockpit
187+
188+La page d'accueil de la v3 « Control Center » : elle agrège tout ce qui précède en un écran — KPIs humains + écosystème + Claude (dont le coût cumulé), graphique 30 jours, chips des 19 sites, incidents récents, anomalies de la dernière heure, raccourcis vers les sessions Claude.
189+
190+### 7) Studio — module Social (Facebook & Reels)
191+
192+`server/social.js` + `server/social/*.py` :
193+
194+- **Auto-post Facebook** : cartes statistiques et carrousels générés aux couleurs de chaque site du groupe (rendu HTML → image), publiés sur la page Facebook Groupe Ka.
195+- **Reels multi-scènes** : `make_reel.py` assemble des vidéos verticales multi-scènes à partir des données live des plateformes.
196+- **Moteur musical numpy** : `music_engine.py` synthétise les pistes audio des Reels (pas de banque de sons externe).
197+- Galerie des rendus dans l'onglet Studio, insights de page (`insights.py`).
198+- Les rendus vivent dans `data/social/` (non versionné).
199+
200+### 8) Gardiens KA Guardian (ka2 / ka4 / ka6)
201+
202+Les trois agents gardiens autonomes des connecteurs (ka2.bot / ka4.bot / ka6.bot — un seul repo FastAPI sur **M4M36**, sous launchd) sont intégrés à la console :
203+
204+- **Chat direct avec chaque gardien** depuis Admin-Ka.
205+- Cartes dédiées dans l'Écosystème (health checks, latence, uptime comme les autres sites).
206+- **Actions launchd** sur M4M36 (redémarrage des gardiens) depuis l'interface.
207+
208+### 9) Écran du nœud (noVNC)
10 209
11−- `server/server.js` — HTTP + WebSocket `/ws` (port 3300, loopback). Lance `claude -p … --output-format stream-json --verbose --include-partial-messages` dans le répertoire du projet choisi, relaie chaque événement du stream au client, persiste les transcripts (`data/transcripts/*.jsonl`), gère `--resume <session-id>` pour la continuité. 210+Un pont WebSocket intégré (`/vncws`) relie le client **noVNC embarqué** au Partage d'écran du nœud (127.0.0.1:5900) : on voit et contrôle l'écran de M3U96a directement dans le navigateur, sans exposer VNC sur le réseau — utile notamment pour le module Social (automatisation d'interface).
12−- `server/perm-mcp.js` — serveur MCP stdio (`--permission-prompt-tool mcp__adminka__approve`) : chaque demande de permission devient une carte **Autoriser / Refuser** dans le chat (long-poll via `/internal/perm`, timeout 10 min → refus). 211+
13−- `public/` — frontend une page : Markdown (marked) + code highlighté (highlight.js), blocs outils repliables, diffs colorés (Edit/Write), TodoWrite en checklist, streaming temps réel, safe-areas iPhone. 212+---
14−- `deploy/*.plist` — services launchd `io.adminka.backend` + `io.adminka.ngrok`. 213+
214+## Identité visuelle
215+
216+L'identité Groupe Ka, déclinée « console » :
217+
218+- **Crème** `#F2F1EC` en fond, **orange** `#F97316` en accent (traits de graphe `#e05f00`), encre `#1a1611`.
219+- Héritage néo-brutaliste (cartes à bords francs, pills, pastille « Ka », typo ronde) modernisé en v3.1 : hairlines + ombres douces, rayons contenus, segmented controls nets — esprit Linear/Vercel, identité crème + orange conservée.
220+- **Dark mode réel** (`ka_theme` auto / clair / sombre) via variables CSS.
221+- Desktop-first depuis la v3 : sidebar ≥ 1020 px + topbar ; mobile : bottom nav 5 entrées avec safe-areas iPhone.
222+- Statuts jamais en couleur seule (● ▲ ■ + libellé).
223+
224+---
225+
226+## Architecture
227+
228+```
229+iPhone / Mac ⇄ wss://www.administration-ka.com (ngrok) ⇄ backend :3300 (M3U96a, loopback)
230+ backend ⇄ claude CLI (local — apps M3U96a)
231+ backend ⇄ ssh <nœud> claude CLI (apps distantes, repo de prod)
232+ └ tunnel SSH inverse -R : cartes de permission (perm-mcp MCP)
233+ backend ⇄ monitor.js : health checks 45 s + sweep nœuds 5 min + SQLite + push WS
234+ backend ⇄ analytics.js: beacon ka-a.js → events/ipinfo/daily2 (SQLite)
235+ backend ⇄ social.js : Studio (Python : cartes, Reels, musique)
236+ backend ⇄ /vncws : pont noVNC → Partage d'écran 127.0.0.1:5900
237+```
238+
239+- **Node.js pur** (modules ES), serveur HTTP + WebSocket maison — deux seules dépendances npm : `ws` et `@novnc/novnc`. SQLite via `node:sqlite` intégré (aucune dépendance native).
240+- **Frontend une page, aucun framework** : `public/index.html` + `app.js` + `style.css`, vendors locaux (marked, highlight.js, noVNC).
241+- **Permissions distantes** : `server/perm-mcp.js` est un serveur MCP stdio (`--permission-prompt-tool mcp__adminka__approve`), déployé aussi sur M3U96b / M4M64a / M4M64b / M2M32 dans `~/.adminka/`. Chaque demande de permission devient une carte **Autoriser / Refuser** dans le chat (long-poll, timeout 10 min → refus). Comme l'IPv4 LAN n'est pas routée entre tous les nœuds et que Tailscale inter-nœuds est bloqué, les réponses transitent par un **tunnel SSH inverse (`-R`)**.
242+- **Persistance** (`data/`, non versionné) : `config.json` (secrets et réglages), `sessions.json`, `chats.json`, `transcripts/*.jsonl`, `eco.sqlite`, `analytics.sqlite`, `audit.jsonl`, logs.
15 243
16 ## Modes de permission 244 ## Modes de permission
17 245
18−- **Sûr** (défaut) : lecture libre (`Read, Glob, Grep, LS, WebFetch, WebSearch, TodoWrite, NotebookRead, Task`), tout le reste (Bash, Edit, Write…) demande une permission dans le chat. 246+- **Sûr** (défaut) : lecture libre (`Read, Glob, Grep, LS, WebFetch, WebSearch, TodoWrite, NotebookRead, Task`) ; tout le reste (Bash, Edit, Write…) déclenche une carte dans le chat : **Autoriser / Toujours (cet outil) / Tout autoriser / Refuser**.
19−- **Auto** : `--dangerously-skip-permissions` (confirmation requise dans l'UI). 247+- **« Tout autoriser »** : le serveur approuve toutes les permissions suivantes jusqu'à la fin de la conversation — la tâche va au bout sans jamais réattendre l'utilisateur.
248+- Modes CLI également exposés : `acceptEdits`, `plan`, et bypass (`--dangerously-skip-permissions`) derrière une confirmation explicite dans l'UI.
20 249
21 ## Auth & sécurité 250 ## Auth & sécurité
22 251
23−- Mot de passe (scrypt) → cookie `akid` HttpOnly/Secure, 7 j d'inactivité / 30 j max. 252+- Mot de passe d'application haché **scrypt** → cookie `akid` HttpOnly/Secure, 7 j d'inactivité / 30 j max.
24−- Rate-limit login : 8 échecs / 15 min / IP. Backend lié à 127.0.0.1 (seul ngrok y accède). 253+- **Rate-limit login** : 8 échecs / 15 min / IP.
25−- Audit complet : `data/audit.jsonl` (logins, prompts, tool_use, permissions, coûts). 254+- Backend lié à **127.0.0.1** — seul le tunnel ngrok y accède.
26−- Changer le mot de passe : `node server/set-password.js '<nouveau>'` puis `launchctl kickstart -k gui/501/io.adminka.backend`. 255+- **Audit complet** : `data/audit.jsonl` (logins, prompts, tool_use, permissions, coûts).
256+- Changement de mot de passe : `node server/set-password.js '<nouveau>'` puis redémarrage du backend.
257+- Aucun secret dans le dépôt : `data/` est hors git (config, bases, transcripts), la clé Anthropic vient de `~/.claude/.env` du nœud.
258+
259+## Structure du dépôt
260+
261+```
262+admin-ka/
263+├── server/
264+│ ├── server.js # HTTP + WS :3300, orchestration claude (local + ssh), upgradeur de prompts, pont /vncws
265+│ ├── monitor.js # Écosystème : checks 45 s, sweep nœuds, eco.sqlite, incidents, push WS
266+│ ├── analytics.js # Analytics v2 : classification humain/crawler/…, sessions, rollups, API
267+│ ├── perm-mcp.js # Serveur MCP stdio (permission-prompt-tool) — aussi déployé sur les nœuds distants
268+│ ├── social.js # Studio : posts FB, Reels, galerie, insights
269+│ ├── social/ # Python : make_reel.py, music_engine.py (numpy), render_card_html.py, insights.py
270+│ ├── set-password.js # Changement du mot de passe d'app (scrypt)
271+│ └── test-analytics.mjs # 28 tests analytics
272+├── public/
273+│ ├── index.html # SPA sans framework — 8 vues
274+│ ├── app.js # logique complète du front (WS, replay, rendu stream-json, thème…)
275+│ ├── style.css # design system crème/orange, dark mode, mobile
276+│ ├── ka-a.js # beacon analytics v2 embarqué par les sites Ka
277+│ └── vendor/ # marked, highlight.js, noVNC (locaux)
278+├── deploy/
279+│ ├── io.adminka.backend.plist # launchd : node server/server.js (KeepAlive)
280+│ └── io.adminka.ngrok.plist # launchd : ngrok http --url=www.administration-ka.com 3300
281+├── docs/screenshots/ # les 10 captures de la visite guidée
282+├── CLAUDE.md # exigences + pièges connus (à lire avant toute modif)
283+└── data/ # NON VERSIONNÉ : config.json, SQLite, transcripts, audit, logs
284+```
285+
286+## Déploiement & exploitation (sur M3U96a)
27 287
28−## Exploitation (sur M3U96a) 288+Le service tourne sous **launchd** (`KeepAlive`) sur le nœud M3U96a, exposé par **ngrok** sur le domaine réservé :
29 289
30 ```bash 290 ```bash
31 # statut 291 # statut
@@ -38,8 +298,36 @@ launchctl kickstart -k gui/501/io.adminka.ngrok
38 298
39 # logs 299 # logs
40 tail -f ~/apps/admin-ka/data/backend.err.log ~/apps/admin-ka/data/ngrok.log 300 tail -f ~/apps/admin-ka/data/backend.err.log ~/apps/admin-ka/data/ngrok.log
301+
302+# changer le mot de passe d'app
303+node server/set-password.js '<nouveau>' && launchctl kickstart -k gui/501/io.adminka.backend
41 ``` 304 ```
42 305
43−Clé API : lue depuis `~/.claude/.env` (`ANTHROPIC_API_KEY`) au démarrage du backend. 306+- Clé API : lue depuis `~/.claude/.env` (`ANTHROPIC_API_KEY`) au démarrage du backend (pas de login OAuth sur les nœuds).
307+- Projets proposés dans le sélecteur : `~/groupe-ka/*` (clones des repos spbgit), `~/apps/*` (apps déployées sur ce nœud), et `~` (home).
308+- Registre des déploiements du cluster : `cluster-deployments.json` (laptop, source de vérité).
309+- **Repo git** : spbgit (git perso) — `~/srv/git/admin-ka.git` sur M3U96a, remote `origin`. Pas GitHub.
310+
311+### Pièges connus (ne pas re-découvrir)
312+
313+- Tailscale inter-nœuds **bloqué** (ACL) : depuis M3U96a, joindre les nœuds via les noms Bonjour `.local` ; M2U64 = sous-réseau 192.168.0.x.
314+- IPv4 LAN non routée entre certains nœuds (EHOSTUNREACH) : les permissions distantes passent par le tunnel SSH inverse.
315+- `ControlPath` ssh trop long avec les hostnames `.local` → `%C`.
316+- Sans `--model`, un nœud retombe sur son défaut local → toujours le passer explicitement.
317+
318+## Apps natives compagnes
319+
320+La console a deux enveloppes natives (WKWebView + identité Ka), distribuées hors de ce dépôt :
321+
322+- **Admin-Ka iOS** — app SwiftUI (repo spbgit `admin-ka-ios.git`), distribuée via **TestFlight** ; panneaux JS natifs (WKUIDelegate), icône et splash Ka.
323+- **Admin-Ka macOS** — app SwiftUI **notarisée** (Developer ID, repo spbgit `admin-ka-macos.git`), livrée en DMG.
324+
325+## Contact
326+
327+- **Groupe Ka** — [www.groupe-ka.com](https://www.groupe-ka.com) · [groupe-ka.com/contact](https://www.groupe-ka.com/contact)
328+- Console : [www.administration-ka.com](https://www.administration-ka.com) (accès privé)
329+- Infra : cluster MacLustr — nœud M3U96a
330+
331+---
44 332
45−Projets proposés dans le sélecteur : `~/groupe-ka/*` (clones des repos spbgit), `~/apps/*` (apps déployées sur ce nœud), et `~` (home). 333+<p align="center">© Groupe Ka — Admin-Ka v3 « Control Center ». Console privée d'exploitation ; tout est branché sur le vrai CLI et les vrais sites, rien n'est simulé.</p>
added docs/screenshots/01-accueil.jpg +0 −0

Binary file not shown.

added docs/screenshots/02-accueil-mobile.jpg +0 −0

Binary file not shown.

added docs/screenshots/03-console-connectee.jpg +0 −0

Binary file not shown.

added docs/screenshots/04-onglet-sessions.jpg +0 −0

Binary file not shown.

added docs/screenshots/05-onglet-ecosysteme.jpg +0 −0

Binary file not shown.

added docs/screenshots/06-console-mobile.jpg +0 −0

Binary file not shown.

added docs/screenshots/07-onglet-vue-d-ensemble.jpg +0 −0

Binary file not shown.

added docs/screenshots/08-onglet-claude-code.jpg +0 −0

Binary file not shown.

added docs/screenshots/09-onglet-prompts.jpg +0 −0

Binary file not shown.

added docs/screenshots/10-onglet-visiteurs.jpg +0 −0

Binary file not shown.

Menu

Theme