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
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 :
| Approche | Pourquoi ç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 :
- 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.
- Modifier les directives Apache de ce nouveau Virtual Server via « Edit Directives » pour changer le
DocumentRootvers le dossier du module Dolibarr existant. - 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.
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
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).
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.
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.
Modifier les directives Apache (VirtualHost :443)
Sélectionnez le nouveau Virtual Server → Web Configuration → VirtualHost :443 → Edit 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
RewriteRulepour webmail et admin
e) Conserver impérativement
- La ligne
SuexecUserGroup - Les directives SSL (certificat, clé, protocole)
- Les logs (ErrorLog, CustomLog)
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).
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 → Servers → Apache Webserver
- Cliquez sur Apply Changes en haut à droite
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 Configuration → SSL Certificate → Let’s Encrypt
- Cliquez sur Request Certificate
6. Configuration PHP-FPM : le piège du socket
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ément | Nouveau VirtualHost (interventions) | VirtualHost Dolibarr (demo) |
|---|---|---|
| Utilisateur système | interveti (#1002) | demo (#1001) |
| Socket PHP-FPM | /run/php/177268...sock | /run/php/176655...sock |
| Propriétaire des fichiers | demo (les fichiers du module sont dans /home/demo/) | |
Le socket de interveti ne peut pas lire les fichiers de demo → erreur 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>
grep -r "SetHandler.*sock" /etc/apache2/sites-enabled/demo.votredomaine.fr.conf7. 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
## 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 :
- Utiliser le bon socket PHP-FPM (celui du serveur Dolibarr, voir section 6)
- Activer AcceptPathInfo pour que Apache transmette
/logincomme 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]
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
POSTvers/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ôme | Cause probable | Solution |
|---|---|---|
| Erreur 403 | Permissions du dossier pwa | Vérifiez les droits de lecture Apache |
| Erreur 404 sur les pages | Mauvais chemin DocumentRoot | Vérifiez dans Edit Directives |
| 404 / « Primary script unknown » sur les .php | Mauvais socket PHP-FPM | Remplacez le socket par celui du serveur Dolibarr (section 6) |
| 400 Bad Request sur /api.php/login | ProxyPass vers la mauvaise API | Supprimez les ProxyPass, utilisez le fichier api.php natif (section 7) |
| « Le module Api doit être activé » | Module API REST désactivé dans Dolibarr | Dolibarr → Configuration → Modules → activer « API REST » |
| Erreur CORS (duplicate headers) | En-têtes CORS en double | Ne pas ajouter de Header CORS manuels, Dolibarr les gère déjà |
| Erreur SSL | Certificat auto-signé / DNS non propagé | Demandez un certificat Let’s Encrypt |
| Apache ne redémarre pas | Erreur de syntaxe | Vérifiez les directives, consultez les logs Webmin |
| Pas de sudo en SSH | Normal sous Virtualmin | Webmin → Apache → Apply Changes |
10. Récapitulatif
- Configurer l’enregistrement DNS A pour le sous-domaine
- Créer un Virtual Server dans Virtualmin (Apache website uniquement, pas DNS)
- Identifier le socket PHP-FPM du serveur Dolibarr parent
- Modifier les directives du VirtualHost :443 via « Edit Directives »
- Changer le DocumentRoot et le Directory vers le dossier du module
- Remplacer le socket PHP-FPM par celui du serveur Dolibarr
- Ajouter
<Files "api.php"> AcceptPathInfo On </Files> - Supprimer les ServerAlias, ScriptAlias et RewriteRule inutiles
- Ne PAS ajouter de ProxyPass (l’API SmartAuth est servie directement)
- Appliquer via Webmin → Apache Webserver → Apply Changes
- Vérifier le certificat SSL (Let’s Encrypt)
- Tester la connexion dans le navigateur