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:
parent
58a0ffc76c
commit
17eea0559d
74
README.md
74
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
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user