Tutoriel

Héberger Invoice Ninja sur son VPS

Déploiement10 min de lecture8 étapes

Les éditeurs SaaS de facturation facturent par utilisateur ou par volume de transactions.

Sommaire· Pourquoi auto-héberger sa facturation1/9
  1. 01Pourquoi auto-héberger sa facturation
  2. 02Ce que vous obtenez avec Invoice Ninja 5.13.45
  3. 03Prérequis chiffrés pour Invoice Ninja 5.13.45
  4. 04Déployer Invoice Ninja sur VPS
  5. 05Connecter les passerelles de paiement
  6. 06Invoice Ninja auto-hébergé vs plan SaaS hébergé
  7. 07Sauvegarder et mettre à jour Invoice Ninja
  8. 08Dépannage : erreurs courantes
  9. 09Invoice Ninja auto-hébergé : ce qu'il faut retenir

Pourquoi auto-héberger sa facturation

Les éditeurs SaaS de facturation facturent par utilisateur ou par volume de transactions. FreshBooks démarre à 19 $/mois pour un seul utilisateur ; QuickBooks Online atteint 35 à 90 $/mois selon le plan. À mesure que l'équipe grossit ou que le nombre de clients augmente, la facture SaaS suit une courbe linéaire sans rapport avec la valeur produite. Sur un VPS entrée de gamme à 99 DH/mois, Invoice Ninja tourne sans limite d'utilisateurs ni de clients, et le coût reste fixe quelle que soit la croissance. La donnée de facturation reste dans votre infrastructure, soumise à votre politique de rétention, sans traverser les serveurs d'un tiers. C'est également la voie choisie par plus de 100 000 entreprises dans le monde qui ont opté pour le déploiement auto-hébergé d'Invoice Ninja.

Ce que vous obtenez avec Invoice Ninja 5.13.45

  • Devis, factures récurrentes, avoirs et bons de commande dans une interface unifiée
  • Passerelles de paiement intégrées : Stripe, PayPal, SEPA, Mollie, GoCardless et une vingtaine d'autres
  • Portail client auto-hébergé avec visualisation et paiement en ligne des factures
  • Suivi du temps facturable par projet et par tâche, intégrable à chaque ligne de facture
  • API REST complète et webhooks pour connecter votre ERP, CRM ou pipeline comptable
  • Authentification OIDC générique ajoutée en version 5.13.43 (18 septembre 2026) pour SSO d'entreprise
  • Support multi-devises et multi-langues avec rendu PDF natif côté serveur
  • Module white-label optionnel à 30 $/an pour retirer la mention « Created with Invoice Ninja »

Prérequis chiffrés pour Invoice Ninja 5.13.45

La version 5.13.45, sortie le 9 octobre 2026, exige un environnement minimal précis. Comptez au minimum 2 Go de RAM dédiés à l'ensemble de la stack : le conteneur PHP-FPM d'Invoice Ninja consomme entre 300 et 500 Mo selon la charge, MySQL 8.4 LTS en prend 400 à 700 Mo selon le buffer pool configuré, Redis 7.4 reste léger à 30-50 Mo au repos. Un VPS avec 2 vCPU et 4 Go de RAM offre une marge confortable pour la génération PDF en parallèle. Côté stockage, prévoyez au moins 10 Go pour les volumes Docker : la base de données croît lentement, mais les PDF de factures s'accumulent dans storage/. MySQL 8.4 LTS est recommandé par la documentation officielle pour ses garanties de compatibilité jusqu'en 2032 ; évitez MariaDB qui présente des incompatibilités connues avec certaines migrations d'Invoice Ninja v5. Redis 7.4 gère la file de travaux asynchrones (envoi d'e-mails, génération de PDF). PHP 8.2 ou 8.3 est embarqué dans l'image officielle invoiceninja/invoiceninja:5.13.45 ; vous n'avez pas à l'installer séparément. Docker Engine 24+ et Docker Compose v2.x sont requis.

Déployer Invoice Ninja sur VPS

  1. Préparer l'arborescence de travail

    Connectez-vous en SSH à votre VPS et créez un répertoire dédié : mkdir -p /opt/invoiceninja/{data,logs,public} && cd /opt/invoiceninja. Ce répertoire accueillera le fichier Compose, le fichier d'environnement et les volumes persistants. Assurez-vous que Docker et Docker Compose v2 sont installés : docker compose version doit retourner une version 2.x.

  2. Créer le fichier docker-compose.yml

    Créez /opt/invoiceninja/docker-compose.yml avec les services suivants. Le service db utilise l'image mysql:8.4 avec un volume nommé db_data. Le service redis utilise redis:7.4-alpine. Le service app utilise invoiceninja/invoiceninja:5.13.45 et dépend de db et redis ; montez ./data:/var/www/app/storage et ./public:/var/www/app/public. Exposez le port 9000 en interne uniquement — nginx fera l'interface publique. Déclarez les trois services dans un réseau app-net interne de type bridge pour les isoler du reste de l'hôte.

  3. Configurer les variables d'environnement

    Créez /opt/invoiceninja/.env (jamais versionné). Les variables essentielles : APP_ENV=production, APP_DEBUG=false, APP_URL=https://votre-domaine.com, DB_HOST=db, DB_DATABASE=invoiceninja, DB_USERNAME=ninja, DB_PASSWORD=<mot_de_passe_fort>, MYSQL_ROOT_PASSWORD=<root_pwd>, REDIS_HOST=redis, QUEUE_CONNECTION=redis, MAIL_MAILER=smtp, MAIL_HOST=<votre_smtp>, MAIL_PORT=587, MAIL_USERNAME=<compte>, MAIL_PASSWORD=<pwd>, [email protected], MAIL_ENCRYPTION=tls. Choisissez des mots de passe d'au moins 32 caractères aléatoires.

  4. Générer la clé d'application APP_KEY

    Avant le premier démarrage, générez la clé de chiffrement Laravel. Lancez d'abord les conteneurs en arrière-plan : docker compose up -d db redis. Attendez 20 secondes que MySQL initialise sa base, puis démarrez l'application : docker compose up -d app. Générez la clé : docker compose exec app php artisan key:generate. Copiez la valeur retournée (format base64:…) et injectez-la dans .env sous la variable APP_KEY. Redémarrez le conteneur app : docker compose restart app. Sans cette étape, tous les tokens de session et les données chiffrées en base seront illisibles.

  5. Configurer nginx en reverse proxy

    Créez /etc/nginx/sites-available/invoiceninja.conf. Le bloc server écoute sur le port 443 avec le certificat Let's Encrypt (voir le bloc tip suivant). La directive root pointe vers /opt/invoiceninja/public. Le bloc location / utilise try_files $uri $uri/ /index.php?$query_string. Le bloc location ~ \.php$ passe les requêtes à fastcgi_pass 127.0.0.1:9000 avec les paramètres SCRIPT_FILENAME et PATH_INFO standards. Ajoutez client_max_body_size 100M pour autoriser l'import de fichiers joints volumineux. Activez la configuration : ln -s /etc/nginx/sites-available/invoiceninja.conf /etc/nginx/sites-enabled/ && nginx -t && systemctl reload nginx.

  6. Lancer les migrations et la première connexion

    Une fois nginx configuré, lancez les migrations de base de données : docker compose exec app php artisan migrate --force. L'opération prend 30 à 60 secondes selon les ressources disponibles. Accédez ensuite à https://votre-domaine.com dans un navigateur : l'assistant de configuration vous demande de créer le compte administrateur (e-mail, mot de passe) et de saisir les informations de votre entreprise (raison sociale, IBAN si souhaité). À l'issue de cet assistant, Invoice Ninja est opérationnel.

  7. Activer la file de travaux asynchrones

    Invoice Ninja s'appuie sur des workers Laravel pour l'envoi d'e-mails et la génération de PDF en arrière-plan. Dans le fichier Compose, ajoutez un service worker qui utilise la même image invoiceninja/invoiceninja:5.13.45, monte les mêmes volumes, et exécute la commande php artisan queue:work --sleep=3 --tries=3. Ce service ne doit pas exposer de port. Sans worker actif, les e-mails de factures sont mis en file mais jamais envoyés.

  8. Configurer les passerelles de paiement

    Dans le backoffice (menu Paramètres > Passerelles de paiement), activez Stripe en collant vos clés publique et secrète depuis le tableau de bord Stripe. Pour PayPal, utilisez les identifiants OAuth de votre application REST PayPal. Pour SEPA via GoCardless, renseignez l'access token GoCardless Sandbox puis basculez sur l'environnement Production après tests. Chaque passerelle peut être activée ou désactivée par devise et par plan tarifaire client.

Pour obtenir un certificat TLS Let's Encrypt avec Certbot, installez le package python3-certbot-nginx puis exécutez certbot --nginx -d votre-domaine.com. Certbot modifie automatiquement la configuration nginx pour rediriger HTTP vers HTTPS et renouvelle le certificat toutes les 60 jours via un timer systemd. Vérifiez que le port 80 est ouvert dans votre pare-feu avant de lancer Certbot : ufw allow 80/tcp. Une fois le certificat obtenu, vous pouvez refermer le port 80 si vous le souhaitez et forcer le HTTPS en ajoutant add_header Strict-Transport-Security "max-age=31536000" always; dans le bloc server nginx.

Connecter les passerelles de paiement

Invoice Ninja 5.13.45 supporte nativement plus de 25 passerelles. Stripe est la plus complète : elle gère les paiements par carte, le prélèvement SEPA, les virements ACH et, depuis la version 5.13.43, Stripe PromptPay pour les marchés d'Asie du Sud-Est. Pour l'activer, créez une clé API restreinte dans le tableau de bord Stripe avec les permissions charges:write, customers:write et payment_methods:read, puis saisissez-la dans Invoice Ninja. PayPal s'intègre via l'API REST (pas l'ancienne API NVP) : créez une application dans le portail développeur PayPal, récupérez le client_id et le client_secret, et configurez-les dans la passerelle PayPal d'Invoice Ninja. Pour les prélèvements SEPA en Europe, GoCardless est la voie recommandée : le mandat de débit est signé en ligne par le client depuis le portail Invoice Ninja, sans échange de RIB par e-mail. Mollie constitue une alternative tout-en-un appréciée pour les entreprises européennes : elle unifie carte, virement, iDEAL et Bancontact sous une seule intégration.

Invoice Ninja auto-hébergé vs plan SaaS hébergé

Faites défiler le tableau

Auto-hébergé VPSSaaS Invoice Ninja hébergé
Coût mensuel99 DH/mois (VPS fixe)Gratuit jusqu'à 20 clients, puis 11-16 $/mois
Limite de clientsNon plafonnée20 clients en plan gratuit
Contrôle des donnéesDonnées sur votre infrastructureDonnées chez Invoice Ninja Inc.
Mises à jourManuelles (commande docker pull)Automatiques
White-label30 $/an (optionnel)Inclus dans les plans payants
Maintenance serveurÀ votre chargeGérée par l'éditeur

Sauvegarder et mettre à jour Invoice Ninja

La stratégie de sauvegarde doit couvrir deux éléments distincts : la base de données MySQL et le volume de stockage des fichiers. Pour MySQL, planifiez un dump quotidien avec docker compose exec db mysqldump -u ninja -p invoiceninja | gzip > /backups/invoiceninja-$(date +%Y%m%d).sql.gz via un cron ou un timer systemd. Pour les fichiers (PDF générés, logos, pièces jointes), sauvegardez le répertoire ./data avec rsync vers un stockage objet S3-compatible. Conservez au minimum 30 jours glissants et testez la restauration trimestriellement.

Pour mettre à jour vers une version future, la procédure est la suivante : mettez à jour le tag de l'image dans votre fichier Compose (par exemple de 5.13.45 vers la version suivante), tirez la nouvelle image avec docker compose pull app, puis exécutez docker compose up -d app worker suivi de docker compose exec app php artisan migrate --force. La migration s'exécute automatiquement au démarrage dans certaines configurations, mais il est plus sûr de la déclencher explicitement. Consultez le changelog GitHub avant toute mise à jour majeure (passage de 5.x à 6.x le cas échéant) : des étapes de migration supplémentaires peuvent être requises.

Dépannage : erreurs courantes

Quatre problèmes reviennent fréquemment lors du déploiement initial.

Erreur SQLSTATE[HY000] [2002] Connection refused : MySQL n'est pas encore prêt au moment où le conteneur app tente de s'y connecter. Ajoutez une directive healthcheck sur le service db et une condition service_healthy dans depends_on du service app. Alternativement, attendez 30 secondes après docker compose up -d db avant de démarrer app.

Les e-mails ne partent pas : vérifiez que le service worker est bien en cours d'exécution avec docker compose ps worker. Si le statut est Exited, inspectez les logs : docker compose logs worker. La cause la plus fréquente est un MAIL_HOST incorrect ou un port SMTP bloqué par le pare-feu de l'hébergeur.

Page blanche ou erreur 500 après migration : le répertoire storage/ n'a pas les bonnes permissions. Depuis l'hôte, exécutez docker compose exec app chown -R www-data:www-data /var/www/app/storage && docker compose exec app php artisan config:clear && docker compose exec app php artisan cache:clear.

La génération PDF produit des fichiers vides : Invoice Ninja utilise Snappy (wkhtmltopdf) ou une alternative selon la configuration. Vérifiez que la variable PDF_GENERATOR est définie (valeurs possibles : snappy, browsershot, phantom) et que le binaire correspondant est présent dans l'image. L'image officielle invoiceninja/invoiceninja:5.13.45 inclut wkhtmltopdf ; si vous avez construit une image custom, assurez-vous de l'avoir inclus.

Invoice Ninja auto-hébergé : ce qu'il faut retenir

Invoice Ninja 5.13.45, publié le 9 octobre 2026, est une solution de facturation mature et activement maintenue. L'Elastic License 2.0 autorise l'auto-hébergement pour tout usage interne sans restriction : vous n'avez pas à débourser un centime tant que vous n'en revendiez pas l'accès comme service. La stack Docker (image officielle + MySQL 8.4 LTS + Redis 7.4) est reproductible en moins d'une heure sur n'importe quel VPS disposant de 2 Go de RAM. Le module white-label reste optionnel à 30 $/an : pour la grande majorité des freelances et PME, la mention « Created with Invoice Ninja » dans le pied de page des PDF n'est pas un obstacle. Si votre volume de clients dépasse 20 ou que vos données de facturation doivent rester dans votre infrastructure pour des raisons légales ou de conformité, le déploiement auto-hébergé est économiquement et techniquement justifié. Pour aller plus loin, notre équipe est disponible à [email protected] pour vous aider à dimensionner votre VPS et configurer les sauvegardes.

Déployez votre infrastructure dès aujourd'hui

VPS Cloud. Environnements préconfigurés disponibles.

Besoin d'aide ?

Parcourez notre centre d'aide et notre FAQ, ou contactez notre équipe — rappel, WhatsApp ou e-mail. Support en français, anglais et arabe.

Écrire sur WhatsApps'ouvre dans un nouvel onglet