Kalli
Server

Database & Migrations

Base de données & migrations (serveur)

Cette page décrit comment le serveur accède à la base et gère ses migrations. Le détail des tables est dans Schéma & rôles des tables.

Fichiers

ÉlémentEmplacement
Connexionsapps/server/src/db/index.ts
Schémas Drizzleapps/server/src/db/schema/auth.ts (Better Auth), apps/server/src/db/schema/naivi.ts (métier)
Configuration Drizzleapps/server/drizzle.config.ts
Migrations SQLapps/server/drizzle/ (0000 à 0005, journal dans drizzle/meta/_journal.json)
Script de migrationapps/server/src/scripts/migrate.ts (lit DATABASE_URL)

Connexions

Deux pools pg sont créés au démarrage :

  • Principal (DATABASE_URL, 20 connexions max) : schémas auth et naivi, utilisé par toutes les procédures.
  • Chainlit (CHAINLIT_DATABASE_URL, 10 connexions max) : lecture seule côté métier, pour getLogo et getAllFeedback.

Les deux pools sont fermés sur SIGTERM et SIGINT.

Scripts

Lancés depuis apps/server/ :

ScriptEffet
bun run db:generateGénère une migration SQL à partir des schémas TypeScript
bun run db:migrateApplique les migrations existantes
bun run db:pushPousse directement le schéma (développement uniquement)
bun run db:statusVérifie l'état des migrations (check-migrations.ts)
bun run db:studioInterface Drizzle Studio

Le déploiement applique les migrations avant de démarrer le serveur : dans Helm, un initContainer db-migrate lance db:migrate (voir Déploiement).

Historique des migrations

FichierContenu
0000_transform_to_unified_schema.sqlCrée les extensions et enums, les tables Better Auth (si absentes), les tables métier unifiées (files, chunks, qa_pair, logo, tags, roles, role_tags, item_tags, indexes, index_chunks). Migre les anciennes tables (regular_files, qa_files, chunk_tags, qa_tags, indexes_chunks) puis les supprime. Active pgcrypto pour gen_random_uuid().
0001_pink_luke_cage.sqlSupprime la clé étrangère de index_chunks.chunk_id, qui référence à la fois chunks et qa_pair.
0002_add_role_id_to_indexes.sqlAjoute indexes.role_id (FK vers roles, ON DELETE SET NULL) et l'index indexes_role_active_idx.
0003_create_chainlit_tables.sqlCrée les tables Chainlit (User, Thread, Step, Element, Feedback) dans la base migrée.
0004_open_dark_beast.sqlAjoute chunks.metadata et files.processing_metadata (JSONB).
0005_premium_tombstone.sqlAjoute roles.is_hierarchy_excluded.

Points à connaître :

  • La table file_assignments est créée par 0000 et n'est plus utilisée : elle n'existe pas dans db/schema/naivi.ts (déclaration commentée). Elle peut donc subsister dans une base existante.
  • La table logo est créée dans la base migrée, mais getLogo lit le logo dans la base Chainlit (CHAINLIT_DATABASE_URL).
  • La migration 0003 place les tables Chainlit dans la même base que le schéma métier, alors que le serveur les lit par un pool distinct. Si les deux bases sont séparées, 0003 crée des tables inutilisées dans la base principale.

Règles de modification

  1. Modifier le schéma dans apps/server/src/db/schema/*.ts.
  2. Lancer bun run db:generate, puis relire le SQL généré dans apps/server/drizzle/.
  3. Committer la migration avec le code qui en dépend.
  4. Appliquer les migrations avant de déployer ce code (db:migrate).

Les modifications manuelles de schéma en production sont à éviter : elles désynchronisent le journal Drizzle.