Skip to content

Amorçage base neuve : réparer le chargement du schéma et les rôles - #1

Merged
THIOYE97 merged 1 commit into
mainfrom
fix/amorcage-base-neuve
Jul 22, 2026
Merged

THIOYE97 merged 1 commit into
mainfrom
fix/amorcage-base-neuve

Conversation

@THIOYE97

Copy link
Copy Markdown
Owner

Contexte

Le service de test provisionné hier ne démarrait pas (/auth/login en 500). L'investigation a montré que toute reconstruction d'une base neuve était silencieusement incomplète — une seule table sur 49 réellement créée, migrations calées à head malgré un schéma absent, seed et login cassés. Chaque défaut était masqué en dev local (connexion superuser).

Cinq correctifs (un seul fichier, scripts/init_db.py)

  1. Découpage SQL ré-écrit en mini-lexer : neutralise les ; dans les commentaires --, les chaînes '…' et les blocs $tag$…$tag$. Les en-têtes pg_dump étaient sinon éclatés en fragments exécutés (Type: TABLE…).
  2. check_function_bodies = false reposé sur la connexion de chargement (fonctions à référence anticipée, dont get_user_for_login).
  3. Méta-commandes psql (\restrict, PG 17) ignorées.
  4. Appartenance aux rôles : GRANT … TO CURRENT_USER pour autoriser le SET ROLE du seed.
  5. Privilèges runtime + contournement RLS : le dump est --no-privileges ; on accorde les droits et, faute de BYPASSRLS sur Render, on pose une politique permissive TO auth_bypass_rls sur chaque table à RLS. Sinon /auth/login → 401 sur toute base reconstruite.

Le seed insère désormais en tant que propriétaire (comme le runtime).

Validation

Reconstruction depuis une base vide avec le seul init_db → schéma complet (m13, 55 tables), seed admin, /auth/login HTTP 200 avec jeton émis par le service.

🤖 Generated with Claude Code

…s rôles

Cinq défauts empêchaient toute reconstruction from-scratch d'aboutir — tous
masqués en dev local, où la connexion est superuser.

- Découpage SQL : ré-écrit en mini-lexer. Il neutralise les « ; » nichés dans
  les commentaires -- , les chaînes '…' et les blocs $tag$…$tag$. Les en-têtes
  pg_dump (« -- Name: x; Type: TABLE; … ») étaient sinon éclatés en fragments
  exécutés tels quels — une seule table sur 49 était réellement créée.
- check_function_bodies = false reposé sur la connexion de chargement : les
  fonctions à référence anticipée (dont get_user_for_login) échouaient, le
  filtre anti-bruit ayant écarté le SET du dump.
- Méta-commandes psql (\restrict… — PG 17) désormais ignorées.
- Rôles applicatifs accordés à l'utilisateur courant (GRANT … TO CURRENT_USER)
  pour que le SET ROLE du seed soit permis.
- Privilèges runtime + contournement RLS : le dump étant --no-privileges, les
  rôles n'héritent d'aucun droit. On accorde SELECT/INSERT/… et, faute de
  pouvoir poser BYPASSRLS sur une base Render (propriétaire non-superuser), on
  crée une politique permissive « TO auth_bypass_rls USING (true) » sur chaque
  table à RLS — sinon /auth/login renvoie « permission denied for table users »
  puis un 401 systématique sur toute base reconstruite.

Le seed insère désormais en tant que propriétaire (comme le runtime), le
SET ROLE auth_bypass_rls d'origine ne fonctionnant que sous connexion superuser.

Validé de bout en bout : reconstruction depuis une base vide → /auth/login 200.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@THIOYE97
THIOYE97 merged commit f7754f3 into main Jul 22, 2026
2 of 3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants