Self-host Invoice Ninja
updated Sep 2026deployed by usprices checked · Jul 2026Install verified on Ubuntu 26.04 · Sep 2026 · how we test
We earn commissions when you shop through the links below. Full disclosure →
Invoicing and billing for freelancers and small businesses: invoices, quotes, recurring billing, expenses, payments through online gateways, and a client portal, with desktop and mobile apps that also work against a self-hosted server. Source-available under the Elastic License 2.0; the self-hosted code includes the hosted Pro and Enterprise features, and removing the branding needs a paid white-label license.
Key facts
CategoryInvoicing
LicenseElastic-2.0
StackPHP, Laravel, MySQL, Redis
Min RAM2048 MB
Official imageyes
Measured idle RAM1051 MB
Difficulty
What you need
- Any VPS with at least 2048 MB of RAM
- A domain you control — most self-hosted setups need HTTPS in front of them
- Under an hour if you've used Docker before
Where to host itaffiliate disclosure
Hetzner Cloudrun it on
From $23.59/mo · 2 vCPU / 4 GB / 80 GB · EU + USKamaterafree trial
From $4/mo · 1 vCPU / 1 GB / 20 GB · US + EU + AsiaDigitalOceanalso works on
From $6/mo · 1 vCPU / 1 GB / 25 GB · US + EU + AsiaPaid link — we earn a commission if you shop through it.
Install
Run these commands on your server:
# Invoice Ninja — upstream's Debian compose stack (app + nginx + MySQL + Redis) from invoiceninja/dockerfiles
git clone https://github.com/invoiceninja/dockerfiles.git -b debian invoiceninja && cd invoiceninja/debian
# Replace the sample APP_KEY, admin password and DB passwords; APP_URL uses the box's first IP (usually the private one on a cloud VM — use your public IP or domain)
DBPW=$(openssl rand -hex 16)
sed -i "s|^APP_URL=.*|APP_URL=http://$(hostname -I | cut -d' ' -f1)|; s|^APP_KEY=.*|APP_KEY=base64:$(openssl rand -base64 32)|; s|^APP_DEBUG=.*|APP_DEBUG=false|; s|^IN_PASSWORD=.*|IN_PASSWORD=$(openssl rand -hex 12)|; s|^\(DB_PASSWORD\|MYSQL_PASSWORD\)=.*|\1=$DBPW|; s|ninjaAdm1nPassword|$(openssl rand -hex 16)|g" .env
docker compose up -d
# → http://SERVER_IP:80 — log in as admin@example.com with the IN_PASSWORD from .envMore self-hosted tools
Invoicing
Akaunting
PHPLaravelVue.jsMariaDB
easyRead guide →
Link in bio
LinkStack
PHPLaravel
easyRead guide →
Video platform
PeerTube
TypeScriptNode.jsPostgreSQLRedis
moderateRead guide →
Monitoring
Zabbix
CPHPMySQL
hardRead guide →