InvoiceShelf
Open source invoicing solution for individuals and businesses
Alternative to: freshbooks, invoice ninja, zoho invoice
InvoiceShelf is a self-hosted, multi-tenant invoicing app that helps individuals and small businesses create professional invoices and estimates, record payments, and track expenses. It supports multiple companies, customizable templates, taxes, and recurring invoices through a Laravel and Vue web app.
InvoiceShelf Docker Compose example
Self-host InvoiceShelf on your own server, homelab, or VPS starting from this Docker Compose example.
It runs InvoiceShelf in Docker containers using the official invoiceshelf/invoiceshelf:latest image, with persistent volumes and automatic restarts preconfigured.
Review the environment variables and adjust them to your setup, save the file as compose.yml (or docker-compose.yml), and start the stack with docker compose up -d.
services:
webapp:
image: invoiceshelf/invoiceshelf:latest
restart: unless-stopped
volumes:
- storage:/var/www/html/storage/
- modules:/var/www/html/Modules/
environment:
# Application name shown in the UI.
APP_NAME: "InvoiceShelf"
APP_ENV: "production"
APP_DEBUG: "false"
# Public URL the app is reached at, including scheme (and port if non-standard). e.g. https://invoices.example.com
APP_URL: "http://localhost"
# Host used for session cookies (host only, no scheme). Must match APP_URL's host.
SESSION_DOMAIN: "localhost"
# Comma-separated domains allowed to make cookie-authenticated API requests. Must include APP_URL's host[:port].
SANCTUM_STATEFUL_DOMAINS: "localhost"
DB_CONNECTION: "sqlite"
# Path to the SQLite database file inside the storage volume. Do not change.
DB_DATABASE: "/var/www/html/storage/app/database.sqlite"
CACHE_STORE: "file"
SESSION_DRIVER: "file"
SESSION_LIFETIME: "240"
AUTORUN_ENABLED: "true"
AUTORUN_LARAVEL_MIGRATION: "false"
AUTORUN_LARAVEL_OPTIMIZE: "false"
PHP_OPCACHE_ENABLE: "1"
volumes:
storage:
modules: Prefer a managed setup? WinterFlow installs, configures, and updates InvoiceShelf for you using this same Docker Compose configuration.