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.