fastsite est auto-hébergé. Vous faites tourner le moteur sur votre propre machine, il génère une sortie statique et pousse cette sortie vers un dépôt git que votre CDN surveille. Ni votre contenu ni vos identifiants ne quittent votre infrastructure.

Ce dont vous avez besoin

  • Un hôte Linux avec Docker et le plugin Compose. Deux cœurs et 2 Go de RAM suffisent pour faire tourner plusieurs sites.
  • Un domaine pour le moteur lui-même, pointé vers cet hôte, avec TLS en frontal.
  • Un dépôt git par site pour la sortie générée, ainsi qu'un token ou une clé de déploiement autorisant les pushs.
  • Un hébergeur statique qui surveille le dépôt — Cloudflare Pages, Netlify, ou tout autre service qui construit sur push.

Ce dont vous n'avez pas besoin

Pas de chaîne d'outils Node ni de gestionnaire de paquets sur l'hôte, pas de service de base de données externe, pas de serveur de cache séparé à provisionner, et pas de compte chez nous. L'image embarque PHP, Node et le pipeline d'images ; la stack Compose apporte son propre Redis. C'est un seul conteneur plus un volume de données.

Récupérer le code

git clone https://github.com/sitepointsystems/getfastsite_gnu.git
cd getfastsite_gnu
cp .env.example .env

Configurer

Ouvrez .env et renseignez les quelques valeurs que le moteur doit connaître sur lui-même. Tout le reste dispose d'une valeur par défaut fonctionnelle.

VariableRôle
APP_URLL'URL publique du moteur. C'est l'émetteur OAuth et la base communiquée aux clients MCP lors de la découverte, elle doit donc être la vraie URL externe. La laisser à la valeur localhost par défaut est la raison la plus courante pour laquelle un agent distant ne peut pas se connecter.
APP_SECRETUne chaîne hexadécimale aléatoire de 64 caractères. Dérive la clé de chiffrement de chaque identifiant stocké — secrets de webhook, tokens GitHub, seeds d'authentification à deux facteurs. Générez-la une fois et conservez-la : la faire tourner rend les secrets existants indéchiffrables.
DATA_PATHL'emplacement où vivent les bases de données des sites, les médias, les builds et les clones git par site. Sauvegardez ceci.
REDIS_URLFile d'attente, sessions et limitation de débit. La stack Compose définit cela pour vous.
GIT_AUTHOR_NAME · GIT_AUTHOR_EMAILL'identité sur les commits de publication. Les deux ont des valeurs par défaut.

Générez un secret avec :

php -r 'echo bin2hex(random_bytes(32)), PHP_EOL;'

Facultatif, et uniquement si vous souhaitez ces fonctionnalités : R2_* pour les sauvegardes hors boîte vers Cloudflare R2, SHORTPIXEL_API_KEY pour une compression d'image supplémentaire avant l'exécution du pipeline de variantes, et ENDPOINTR_* si vous routez la traduction via votre propre passerelle IA plutôt qu'une clé par site.

Démarrer le moteur

docker compose up -d
docker compose logs -f

Les migrations s'exécutent automatiquement à chaque démarrage, pour la base de données du moteur et chaque base de données de site. Le worker de file d'attente et le planificateur démarrent en même temps que le serveur web sous supervisor à l'intérieur du conteneur — il n'y a rien d'autre à lancer ou à maintenir en vie.

Vérifiez qu'il a démarré :

curl https://your-host/healthz

Créer le premier utilisateur administrateur

Le démarrage du conteneur migre la base de données mais ne crée pas de compte. Faites-le une fois, explicitement :

docker compose exec app php bin/fastsite install \
  --email=you@example.com \
  --password='a-long-passphrase'

Le mot de passe doit comporter au moins 12 caractères. La commande peut être relancée sans risque — une fois qu'un administrateur existe, elle ne fait rien, et ne peut donc pas être utilisée pour en ajouter un second discrètement. Tout autre compte est créé depuis le tableau de bord.

Trois services écoutent désormais sur votre hôte :

Tableau de bord

https://your-host/

Sites, contenu, médias, l'éditeur shell, journaux de build, sauvegardes.

Serveur MCP

https://your-host/mcp

Ce sur quoi vous pointez Claude, ChatGPT ou Codex. Voir la référence MCP.

API REST

https://your-host/api/v1

Pour les pipelines et les scripts qui ne sont pas des agents. Voir la référence API.

Créer votre premier site

Un site est identifié par un identifiant immuable. Il dispose de sa propre base de données, de son propre stockage de médias, de son propre shell et de son propre répertoire de sortie de build.

docker compose exec app php bin/fastsite site:create blog \
  --name="My blog" \
  --url=https://example.com \
  --locale=en

Pointez-le ensuite vers le dépôt que votre CDN surveille et ajoutez un identifiant GitHub autorisant les pushs. Les deux sont des paramètres du site — github_repo et un identifiant stocké — modifiables depuis le tableau de bord, via l'API, ou par un agent.

Ou ignorez tout ça

Connectez d'abord un agent et dites crée un site appelé blog sur example.com. Tout ce qui précède est un appel d'outil qu'il peut effectuer en votre nom. Voir connecter votre agent.

Interagir depuis du code

Créez une clé API limitée, puis utilisez-la dans l'en-tête X-API-Key :

docker compose exec app php bin/fastsite key:create you@example.com \
  --name="Deploy pipeline" \
  --scopes=content:write,media:write,publish \
  --sites=blog

Le secret est affiché une seule fois et stocké sous forme de hash, copiez-le dès qu'il apparaît. La surface complète est disponible sur la page de l'API REST.

Concevoir le shell

Un nouveau site est structuré avec un shell par défaut : des templates Twig, un fichier de tokens CSS et des chaînes d'interface. C'est là que vit tout le design — le contenu arrive en HTML de corps uniquement, de sorte que le chrome est conçu une fois et jamais répété.

Lisez comment ça fonctionne avant de modifier le shell. L'audit de build impose un CSS inliné, zéro JavaScript livré et des balises head complètes, et il rejettera un template qui coûterait un point PageSpeed plutôt que de le laisser partir silencieusement.

Mettre à jour

git pull
docker compose build --pull
docker compose up -d

Les migrations s'exécutent au démarrage. Les bases de données des sites sont versionnées indépendamment, donc une mise à jour ne touche jamais la sortie publiée tant que vous ne publiez pas à nouveau.

Sauvegardes

Tout ce qui compte se trouve sous DATA_PATH. Le moteur peut également prendre un instantané d'un site à la demande — complet, base de données uniquement, médias uniquement, ou juste le shell — et restaurer n'importe quel instantané sur un site en cours d'exécution.

docker compose exec app php bin/fastsite backup:site blog
docker compose exec app php bin/fastsite backup:list blog

Avec R2_* configuré, ces instantanés sont envoyés vers Cloudflare R2 et un jeu nocturne s'exécute automatiquement ; sans cela, ils sont écrits dans le volume de données. La restauration d'une base de données de site déclenche toujours un rebuild et une republication, de sorte que la base de données et la sortie publiée ne peuvent jamais diverger.

La sortie générée est déjà dans git, votre historique de publication constitue donc une seconde sauvegarde vers laquelle vous pouvez revenir avec un revert.