From 17eea0559da0537667f6a14112b47496b9083b2b Mon Sep 17 00:00:00 2001 From: Bruno Charest Date: Wed, 27 May 2026 21:12:13 -0400 Subject: [PATCH] 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 --- README.md | 74 +++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 61 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 13fd79d..d0d2536 100644 --- a/README.md +++ b/README.md @@ -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