docs: update README with quick wins, security features, .env workflow

- Add GZip + Cache-Control + .dockerignore to Features & Performance
- Update installation: add .env creation step
- Update docker-compose example: include env_file + data volume
- Rewrite auth activation: use .env instead of docker-compose.yml
- Expand auth env vars table: TTL, rate limiting
- Expand Security section: rate limiting, audit, backup, secret redaction
- Update Stack technique: security, PDF, compression, .dockerignore
This commit is contained in:
Bruno Charest 2026-05-27 21:12:13 -04:00
parent 58a0ffc76c
commit 17eea0559d

View File

@ -61,7 +61,8 @@
- ** Gestion dynamique des vaults** : Ajout/suppression de vaults via API sans redémarrage
- **🐳 Docker multi-platform** : linux/amd64, linux/arm64, linux/arm/v7, linux/386
- **🔒 Authentification** : JWT + Argon2id, sessions persistantes, contrôle d'accès par vault
- **🛡️ Sécurité** : Headers de sécurité (CSP, X-Frame-Options…), protection path traversal, utilisateur non-root
- **🛡️ Sécurité** : Rate limiting, audit log, backup automatique, redaction de secrets, headers CSP, protection path traversal, utilisateur non-root
- **⚡ Performance** : Compression GZip, Cache-Control immutable, index inversé incrémental, search sans I/O disque
- **❤️ Healthcheck** : Endpoint `/api/health` intégré pour Docker et monitoring
---
@ -90,7 +91,7 @@ git clone https://git.dracodev.net/Projets/ObsiGate.git
cd ObsiGate
```
### 2. Configurer vos vaults
### 2. Configurer vos vaults et vos secrets
Éditez le fichier `docker-compose.yml` pour ajouter vos vaults Obsidian :
@ -101,6 +102,15 @@ volumes:
> **Important** : Le chemin doit être absolu et le volume en lecture seule (`:ro`)
Créez votre fichier `.env` pour l'authentification et les secrets :
```bash
cp .env.example .env
# Éditez .env pour configurer vos mots de passe et options
```
> **Ne committez jamais `.env` !** Il est dans `.gitignore`. Utilisez `.env.example` comme référence.
### 3. Lancer l'application
```bash
@ -148,6 +158,8 @@ services:
- /home/user/Documents/Obsidian-Recettes:/vaults/Recettes:ro
- /home/user/Documents/Obsidian-IT:/vaults/IT:ro
- /home/user/Documents/Obsidian-Perso:/vaults/Perso:ro
# Persistance des données d'auth
- ./data:/app/data
environment:
# Configuration des vaults
- VAULT_1_NAME=Recettes
@ -156,6 +168,11 @@ services:
- VAULT_2_PATH=/vaults/IT
- VAULT_3_NAME=Perso
- VAULT_3_PATH=/vaults/Perso
# Auth (les secrets sont dans .env)
- OBSIGATE_AUTH_ENABLED=true
- OBSIGATE_ADMIN_USER=admin
env_file:
- .env # Contient OBSIGATE_ADMIN_PASSWORD et autres secrets
```
### Étape 3 : Build & déploiement
@ -206,16 +223,25 @@ ObsiGate supporte un système d'authentification optionnel basé sur **JWT + Arg
### Activer l'authentification
Dans `docker-compose.yml`, décommentez les variables d'auth :
1. **Copiez le template `.env`** :
```bash
cp .env.example .env
```
```yaml
environment:
# ... vaults ...
- OBSIGATE_AUTH_ENABLED=true
# - OBSIGATE_ADMIN_USER=admin # Défaut: admin
# - OBSIGATE_ADMIN_PASSWORD= # Vide = mot de passe auto-généré (voir logs)
# - OBSIGATE_SECURE_COOKIES=false # true si derrière un reverse-proxy HTTPS
```
2. **Éditez `.env`** et décommentez/configurez les variables :
```bash
OBSIGATE_AUTH_ENABLED=*** OBSIGATE_ADMIN_USER=admin
OBSIGATE_ADMIN_PASSWORD=votre_mot_de_passe # Laissez vide = auto-généré (voir logs)
# OBSIGATE_SECURE_COOKIES=false # true si derrière HTTPS
```
3. **Dans `docker-compose.yml`**, assurez-vous d'avoir :
```yaml
env_file:
- .env
```
> **Ne mettez jamais de mot de passe dans `docker-compose.yml` !** Utilisez toujours `.env`.
### Premier démarrage
@ -275,6 +301,12 @@ Lorsqu'un compte **admin** est connecté, une icône 🛡️ apparaît dans le h
| `OBSIGATE_ADMIN_USER` | Nom de l'admin auto-créé | `admin` |
| `OBSIGATE_ADMIN_PASSWORD` | Mot de passe admin (vide = auto-généré) | *(auto)* |
| `OBSIGATE_SECURE_COOKIES` | Cookie `Secure` (HTTPS uniquement) | `false` |
| `OBSIGATE_ACCESS_TOKEN_TTL` | Durée de vie token JWT (secondes) | `3600` |
| `OBSIGATE_REFRESH_TOKEN_TTL` | Durée de vie refresh token (secondes) | `2592000` |
| `OBSIGATE_LOGIN_MAX_ATTEMPTS` | Tentatives de login max par IP | `10` |
| `OBSIGATE_LOGIN_WINDOW_SECONDS` | Fenêtre de rate limiting (secondes) | `900` |
>Toutes ces variables sont documentées dans `.env.example`.
### Volume pour la persistance
@ -652,6 +684,13 @@ Ces paramètres sont configurables via l'interface (Settings) ou l'API `/api/con
- **Query time display** : temps serveur affiché dans les résultats (`query_time_ms`)
- **Staleness detection fix** : utilisation d'un compteur de génération au lieu de `id(index)` pour détecter les changements d'index
### Optimisations v1.5.0 (Quick Wins 2026-05-27)
- **Compression GZip** : middleware FastAPI compresse toutes les réponses >1KB (~70% de bande passante économisée)
- **Cache-Control immutable** : les assets statiques (`/static/*`) sont cachés 1 an par le navigateur
- **`.dockerignore`** : contexte de build Docker minimal (pas de `.git`, `docs/`, `*.md`, `__pycache__`)
- **InvertedIndex incrémental** : hooks `add_document`/`remove_document`, plus de rebuild O(N) à chaque mutation
### Optimisations v1.1.0
- **Recherche sans I/O** : le contenu des fichiers est mis en cache dans l'index mémoire
@ -665,8 +704,14 @@ Ces paramètres sont configurables via l'interface (Settings) ou l'API `/api/con
## 🛡️ Sécurité
- **Path traversal** : tous les endpoints fichier valident que le chemin résolu reste dans la vault
- **Utilisateur non-root** : le conteneur Docker tourne sous l'utilisateur `obsigate`
- **Rate limiting** : 10 tentatives de login max par IP sur 15 minutes + lockout par compte (5 tentatives)
- **Audit log** : toutes les écritures, suppressions et changements de config sont journalisés dans `data/audit.log` (JSON lines, rotation 10 MB)
- **Backup automatique** : chaque modification ou suppression de fichier est sauvegardée dans `.obsigate-backup/` avec timestamp
- **Secret redaction** : masquage automatique des JWT, clés API, tokens et connection strings dans les aperçus
- **Utilisateur non-root** : le conteneur Docker tourne sous l'utilisateur `obsigate` (UID 1000)
- **Volumes read-only** : les vaults sont montées en `:ro` par défaut dans docker-compose
- **Secrets dans `.env`** : les mots de passe et tokens ne sont jamais dans `docker-compose.yml`
- **Atomic writes** : les fichiers de données (users.json, shares.json, webhooks.json) utilisent tmp+replace
---
@ -674,10 +719,13 @@ Ces paramètres sont configurables via l'interface (Settings) ou l'API `/api/con
- **Backend** : Python 3.11 + FastAPI 0.110 + Uvicorn
- **Auth** : python-jose (JWT HS256) + argon2-cffi (Argon2id)
- **Security** : rate limiting (IP + account lockout), audit logging, secret redaction, atomic writes
- **File Watcher** : watchdog 4.x (inotify natif + fallback polling)
- **Frontend** : Vanilla JS + HTML + CSS (zéro framework, zéro build)
- **Rendu Markdown** : mistune 3.x
- **Image Docker** : python:3.11-slim (multi-stage)
- **PDF Export** : WeasyPrint 60+
- **Compression** : GZip middleware (FastAPI), Cache-Control immutable pour les assets
- **Image Docker** : python:3.11-slim (multi-stage), `.dockerignore` pour contexte minimal
- **Stockage utilisateurs** : JSON local (`data/users.json`) — aucune base de données
- **Architecture** : SPA + API REST + SSE