GiGaRuN Solutions
Vos métiers, nos solutions Excellence IT - La Réunion
+262 692 31 11 91
← Retour aux guides

VirtualHost Virtualmin pour Dolibarr

Créer un sous-domaine dédié à un module Dolibarr (SmartInterventions, etc.) sous Webmin / Virtualmin

1. Contexte et problématique

Vous hébergez Dolibarr sur un serveur géré par Webmin / Virtualmin. Votre Dolibarr est accessible via un domaine existant, par exemple demo.votredomaine.fr.

Un module comme SmartInterventions (ou tout autre module disposant d’une PWA) nécessite un sous-domaine dédié avec son propre VirtualHost Apache, dont le DocumentRoot pointe vers un sous-dossier spécifique de votre Dolibarr :

/home/demo/public_html/custom/smartinterventions/pwa
Objectif : Accéder au module via une URL propre comme https://interventions.votredomaine.fr au lieu de https://demo.votredomaine.fr/custom/smartinterventions/pwa/.

La documentation officielle du module fournit un exemple de VirtualHost Apache générique :

<VirtualHost *:443>
    ServerName interventions.votredomaine.fr
    DocumentRoot /chemin/vers/dolibarr/custom/smartinterventions/pwa
    <Directory /chemin/vers/dolibarr/custom/smartinterventions/pwa>
        AllowOverride All
        Require all granted
    </Directory>
    # + configuration SSL
</VirtualHost>

Le problème : sous Virtualmin, vous ne pouvez pas simplement coller ce bloc dans un fichier de configuration Apache. Virtualmin gère les VirtualHosts à sa manière.

2. Pourquoi les solutions évidentes ne marchent pas

Quand on utilise Virtualmin, plusieurs approches semblent logiques mais ne fonctionnent pas :

ApprochePourquoi ça ne marche pas
ServerAlias dans le VirtualHost existant Un ServerAlias partage le même DocumentRoot. Impossible de pointer vers un sous-dossier différent.
Sub-Server (sous-domaine Virtualmin) Un Sub-Server crée un sous-dossier dans l’arborescence du parent. Il ne permet pas de pointer vers un dossier existant ailleurs.
Écrire le VirtualHost manuellement dans un .conf Risque de conflit avec Virtualmin qui gère ses propres fichiers et peut écraser vos modifications.

3. La méthode qui fonctionne

La solution est en trois temps :

  1. Créer un Virtual Server dans Virtualmin pour le sous-domaine. Virtualmin va créer un répertoire home inutile — ce n’est pas grave.
  2. Modifier les directives Apache de ce nouveau Virtual Server via « Edit Directives » pour changer le DocumentRoot vers le dossier du module Dolibarr existant.
  3. Corriger le socket PHP-FPM pour utiliser celui du Virtual Server propriétaire des fichiers (le serveur Dolibarr parent), sans quoi PHP ne pourra pas lire les fichiers.
Point clé : Apache se fiche de savoir si le DocumentRoot est dans le « home » du Virtual Server ou ailleurs. On exploite cette souplesse tout en restant dans le cadre de gestion de Virtualmin.

4. Procédure pas à pas

1

Prérequis : configurer le DNS

Chez votre registrar ou gestionnaire DNS, ajoutez un enregistrement A :

interventions.votredomaine.fr  →  IP_DU_SERVEUR

Attendez la propagation DNS. Ne cochez pas « DNS for domain » dans Virtualmin — sauf si votre serveur est le DNS autoritaire (rarement le cas).

2

Créer le Virtual Server dans Virtualmin

Dans Virtualmin → Create Virtual Server :

  • Domain name : interventions.votredomaine.fr
  • Enabled features : cochez uniquement Apache website
  • Décochez tout le reste : DNS, Mail, MariaDB, Spam, AWStats

Validez. Virtualmin crée un répertoire par défaut (ex. /home/interveti/public_html). C’est normal.

3

Identifier le socket PHP-FPM du serveur Dolibarr

Avant de modifier les directives, vous devez trouver le socket PHP-FPM du Virtual Server Dolibarr parent (celui qui possède les fichiers). En SSH :

# Trouver le socket du serveur Dolibarr (ex: demo.votredomaine.fr)
grep -r "SetHandler.*sock" /etc/apache2/sites-enabled/demo.votredomaine.fr.conf

Vous obtiendrez quelque chose comme :

SetHandler proxy:unix:/run/php/17665503967645.sock|fcgi://127.0.0.1

Notez ce chemin de socket — vous en aurez besoin à l’étape suivante.

4

Modifier les directives Apache (VirtualHost :443)

Sélectionnez le nouveau Virtual Server → Web Configuration → VirtualHost :443Edit Directives.

a) Changer le DocumentRoot et le Directory

# AVANT (généré par Virtualmin)
DocumentRoot /home/interveti/public_html
<Directory /home/interveti/public_html>

# APRÈS (modifié par vous)
DocumentRoot /home/demo/public_html/custom/smartinterventions/pwa
<Directory /home/demo/public_html/custom/smartinterventions/pwa>

b) Remplacer le socket PHP-FPM

# AVANT (socket du nouveau Virtual Server - n'a PAS les droits sur les fichiers)
<FilesMatch \.php$>
    SetHandler proxy:unix:/run/php/1772686153847109.sock|fcgi://127.0.0.1
</FilesMatch>

# APRÈS (socket du serveur Dolibarr parent - propriétaire des fichiers)
<FilesMatch \.php$>
    SetHandler proxy:unix:/run/php/17665503967645.sock|fcgi://127.0.0.1
</FilesMatch>

c) Ajouter AcceptPathInfo pour l’API

Le module SmartAuth utilise un routeur personnalisé via api.php/action. Apache doit accepter le PATH_INFO :

<Files "api.php">
    AcceptPathInfo On
</Files>

d) Supprimer les éléments inutiles

  • Les ServerAlias (www, mail, webmail, admin)
  • Le ScriptAlias /cgi-bin/ et le bloc <Directory> cgi-bin
  • Les RewriteRule pour webmail et admin

e) Conserver impérativement

  • La ligne SuexecUserGroup
  • Les directives SSL (certificat, clé, protocole)
  • Les logs (ErrorLog, CustomLog)
5

Exemple de directives finales

SuexecUserGroup #1002 #1002
ServerName interventions.votredomaine.fr
DocumentRoot /home/demo/public_html/custom/smartinterventions/pwa
ErrorLog /var/log/virtualmin/interventions.votredomaine.fr_error_log
CustomLog /var/log/virtualmin/interventions.votredomaine.fr_access_log combined
DirectoryIndex index.php index.htm index.html
<Directory /home/demo/public_html/custom/smartinterventions/pwa>
    Options -Indexes +IncludesNOEXEC +SymLinksIfOwnerMatch
    Require all granted
    AllowOverride All Options=ExecCGI,Includes,IncludesNOEXEC,Indexes,MultiViews,SymLinksIfOwnerMatch
</Directory>
<Files "api.php">
    AcceptPathInfo On
</Files>
ProxyPass /.well-known !
RemoveHandler .php
RemoveHandler .php8.4
<FilesMatch \.php$>
    SetHandler proxy:unix:/run/php/SOCKET_DU_SERVEUR_DOLIBARR.sock|fcgi://127.0.0.1
</FilesMatch>
SSLEngine on
SSLCertificateFile /etc/ssl/virtualmin/XXXXXX/ssl.cert
SSLCertificateKeyFile /etc/ssl/virtualmin/XXXXXX/ssl.key
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLCACertificateFile /etc/ssl/virtualmin/XXXXXX/ssl.ca

Les valeurs XXXXXX sont générées par Virtualmin — conservez celles déjà présentes. Le socket PHP-FPM doit être celui du serveur Dolibarr parent (voir étape 3).

6

Appliquer la configuration Apache

En SSH vous n’aurez probablement pas les droits sudo. C’est normal sous Virtualmin.

Utilisez l’interface Webmin (pas Virtualmin) :

  • Webmin → ServersApache Webserver
  • Cliquez sur Apply Changes en haut à droite
💡
Astuce : Webmin tourne en root. « Apply Changes » vérifie la syntaxe et recharge Apache en une action.

5. Certificat SSL avec Let’s Encrypt

Virtualmin génère un certificat SSL à la création du Virtual Server. Il demande souvent automatiquement un certificat Let’s Encrypt si le DNS pointe déjà vers le serveur.

Vérifiez en cliquant sur le cadenas dans votre navigateur :

  • Émetteur : doit indiquer « Let’s Encrypt » (R10, R11 ou R12)
  • Domaine : doit correspondre à votre sous-domaine
  • Expiration : environ 90 jours après la création

Si le certificat est auto-signé, demandez-en un manuellement :

  • Virtualmin → Virtual Server → Server ConfigurationSSL CertificateLet’s Encrypt
  • Cliquez sur Request Certificate
Prérequis : le DNS doit déjà pointer vers votre serveur pour que Let’s Encrypt puisse valider le domaine.

6. Configuration PHP-FPM : le piège du socket

Piège critique : Quand Virtualmin crée un Virtual Server, il crée un socket PHP-FPM dédié qui tourne sous l’utilisateur de ce serveur (ex. interveti). Si le DocumentRoot pointe vers des fichiers appartenant à un autre utilisateur (ex. demo), PHP retournera « Primary script unknown » car le processus PHP-FPM n’a pas les droits de lecture.

Comprendre le problème

Virtualmin isole chaque Virtual Server avec son propre processus PHP-FPM. Voici ce qui se passe :

ÉlémentNouveau VirtualHost (interventions)VirtualHost Dolibarr (demo)
Utilisateur systèmeinterveti (#1002)demo (#1001)
Socket PHP-FPM/run/php/177268...sock/run/php/176655...sock
Propriétaire des fichiersdemo (les fichiers du module sont dans /home/demo/)

Le socket de interveti ne peut pas lire les fichiers de demoerreur 404 / « Primary script unknown » sur tous les fichiers PHP.

La solution

Dans les directives du VirtualHost, remplacez le socket PHP-FPM par celui du serveur propriétaire des fichiers :

# Remplacer le socket du nouveau serveur par celui du serveur Dolibarr
<FilesMatch \.php$>
    SetHandler proxy:unix:/run/php/SOCKET_DU_SERVEUR_DOLIBARR.sock|fcgi://127.0.0.1
</FilesMatch>
Pour trouver le bon socket : grep -r "SetHandler.*sock" /etc/apache2/sites-enabled/demo.votredomaine.fr.conf

7. Configuration de l’API SmartAuth

Le module SmartInterventions utilise SmartAuth, un système d’authentification JWT indépendant de l’API standard de Dolibarr. La PWA appelle l’endpoint /api.php/login, /api.php/home, etc.

Architecture de l’API

Le fichier api.php est situé directement dans le dossier pwa/ (le DocumentRoot). Il utilise le routeur personnalisé de SmartAuth (RouteController) qui parse l’action depuis le PATH_INFO de l’URL :

# Requête du navigateur :
POST https://interventions.votredomaine.fr/api.php/login

# Apache sert le fichier pwa/api.php avec PATH_INFO = /login
# Le routeur SmartAuth extrait "login" et appelle AuthController::login()

Ce qu’il ne faut PAS faire

Ne pas utiliser ProxyPass vers l’API Dolibarr standard. L’erreur la plus courante est de configurer :
## FAUX - ne faites PAS cela
ProxyPass /api.php/ https://demo.votredomaine.fr/api/index.php/
ProxyPassReverse /api.php/ https://demo.votredomaine.fr/api/index.php/

L’API standard de Dolibarr (/api/index.php) n’est pas le même endpoint que celui de SmartAuth (pwa/api.php). Le ProxyPass envoie les requêtes au mauvais endroit, ce qui produit des erreurs 400 ou des réponses inattendues.

Ce qu’il faut faire

Le fichier api.php étant déjà dans le DocumentRoot, il suffit de :

  1. Utiliser le bon socket PHP-FPM (celui du serveur Dolibarr, voir section 6)
  2. Activer AcceptPathInfo pour que Apache transmette /login comme PATH_INFO à api.php
<Files "api.php">
    AcceptPathInfo On
</Files>

Aucun ProxyPass, Alias ou RewriteRule n’est nécessaire. Apache sert api.php directement.

8. Règles de réécriture (.htaccess)

Certains modules Dolibarr nécessitent des règles de réécriture pour router les appels API. La doc officielle donne un exemple nginx :

# Directive nginx (documentation officielle)
location ~ {
    try_files $uri $uri/ /api.php/$1?$args;
}

L’équivalent Apache, dans un fichier .htaccess à la racine du dossier pwa :

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /api.php/$1 [QSA,L]
Le AllowOverride All dans nos directives autorise les fichiers .htaccess. Vérifiez qu’il est présent dans votre bloc <Directory>.

9. Vérification et tests

Test navigateur

Ouvrez https://interventions.votredomaine.fr. Vous devez voir l’interface de connexion du module.

Test de l’API

Ouvrez les DevTools du navigateur (F12 → onglet Network). Tentez une connexion. Vous devez voir :

  • Une requête POST vers /api.php/login
  • Un code de réponse 200 (succès) ou 401 (identifiants incorrects)
  • Pas d’erreur 400, 404 ou 500

Test en ligne de commande (SSH)

# Tester l'API depuis le serveur
curl -s -X POST https://interventions.votredomaine.fr/api.php/login   -H "Content-Type: application/json"   -d '{"email":"user@example.com","password":"test"}' | head -c 200

Vérifications complémentaires

  • Le cadenas SSL est présent et valide (Let’s Encrypt)
  • La page se charge sans erreur 403 ou 404
  • La connexion au module fonctionne avec des identifiants valides

En cas de problème

SymptômeCause probableSolution
Erreur 403Permissions du dossier pwaVérifiez les droits de lecture Apache
Erreur 404 sur les pagesMauvais chemin DocumentRootVérifiez dans Edit Directives
404 / « Primary script unknown » sur les .phpMauvais socket PHP-FPMRemplacez le socket par celui du serveur Dolibarr (section 6)
400 Bad Request sur /api.php/loginProxyPass vers la mauvaise APISupprimez les ProxyPass, utilisez le fichier api.php natif (section 7)
« Le module Api doit être activé »Module API REST désactivé dans DolibarrDolibarr → Configuration → Modules → activer « API REST »
Erreur CORS (duplicate headers)En-têtes CORS en doubleNe pas ajouter de Header CORS manuels, Dolibarr les gère déjà
Erreur SSLCertificat auto-signé / DNS non propagéDemandez un certificat Let’s Encrypt
Apache ne redémarre pasErreur de syntaxeVérifiez les directives, consultez les logs Webmin
Pas de sudo en SSHNormal sous VirtualminWebmin → Apache → Apply Changes

10. Récapitulatif

Résumé de la procédure :
  1. Configurer l’enregistrement DNS A pour le sous-domaine
  2. Créer un Virtual Server dans Virtualmin (Apache website uniquement, pas DNS)
  3. Identifier le socket PHP-FPM du serveur Dolibarr parent
  4. Modifier les directives du VirtualHost :443 via « Edit Directives »
  5. Changer le DocumentRoot et le Directory vers le dossier du module
  6. Remplacer le socket PHP-FPM par celui du serveur Dolibarr
  7. Ajouter <Files "api.php"> AcceptPathInfo On </Files>
  8. Supprimer les ServerAlias, ScriptAlias et RewriteRule inutiles
  9. Ne PAS ajouter de ProxyPass (l’API SmartAuth est servie directement)
  10. Appliquer via Webmin → Apache Webserver → Apply Changes
  11. Vérifier le certificat SSL (Let’s Encrypt)
  12. Tester la connexion dans le navigateur
💡
Pourquoi cette méthode ? Virtualmin impose sa propre gestion des VirtualHosts. On ne peut pas coller un bloc Apache dans un .conf comme sur un serveur classique. En créant le Virtual Server via Virtualmin puis en modifiant ses directives, on reste dans le cadre de l’outil (SSL, renouvellement automatique, logs) tout en obtenant le résultat souhaité. Le répertoire home créé automatiquement reste vide et n’a aucun impact. Le changement de socket PHP-FPM est indispensable pour que PHP puisse lire les fichiers du module Dolibarr.