Manuel
Guide complet pour l'installation, la configuration et le déploiement de notACMS.
Démarrage Rapide
# 1. Cloner git clone https://github.com/holas1337/notACMS my-site && cd my-site # 2. Configurer la production echo "APP_SECRET=$(php -r 'echo bin2hex(random_bytes(32));')" >> .env.local echo "URL=yourdomain.com" >> .env.local > # 3. Déployer ./notACMS deploy --prodLe site fonctionne sur
https://yourdomain.com. Modifier le contenu danslocal/content/.
Installation (Développement)
notACMS utilise DDEV pour le développement local.
Prérequis : Docker Desktop (ou Orbstack sur Mac), DDEV 1.22+, Git.
git clone https://github.com/holas1337/notACMS my-site
cd my-site
ddev start
ddev composer install
ddev build
Le site fonctionne sur https://my-site.ddev.site.
Structure du Contenu
local/content/
├── _site.yaml # Configuration du site
├── _routes.yaml # Surcharges d'URLs
├── _tags.yaml # Traductions des tags
├── pages/ # Pages statiques
│ ├── home/
│ │ ├── en.md
│ │ ├── de.md
│ │ └── pl.md
│ └── about/
│ ├── en.md
│ └── pl.md
└── blog/
├── _index_en.md
└── releases/
└── v1-0-0/
├── en.md
└── pl.md
Frontmatter des Pages
| Champ | Type | Requis | Description |
|---|---|---|---|
title |
string | Oui | Titre de la page |
slug |
string | Oui | Chemin de l'URL |
description |
string | Non | Méta-description |
date |
date | Articles | Date de publication |
updated |
date | Non | Date de dernière modification |
category |
string | Articles | Slug de catégorie |
tags |
list | Non | Liste des tags |
template |
string | Non | Template Twig |
image |
string | Non | Chemin vers l'image de prévisualisation |
image_alt |
string | Requis avec image |
Texte alternatif de l'image (valeur par défaut : titre, si omis) |
draft |
bool | Non | Masquer en production |
pinned |
date ou false | Non | Épingle l'article jusqu'à cette date (incluse) en haut de toutes les listes ; est automatiquement désépinglé lorsque la date est dépassée. Articles uniquement. |
featured |
bool | Non | Projets uniquement, affichage dans la grille curatée |
dynamic |
bool | Non | Ignorer le pré-rendu statique |
series |
string | Non | Clé de série |
series_order |
int | Non | Position dans la série |
toc |
bool | Non | Afficher la table des matières |
related |
list | Non | Slugs d'articles connexes manuels |
menu |
object | Non | Configuration de navigation : weight (ordre de tri) et label (surcharge) |
Images
Placer les images dans le sous-répertoire files/ à côté du contenu :
blog/releases/my-post/
├── en.md
└── files/
└── featured.webp
Référencer dans le frontmatter : image: /media/my-post/featured.webp
Astuce : Toutes les images doivent être en WebP. Utiliser ImageMagick :
ddev exec convert input.jpg -quality 82 -strip -define webp:method=6 output.webp
Commandes de Build
| Commande | Objectif |
|---|---|
ddev build |
Build complet de développement : Cache + Assets + Pages + Recherche |
ddev code-check |
PHPStan + PHP CS Fixer |
ddev code-fix |
Correction automatique du style de code |
./notACMS deploy --prod |
Déploiement en production (Docker + build statique) |
./notACMS rebuild --prod |
Mise à jour du contenu uniquement (rapide, pas de rebuild Docker) |
Déploiement en Production
Prérequis
- Docker + Docker Compose
- Domaine avec enregistrement DNS A pointant vers le serveur
- Ports 80/443 disponibles (ou personnalisé via
NGINX_PORT)
Premier Déploiement
./notACMS deploy --prod
Ce qui se passe :
- Seede
local/content/depuisdocs/demo/content/(si vide) - Build l'image Docker PHP
- Installe les dépendances Composer (
--no-deven prod) - Compile SCSS + Assets
- Génère le HTML statique →
public/static/ - Build l'index de recherche Pagefind →
public/pagefind/ - Démarre le conteneur nginx
Mises à Jour de Contenu
Après modification des fichiers Markdown :
./notACMS rebuild --prod
Ignore le rebuild Docker — régénère uniquement HTML + index de recherche (~10s au lieu de ~2-3min).
Commandes de Conteneur
| Commande | Objectif |
|---|---|
./notACMS deploy up |
Démarrer les conteneurs (pas de rebuild) |
./notACMS deploy down |
Arrêter les conteneurs |
./notACMS deploy restart |
Redémarrer sans rebuild |
Variables d'Environnement
Créer .env.local à la racine du projet (jamais commité, gitignored) :
| Variable | Requis | Définir via | Objectif |
|---|---|---|---|
APP_SECRET |
Oui | php -r "echo bin2hex(random_bytes(32));" |
Secret Symfony |
URL |
Oui | yourdomain.com |
Doit correspondre à base_url dans _site.yaml |
NGINX_PORT |
Non | 8123 |
Port hôte (Défaut : 8123) |
RUNTIME_PHP_ENABLED |
Non | true/false |
Activer PHP pour le formulaire de contact |
MAILER_DSN |
Non* | smtp://user:pass@host:587 |
*Requis si le formulaire de contact est activé |
TURNSTILE_SITE_KEY |
Non | Cloudflare Key | CAPTCHA (optionnel) |
TURNSTILE_SECRET_KEY |
Non | Cloudflare Secret | CAPTCHA (optionnel) |
CERTRESOLVER |
Non | le ou dummy |
Résolveur SSL (Défaut : le) |
UID / GID |
Non | 1000 |
Correspondre à l'utilisateur hôte (id) |
Dépannage
Port déjà utilisé
Erreur : bind: address already in use
Correction :
echo "NGINX_PORT=8080" >> .env.local
./notACMS deploy --prod
Permission refusée
Erreur : 403 sur les fichiers statiques
Correction :
echo "UID=$(id -u)" >> .env.local
echo "GID=$(id -g)" >> .env.local
./notACMS deploy restart
Formulaire de contact 404
Correction : Activer l'exécution PHP :
echo "RUNTIME_PHP_ENABLED=true" >> .env.local
./notACMS deploy restart
Échec du certificat SSL
Erreur : Traefik ne peut pas obtenir le certificat
Correction : Vérifier que les ports 80/443 sont ouverts, que le DNS se résout. Ou utiliser CERTRESOLVER=dummy pour les tests.
Les styles ne se mettent pas à jour
Correction : Vider le cache et rebuild :
rm -rf var/ public/assets/
./notACMS deploy --prod
Build bloqué
Correction : S'assurer que Docker dispose de suffisamment de mémoire (4GB+) pour la compilation des assets.