Le contexte
Je gère plus de 15 applications en production sur un seul VPS Ubuntu, en self-hosted : Symfony, services Node, fronts React statiques. Stack Apache + PHP-FPM + MySQL. Voici comment ça tient debout.
Un vhost par application
ServerName baccalaureat.sn
DocumentRoot /var/www/baccalaureat/public
AllowOverride All
Require all granted
FallbackResource /index.php
SetHandler "proxy:unix:/run/php/baccalaureat.sock|fcgi://localhost"
Pools PHP-FPM isolés : la clé de la stabilité
L'erreur du débutant : un seul pool pour tout. Si une appli part en vrille, elle prend tout le serveur. La solution : un pool par appli, avec son propre user système.
; /etc/php/8.4/fpm/pool.d/baccalaureat.conf [baccalaureat] user = www-baccalaureat listen = /run/php/baccalaureat.sock pm = dynamic pm.max_children = 10
Une faille sur un site ne donne pas accès aux fichiers des autres.
MySQL : une base et un user par appli
CREATE DATABASE blog_db CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; CREATE USER 'blog_user'@'localhost' IDENTIFIED BY '...'; GRANT ALL PRIVILEGES ON blog_db.* TO 'blog_user'@'localhost';
Jamais de user MySQL partagé. Si des identifiants fuitent, les dégâts sont contenus.
Les services Node sous systemd
# /etc/systemd/system/trackos.service [Service] ExecStart=/usr/bin/node /var/www/trackos/server.js Restart=always User=www-trackos
Ce que je retiens
- Un pool PHP-FPM + un user système par appli = cloisonnement et stabilité.
- Une base + un user MySQL par projet, jamais de partage.
- systemd pour tout ce qui doit rester vivant.
- Le self-hosting impose la rigueur sur l'isolation.