README : installation, configuration, authentification OpenID Connect

This commit is contained in:
fabien committed 2026-10-06 22:15:59 +02:00
1 parent 058370830f
commit 535603f6d3
1 file changed
+110
+110
View File
@@ -0,0 +1,110 @@
# Lassistanoque
Assistant IA auto-hébergé : backend Go (API + SPA embarquée), base SQLite, connecteurs LLM multiples (via [any-llm](https://github.com/mozilla-ai/any-llm-go)), authentification par mot de passe ou OpenID Connect.
## Prérequis
- Go >= 1.26
- Node.js + npm (build du frontend)
- (optionnel) un serveur OpenID Connect, ex. [Keycloak](https://www.keycloak.org/)
## Installation
```bash
# 1. frontend : build la SPA et l'écrit dans backend/internal/http/web
cd backend/web
npm install
npm run build
# 2. backend
cd ..
go build -o lassistanoque .
```
Le `Makefile` du backend enchaîne les deux et produit les binaires multi-plateformes dans `build/` :
```bash
make build # linux/amd64, linux/arm64, windows, darwin...
```
## Configuration
La configuration se fait par variables d'environnement, chargeables depuis un fichier `.env` placé dans le répertoire de lancement (backend) :
| Variable | Défaut | Description |
|----------------------------|--------------------|----------------------------------------------------|
| `LASSISTANOQUE_DB_TYPE` | `turso` | Type de base (seul `turso`/SQLite est implémenté) |
| `LASSISTANOQUE_DB_URL` | `lassistanoque.db` | Chemin du fichier SQLite |
| `LASSISTANOQUE_HTTP_PORT` | `3000` | Port du serveur HTTP |
| `LASSISTANOQUE_JWT_SECRET` | *(obligatoire)* | Secret de signature des tokens, ex. `openssl rand -base64 32` |
| `LASSISTANOQUE_STORAGE_TYPE`| `database` | Stockage des fichiers (seul `database` est implémenté) |
| `LASSISTANOQUE_SERVER_ID` | `default` | Identifiant du serveur |
Exemple `backend/.env` :
```env
LASSISTANOQUE_JWT_SECRET=<secret généré>
LASSISTANOQUE_HTTP_PORT=3000
```
## Lancement
```bash
./lassistanoque serve
```
- Les migrations de la base sont appliquées automatiquement au démarrage (ou manuellement avec `./lassistanoque migrate`).
- L'application est servie sur `http://localhost:3000` (SPA + API `/api`).
- Créez le premier compte depuis la page d'inscription (`/register`), puis configurez un fournisseur LLM et sa clé d'API dans les réglages de l'espace (`settings/models`).
## Authentification OpenID Connect
Les fournisseurs OIDC sont enregistrés dans la table `oidc` :
```sql
insert into oidc (id, label, domain, client_id, client_secret, wellknown_url, _date_created, _version)
values (
'keycloak', -- identifiant du fournisseur
'Keycloak', -- libellé affiché sur la page de connexion
'sso.example.com', -- domaine du fournisseur
'lassistanoque', -- client_id
'<client_secret>',
'https://<keycloak>/realms/<realm>/.well-known/openid-configuration',
datetime('now'),
'v1'
);
```
Côté fournisseur (Keycloak) :
- client de type *confidential*, *Standard Flow* (authorization code) activé ;
- *Valid Redirect URIs* : `http://localhost:3000/api/auth/oidc/callback` (l'URL de callback est reconstruite depuis le `Host` de la requête ; derrière un reverse proxy, transmettre `X-Forwarded-Proto` et `X-Forwarded-Host`).
Flux : les fournisseurs configurés apparaissent comme boutons sur la page de connexion → redirection vers le fournisseur → au retour, le backend valide le `state` signé, échange le code, vérifie le token ID (signature JWKS, émetteur, audience) puis délivre les tokens applicatifs. À la première connexion, l'utilisateur est créé automatiquement avec son espace personnel.
## Développement
```bash
# backend (API sur :3000)
cd backend
go run . serve
# frontend en mode dev (Vite sur :5173, API proxyfiée vers :3000)
cd web
npm run dev
```
Structure :
```
backend/
├── cmd/ # CLI (serve, migrate, version) et assemblage IoC
├── internal/
│ ├── adapter/ # implémentations : db (turso/SQLite), auth (password, oidc), llm, tools, security (JWT)
│ ├── domain/ # entités et interfaces des repositories
│ ├── http/ # serveur HTTP, routes, SPA embarquée
│ └── service/ # logique métier (auth, chat, agents, tasks...)
└── web/ # frontend SvelteKit
```
Tests : `go test ./backend/...`