SPB Git forge

spb/groupe-ka

Public

Groupe KA — site du holding + KA ID (compte unique & SSO des 7 plateformes). Next.js 16, SQLite, Google & Apple login.

81commits 1branches 0releases
89.2 MBsize
maindefault branch
22 days agolast push
TypeScript 70.4% HTML 18.4% JavaScript 4% Python 3.8% CSS 3.4%

docs: README à jour avec screenshot

Simon-Pierre Boucher committed 1 mo ago (Aug 18, 2026) parent 30d26aa

2 changed files +85 −47

modified README.md +85 −47
@@ -2,9 +2,9 @@
2 2
3 3 <div align="center">
4 4
5 −# Groupe KA — le hub & le KA ID
5 +# Groupe Ka — le hub de l'écosystème & le KA ID
6 6
7 −**Site vitrine du holding + compte unique (KA ID) pour les sept plateformes du groupe.**
7 +**Portail de l'écosystème ·Ka : le site vitrine qui fédère les 12 plateformes québécoises du groupe, et le compte unique (KA ID) qui les relie toutes.**
8 8
9 9 [![Site](https://img.shields.io/website?url=https%3A%2F%2Fwww.groupe-ka.com&up_message=en%20ligne&down_message=hors%20ligne&label=groupe-ka.com&style=flat-square)](https://www.groupe-ka.com)
10 10 [![Next.js](https://img.shields.io/badge/Next.js-16.3-000000?style=flat-square&logo=nextdotjs&logoColor=white)](https://nextjs.org)
@@ -17,94 +17,132 @@
17 17 [![Sign in with Apple](https://img.shields.io/badge/Connexion-Sign_in_with_Apple-000000?style=flat-square&logo=apple&logoColor=white)](#-authentification)
18 18 [![JWT](https://img.shields.io/badge/Sessions-JWT_HS256_(jose)-d9f26b?style=flat-square)](#-authentification)
19 19 [![scrypt](https://img.shields.io/badge/Mots_de_passe-scrypt_natif-1c5c41?style=flat-square)](#-authentification)
20 −[![Apple Wallet](https://img.shields.io/badge/Carte_membre-Apple_Wallet-999999?style=flat-square&logo=apple&logoColor=white)](#-fonctionnalités)
20 +[![Apple Wallet](https://img.shields.io/badge/Carte_membre-Apple_Wallet-999999?style=flat-square&logo=apple&logoColor=white)](#-fonctionnalités-principales)
21 21
22 −[![Plateformes SSO](https://img.shields.io/badge/SSO-7_plateformes-1c5c41?style=flat-square)](#-sso--un-compte-sept-plateformes)
23 −[![Routes API](https://img.shields.io/badge/API-17_routes-141814?style=flat-square)](#-routes)
24 −[![Pages](https://img.shields.io/badge/Pages-8-141814?style=flat-square)](#-routes)
25 −[![Code](https://img.shields.io/badge/TS%2FTSX-~5_400_lignes-141814?style=flat-square)](#-métriques)
22 +[![Plateformes SSO](https://img.shields.io/badge/SSO-12_plateformes_+_iOS-1c5c41?style=flat-square)](#-sso--un-compte-douze-plateformes)
23 +[![Routes API](https://img.shields.io/badge/API-20_routes-141814?style=flat-square)](#-routes)
24 +[![Pages](https://img.shields.io/badge/Pages-14-141814?style=flat-square)](#-routes)
26 25 [![PM2](https://img.shields.io/badge/Prod-PM2_+_ngrok-2B037A?style=flat-square&logo=pm2&logoColor=white)](#-déploiement)
27 26 [![Licence](https://img.shields.io/badge/©_2026-Simon--Pierre_Boucher-d9f26b?style=flat-square)](#-auteur)
28 27
29 28 </div>
30 29
30 +![Aperçu de Groupe Ka](docs/screenshot.png)
31 +
31 32 ---
32 33
33 −## 📸 Aperçu
34 +## 📖 Description
34 35
35 −| Accueil | Connexion (KA ID) |
36 −|:---:|:---:|
37 −| ![Accueil](assets/screenshots/accueil.png) | ![Connexion](assets/screenshots/connexion.png) |
36 +**Groupe Ka** est le **hub central de l'écosystème ·Ka** — [**www.groupe-ka.com**](https://www.groupe-ka.com). Il joue trois rôles :
38 37
39 −<div align="center">
40 −<img src="assets/screenshots/mobile.png" alt="Vue mobile — icône compte directement dans le header" width="260">
41 −</div>
38 +1. **Vitrine du groupe** : présentation des **12 plateformes québécoises** de l'écosystème, avec **métriques live** (ticker, cartes plateformes, équation, socle) tirées en direct des `/api/stats` de chaque site (**ISR 10 min**, replis).
39 +2. **KA ID** : l'**identité centrale** du groupe (**SSO maison**) — un seul compte (**courriel + mot de passe**, **Google**, **Apple**) et un **`ka_id` partagé** par toutes les plateformes.
40 +3. **Tour de contrôle publique** : pages **`/status`** (disponibilité des 12 sites, historique **90 jours**, ticks aux **5 min**) et **`/stats`** (tableau de bord maître, consolidation live de l'écosystème).
42 41
43 −## ✨ Fonctionnalités
42 +## ✨ Fonctionnalités principales
44 43
45 −- 🪪 **KA ID** — identifiant membre unique (`ka-` + 10 chiffres) créé au hub, source de vérité du groupe.
46 −- 🔑 **Trois modes de connexion** : Google OAuth 2.0, Sign in with Apple, courriel + mot de passe (scrypt natif, zéro dépendance).
47 −- 🛰 **SSO maison** vers les 7 plateformes (jeton JWT signé par plateforme, 5 min).
48 −- 👤 **Profil enrichi** (bio, ville, réseaux sociaux, rôle…) affiché par toutes les plateformes, avec page publique `/u/[kaId]`.
49 −- ⭐ **Favoris unifiés** « Mon univers Ka » — magasin central, les plateformes poussent/lisent via `/api/sso/favorites`.
50 −- 💳 **Carte de membre** avec QR code + passe **Apple Wallet** signée (`/api/wallet/pass`).
44 +- 🪪 **KA ID** — identifiant membre unique (**`ka-` + 10 chiffres**) créé au hub, **source de vérité** de tout le groupe.
45 +- 🔑 **Trois modes de connexion** : **Google OAuth 2.0**, **Sign in with Apple**, **courriel + mot de passe** (**scrypt natif**, zéro dépendance).
46 +- 🛰 **SSO maison** vers les **12 plateformes** + l'app **iOS native** (`ka-ios`) — jeton **JWT signé par plateforme, 5 min**.
47 +- 👤 **Profil enrichi** (bio, ville, réseaux sociaux, rôle…) affiché par toutes les plateformes, avec page publique **`/u/[kaId]`**.
48 +- ⭐ **Favoris unifiés** « Mon univers Ka » — magasin central, les plateformes poussent/lisent via **`/api/sso/favorites`**.
49 +- 💳 **Carte de membre** avec QR code + passe **Apple Wallet** signée (**`/api/wallet/pass`**).
50 +- 📈 **Métriques live** de l'écosystème (`src/lib/live.ts`) et **page `/stats`** — consolidation en direct des **12 plateformes**.
51 +- 🟢 **Page `/status`** — état des sites vérifié en direct + **historique de disponibilité 90 jours** (`data/status/history.jsonl`, ticks aux **5 min** via cron PM2 **`groupe-ka-status-tick`**), uptime **24 h / 7 j / 30 j**.
52 +- 🤖 **KA Agent** — bulle de chat IA du groupe (`public/ka-agent.js`) câblée sur toutes les pages.
53 +- ⚖️ **Conformité** : pages **`/loi-25`**, **`/conditions`**, **`/confidentialite`**, **`/retrait`** (droit de retrait des données).
51 54 - 📱 **Menu mobile 100 % CSS** (case à cocher + `peer`, zéro JS) et icône compte directe dans le header.
55 +- 🎨 **ka-ui vendoré** (`src/ka/` + **`ecosystem.json`**) — design system, accents officiels et footer partagés de l'écosystème.
56 +
57 +## 🛰 SSO — un compte, douze plateformes
52 58
53 −## 📊 Métriques
59 +`/sso/authorize?client=<plateforme>` émet un **JWT (5 min)** signé avec le **secret partagé** de la plateforme. Clients enregistrés (`src/lib/sso.ts`) :
54 60
55 −| Métrique | Valeur |
56 −|---|---:|
57 −| Lignes TypeScript / TSX | ~5 400 |
58 −| CSS (design system maison) | ~850 lignes |
59 −| Routes API | **17** |
60 −| Pages | **8** |
61 −| Plateformes SSO servies | **7** |
62 −| Dépendances de prod | **7** seulement |
63 −| Base de données | SQLite (WAL), zéro serveur |
61 +[**Trouve·Ka**](https://www.trouve-ka.com) · [**Lou·Ka**](https://www.lou-ka.com) · [**Immo·Ka**](https://www.immo-ka.com) · [**Vrai-Prix**](https://www.vrai-prix.com) · [**Auto·Ka**](https://www.auto-ka.com) · [**Fabri·Ka**](https://www.fabri-ka.com) · [**Food·Ka**](https://www.food-ka.com) · [**Resto·Ka**](https://www.resto-ka.com) · [**Sorti·Ka**](https://www.sorti-ka.com) · [**Créa·Ka**](https://www.crea-ka.com) · [**API·Ka**](https://www.api-ka.com) · [**Job·Ka**](https://www.job-ka.com)
62 +
63 +… plus le client **`ka-ios`** (app iOS native du groupe, redirection `ka-ios://auth`).
64 64
65 65 ## 🔐 Authentification
66 66
67 67 | Mode | Détails |
68 68 |---|---|
69 −| **Google** | OAuth 2.0 code flow, `id_token` vérifié par JWKS (`jose`), liaison par `google_sub` puis courriel |
70 −| **Apple** | Sign in with Apple, retour `form_post`, `client_secret` = JWT ES256 signé à la volée avec la clé `.p8`, liaison par `apple_sub` |
71 −| **Courriel** | scrypt natif Node (`crypto.scryptSync`), comparaison à temps constant |
72 −| **Sessions** | JWT HS256 (`jose`) en témoin HttpOnly `ka_session`, 30 jours |
73 −
74 −## 🛰 SSO — un compte, sept plateformes
75 −
76 −`/sso/authorize?client=<plateforme>` émet un JWT (5 min) signé avec le secret partagé de la plateforme :
77 −[Lou·Ka](https://www.lou-ka.com) · [Immo·Ka](https://www.immo-ka.com) · [Vrai-Prix](https://www.vrai-prix.com) · [ValoPlex](https://www.valoplex.com) · [Auto·Ka](https://www.auto-ka.com) · [Fabri·Ka](https://www.fabri-ka.com) · [Food·Ka](https://www.food-ka.com)
69 +| **Google** | OAuth 2.0 code flow, `id_token` vérifié par **JWKS** (`jose`), liaison par `google_sub` puis courriel |
70 +| **Apple** | Sign in with Apple, retour `form_post`, `client_secret` = **JWT ES256** signé à la volée avec la clé `.p8`, liaison par `apple_sub` |
71 +| **Courriel** | **scrypt natif** Node (`crypto.scryptSync`), comparaison à temps constant |
72 +| **Sessions** | **JWT HS256** (`jose`) en témoin HttpOnly **`ka_session`**, **30 jours** |
78 73
79 74 ## 🗂 Routes
80 75
81 −**Pages** : `/` · `/connexion` · `/compte` · `/compte/carte` · `/u/[kaId]` · `/m/[kaId]` · `/conditions` · `/confidentialite`
76 +**Pages (14)** : `/` · `/connexion` · `/compte` · `/compte/carte` · `/u/[kaId]` · `/m/[kaId]` · `/stats` · `/status` · `/avis` · `/bots` · `/retrait` · `/loi-25` · `/conditions` · `/confidentialite`
82 77
83 −**API** :
78 +**API (20 routes)** :
84 79
85 80 | Groupe | Routes |
86 81 |---|---|
87 82 | Auth | `/api/auth/{login,register,logout,me}` · `/api/auth/{google,apple}` · `/api/auth/callback/{google,apple}` |
88 83 | Profil | `/api/profile` · `/api/profile/{role,public,avatar}` |
89 84 | SSO | `/sso/authorize` · `/api/sso/{profile,favorites}` |
85 +| Statut | `/api/status/tick` (cron PM2, 5 min) |
90 86 | Divers | `/api/favorites` · `/api/wallet/pass` · `/api/health` |
91 87
92 −## 🧱 Stack
88 +## 🧱 Stack technique
93 89
94 −**Next.js 16 (App Router, Turbopack)** · **React 19** · **TypeScript 5** · **Tailwind CSS 4** · **better-sqlite3** (WAL) · **jose** (JWT/JWKS) · **sharp** (avatars) · **qrcode** (carte de membre)
90 +**Next.js 16.3** (App Router, **Turbopack**) · **React 19.2** · **TypeScript 5** · **Tailwind CSS 4** · **better-sqlite3** (SQLite **WAL**, zéro serveur) · **jose** (JWT/JWKS) · **sharp** (avatars) · **qrcode** (carte de membre) — **7 dépendances de prod** seulement.
95 91
96 −## 🚀 Déploiement
92 +## 📁 Structure du projet
93 +
94 +```
95 +groupe-ka/
96 +├── src/
97 +│ ├── app/ # App Router : pages + API (compte, connexion, sso, stats, status, u/[kaId]…)
98 +│ ├── ka/ # ka-ui vendoré + ecosystem.json (13 sites, accents, footer partagé)
99 +│ └── lib/ # auth.ts, sso.ts, db.ts, live.ts, ecostats.ts, status.ts, roles.ts
100 +├── public/ # favicon, og.png, ka-agent.js (widget IA), documents
101 +├── assets/ # captures d'écran historiques
102 +├── data/ # SQLite (WAL) + status/history.jsonl (90 j)
103 +├── scripts/ # status-tick.sh (tick de disponibilité, cron PM2)
104 +└── docs/ # screenshot.png (aperçu du README)
105 +```
106 +
107 +## 🚀 Démarrage local
97 108
98 109 ```bash
110 +npm install
99 111 npm run dev # développement (http://localhost:3000)
100 112 npm run build # build de production
101 113 npm start # sert le build
114 +npm run lint # eslint
102 115 ```
103 116
104 −En production : nœud **M3U96b** du cluster MacLustr, **PM2** (auto-restart) + tunnel **ngrok** → [www.groupe-ka.com](https://www.groupe-ka.com).
105 −
106 117 Variables d'environnement : `BASE_URL`, `KA_AUTH_SECRET`, `GOOGLE_CLIENT_ID/SECRET`, `APPLE_CLIENT_ID/TEAM_ID/KEY_ID/PRIVATE_KEY`, `KA_SSO_SECRET_*` (une par plateforme), `KA_PASS_*` (Apple Wallet), `KA_DB_PATH`.
107 118
119 +## ☁️ Déploiement
120 +
121 +En production sur le nœud **M3U96b** du cluster MacLustr, **port 8110**, exposé via un tunnel **ngrok** → [**www.groupe-ka.com**](https://www.groupe-ka.com).
122 +
123 +Processus **PM2** (auto-restart) :
124 +
125 +| Processus | Rôle |
126 +|---|---|
127 +| **`groupe-ka`** | l'app Next.js (`next start`, port **8110**) |
128 +| **`groupe-ka-ngrok`** | le tunnel **ngrok** vers **www.groupe-ka.com** |
129 +| **`groupe-ka-status-tick`** | cron **5 min** — tick de disponibilité (`/api/status/tick`) |
130 +
131 +## 🛠 Développement remote-first (IMPORTANT)
132 +
133 +La **source de vérité** est le **repo git sur le nœud M3U96b** (`~/apps/groupe-ka`), **pas** une copie laptop. Tout se fait **via SSH** : édition, build, `pm2 restart groupe-ka`, puis commit/push **sur le nœud**.
134 +
135 +- `origin` = **spbgit** (git perso **git.spboucher.ai**), alias SSH **`gitsrv`** → `gitsrv:srv/git/groupe-ka.git` — **pas GitHub**.
136 +- Le push fonctionne grâce à l'**agent forwarding** pendant une session SSH depuis le laptop.
137 +
108 138 ## 👤 Auteur
109 139
110 140 **Simon-Pierre Boucher** — [contact@spboucher.ai](mailto:contact@spboucher.ai) · © 2026 Groupe KA
141 +
142 +---
143 +
144 +<div align="center">
145 +
146 +Un service **Groupe Ka**
147 +
148 +</div>
added docs/screenshot.png +0 −0

Binary file not shown.