FR EN

Chapitre 03Démarrer

Démarrage local

Du poste vide à la première publication, sans dépôt distant ni hébergeur. Trois terminaux, une clé, dix minutes.

8 min de lecture14 sectionsChapitre 3 / 22

Prérequis

OutilVersionPourquoi
Node.js20 ou plus (développé sous 22.14)Astro 5, et les API web utilisées par les fonctions.
npm10 ou plusLivré avec Node. npm create et les espaces de travail.
Gittoute version récentePour versionner le site. Pas nécessaire pour l'essai local.
Un dépôt Git accessible par APIGitHubSeulement pour publier en ligne. Un faux service local est fourni.
vérifier bash
node -v     # v20.x ou plus
npm -v
Windows

Tout fonctionne en PowerShell comme en Git Bash. Les commandes de cette documentation sont écrites en syntaxe POSIX ; sous PowerShell, remplacez VAR=valeur commande par $env:VAR = 'valeur'; commande, et && par ;.

Trois façons de commencer

Le cas courant

Un site neuf

npm create inline@latest mon-site — squelette, charte, contrôles, clé. C'est la voie décrite ci-dessous.

Pour travailler sur l'outil

Le dépôt de référence

Cloner le dépôt inline lui-même : il contient inline-core et un site d'exemple bilingue.

Site Astro existant

Ajouter l'intégration

npm install inline-core puis quatre adaptateurs de routes. Voir plus bas.

1. Créer le site

terminal bash
npm create inline@latest boulangerie-martin -- \
  --nom "Boulangerie Martin" \
  --courriel contact@boulangerie-martin.fr \
  --langue fr

cd boulangerie-martin
npm install
OptionDéfautRôle
--nomnom du dossierNom du site, affiché dans le pied de page et l'aide.
--courrielcontact@exemple.frAdresse de contact montrée au client quand il a besoin d'aide.
--languefrCode de la langue principale. Deux lettres minuscules.

La commande refuse d'écrire dans un dossier existant et non vide. Elle produit :

ce qui est écrit text
boulangerie-martin/
  astro.config.mjs          intégration inline, sortie statique, i18n
  package.json              dev, build, serve:functions, mock:git, make:key, check
  wrangler.toml             configuration de l'hébergeur (fonctions)
  .gitignore                node_modules, dist, .astro, .dev.vars…
  .env.example              le SEUL fichier d'environnement versionné
  .dev.vars                 accès d'essai local — ignoré par Git
  functions/api/*.ts        quatre adaptateurs de routes
  scripts/                  check-html, check-locales, check-logs, check-secrets,
                            make-key, mock-git-api
  src/
    content/config.ts       déclaration de la collection
    content/site.json       navigation, coordonnées, pied de page
    content/pages/fr/home.json
    components/Testimonial.astro
    layouts/Base.astro
    lib/locales.ts          les langues de CE site
    pages/[lang]/[...slug].astro
    styles/theme.css        la charte — le fichier à reprendre
  .github/workflows/ci.yml  contrôles automatiques
Ce qu'elle n'écrit pas

Aucune logique d'édition : ni overlay, ni schéma, ni vérification d'identité, ni route serveur. Tout cela arrive par inline-core, en dépendance versionnée. C'est toute la différence entre un échafaudage et un copier-coller — le jour d'un correctif de sécurité, npm update inline-core suffit.

La clé, affichée une seule fois

À la fin, la commande affiche la clé du site. Elle est déjà écrite dans .dev.vars pour l'essai local, mais elle n'est stockée nulle part sous forme lisible côté serveur : seule son empreinte argon2id existe. Une clé perdue se régénère, elle ne se retrouve pas.

2. Lancer les trois processus

Trois terminaux, à la racine du projet :

  1. Le faux dépôt Git

    bash bash
    npm run mock:git

    Écoute sur http://127.0.0.1:8787 et imite les deux routes de l'API Contents de GitHub réellement utilisées. Les publications écrivent directement dans les fichiers du projet, comme le ferait un commit. Aide au développement uniquement.

  2. Le build

    bash bash
    npm run build

    Construit dist/. Le build échoue si le contenu ne passe pas le schéma, ou si un data-cms pointe vers une clé absente — c'est voulu.

  3. Le site et les fonctions

    bash bash
    npm run serve:functions

    Sert dist/ et /functions sur http://127.0.0.1:8788. C'est ici qu'on édite.

Le piège numéro un du démarrage

npm run dev lance le serveur Astro seul : le site s'affiche, mais /api/* n'existe pas, donc /admin ne peut pas ouvrir de session et l'édition ne fonctionne pas. Pour éditer, il faut npm run serve:functions. npm run dev sert à travailler la mise en page, pas l'édition.

3. Première modification

  1. Ouvrir http://127.0.0.1:8788/admin.
  2. Coller la clé affichée à la création, valider.
  3. Vous arrivez sur le site, avec une barre en bas de l'écran.
  4. Cliquer sur un titre : il devient modifiable, une barre de variantes apparaît.
  5. Modifier le texte, puis cliquer sur Publier.

Avec le faux dépôt, la publication écrit dans src/content/pages/fr/home.json. Relancez npm run build pour voir la modification figée dans le HTML — en production, l'hébergeur le fait tout seul.

Le parcours, sans rien installer

Le simulateur reproduit exactement ce parcours dans cette documentation : clé, overlay, édition, publication, conflit. Utile pour montrer l'outil avant de l'installer.

Les ports utilisés

PortProcessusRôle
4321npm run devServeur Astro seul — mise en page, pas d'édition.
8788npm run serve:functionsSite construit + fonctions. C'est l'adresse d'édition.
8787npm run mock:gitFaux dépôt Git local. Changer avec MOCK_PORT.

Le fichier .dev.vars

C'est le fichier d'environnement local, ignoré par Git, jamais déployé. Il est écrit par la commande de création, et ressemble à ceci :

.dev.vars env
# Essai local uniquement. Ignoré par Git, jamais déployé.
EDITOR_KEY_HASH=$argon2id$v=19$m=19456,t=2,p=1$<sel>$<empreinte>
SESSION_SECRET=<32 caractères au moins>
EDITOR_NAME=Éditeur du site
EDITOR_EMAIL=contact@boulangerie-martin.fr
GIT_PROVIDER=github
GIT_REPO=agence/boulangerie-martin
GIT_BRANCH=main
GIT_TOKEN=essai-local
GIT_API_BASE=http://127.0.0.1:8787

GIT_API_BASE est la ligne qui bascule vers le faux dépôt. La retirer fait parler la fonction au vrai GitHub — avec un GIT_REPO et un GIT_TOKEN réels. Le détail de chaque variable : Référence.

Jamais dans le dépôt

.dev.vars, .env et tout fichier d'environnement réel sont ignorés par Git. Le seul fichier d'environnement versionné est .env.example, qui ne contient aucune valeur. npm run check vérifie en plus qu'aucun secret ne se retrouve dans le dossier de build.

Régénérer les accès

Depuis le site — clé perdue, clé à changer

La clé n'est stockée nulle part sous forme lisible : seule son empreinte argon2id vit en variable d'environnement. Elle ne se retrouve donc pas, elle se régénère — et c'est voulu.

dans le projet du site bash
npm run make:key

La commande affiche la nouvelle clé, son empreinte et un secret de session. Rien n'est écrit sur disque : ce qui n'est pas copié à ce moment-là est perdu. La suite — remplacer les variables, redéployer, transmettre — est dans Sécurité et authentification.

Un site créé avant create-inline 1.1.0

La commande n'est livrée avec le site que depuis cette version ; avant, elle n'existait que dans le dépôt de référence. Trois lignes la rattrapent : copier scripts/make-key.mjs depuis un site récent, puis npm pkg set scripts.make:key="node scripts/make-key.mjs" et npm install --save-dev @noble/hashes — la bibliothèque de hachage arrive bien dans l'arbre par inline-core, mais rien ne garantit qu'elle soit hissée à la racine. En attendant, la rotation reste possible depuis le dépôt de référence : c'est la même empreinte, calculée avec les mêmes paramètres.

Depuis le dépôt de référence — préparer un site

terminal bash
# Accès complets d'un site : clé, empreinte, secret de session, variables, aide-mémoire
npm run create:site -- --nom "Boulangerie Martin" --depot agence/boulangerie-martin

# Idem, plus l'écriture d'un .dev.vars local prêt à l'emploi
npm run create:site -- --nom "Essai local" --ecrire

create:site affiche deux blocs qui ne voyagent pas ensemble : ce qui part chez le client (une clé, une adresse) et ce qui part chez l'hébergeur (l'empreinte, les secrets, le jeton), plus la liste de vérification d'avant livraison. Voir Exploitation.

Dans un projet Astro qui existe déjà

  1. Installer le paquet

    bash bash
    npm install inline-core
  2. Déclarer l'intégration

    astro.config.mjs js
    import { defineConfig } from 'astro/config';
    import inline from 'inline-core/astro';
    
    export default defineConfig({
      output: 'static',
      integrations: [
        inline({
          locales: ['fr'],                            // la référence en premier
          support: { email: 'contact@agence.fr' },    // affichée au client
          // theme: 'src/styles/theme.css',           // défaut
          // pages: { admin: true, help: true },      // false pour fournir les vôtres
        }),
      ],
    });

    L'intégration pose /admin et /aide, construit l'overlay, injecte l'amorce d'édition, crée src/media/library.ts s'il manque, et refuse de démarrer si la sortie n'est pas statique.

  3. Écrire les quatre adaptateurs de routes

    L'hébergeur découvre les routes par l'arborescence de /functions, hors du build Astro : une intégration ne peut pas les injecter. Vingt lignes, écrites une fois.

    functions/api/save.ts ts
    import { createSaveRoute } from 'inline-core/server';
    import { LOCALES } from '../../src/lib/locales';
    
    const route = createSaveRoute({ locales: LOCALES });
    
    export const onRequest = route.onRequest;
    export const onRequestPost = route.onRequestPost;

    Les trois autres sont identiques avec createAuthRoute(), createContentRoute({ locales }) et createUploadRoute(). Le détail : Référence des routes.

  4. Déclarer le schéma et la charte

    src/content/config.ts ts
    import { defineCollection } from 'astro:content';
    import { glob } from 'astro/loaders';
    import { pageSchema } from 'inline-core/schema';
    
    const pages = defineCollection({
      loader: glob({ pattern: '**/*.json', base: './src/content/pages' }),
      schema: pageSchema,
    });
    
    export const collections = { pages };
    src/layouts/Base.astro astro
    ---
    import 'inline-core/styles/tokens.css';
    import '../styles/theme.css';
    ---
  5. Générer une clé

    Sans EDITOR_KEY_HASH, l'édition est impossible — c'est l'état par défaut. Voir Sécurité.

Travailler sur inline-core lui-même

Le dépôt de référence est un espace de travail npm : packages/inline-core et packages/create-inline y sont installés par lien, et le site à la racine les consomme directement.

terminal bash
git clone <depot> inline && cd inline
npm install

npm run create:site -- --nom "Essai local" --ecrire   # écrit .dev.vars, affiche la clé
npm run build
npm run serve:functions

npm test          # toute la suite : git, auth, durcissement, amorçage, assainissement, médias…
npm run check     # HTML brut, parité des langues, journaux, secrets

Pour éprouver les paquets tels qu'ils partiraient au registre, voir Exploitation (test:scaffold et test:pack).

Si ça ne démarre pas

SymptômeCause probable
/admin répond 404Vous êtes sur npm run dev sans avoir construit, ou l'intégration n'est pas déclarée.
La clé est refusée alors qu'elle est bonne.dev.vars absent, ou EDITOR_KEY_HASH vide. Les variables ne sont relues qu'au (re)démarrage.
« Clé incorrecte » après cinq essaisC'est la limitation de débit : 5 tentatives par quart d'heure. Elle fonctionne.
La publication échoue en localnpm run mock:git n'est pas lancé, ou GIT_API_BASE manque dans .dev.vars.
L'image ne s'affiche pas après publicationLe fichier est dans le dépôt, mais le HTML n'est pas reconstruit. Relancer npm run build.
Erreur « Charte introuvable »src/styles/theme.css manque, ou l'option theme pointe ailleurs.

Liste complète : Dépannage et pièges connus.