[{"data":1,"prerenderedAt":190},["ShallowReactive",2],{"seo-verification":3,"blog-host-invoice-ninja-vps-en":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-host-invoice-ninja-vps-en",{"id":9,"slug":10,"slugs":11,"title":14,"excerpt":15,"readTime":16,"views":17,"isPinned":18,"publishedAt":19,"updatedAt":20,"category":21,"categories":26,"featuredImage":28,"bgImage":29,"posterImage":30,"relatedSolution":28,"intro":31,"sections":32,"ctaTitle":28,"ctaBody":28,"ctaButton":128,"ctaUrl":129,"relatedPosts":130},432,"host-invoice-ninja-vps",{"fr":12,"en":10,"ar":10,"es":13},"heberger-invoice-ninja-vps","alojar-invoice-ninja-vps","Host Invoice Ninja on your VPS","Deploy Invoice Ninja 5.13.45 on your VPS using Docker Compose, MySQL 8.4, and Redis 7.4. Self-hosted invoicing under Elastic License 2.0, no SaaS subscription required.",10,0,false,"2026-10-11T00:00:00+00:00","2026-10-13T14:10:28+00:00",{"id":22,"name":23,"slug":24,"color":25,"icon":24},3,"Deployment","deploiement","bg-success\u002F10 text-success",[27],{"id":22,"name":23,"slug":24,"color":25,"icon":24},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fheberger-invoice-ninja-vps-poster.svg","SaaS invoicing vendors charge per user or per transaction volume.",[33,37,49,52,80,83,86,119,122,125],{"type":34,"title":35,"body":36},"h2","Why self-host your invoicing","SaaS invoicing vendors charge per user or per transaction volume. FreshBooks starts at $19\u002Fmonth for a single user; QuickBooks Online ranges from $35 to $90\u002Fmonth depending on the plan. As your team grows or your client count increases, the SaaS bill scales linearly with no corresponding increase in value. On an entry-level VPS at 99 DH\u002Fmonth, Invoice Ninja runs with no user or client limits, and the cost stays flat regardless of growth. Billing data remains in your infrastructure, subject to your own retention policy, without transiting through a third-party's servers. More than 100,000 businesses worldwide have already made this choice with Invoice Ninja's self-hosted deployment.",{"type":38,"title":39,"items":40},"ul","What you get with Invoice Ninja 5.13.45",[41,42,43,44,45,46,47,48],"Quotes, recurring invoices, credit notes, and purchase orders in a unified interface","Built-in payment gateways: Stripe, PayPal, SEPA, Mollie, GoCardless, and over twenty others","Self-hosted client portal with online invoice viewing and payment","Billable time tracking by project and task, directly linkable to invoice line items","Full REST API and webhooks to connect your ERP, CRM, or accounting pipeline","Generic OIDC authentication added in version 5.13.43 (18 September 2026) for enterprise SSO","Multi-currency and multi-language support with native server-side PDF rendering","Optional white-label module at $30\u002Fyear to remove the 'Created with Invoice Ninja' footer",{"type":34,"title":50,"body":51},"Minimum requirements for Invoice Ninja 5.13.45","Version 5.13.45, released on 9 October 2026, requires a specific minimum environment. Plan for at least 2 GB of RAM allocated to the entire stack: the Invoice Ninja PHP-FPM container consumes 300 to 500 MB under load, MySQL 8.4 LTS takes 400 to 700 MB depending on the buffer pool size, and Redis 7.4 stays light at 30–50 MB at rest. A VPS with 2 vCPUs and 4 GB of RAM provides comfortable headroom for parallel PDF generation. For storage, allocate at least 10 GB for Docker volumes: the database grows slowly, but invoice PDFs accumulate in `storage\u002F`. MySQL 8.4 LTS is recommended by the official documentation for its compatibility guarantees through 2032; avoid MariaDB, which has known incompatibilities with certain Invoice Ninja v5 migrations. Redis 7.4 handles the asynchronous job queue (email sending, PDF generation). PHP 8.2 or 8.3 is bundled in the official `invoiceninja\u002Finvoiceninja:5.13.45` image and does not need to be installed separately. Docker Engine 24+ and Docker Compose v2.x are required.",{"type":53,"title":54,"steps":55},"steps","Deploy Invoice Ninja on a VPS",[56,59,62,65,68,71,74,77],{"title":57,"body":58},"Prepare the working directory","SSH into your VPS and create a dedicated directory: `mkdir -p \u002Fopt\u002Finvoiceninja\u002F{data,logs,public} && cd \u002Fopt\u002Finvoiceninja`. This directory will hold the Compose file, the environment file, and persistent volumes. Verify that Docker and Docker Compose v2 are installed: `docker compose version` should return a 2.x version string.",{"title":60,"body":61},"Create the docker-compose.yml file","Create `\u002Fopt\u002Finvoiceninja\u002Fdocker-compose.yml` with the following services. The `db` service uses the `mysql:8.4` image with a named volume `db_data`. The `redis` service uses `redis:7.4-alpine`. The `app` service uses `invoiceninja\u002Finvoiceninja:5.13.45` and depends on `db` and `redis`; mount `.\u002Fdata:\u002Fvar\u002Fwww\u002Fapp\u002Fstorage` and `.\u002Fpublic:\u002Fvar\u002Fwww\u002Fapp\u002Fpublic`. Expose port `9000` internally only — nginx will handle the public interface. Declare all three services on an internal `app-net` bridge network to isolate them from the rest of the host.",{"title":63,"body":64},"Configure environment variables","Create `\u002Fopt\u002Finvoiceninja\u002F.env` (never commit this file). Essential variables: `APP_ENV=production`, `APP_DEBUG=false`, `APP_URL=https:\u002F\u002Fyour-domain.com`, `DB_HOST=db`, `DB_DATABASE=invoiceninja`, `DB_USERNAME=ninja`, `DB_PASSWORD=\u003Cstrong_password>`, `MYSQL_ROOT_PASSWORD=\u003Croot_pwd>`, `REDIS_HOST=redis`, `QUEUE_CONNECTION=redis`, `MAIL_MAILER=smtp`, `MAIL_HOST=\u003Cyour_smtp>`, `MAIL_PORT=587`, `MAIL_USERNAME=\u003Caccount>`, `MAIL_PASSWORD=\u003Cpwd>`, `MAIL_FROM_ADDRESS=noreply@yourdomain.com`, `MAIL_ENCRYPTION=tls`. Use passwords of at least 32 random characters.",{"title":66,"body":67},"Generate the APP_KEY application key","Before the first start, generate the Laravel encryption key. First bring up the dependency containers: `docker compose up -d db redis`. Wait 20 seconds for MySQL to initialize its data directory, then start the application: `docker compose up -d app`. Generate the key: `docker compose exec app php artisan key:generate`. Copy the returned value (format `base64:…`) and set it as `APP_KEY` in `.env`. Restart the app container: `docker compose restart app`. Without this step, all session tokens and database-encrypted data will be unreadable.",{"title":69,"body":70},"Configure nginx as a reverse proxy","Create `\u002Fetc\u002Fnginx\u002Fsites-available\u002Finvoiceninja.conf`. The `server` block listens on port 443 with a Let's Encrypt certificate (see the tip block below). The `root` directive points to `\u002Fopt\u002Finvoiceninja\u002Fpublic`. The `location \u002F` block uses `try_files $uri $uri\u002F \u002Findex.php?$query_string`. The `location ~ \\.php$` block passes requests to `fastcgi_pass 127.0.0.1:9000` with standard `SCRIPT_FILENAME` and `PATH_INFO` parameters. Add `client_max_body_size 100M` to allow large attachment uploads. Enable the configuration: `ln -s \u002Fetc\u002Fnginx\u002Fsites-available\u002Finvoiceninja.conf \u002Fetc\u002Fnginx\u002Fsites-enabled\u002F && nginx -t && systemctl reload nginx`.",{"title":72,"body":73},"Run migrations and first login","Once nginx is configured, run the database migrations: `docker compose exec app php artisan migrate --force`. The operation takes 30 to 60 seconds. Then open `https:\u002F\u002Fyour-domain.com` in a browser: the setup wizard prompts you to create an administrator account (email, password) and enter your company details (business name, IBAN if desired). After the wizard completes, Invoice Ninja is fully operational.",{"title":75,"body":76},"Enable the asynchronous job queue","Invoice Ninja relies on Laravel workers for email sending and background PDF generation. In the Compose file, add a `worker` service that uses the same `invoiceninja\u002Finvoiceninja:5.13.45` image, mounts the same volumes, and runs the command `php artisan queue:work --sleep=3 --tries=3`. This service should not expose any port. Without an active worker, invoice emails are queued but never sent.",{"title":78,"body":79},"Configure payment gateways","In the backoffice (Settings > Payment Gateways), enable Stripe by pasting your public and secret keys from the Stripe dashboard. For PayPal, use the OAuth credentials from your PayPal REST application. For SEPA via GoCardless, enter your GoCardless Sandbox access token, then switch to the Production environment after testing. Each gateway can be enabled or disabled per currency and per client pricing plan.",{"type":81,"body":82},"tip","To obtain a Let's Encrypt TLS certificate with Certbot, install the `python3-certbot-nginx` package and run `certbot --nginx -d your-domain.com`. Certbot automatically updates your nginx configuration to redirect HTTP to HTTPS and renews the certificate every 60 days via a systemd timer. Make sure port 80 is open in your firewall before running Certbot: `ufw allow 80\u002Ftcp`. Once the certificate is issued, you may close port 80 and enforce HTTPS by adding `add_header Strict-Transport-Security \"max-age=31536000\" always;` to your nginx server block.",{"type":34,"title":84,"body":85},"Connecting payment gateways","Invoice Ninja 5.13.45 natively supports more than 25 gateways. Stripe is the most complete: it handles card payments, SEPA direct debit, ACH transfers, and, since version 5.13.43, Stripe PromptPay for Southeast Asian markets. To activate it, create a restricted API key in the Stripe dashboard with `charges:write`, `customers:write`, and `payment_methods:read` permissions, then enter it in Invoice Ninja. PayPal integrates via the REST API (not the legacy NVP API): create an application in the PayPal developer portal, retrieve the `client_id` and `client_secret`, and configure them in Invoice Ninja's PayPal gateway. For SEPA direct debits in Europe, GoCardless is the recommended route: the debit mandate is signed online by the client through the Invoice Ninja portal, without exchanging bank details by email. Mollie is a popular all-in-one alternative for European businesses, unifying card, bank transfer, iDEAL, and Bancontact under a single integration.",{"type":87,"title":88,"col_a":89,"col_b":90,"rows":91,"headers":116},"comparison","Self-hosted Invoice Ninja vs hosted SaaS plan","Self-hosted VPS","Invoice Ninja hosted SaaS",[92,96,100,104,108,112],[93,94,95],"Monthly cost","99 DH\u002Fmonth (fixed VPS)","Free up to 20 clients, then $11–16\u002Fmonth",[97,98,99],"Client limit","Uncapped","20 clients on the free plan",[101,102,103],"Data control","Data on your infrastructure","Data at Invoice Ninja Inc.",[105,106,107],"Updates","Manual (docker pull command)","Automatic",[109,110,111],"White-label","$30\u002Fyear (optional)","Included in paid plans",[113,114,115],"Server maintenance","Your responsibility","Managed by the vendor",[5,117,118],"Host Invoice Ninja yourself on VPS","SaaS Invoice Ninja hosted",{"type":34,"title":120,"body":121},"Backing up and updating Invoice Ninja","The backup strategy must cover two distinct elements: the MySQL database and the file storage volume. For MySQL, schedule a daily dump using `docker compose exec db mysqldump -u ninja -p invoiceninja | gzip > \u002Fbackups\u002Finvoiceninja-$(date +%Y%m%d).sql.gz` via a cron job or systemd timer. For files (generated PDFs, logos, attachments), back up the `.\u002Fdata` directory with rsync to an S3-compatible object store. Retain at least 30 rolling days and test restoration quarterly.\n\nTo update to a future version, the procedure is: update the image tag in your Compose file (for example from `5.13.45` to the next version), pull the new image with `docker compose pull app`, then run `docker compose up -d app worker` followed by `docker compose exec app php artisan migrate --force`. The migration runs automatically on startup in some configurations, but it is safer to trigger it explicitly. Review the GitHub changelog before any major update (for example a 5.x to 6.x jump): additional migration steps may be required.",{"type":34,"title":123,"body":124},"Troubleshooting common errors","Four issues come up frequently during initial deployment.\n\n**Error `SQLSTATE[HY000] [2002] Connection refused`**: MySQL is not yet ready when the app container tries to connect. Add a `healthcheck` directive to the `db` service and a `service_healthy` condition in the app's `depends_on`. Alternatively, wait 30 seconds after `docker compose up -d db` before starting the app.\n\n**Emails are not sent**: verify that the worker service is running with `docker compose ps worker`. If the status shows `Exited`, inspect the logs: `docker compose logs worker`. The most common cause is an incorrect `MAIL_HOST` or an SMTP port blocked by the hosting provider's firewall.\n\n**Blank page or 500 error after migration**: the `storage\u002F` directory has incorrect permissions. From the host, run `docker compose exec app chown -R www-data:www-data \u002Fvar\u002Fwww\u002Fapp\u002Fstorage && docker compose exec app php artisan config:clear && docker compose exec app php artisan cache:clear`.\n\n**PDF generation produces empty files**: Invoice Ninja uses Snappy (wkhtmltopdf) or an alternative depending on configuration. Check that the `PDF_GENERATOR` variable is set (possible values: `snappy`, `browsershot`, `phantom`) and that the corresponding binary is present in the image. The official `invoiceninja\u002Finvoiceninja:5.13.45` image includes wkhtmltopdf; if you built a custom image, ensure you included it.",{"type":34,"title":126,"body":127},"Self-hosted Invoice Ninja: key takeaways","Invoice Ninja 5.13.45, published on 9 October 2026, is a mature and actively maintained invoicing solution. The Elastic License 2.0 permits self-hosting for any internal use without restriction: you owe nothing as long as you do not resell access as a service. The Docker stack (official image + MySQL 8.4 LTS + Redis 7.4) is reproducible in under an hour on any VPS with 2 GB of RAM. The white-label module remains optional at $30\u002Fyear: for the vast majority of freelancers and SMBs, the 'Created with Invoice Ninja' footer on PDFs is not an obstacle. If your client volume exceeds 20 or your billing data must remain in your infrastructure for legal or compliance reasons, self-hosted deployment is both economically and technically justified. Our team is available at support@servorbit.com to help you right-size your VPS and configure backups.","Discover our Professional offers","\u002Fsolutions\u002Fprofessionnels",[131,154,170],{"id":132,"slug":133,"slugs":134,"title":138,"excerpt":139,"readTime":16,"views":17,"isPinned":18,"publishedAt":140,"updatedAt":141,"category":142,"categories":148,"featuredImage":28,"bgImage":29,"posterImage":150,"relatedSolution":151},421,"migrate-bitwarden-cloud-to-vaultwarden-vps",{"fr":135,"en":133,"ar":136,"es":137},"migrer-bitwarden-cloud-vaultwarden-vps","نقل-bitwarden-cloud-إلى-vaultwarden-على-vps","migrar-bitwarden-cloud-a-vaultwarden-vps","Migrate from Bitwarden Cloud to Vaultwarden on a VPS","Migrate everything from Bitwarden cloud to Vaultwarden: logins, organizations, and attachments — nothing left behind. Full CLI guide with troubleshooting.","2026-10-07T00:00:00+00:00","2026-10-07T23:07:24+00:00",{"id":143,"name":144,"slug":145,"color":146,"icon":147},8,"Security & Monitoring","securite-monitoring","bg-rose-500\u002F10 text-rose-400","security",[149],{"id":143,"name":144,"slug":145,"color":146,"icon":147},"\u002Fblog\u002Fcovers\u002Fmigrer-bitwarden-cloud-vaultwarden-vps-poster.svg",{"categorySlug":152,"appSlug":153},"cybersecurity-bastion","vaultwarden",{"id":155,"slug":156,"slugs":157,"title":161,"excerpt":162,"readTime":163,"views":17,"isPinned":18,"publishedAt":164,"updatedAt":165,"category":166,"categories":167,"featuredImage":28,"bgImage":29,"posterImage":169,"relatedSolution":28},427,"docker-compose-update-best-practices-vps",{"fr":158,"en":156,"ar":159,"es":160},"docker-compose-mise-a-jour-best-practices-vps","أفضل-ممارسات-تحديث-docker-compose-على-vps","docker-compose-actualizacion-buenas-practicas-vps","Updating a Docker Compose stack in production","A complete protocol to update Docker Compose stacks without downtime or data loss: version pinning, volume backup, and two-minute rollback.",9,"2026-10-09T00:00:00+00:00","2026-10-09T22:36:09+00:00",{"id":22,"name":23,"slug":24,"color":25,"icon":24},[168],{"id":22,"name":23,"slug":24,"color":25,"icon":24},"\u002Fblog\u002Fcovers\u002Fdocker-compose-mise-a-jour-best-practices-vps-poster.svg",{"id":171,"slug":172,"slugs":173,"title":177,"excerpt":178,"readTime":143,"views":17,"isPinned":18,"publishedAt":179,"updatedAt":180,"category":181,"categories":187,"featuredImage":28,"bgImage":29,"posterImage":189,"relatedSolution":28},430,"how-to-host-maybe-on-a-vps",{"fr":174,"en":172,"ar":175,"es":176},"heberger-maybe-vps","كيفية-استضافة-maybe-على-خادم-vps","como-alojar-maybe-en-un-vps","Self-hosting Maybe on a VPS: take control of your finances","Install Maybe, the open source personal finance app, on your VPS with Docker. Keep your financial data under your control, without a SaaS subscription.","2026-10-10T00:00:00+00:00","2026-10-10T21:55:40+00:00",{"id":182,"name":183,"slug":184,"color":185,"icon":186},7,"Self-hosting","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[188],{"id":182,"name":183,"slug":184,"color":185,"icon":186},"\u002Fblog\u002Fcovers\u002Fheberger-maybe-vps-poster.svg",1791901015320]