Pourquoi self-héberger ERPNext sur un VPS
Un ERP centralise les données les plus sensibles de l'entreprise : écritures comptables, marges, fiches clients et fournisseurs, paie. Les offres SaaS facturent souvent par utilisateur et par mois, ce qui devient coûteux à mesure que les équipes grandissent. Sur un VPS dédié, vous payez le serveur une fois, vous ajoutez autant d'utilisateurs que nécessaire, et la base de données reste sous votre contrôle, sauvegardée selon vos propres règles.
ERPNext repose sur Frappe, un framework Python/JavaScript qui rend le code source lisible et extensible. Une instance auto-hébergée vous ouvre les mises à jour sur votre propre calendrier, le choix des apps complémentaires (HRMS, e-Commerce, Education, Healthcare) et la possibilité de coder vos propres modules sans dépendre d'un éditeur.
Les bénéfices concrets d'un ERPNext auto-hébergé
- Aucun coût par utilisateur : ajoutez vos équipes sans augmenter la facture.
- Souveraineté des données comptables et RH, qui restent sur votre serveur.
- Tous les modules disponibles (compta, stock, CRM, fabrication, paie) sans palier payant.
- Personnalisation libre via le framework Frappe et les apps complémentaires.
- Sauvegardes et rétention maîtrisées, adaptées à vos obligations légales.
- Évolutivité : montez en RAM/vCPU à mesure que le volume de transactions croît.
Les modules clés d'ERPNext
ERPNext couvre l'ensemble du cycle opérationnel d'une entreprise. Comptabilité : plan comptable multidevise, grand livre, rapports réglementaires (bilan, compte de résultat), gestion TVA et rapprochement bancaire. Ventes et achats : devis, commandes, livraisons, factures et avoirs avec workflow de validation. Gestion des stocks : entrepôts multiples, lots et numéros de série, inventaires tournants et valorisation FIFO ou moyenne mobile. CRM : leads, opportunités, campagnes et pipeline commercial avec tableau de bord des activités. Fabrication : nomenclatures (BOM), ordres de fabrication, suivi des postes de charge et des rebuts. Ressources humaines : fiches employés, congés, présences, paie configurable par pays et évaluation de performance.
Chaque module s'active depuis le bureau ERPNext ; vous n'installez que ce dont vous avez besoin, et les droits d'accès se définissent par rôle au niveau du document.
Prérequis matériels et logiciels
ERPNext est plus exigeant que la moyenne. Comptez au minimum 2 vCPU et 4 Go de RAM pour un usage de test, et 4 vCPU / 8 Go de RAM pour une production avec plusieurs utilisateurs simultanés. Prévoyez 20 Go de disque pour la base MariaDB, Redis et les fichiers téléversés.
Côté logiciel : Docker et Docker Compose v2 (>= 2.20), un nom de domaine (ex. erp.monsaas.com) pointant vers l'IP du VPS, et le port 443 ouvert en entrée. ERPNext utilise MariaDB 10.6+ comme base de données principale et Redis pour le cache et les workers temps réel — les deux sont inclus dans la stack frappe_docker ; vous n'avez pas à les installer séparément.
Déployer ERPNext avec Frappe Docker et HTTPS
Préparer le VPS et Docker
En SSH, mettez à jour le système (
apt update && apt upgrade -y) et installez Docker viacurl -fsSL https://get.docker.com | sh. Ajoutez votre utilisateur au groupe docker :usermod -aG docker $USER. Vérifiez avecdocker compose version(v2 requis).Récupérer frappe_docker
Clonez le dépôt officiel et choisissez la branche qui correspond à la version cible :
git clone https://github.com/frappe/frappe_docker cd frappe_dockerLe dossier
overrides/contient des compose partials pour Caddy (HTTPS auto), Traefik et l'app HRMS — assemblez-les selon vos besoins.Configurer l'environnement
Copiez
example.enven.envet ajustez les variables essentielles :cp example.env .envDans
.env, définissezFRAPPE_SITE_NAME_HEADER,DB_PASSWORD,REDIS_CACHE, et — si vous utilisez l'override Caddy —LETSENCRYPT_EMAILet le domaine dansCaddyfile. Ne déployez jamais avec les mots de passe par défaut.Lancer la stack
Démarrez tous les services :
docker compose --project-name erpnext \ -f compose.yaml \ -f overrides/compose.mariadb.yaml \ -f overrides/compose.redis.yaml \ -f overrides/compose.https.yaml \ up -dPuis créez le site ERPNext et installez l'app :
docker compose exec backend bench new-site erp.monsaas.com \ --mariadb-root-password <rootpwd> \ --admin-password <adminpwd> docker compose exec backend bench --site erp.monsaas.com install-app erpnext docker compose exec backend bench --site erp.monsaas.com migrateSuivez les logs pour confirmer que tous les services (db, redis, workers, scheduler) sont sains :
docker compose logs -f.Configurer le reverse proxy
Si vous n'utilisez pas l'override Caddy inclus, placez Nginx devant ERPNext. Exemple minimal :
server { listen 443 ssl; server_name erp.monsaas.com; ssl_certificate /etc/letsencrypt/live/erp.monsaas.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/erp.monsaas.com/privkey.pem; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; } }Avec Caddy, un simple
Caddyfilesuffit :erp.monsaas.com { reverse_proxy backend:8000 }— le certificat Let's Encrypt est obtenu et renouvelé automatiquement.Sécuriser et sauvegarder
Restreignez les ports internes (MariaDB 3306, Redis 6379) au loopback ou au réseau Docker interne. Planifiez des sauvegardes régulières avec
bench backupet stockez-les hors du VPS :docker compose exec backend bench --site erp.monsaas.com backup --with-filesLes fichiers de backup sont placés dans
sites/erp.monsaas.com/private/backups/— copiez-les vers un stockage objet externe (S3, Garage) pour la reprise après incident.Se connecter la première fois
Ouvrez l'adresse de votre application et connectez-vous avec l'identifiant
Administratoret le mot de passe administrateur défini lors dubench new-site. Comptez quelques minutes après l'installation avant que l'adresse réponde — les migrations initiales tournent en arrière-plan. ERPNext enchaîne sur son assistant de configuration : langue, fuseau horaire, devise, exercice comptable et société.
Post-installation : société, exercice et utilisateurs
Une fois connecté en Administrator, rendez-vous dans Paramètres → Paramètres système pour confirmer le fuseau horaire et le format de date, puis dans Comptabilité → Plan comptable pour adapter la structure aux normes locales (ERPNext propose des charts of accounts pour une centaine de pays).
Créez votre société dans Comptabilité → Société : renseignez la devise de base, le numéro fiscal et l'exercice comptable de départ. ERPNext crée automatiquement les comptes de clôture et les entrées de bilan d'ouverture.
Pour les utilisateurs, allez dans Paramètres → Utilisateurs et autorisations → Utilisateur : assignez les rôles métier (Accounts Manager, Stock User, HR Manager…) plutôt que des droits document par document. Les rôles se combinent : un utilisateur peut être à la fois Sales User et Purchase User sans droits d'administration.
Monitoring et maintenance
ERPNext fournit plusieurs points d'entrée pour superviser une instance en production.
bench doctor est la commande de diagnostic intégrée : elle vérifie l'état des workers Celery, du scheduler et de la connexion Redis. Lancez-la depuis le conteneur :
docker compose exec backend bench doctorUn worker absent ou une queue bloquée s'affiche immédiatement.
Logs applicatifs — les journaux ERPNext sont dans sites/<site>/logs/ à l'intérieur du volume sites :
- web.log : erreurs HTTP et traces Python du backend Gunicorn ;
- worker.error.log : exceptions des workers Celery (tâches planifiées, envois d'e-mail) ;
- scheduler.log : cycles du planificateur.
Sauvegarde automatisée — créez une tâche cron sur l'hôte pour lancer bench backup quotidiennement et copier les archives vers un stockage distant :
0 3 * * * docker compose -p erpnext exec -T backend \
bench --site erp.monsaas.com backup --with-files \
&& rclone copy /path/to/backups remote:erpnext-backupsMises à jour — avant chaque montée de version majeure, faites un backup complet, lisez les release notes, testez sur une copie, puis : bench update --reset dans le conteneur. Les migrations de schéma s'appliquent automatiquement, mais certaines versions majeures d'ERPNext exigent une montée préalable vers la version mineure la plus haute (ex. v14 → v14.x latest avant de passer à v15).
Dépannage : erreurs courantes
Worker crash : RedisBroadcastError ou ConnectionRefusedError vers Redis
Erreur dans worker.error.log : redis.exceptions.ConnectionRefusedError: [Errno 111] Connection refused. Cause : le conteneur Redis s'est arrêté ou a redémarré après un OOM. Vérifiez : docker compose ps redis — s'il est en Exited, relancez avec docker compose up -d redis puis redémarrez les workers. Si le crash est répété, augmentez la RAM allouée au VPS ou limitez le nombre de workers dans common_site_config.json.
Migration de schéma bloquée : frappe.exceptions.SchemaChangedError
Erreur lors d'un bench migrate : SchemaChangedError: <DocType> has been manually modified. Cause : une colonne a été modifiée manuellement en base, ERPNext refuse d'écraser. Remède : bench --site erp.monsaas.com migrate --skip-failing, puis inspectez le doctype concerné dans l'interface et relancez migrate sans le flag.
Timeout bench : Traceback ... requests.exceptions.ReadTimeout
Erreur lors d'une action longue (import CSV massif, recalcul de stock) : ReadTimeout: HTTPConnectionPool. Augmentez le timeout Gunicorn dans common_site_config.json : "gunicorn_workers": 2, "web_timeout": 120. Redémarrez le service web : docker compose restart backend.
MariaDB connexion refusée : OperationalError: (2003, "Can't connect to MySQL server on 'db'")
Erreur au démarrage de bench new-site ou au lancement des workers. Cause habituelle : le conteneur MariaDB n'est pas encore prêt ou le health check a échoué. Vérifiez : docker compose logs db | tail -20. Si MariaDB sort [ERROR] InnoDB: Page 0 log sequence number, les fichiers de base sont corrompus — restaurez depuis le dernier backup. Si c'est un simple délai de démarrage, attendez 30 secondes et relancez la commande.
Site vide après bench migrate : TemplateNotFound
ERPNext affiche une page blanche ou une erreur Jinja après une mise à jour. Cause : les assets statiques n'ont pas été reconstruits. Lancez : docker compose exec backend bench --site erp.monsaas.com clear-cache && bench build --app erpnext. Un redémarrage du conteneur frontend (si séparé) peut également suffire.
ERPNext vs Odoo Community : quand choisir l'un ou l'autre
Faites défiler le tableau
| Critère | ERPNext | Odoo Community |
|---|---|---|
| Licence | GPL v3 — code et modules libres | LGPL v3 (core) — modules enterprise propriétaires |
| Modules inclus | Comptabilité, stock, CRM, fabrication, RH — tous gratuits | Core fonctionnel ; modules avancés réservés à Odoo Enterprise (payant) |
| Langage / stack | Python + Frappe, JS vanilla côté client | Python + OWL (framework JS maison) |
| Interface | Bureau d'apps, formulaires configurables sans code | Vue par kanban/liste, studio low-code (Enterprise) |
| Complexité d'installation | Stack Docker officielle bien documentée | Docker disponible, mais moins de recul communautaire |
| Communauté | Active sur GitHub et forum Frappe ; forte en Inde, Afrique | Très large ; écosystème partenaires dense en Europe |
| Idéal pour | PME cherchant un ERP complet gratuit, fabrication, multi-devises | Entreprises voulant CRM avancé ou e-commerce Odoo sans développement custom |
ERPNext évolue par versions majeures avec migrations de schéma : avant chaque mise à jour, faites un bench backup complet et testez la montée de version sur une copie avant de l'appliquer en production. Les migrations entre versions majeures doivent suivre le chemin officiel (ex. v14 → v15 sans sauter de version).
La documentation officielle
Pour la configuration avancée et les options propres à l'outil, référez-vous à la documentation officielle de ERPNext et au dépôt frappe_docker. Ce guide couvre la mise en ligne sur VPS ; la doc éditeur reste la référence pour les réglages fins, les montées de version majeures et les cas d'usage spécifiques.