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 resetCommandes
| Commande | Effet |
|---|---|
fraza-dev | Cré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 up | Démarre les services du compose.yaml, avec des ports libres choisis pour cette machine, puis crée le bucket local. |
fraza-dev services down | Arrête les services. Les données restent dans les volumes Docker. |
fraza-dev services reset | Supprime 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 status | docker compose ps. |
fraza-dev env | Crée .env.local depuis .env.example s'il manque, sans rien lancer. |
fraza-dev init | Ajoute 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.
| Variable | Service | Premier port essayé |
|---|---|---|
FRAZA_LOCAL_DB_PORT | PostgreSQL | 5432 |
FRAZA_LOCAL_S3_PORT | S3 local (Versity S3 Gateway) | 9000 |
FRAZA_LOCAL_SMTP_PORT | SMTP de Mailpit | 1025 |
FRAZA_LOCAL_MAIL_PORT | Boîte de réception de Mailpit | 8025 |
FRAZA_LOCAL_SITE_PORT | next dev | 3000 |
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.
Le cookie de session
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 voit | Ce 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 localhost | Passe 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 localhost | Avertit 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:ounpm link, dont le dossier réel est hors denode_modules, a sondist/surveillé. Quand il change,next devredémarre après une demi-seconde sans nouvelle écriture. Les premières secondes ne comptent pas : untsup --watchqui 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 untsup --watchchacun. 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.
| Service | Image | Identifiants |
|---|---|---|
| PostgreSQL | postgres:17-alpine | utilisateur fraza, sans mot de passe, base fraza |
| S3 | versity/versitygw:v1.10.0 | fraza-local / fraza-local-secret, région us-east-1 |
| Mailpit | axllent/mailpit:v1.27 | aucun |
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 initUn 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à.
| Étape | Ce qui est fait | Ce qui est gardé |
|---|---|---|
Script dev | fraza-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, test | Ajoutés. | Un script du même nom. |
next.config | La ligne distDir du serveur de test. | Un distDir déjà posé, ou un fichier d'une autre forme, signalé. |
compose.yaml | Copié 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.local | Les 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.local | La 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.