Skip to main content

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_64 or arm64) 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.

Windows

There is no native Windows build. Run the Linux binary inside WSL2 instead.

Download and runโ€‹

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

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.

info

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.

./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/AAAA record must point at the server's public IP.
  • Ports 80 and 443 must 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.

FlagDefaultDescription
--domain <name>(none)Public hostname. Required for --lets-encrypt and --ssl-cert.
--port <port>8765Port to listen on.
--server-ip <ip>(auto-detected)Bind to a specific local IP. By default the server binds to all interfaces.
--lets-encryptfalseIssue 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-httpsfalseServe plain HTTP. Use behind a reverse proxy.
--worker-modefalseEnable FrankenPHP worker mode for higher throughput (keeps PHP alive between requests).
--worker-threads <n>2Number of FrankenPHP worker threads when --worker-mode is enabled.
--messenger-workers <n>1Number of background async workers. Set to 0 to run no workers in this process.
--log-format <format>consoleconsole for human-readable output, json for structured logs.
--enable-metricsfalseExpose a Prometheus metrics endpoint at /metrics on a dedicated port.
--metrics-port <port>9090Port for the metrics endpoint.
--skip-introfalseSuppress 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.