ADR-002 : SQLite + Drizzle plutôt que Postgres
ADR-002 : SQLite + Drizzle plutôt que Postgres
Date : 2026 (initial setup) — Statut : accepté
Contexte
Stockage relationnel pour : users, games, questions, feedbacks. Volume attendu : <10K users, <100K questions sur la durée de vie du projet (usage perso + qq invités potentiels).
Options : Postgres (standard, riche), MySQL/MariaDB, SQLite (local, simple).
Décision
SQLite (via better-sqlite3) + Drizzle ORM.
Raisons :
- Self-host minimal : un fichier
.dbdans un volume Unraid, zéro service supplémentaire à monitorer - ACID suffisant : SQLite est ACID et plus que rapide pour ce volume. WAL mode active par défaut.
better-sqlite3synchrone : pas de Promise pour chaque query, code plus simple, perfs excellentes (< 1ms par query)- Drizzle ORM : types end-to-end, migrations propres (
drizzle-kit generate+migrate), syntaxe expressive sans magie - Zéro pool / latence réseau : la DB tourne dans le même process que le backend
Conséquences
Bonnes
- Stack minimaliste : un container app + Qdrant, c'est tout
- Backup trivial : copier le
.db(en mode WAL : aussi.db-shmet.db-wal) - Migrations rapides à appliquer (single-instance, pas de coordination)
- Tests unitaires faciles :
:memory:ou tmpdir
Mauvaises
- Pas de scaling horizontal : un seul process écrit. Pour scaler, il faudrait migrer vers Postgres.
- Pas de réplication : si le fichier corrompt, restore depuis backup obligatoire.
- Concurrent writes : SQLite serialize les writes. Pas un problème sur ce volume, mais à connaître.
- Pas de full-text search avancé : SQLite a FTS5 mais on ne l'utilise pas. Le retrieval vectoriel est sur Qdrant.
Alternative envisagée
- Postgres : plus robuste mais demande un container supplémentaire, configuration users/perms, backup pg_dump à scripter, tuning à apprendre. Overkill pour <100K rows.
- PlanetScale / Neon serverless : non self-hostable simplement. Et envoyer les données chez un cloud tiers va à l'encontre du principe self-host du projet.
Migration future possible
Si on doit scaler :
- Drizzle supporte Postgres natif → migrer le schéma
src/schema.ts(changer le driver) - Migrations SQL traduites manuellement (SQLite et Postgres ont des syntaxes proches mais quelques diffs :
INTEGER PRIMARY KEY AUTOINCREMENTvsSERIAL) - Sessions in-memory → table
sessionsdans la même DB - Container Postgres + volume + healthcheck dans
docker-compose.yml
L'effort est borné : Drizzle abstrait l'essentiel. C'est faisable en 1-2 jours quand le besoin se présente.
No comments to display
No comments to display