Procédures opérationnelles
Runbooks d'exploitation pour les tâches de maintenance courantes.
Régénérer Les Actions DB
bun run generate:actionsLancez cette commande après des changements de schéma Drizzle. Commitez les fichiers générés avec le changement de schéma afin que TypeScript et les tests de contrats authz voient la même surface d'actions base de données que le runtime.
Changer Le Domaine Production
La production Yayaw est servie canoniquement depuis https://yayaw.app.
- Attachez le domaine apex au projet Vercel
yayaw:
vercel domains add yayaw.app- Ajoutez
www.yayaw.appcomme domaine projet redirigeant versyayaw.appavec le statut308. - Gardez les domaines
.euretirés uniquement comme redirections de domaine projet avec le statut308: routezyayaw.euetwww.yayaw.euversyayaw.app. Les projets compagnons doivent suivre le même modèle, par exempletable.yayaw.euverstable.yayaw.app. - Définissez les variables d'environnement production:
NEXT_PUBLIC_BASE_URL=https://yayaw.app
BETTER_AUTH_TRUSTED_ORIGINS=https://*.yayaw.app,https://*.vercel.app- Gardez une branche Git durable
preview, attachezpreview.yayaw.appcomme domaine de prévisualisation Vercel adossé à cette branche, puis définissez leNEXT_PUBLIC_BASE_URLde prévisualisation:
NEXT_PUBLIC_BASE_URL=https://preview.yayaw.app- Ne gardez pas d'anciens hôtes de prévisualisation comme domaines actifs après
vérification de
preview.yayaw.app. - Redéployez les derniers déploiements production et prévisualisation afin que les builds reçoivent l'URL publique de base.
- Mettez à jour les callbacks et webhooks tiers qui stockent des origines absolues: fournisseurs OAuth, webhooks Stripe, URLs de retour du portail de facturation, liens e-mail et réglages analytics/site.
Déployer Le Runtime Auto-Hébergé
- Copiez le fichier exemple et renseignez les secrets production hors git:
cp .env.self-host.example .env.self-host
perl -0pi -e "s/^BETTER_AUTH_SECRET=$/BETTER_AUTH_SECRET=$(openssl rand -hex 32)/m" .env.self-host- Lancez la synchronisation de schéma et le seed:
docker compose --env-file .env.self-host -f docker-compose.self-host.yml --profile setup run --rm migrate- Démarrez ou mettez à jour le runtime:
docker compose --env-file .env.self-host -f docker-compose.self-host.yml up --build -d- Confirmez que Caddy atteint l'app et que les en-têtes
Host/X-Forwarded-*sont préservés en ouvrant leDEPLOYMENT_URLconfiguré. - Téléversez une ressource média et confirmez qu'elle est servie depuis le
STORAGE_PUBLIC_BASE_URLconfiguré. - Confirmez que
bun run worker:page-aitourne via le service ComposeworkerlorsquePAGE_AI_QUEUE_DRIVER=db-worker. - Sauvegardez Postgres et le stockage objet ensemble avant toute release risquée.
Mettre À Jour Les Feature Flags Seedés
- Modifiez
src/lib/scripts/seed.ts. - Appliquez le seed:
bun run seed- Relancez les checks applicatifs:
bun run check
bunx tsc --noEmit
bun run buildMiroiter La Documentation Yayaw Table Dans Le CMS
Utilisez le script de migration adossé au MCP seulement lorsqu'un opérateur a
besoin d'un miroir CMS de la documentation Fumadocs Yayaw Table sous
https://yayaw.app/table/docs. La source de vérité reste
content/docs/{en,fr}/table. Gardez la landing Table et la page d'exemple
directement rédigées dans le CMS.
Lancez d'abord un dry-run:
YAYAW_MCP_LOCAL_USER_ID=<superadmin-user-id> \
YAYAW_MCP_ENV_FILE=/path/to/yayaw-env.txt \
bun --conditions react-server --env-file=.env \
src/lib/scripts/mcp/migrate-table-pages-to-cms.tsAppliquez et publiez les pages CMS après un dry-run propre:
TABLE_CMS_APPLY=1 TABLE_CMS_PUBLISH=1 \
YAYAW_MCP_LOCAL_USER_ID=<superadmin-user-id> \
YAYAW_MCP_ENV_FILE=/path/to/yayaw-env.txt \
bun --conditions react-server --env-file=.env \
src/lib/scripts/mcp/migrate-table-pages-to-cms.tsLe script clone la source publique Yayaw-Table, construit des documents Puck
localisés pour /table/docs et chaque guide /table/docs/*, puis les crée,
valide et publie via le serveur MCP stdio local. Définissez
YAYAW_TABLE_SOURCE_DIR pour réutiliser un checkout existant ou
YAYAW_TABLE_SOURCE_REF pour migrer une branche source précise. Définissez
YAYAW_MCP_ENV_FILE si le serveur MCP local doit utiliser un fichier
d'environnement autre que .env. Définissez YAYAW_MCP_REQUEST_TIMEOUT_MS si
un tunnel lent ou un gros dataset CMS nécessite plus que le timeout MCP par
défaut de cinq minutes. Définissez TABLE_CMS_SKIP_EXISTING_PAGE_SCAN=1 pour
ignorer le scan non essentiel de la page globale /table via tunnel lent; chaque
page est quand même vérifiée par slug avant create/update. Définissez
TABLE_CMS_INCLUDE_SITE_PAGES=1 seulement si vous voulez régénérer
intentionnellement /table et /table/example depuis le projet source au lieu
de conserver ces pages rédigées dans le CMS.
Synchroniser Le Sous-Projet Fumadocs Yayaw Table
Utilisez le sous-projet Fumadocs lorsque Yayaw doit versionner la documentation
développeur de Yayaw Table. Ces pages vivent dans content/docs/{en,fr}/table
et sont servies depuis /[locale]/docs/table/*. C'est distinct de la route CMS
publique /[locale]/table/docs/*.
Lors d'un import depuis le dépôt upstream Yayaw-Table:
- Copiez les fichiers anglais
content/docs/*.mdxverscontent/docs/en/table. - Copiez les fichiers français
content/docs/*.fr.mdxverscontent/docs/fr/table, en retirant le suffixe.fr. - Copiez
content/docs/meta.jsonverscontent/docs/en/table/meta.jsonetcontent/docs/meta.fr.jsonverscontent/docs/fr/table/meta.json. - Réécrivez les liens internes de
/docs/...vers des liens relatifs comme./setupafin que les pages se résolvent sous/docs/table. - Gardez
content/docs/en/table/meta.jsonetcontent/docs/fr/table/meta.jsondans le même ordre, puis lancezbun run docs:check-translations.
Valider Les Webhooks De Facturation En Staging
- Webhook du plugin Better Auth Stripe:
stripe listen --forward-to https://<staging-domain>/api/auth/stripe/webhook- Webhook ponctuel custom:
stripe listen --forward-to https://<staging-domain>/api/billing/stripe/webhook- Déclenchez des événements:
stripe trigger checkout.session.completed
stripe trigger customer.subscription.updated
stripe trigger customer.subscription.deleted
stripe trigger invoice.payment_failed
stripe trigger invoice.paidinvoice.payment_failed et invoice.paid doivent atteindre l'endpoint Stripe
du plugin Better Auth sur /api/auth/stripe/webhook. L'endpoint custom des
achats ponctuels sur /api/billing/stripe/webhook traite volontairement
uniquement checkout.session.completed.
Rejouer Les Webhooks Ponctuels Échoués
Quand le traitement d'un webhook ponctuel échoue à cause d'un incident transitoire, rejouez les événements échoués:
bun run billing:replay-webhooksLimite optionnelle:
bun run billing:replay-webhooks -- --limit=20Régénérer Les Artefacts Source Fumadocs
bun run docs:generateRégénérer Les Fichiers Assistants LLM
bun run docs:llm:generateLancez cette commande après une modification de content/llm/llm-source.md. Ne
modifiez pas AGENTS.md, GEMINI.md ni .github/copilot-instructions.md
manuellement.
Lancer Une Passe Docs Complète
Utilisez ceci lors de changements documentaires larges:
bun run docs:generate
bun run docs:check-links
bun run docs:check-translations
bun run docs:llm:generate
bun run docs:llm:check
bun run checkSi le changement docs touche les routes, imports ou rendu MDX, lancez aussi:
bunx tsc --noEmit
bun run buildGardez les docs anglaises canoniques. Lorsque la tâche demande les docs localisées, mettez à jour le miroir français dans la même PR.
Gérer Les Clés MCP Production
Émettre une clé MCP production pour un utilisateur:
bun run mcp:key -- issue --email admin@example.com --permissions read,write,publish,adminRévoquer une clé MCP production:
bun run mcp:key -- revoke --key-id <api-key-id>Faites une rotation en émettant d'abord la clé de remplacement, en mettant à
jour le secret client, en vérifiant yayaw_status, puis en révoquant l'ancienne
clé.
Valider L'Intégrité De Documentation
bun run docs:check-links
bun run docs:check-translations
bun run docs:llm:checkSi docs:llm:check échoue, régénérez avec bun run docs:llm:generate et
revoyez le diff des fichiers assistants générés avant commit.
Vérifier L'Accès Au Code GitHub
- Confirmez que
/dashboard/admin/billing-settingsactive l'accès dépôt GitHub. - Confirmez la présence du dépôt, de l'ID GitHub App et de l'ID d'installation.
- Confirmez que
BILLING_CODE_ACCESS_GITHUB_APP_PRIVATE_KEYexiste dans l'environnement de déploiement cible. - Utilisez une organisation de test payante avec
code-access:read. - Soumettez un username GitHub depuis
/dashboard/organization/code-access. - Confirmez que
code_access_github_accountsenregistre l'invitation ou l'état d'accès actif. - Confirmez dans GitHub que l'invitation au dépôt donne un accès lecture seule.
En staging sans GitHub App, utilisez BILLING_CODE_ACCESS_GITHUB_TOKEN
uniquement comme solution de repli temporaire explicite.
Vérifier Le Stockage Média
- Confirmez que les variables du fournisseur de stockage choisi sont
configurées:
STORAGE_PROVIDER=supabaseavec les clés Supabase, ouSTORAGE_PROVIDER=s3avec les clés S3/MinIO etSTORAGE_PUBLIC_BASE_URL. - Téléversez une image depuis
/dashboard/content/media. - Confirmez qu'une ligne
media_assetsest créée pour l'organisation active. - Confirmez que l'URL publique charge.
- Ouvrez l'éditeur de page et liez la ressource à un champ image.
- Publiez la page et confirmez que la page publique rend la ressource choisie.
- Si les miniatures sont activées pour ce type de ressource, confirmez qu'une URL de miniature est créée ou qu'un échec non bloquant de miniature est enregistré.
Vérifier Le DNS Manuel De Domaine Public
- Définissez
PUBLIC_DOMAIN_PROVIDER=manual-dns. - Configurez
PUBLIC_DOMAIN_CNAME_TARGETouPUBLIC_DOMAIN_IPV4_TARGETS. - Ajoutez un domaine depuis les réglages d'organisation ou
yayaw_org_domain_add. - Publiez le challenge TXT affiché dans le dashboard.
- Pointez le hostname vers le proxy inverse.
- Lancez l'action de check/vérification et confirmez que le domaine devient
verified. - Ouvrez l'hôte personnalisé et confirmez que les pages publiques rendent
tandis que
/dashboard,/auth,/api,/docs,/oet/ingestrestent bloqués.
Réinitialiser La Base Locale
bun run db:resetDépanner Les Problèmes De Build
- Régénérez les artefacts:
bun run generate:actions
bun run docs:generate- Relancez les checks:
bun run check
bunx tsc --noEmit
bun run buildDépanner Les Blocages esbuild / Drizzle
Symptômes:
bun run docs:generatene termine pasbun run db:generateoubun run db:pushreste bloqué
Actions:
- Relancez la commande une fois pour confirmer la sortie de timeout des scripts safe.
- Réinstallez les dépendances:
rm -rf node_modules
bun install- Réessayez:
bun run docs:generate
bun run db:generate
bun run db:push