Installation

Prérequis système

ComposantVersion minimale
Docker Engine24.0
Docker Composev2.20
RAM2 Go (4 Go recommandés)
Disque20 Go
DomaineUn FQDN avec enregistrement DNS A

Un certificat TLS est fortement recommandé en production. Ce guide utilise Nginx comme reverse-proxy avec Let’s Encrypt.

Récupérer Fatplant

git clone https://github.com/fatplant/fatplant.git /opt/fatplant
cd /opt/fatplant

Configurer l’environnement

cp .env.example .env
nano .env

Les variables essentielles à renseigner pour la production :

# Domaine public de votre instance
APP_URL=https://monmedia.fr
ADMIN_URL=https://admin.monmedia.fr

# Base de données
DATABASE_URL=postgresql://fatplant:motdepasse@db:5432/fatplant

# Redis
REDIS_URL=redis://redis:6379

# Mailer (exemple SMTP)
MAILER_DSN=smtp://user:pass@smtp.monmedia.fr:587

# Serveur Yjs
YJS_SERVER_URL=wss://yjs.monmedia.fr
YJS_SERVER_PERSIST=http
YJS_BACKEND_URL=http://backend:8000

Générer les clés JWT

L’authentification entre l’admin et le backend repose sur des paires de clés asymétriques RS256. Générez-les avant le premier démarrage :

mkdir -p docker/frankenphp/jwt
openssl genrsa -out docker/frankenphp/jwt/private.pem 4096
openssl rsa -pubout -in docker/frankenphp/jwt/private.pem 
    -out docker/frankenphp/jwt/public.pem

Puis référencez ces fichiers dans .env :

JWT_SECRET_KEY=%kernel.project_dir%/config/jwt/private.pem
JWT_PUBLIC_KEY=%kernel.project_dir%/config/jwt/public.pem
JWT_PASSPHRASE=

Démarrer les services

docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d

Le fichier docker-compose.prod.yml surcharge la configuration pour la production (suppression des ports exposés en direct, volumes persistants, logs structurés).

Initialiser la base de données

Au premier démarrage, les migrations sont appliquées automatiquement. Vous pouvez le vérifier :

docker compose exec backend php bin/console doctrine:migrations:status

Pour créer le premier compte administrateur :

docker compose exec backend php bin/console fatplant:user:create 
    --email=admin@monmedia.fr 
    --password=VotreMotDePasse 
    --role=ROLE_ADMIN

Configuration du reverse-proxy Nginx

Voici un exemple de configuration Nginx pour exposer les services :

# Backend API
server {
    listen 443 ssl;
    server_name api.monmedia.fr;
    ssl_certificate /etc/letsencrypt/live/monmedia.fr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/monmedia.fr/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

# Frontend public
server {
    listen 443 ssl;
    server_name monmedia.fr;
    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
    }
}

# Serveur Yjs (WebSocket)
server {
    listen 443 ssl;
    server_name yjs.monmedia.fr;
    location / {
        proxy_pass http://127.0.0.1:1234;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

Vérification post-installation

# Statut des conteneurs
docker compose ps

# Test de l'API
curl https://api.monmedia.fr/api/public/articles

# Test du endpoint health du serveur Yjs
curl https://yjs.monmedia.fr/health

Mises à jour

git pull origin main
docker compose pull
docker compose up -d
docker compose exec backend php bin/console doctrine:migrations:migrate --no-interaction

Consultez toujours le CHANGELOG.md avant de mettre à jour pour identifier les éventuels changements cassants.

Restez a la pointe de l'edition

Recevez les dernieres nouveautes, tutoriels et bonnes pratiques dans votre boite mail.

F
Fatplant

Le CMS open-source des redactions de presse en ligne. Du chemin de fer a la publication et au paywall : journaux, magazines et plateformes editoriales, self-hosted et sans vendor lock-in.

Open Source RGPD MIT License
Pourquoi « Fatplant » ?

« Fatplant », c'est « Flat Plan » qui a un peu bougé. Le flat plan — le chemin de fer en jargon de presse — c'est le plan page à page d'un journal avant impression : le squelette de l'édition, la pré-maquette en fil de fer. C'est exactement ce que dessine notre page builder. Un CMS qui part du chemin de fer ne pouvait pas s'appeler autrement. 🌱

© 2026 Fatplant SAS. Tous droits reserves.