Quick install
The quick install bundles SolidInvoice, PHP, and a webserver into a single self-contained download. It is the fastest way to get a production-ready instance running and is the recommended install method for most users.
System requirementsโ
- 64-bit Linux (
x86_64orarm64) or macOS (Intel or Apple Silicon). - A database โ SQLite works out of the box; MySQL, MariaDB, or PostgreSQL are also supported.
You do not need PHP, Composer, Nginx, Apache, or a separate cron job โ the bundled webserver and worker handle all of it.
There is no native Windows build. Run the Linux binary inside WSL2 instead.
Download and runโ
- Linux
- macOS
One-liner install โ downloads the binary and installs it to /usr/local/bin:
curl -fsSL https://raw.githubusercontent.com/SolidInvoice/SolidInvoice/3.0.x/packaging/install.sh | sh
solidinvoice run
To also install a systemd service so SolidInvoice starts on boot:
curl -fsSL https://raw.githubusercontent.com/SolidInvoice/SolidInvoice/3.0.x/packaging/install.sh | INSTALL_SERVICE=1 sh
Manual download โ grab the binary for your architecture from the releases page, then make it executable and start it:
chmod +x solidinvoice
./solidinvoice run
Download the latest binary for your architecture from the releases page, then make it executable and start it:
chmod +x solidinvoice
./solidinvoice run
On first launch macOS may block the binary because it isn't notarised. Open System Settings โ Privacy & Security and click Open anyway, or run xattr -d com.apple.quarantine ./solidinvoice first.
On macOS, Homebrew is the easiest way to install and keep SolidInvoice up to date.
The application starts on https://localhost:8765 with a self-signed certificate. Open the URL in your browser and continue with the first-run wizard.
Recurring tasks (such as recurring invoices) and async work (email sending) run automatically โ there is no separate cron job or messenger consumer to set up.
SSLโ
The application uses Caddy under the hood, so HTTPS is enabled by default.
Self-signed (default)โ
./solidinvoice run
Useful for local testing. Browsers will show a warning that you have to accept once.
Let's Encrypt (recommended for production)โ
./solidinvoice run --domain=invoice.example.com --lets-encrypt
Issues and renews a free SSL certificate from Let's Encrypt automatically. Requirements:
- The domain's DNS
A/AAAArecord must point at the server's public IP. - Ports
80and443must be reachable from the public internet (Let's Encrypt validates ownership over them).
Custom certificateโ
./solidinvoice run \
--domain=invoice.example.com \
--ssl-cert=/etc/ssl/solidinvoice.pem \
--ssl-key=/etc/ssl/solidinvoice.key
Use this when you already have a certificate (wildcard, EV, or one issued by a corporate CA).
Behind a reverse proxyโ
./solidinvoice run --disable-https
Use when an upstream proxy (Cloudflare, Nginx, an ingress controller) terminates TLS for you. SolidInvoice listens over plain HTTP and trusts the proxy's X-Forwarded-* headers.
Available flagsโ
All flags below apply to the run command.
| Flag | Default | Description |
|---|---|---|
--domain <name> | (none) | Public hostname. Required for --lets-encrypt and --ssl-cert. |
--port <port> | 8765 | Port to listen on. |
--server-ip <ip> | (auto-detected) | Bind to a specific local IP. By default the server binds to all interfaces. |
--lets-encrypt | false | Issue and auto-renew a Let's Encrypt certificate. Requires --domain. |
--ssl-cert <path> | (none) | Path to a custom certificate (PEM). Requires --ssl-key and --domain. |
--ssl-key <path> | (none) | Path to the certificate's private key. Requires --ssl-cert and --domain. |
--disable-https | false | Serve plain HTTP. Use behind a reverse proxy. |
--worker-mode | false | Enable FrankenPHP worker mode for higher throughput (keeps PHP alive between requests). |
--worker-threads <n> | 2 | Number of FrankenPHP worker threads when --worker-mode is enabled. |
--messenger-workers <n> | 1 | Number of background async workers. Set to 0 to run no workers in this process. |
--log-format <format> | console | console for human-readable output, json for structured logs. |
--enable-metrics | false | Expose a Prometheus metrics endpoint at /metrics on a dedicated port. |
--metrics-port <port> | 9090 | Port for the metrics endpoint. |
--skip-intro | false | Suppress the boot banner. |
Other commandsโ
./solidinvoice console <command> # run any Symfony console command (e.g. cache:clear)
./solidinvoice worker --workers=2 # dedicated messenger worker process (e.g. for Kubernetes)
./solidinvoice version # print the version
./solidinvoice build-info # print build details
Health checkโ
curl http://localhost:8765/health
Returns OK (HTTP 200) when the application is running.
Updatingโ
Replace the binary with the latest release and restart it. Application data lives in ~/.SolidInvoice/, separately from the binary, so updates don't touch your invoices, clients, or settings.
Worker mode (high-traffic deployments)โ
For instances handling sustained traffic, enable worker mode:
./solidinvoice run --worker-mode --worker-threads=4 --messenger-workers=5
Worker mode keeps PHP processes alive between requests, which significantly reduces request latency at the cost of higher memory use.