LogoKalli
Database

Database Installation & Setup

Installation & configuration de la base

Option 1 — Docker (recommandé pour le dev local)

docker run --name naivi-postgres \
  -e POSTGRES_USER=naivi \
  -e POSTGRES_PASSWORD=naivi \
  -e POSTGRES_DB=naivi \
  -p 5432:5432 \
  -d postgres:16

DATABASE_URL=postgresql://naivi:naivi@localhost:5432/naivi

Option 2 — PostgreSQL local

Installez PostgreSQL 14+ depuis postgresql.org, puis créez la base:

CREATE USER naivi WITH PASSWORD 'naivi';
CREATE DATABASE naivi OWNER naivi;

Appliquer le schéma (Drizzle)

Le schéma est géré par Drizzle ORM depuis apps/server/.

cd apps/server

# Générer les fichiers de migration depuis le schéma TypeScript
bun run db:generate

# Appliquer les migrations sur la DB
bun run db:migrate

# Alternativement: pousser le schéma directement (dev uniquement)
bun run db:push

Les migrations générées se trouvent dans apps/server/drizzle/.

Extension pgcrypto

Le schéma utilise gen_random_uuid() qui requiert l'extension pgcrypto. Elle est activée par le premier script de migration via:

CREATE EXTENSION IF NOT EXISTS pgcrypto;

Si vous utilisez PostgreSQL 13+, gen_random_uuid() est disponible nativement sans extension.

Variable DATABASE_URL

Tous les services qui accèdent directement à la DB (server + chatbot) lisent DATABASE_URL:

postgresql://<user>:<password>@<host>:<port>/<database>

Pour le chatbot, la connexion est établie via psycopg2 (common/db.py). Pour le server, via Drizzle (db/index.ts).

Rôles par défaut

Au premier démarrage du server, ensureDefaultRoles() crée automatiquement:

  • Rôle admin (is_super_admin: true, display_order: 0)
  • Rôle user (is_super_admin: false, display_order: 1)

Ces rôles sont des rôles applicatifs (table roles dans le schéma naivi), distincts des rôles Better Auth (user.role).

Sauvegarde & restauration

# Dump
pg_dump -U naivi naivi > backup.sql

# Restore
psql -U naivi naivi < backup.sql

Pour les environnements Kubernetes, configurez des CronJobs de backup ou utilisez un opérateur PostgreSQL (ex: CloudNativePG).