Aller au contenu

fraza-dev

Lancer le serveur de développement sur le port de la machine, et piloter les services locaux du compose.yaml.

fraza-dev sert au poste de développement, et à lui seul : un site déployé lance next build puis next start, jamais cette commande. Elle porte le script dev d'un projet créé par @fraza/start, et ses scripts services.

npm run dev               # fraza-dev
npm run services          # fraza-dev services up
npm run services:stop     # fraza-dev services down
npm run services:reset    # fraza-dev services reset

Commandes

CommandeEffet
fraza-devCrée .env.local s'il manque, choisit le port du site pour cette machine, compile les modules de modules/, lance fraza-modules sync, puis next dev sur ce port. Avertit des services hors du poste, et arrête les tâches planifiées si la base en fait partie. Redémarre next dev quand un module lié est recompilé.
fraza-dev -- <options>Pareil, avec des options passées à next dev.
fraza-dev services upDémarre les services du compose.yaml, avec des ports libres choisis pour cette machine, puis crée le bucket local.
fraza-dev services downArrête les services. Les données restent dans les volumes Docker.
fraza-dev services resetSupprime les données locales (base, fichiers, courriels), redémarre les services et relance fraza-db init. Demande de taper oui, sauf avec --yes.
fraza-dev services statusdocker compose ps.
fraza-dev envCrée .env.local depuis .env.example s'il manque, sans rien lancer.
fraza-dev initAjoute le développement local à un projet existant. Voir plus bas. @fraza/start la lance sur chaque projet neuf.

.env.local créé depuis .env.example

Quand .env.local manque, fraza-dev le crée en copiant .env.example, avec un en-tête propre au fichier local et une FRAZA_ENCRYPTION_KEY neuve, en mode 0600. Un fichier existant n'est jamais remplacé. Une ligne FRAZA_ENCRYPTION_KEY= vide reçoit une clé ; une clé déjà posée n'est jamais touchée, puisque la changer rendrait illisible ce qui a été chiffré avec elle.

C'est ce qui permet à un collègue de cloner un projet et de le lancer sans rien saisir : .env.example porte les valeurs locales du compose.yaml. Voir Partager les variables d'un projet.

La création n'a lieu qu'ici, jamais dans fraza-modules sync ni au postinstall : sur la machine de build d'un site déployé, un .env.local tiré du modèle remplirait en silence, avec des valeurs locales, toute variable que la plateforme ne définit pas.

Les ports de la machine

Chaque service reçoit un port libre au premier lancement, à partir de sa valeur habituelle, puis le garde. Deux projets tournent ainsi côte à côte, et les adresses de .env.local restent valides d'un démarrage à l'autre.

VariableServicePremier port essayé
FRAZA_LOCAL_DB_PORTPostgreSQL5432
FRAZA_LOCAL_S3_PORTS3 local (Versity S3 Gateway)9000
FRAZA_LOCAL_SMTP_PORTSMTP de Mailpit1025
FRAZA_LOCAL_MAIL_PORTBoîte de réception de Mailpit8025
FRAZA_LOCAL_SITE_PORTnext dev3000

Un port choisi s'écrit dans .env.local, avec les adresses qui le portent : FRAZA_DATABASE_URL, FRAZA_TEST_DATABASE_URL, FRAZA_STORAGE_ENDPOINT, FRAZA_EMAIL_SMTP_PORT et NEXT_PUBLIC_URL. Seule une adresse locale change (localhost, 127.0.0.1, [::1]) : une variable qui vise un serveur partagé garde sa valeur.

NEXT_PUBLIC_URL suit le port du site parce que la vérification CSRF compare l'origine des requêtes à cette adresse : un next dev passé sur 3001 avec une adresse restée sur 3000 refuserait toutes les écritures. Une ligne NEXT_PUBLIC_URL vide reçoit http://localhost:<port>, pour la même raison. Si le port gardé est pris par un autre programme au démarrage, fraza-dev en choisit un autre et le dit. Un .env.development.local qui fixe NEXT_PUBLIC_URL passe avant .env.local : la commande avertit qu'il faut retirer la ligne.

Les cookies ne dépendent pas du port : deux projets ouverts sur localhost sous le même fraza_session se déconnectent l'un l'autre. fraza-dev passe donc à next dev un nom propre au projet, tiré du nom du paquet : fraza_session_mon_site pour "name": "mon-site".

Il ne le fait que si aucun fichier d'environnement ne nomme le cookie (FRAZA_AUTH_SESSION_COOKIE_NAME), et seulement pour next dev. Une ligne vide ne nomme rien : le core la lit comme une variable absente. En production, le cookie reste fraza_session : chaque site y a son domaine, et le nom du projet n'a pas à se lire dans le navigateur.

Données hors du poste

.env.local peut porter les valeurs de production : voir Développer avec les données de production. Au démarrage, fraza-dev lit les valeurs que verra next dev et avertit :

Ce qu'il voitCe qu'il fait
Une base, un stockage ou un serveur SMTP qui n'est pas localhost, ou Resend avec sa cléLes nomme dans un avertissement : ce que fait le serveur les touche pour de vrai.
Une base qui n'est pas localhostPasse FRAZA_CRON=false à next dev : aucune tâche planifiée ne tourne. Sauf si un fichier d'environnement pose FRAZA_CRON. Avec true, il avertit que les tâches tournent sur cette base.
Un NEXT_PUBLIC_URL qui n'est pas localhostAvertit que la vérification CSRF refusera les écritures, et donne la ligne à écrire.

Rien n'est bloqué : travailler sur la production reste possible, il est seulement dit à voix haute.

Modifier un module

Le core charge les modules une seule fois, au démarrage de next dev. Une route ou un menu modifié garde son ancienne version tant que le serveur tourne. fraza-dev le redémarre donc lui-même :

  • Modules liés. Chaque module activé installé par file: ou npm link, dont le dossier réel est hors de node_modules, a son dist/ surveillé. Quand il change, next dev redémarre après une demi-seconde sans nouvelle écriture. Les premières secondes ne comptent pas : un tsup --watch qui démarre recompile tout, ce qui ne doit pas relancer un serveur qui vient de partir.
  • Modules locaux. Les modules du dossier modules/ du projet sont compilés au démarrage, puis surveillés par un tsup --watch chacun. Une modification les recompile, ce qui redémarre le serveur. Voir fraza-modules.

Un module publié, installé depuis un registre, ne change pas pendant le développement : il n'est pas surveillé.

Un module lié dont le dossier réel est hors du projet demande turbopack.root dans next.config.mjs : voir Développer en local.

Les services

services up lance docker compose --env-file .env.local up -d --wait : le compose.yaml lit ses ports dans .env.local, et la commande attend que PostgreSQL réponde. Elle crée ensuite le bucket de FRAZA_STORAGE_BUCKET sur le S3 local, par une requête signée comme celles du core, puis affiche les adresses.

ServiceImageIdentifiants
PostgreSQLpostgres:17-alpineutilisateur fraza, sans mot de passe, base fraza
S3versity/versitygw:v1.10.0fraza-local / fraza-local-secret, région us-east-1
Mailpitaxllent/mailpit:v1.27aucun

Tout n'écoute que sur 127.0.0.1. Un mot de passe de base ou des clés de stockage n'auraient rien à protéger : rien n'est joignable depuis une autre machine. Pour la même raison, ces valeurs peuvent vivre dans .env.example, suivi par git, sans que fraza-doctor les compte comme des secrets.

Sans compose.yaml ou sans Docker, la commande s'arrête avec un message qui renvoie au guide Développer en local.

Ajouter le développement local à un projet existant

npx fraza-dev init

Un projet créé par une version antérieure de @fraza/start n'a ni compose.yaml ni scripts services. fraza-update ne les ajoute pas : ils changent la façon de travailler du projet, qui peut avoir ses propres services. init les ajoute à la demande, et ne remplace jamais ce que le projet a déjà.

ÉtapeCe qui est faitCe qui est gardé
Script devfraza-dev, s'il est absent ou resté à fraza-modules sync && next dev.Un script écrit par le projet, signalé.
Scripts services, services:stop, services:reset, testAjoutés.Un script du même nom.
next.configLa ligne distDir du serveur de test.Un distDir déjà posé, ou un fichier d'une autre forme, signalé.
compose.yamlCopié depuis le core.Un compose.yml ou docker-compose.yml du projet : rien n'est ajouté, et npm run services ne s'en sert pas.
test/site.test.jsÉcrit, si le projet n'a pas de dossier test/.Un dossier test/ existant.
.env.example et .env.localLes valeurs locales dans les lignes vides ou absentes : adresse du site (http://localhost:3000), base, base de test, stockage, courriel. Un fournisseur resend sans clé devient le SMTP de Mailpit, puisqu'il n'envoyait rien. Seulement si le compose.yaml est celui du core.Toute valeur posée, FRAZA_ENCRYPTION_KEY comprise.
.env.development.localLa ligne NEXT_PUBLIC_URL, qui figeait l'adresse, est mise en commentaire.Le reste du fichier.

La commande dit ce qu'elle a fait, ligne par ligne. Relancée, elle n'a plus rien à faire. Ensuite : npm run services, npx fraza-db init, npm run dev.

Notes

La commande ne charge pas les fichiers d'environnement dans son propre processus, contrairement aux autres CLI. Elle modifie .env.local, et les processus qu'elle lance (next dev, fraza-modules sync, fraza-db) lisent le fichier une fois écrit.

Ctrl+C arrête next dev, et la commande se termine avec lui.

Sur cette page