Pourquoi self-héberger Strapi sur un VPS
Strapi est conçu pour être auto-hébergé : c'est une application Node.js qui expose une API REST ou GraphQL et un panneau d'administration React. Le déployer sur votre propre VPS, plutôt que sur le Strapi Cloud, signifie que vos données, vos médias uploadés et votre base restent sous votre contrôle exclusif, ce qui est souvent une exigence pour des projets clients ou des contraintes de localisation des données. Vous choisissez votre base (PostgreSQL recommandé en production plutôt que SQLite), votre stockage des médias (disque local ou S3), et vous n'êtes pas limité par les quotas d'entrées ou d'utilisateurs admin des offres managées. Un VPS vous permet aussi de faire tourner Strapi et son front consommateur sur la même infrastructure.
Bénéfices concrets
- Propriété complète des contenus, de la base PostgreSQL et des médias uploadés
- Choix libre de la base de données et du stockage (disque local ou bucket S3 compatible)
- Aucun quota d'entrées, de types de contenu ou d'utilisateurs administrateurs
- API REST et GraphQL exposées sur votre domaine, sans intermédiaire ni rate-limit imposé
- Plugins de la communauté installables librement, sans validation d'une plateforme
- Localisation des données maîtrisée, utile pour la conformité et les exigences clients
Prérequis matériels et logiciels
Strapi est plus gourmand que les frameworks front car le build de l'admin React est lourd. Visez un VPS de 2 vCPU et 4 Go de RAM minimum : le build de l'interface admin peut consommer plus de 2 Go de RAM à lui seul, et il est fréquent qu'un build échoue par OOM sur un serveur sous-dimensionné. En production stable, l'application tourne ensuite confortablement. Installez Docker et Docker Compose, et provisionnez une base PostgreSQL 16 (idéalement dans son propre conteneur). Pointez cms.mondomaine.ma vers l'IP du VPS. Prévoyez 15 Go de disque pour les node_modules, les uploads et les sauvegardes.
Déploiement pas à pas
Configurer la base de données de production
Renoncez à SQLite en production. Dans config/database.js, configurez le client postgres et lisez les credentials depuis l'environnement (DATABASE_HOST, DATABASE_NAME, DATABASE_USERNAME, DATABASE_PASSWORD). PostgreSQL est bien plus robuste sous charge concurrente.
Définir les secrets de production
Strapi exige plusieurs clés : APP_KEYS, API_TOKEN_SALT, ADMIN_JWT_SECRET, JWT_SECRET et TRANSFER_TOKEN_SALT. Générez-les aléatoirement et placez-les dans un fichier .env jamais commité. Sans ces clés, l'admin refusera de démarrer en mode production.
Builder l'interface d'administration
Lancez NODE_ENV=production npm run build pour compiler le panneau admin React. Si le build manque de mémoire, augmentez temporairement le swap du VPS ou buildez l'image Docker sur une machine plus puissante avant de la pousser.
Orchestrer avec Docker Compose
Déclarez un service strapi (basé sur node:20) et un service db (postgres:16) dans docker-compose.yml, reliés par un réseau interne. Montez un volume pour public/uploads afin que les médias survivent aux redéploiements. Démarrez avec docker compose up -d.
Placer Nginx en reverse proxy
Configurez un vhost vers http://127.0.0.1:1337 (port par défaut de Strapi). Augmentez client_max_body_size à 50M ou plus pour autoriser l'upload de médias volumineux, sinon les téléversements échoueront avec une erreur 413.
Activer HTTPS et fixer l'URL publique
Exécutez certbot --nginx -d cms.mondomaine.ma, puis renseignez URL=https://cms.mondomaine.ma dans la config serveur de Strapi. Cette URL est indispensable pour que les liens des médias et le panneau admin fonctionnent correctement derrière le proxy.
Déchargez le stockage des médias vers un bucket S3 compatible grâce au provider d'upload @strapi/provider-upload-aws-s3 : vos uploads ne grossissent plus le disque du VPS et survivent à toute recréation de conteneur, sans volume à sauvegarder. Pour la base, automatisez un pg_dump quotidien via un cron sur le VPS et copiez le dump hors du serveur. Enfin, lancez Strapi avec NODE_ENV=production impérativement : le mode développement recompile l'admin à chaud et expose le Content-Type Builder, à proscrire en prod.