ENV SETUP — better-auth-nextjs ================================ Guide d'installation locale complet. Aucun secret ici : les valeurs vont dans `.env` (ignoré). ------------------------------------------------------------------ 1. PRÉREQUIS (versions validées le 2026-08-26) ------------------------------------------------------------------ Outil Version Install Vérif --------- --------- ---------------------------------------- ------------------- Node 26.7 mise use node@latest node --version bun 1.4 mise use bun@latest bun --version sfw — npm i -g sfw (Socket Firewall) which sfw tursodb 0.7.2 brew install tursodatabase/tap/turso tursodb --version agentfs 0.6.4 cargo install agentfs (déjà installé) agentfs --version d3k — bun install -g dev3000 d3k --version Pas besoin du CLI cloud `turso` : tout est local (fichier libsql). pnpm n'est plus utilisé (lockfile supprimé) — ne pas lancer `pnpm install`. ------------------------------------------------------------------ 2. INSTALLATION ------------------------------------------------------------------ cd ~/Github/better-auth-nextjs sfw bun install # deps via Socket Firewall cp env.example .env # puis éditer .env (section 3) bun run db:migrate # crée data/local.db + 20 tables Better Auth d3k --no-agent --no-tui -t # dev server + Chrome monitoré → http://better-auth-nextjs-demo.localhost:1355 Réinitialiser la base : arrêter d3k, `rm data/local.db*`, `bun run db:migrate`. ------------------------------------------------------------------ 3. VARIABLES D'ENVIRONNEMENT (.env) ------------------------------------------------------------------ [REQUIS] BETTER_AUTH_URL URL publique SANS slash final. dev d3k : http://better-auth-nextjs-demo.localhost:1355 dev nu : http://localhost:3000 BETTER_AUTH_SECRET ≥ 32 chars. Générer : `bunx auth secret` ou `openssl rand -base64 32` TURSO_DATABASE_URL file:./data/local.db (Turso local, aucun token) Prod Turso Cloud : libsql://-.turso.io + TURSO_AUTH_TOKEN (dashboard Turso → Database → Generate token) [OPTIONNEL — base alternative] DEMO_SQLITE_PATH Chemin SQLite natif Node (node:sqlite). Prioritaire sur Turso si défini. Utilisé par les tests e2e upstream. Laisser vide. [OPTIONNEL — emails, Resend] https://resend.com/api-keys RESEND_API_KEY Vide en dev → emails rendus en texte dans les logs serveur (`d3k logs --type server`), rien n'est envoyé. BETTER_AUTH_EMAIL Expéditeur. Par défaut "Better Auth " (sandbox Resend : ne délivre qu'à l'email de votre compte Resend). Pour un vrai domaine : vérifier le domaine dans Resend puis "Nom ". Emails concernés : vérification d'adresse, reset mot de passe, magic link, code OTP 2FA, invitation d'organisation. [OPTIONNEL — Stripe] https://dashboard.stripe.com/test/apikeys STRIPE_KEY sk_test_… STRIPE_WEBHOOK_SECRET whsec_… (stripe listen --forward-to http://better-auth-nextjs-demo.localhost:1355/api/auth/stripe/webhook) STRIPE_PLUS_PRICE_ID price_… (plan Plus mensuel) STRIPE_PLUS_ANNUAL_PRICE_ID price_… STRIPE_PRO_PRICE_ID price_… STRIPE_PRO_ANNUAL_PRICE_ID price_… Sans STRIPE_KEY : /pricing s'affiche, le checkout échoue. Des price IDs de démo (compte Better Auth) sont utilisés si vides — à remplacer par les vôtres. [OPTIONNEL — démo SCIM, désactivée] SCIM_DEMO_ENABLED false (true pour activer le workflow SCIM local) SCIM_DEMO_CREDENTIAL_PEPPER ≥ 32 chars aléatoires (requis si enabled) SCIM_DEMO_OIDC_CLIENT_SECRET ≥ 32 chars (portail employé ; SCIM marche sans) SCIM_DEMO_OIDC_SIGNING_PRIVATE_KEY JWK RSA privée ou PEM PKCS#8 ; vide en localhost (clé éphémère générée) Variables SUPPRIMÉES du projet (ne plus les définir) : NODE_ENV, USE_MYSQL, MYSQL_DATABASE_URL, tous les *_CLIENT_ID / *_CLIENT_SECRET sociaux (Google, GitHub, Apple, Discord, Twitter, Microsoft, Twitch, Facebook, PayPal, Railway, Vercel), BETTER_AUTH_API_KEY (@better-auth/infra), TEST_EMAIL. ------------------------------------------------------------------ 4. TURSO LOCAL — fonctionnement ------------------------------------------------------------------ - Le driver est @libsql/client via @libsql/kysely-libsql (lib/auth.ts). `file:./data/local.db` = fichier SQLite/libsql relatif à la racine du projet. - Même code en prod : remplacer l'URL par libsql://… + token, rien d'autre. - Inspecter : bun run db:shell # shell interactif (app arrêtée de préférence) tursodb --readonly data/local.db ".tables" tursodb --readonly data/local.db "select id,email,emailVerified from user;" - Après tout changement de plugin dans lib/auth.ts : `bun run db:migrate`. - Le moteur in-process @tursodatabase/database n'est PAS utilisé : Better Auth n'a pas de dialect Kysely officiel pour lui. Choix documenté, revoir si Turso publie un dialect. ------------------------------------------------------------------ 5. d3k — runtime de dev ------------------------------------------------------------------ d3k status --json # running / appUrl / browserConnected d3k --no-agent --no-tui -t # démarrer (détecte bun + `bun run dev`) d3k errors --context # erreurs navigateur + serveur avec contexte d3k logs --type server # ← les emails de dev (magic link, reset…) sont ici d3k agent-browser snapshot -i Artefacts : ~/.d3k/better-auth-nextjs-demo-*/ (logs, screenshots, profil Chrome). Ne jamais lancer `bun run dev` en parallèle de d3k. ------------------------------------------------------------------ 6. agentfs — sandbox pour les commandes d'agent ------------------------------------------------------------------ Exécute une commande dans un overlay copy-on-write : le FS hôte est en lecture seule, les écritures vont dans une couche delta inspectable. agentfs run -- bun run typecheck # session unique agentfs run --session -- # réutiliser une couche delta agentfs diff # voir ce qui a changé agentfs ps # sessions actives agentfs timeline # journal des actions Par défaut ~/.config, ~/.cache, ~/.local, ~/.claude restent inscriptibles (`--no-default-allows` pour les bloquer, `--allow ` pour en ajouter). Testé OK sur macOS (session créée, exit 0). ------------------------------------------------------------------ 7. VÉRIFICATIONS ------------------------------------------------------------------ bun run typecheck # doit être vert bun run knip # code mort : seul lib/scim-demo-employee.test.ts attendu curl -s $BETTER_AUTH_URL/api/auth/ok # {"ok":true} Flux validés le 2026-08-26 : magic link (lien dans les logs → /dashboard, user créé en base), inscription email/mot de passe.