InvoiceShelf

InvoiceShelf

Official

Docker app from samuel3889's Repository

Overview

InvoiceShelf is a self-hosted, open source invoicing and estimates app built with Laravel and VueJS. This template runs the webapp only (pgsql variant) and expects an external PostgreSQL 16 server/container to already be running - it does NOT deploy its own database. Before starting this container, create a database and a dedicated user for InvoiceShelf on your existing Postgres instance, then fill in the DB_* variables below. Reference compose file: https://github.com/InvoiceShelf/docker/blob/master/docker-compose.pgsql.yml Storage is handled with Docker-managed named volumes (invoiceshelf_storage, invoiceshelf_modules) so the container works immediately with zero manual setup - no directories to create, no permissions to fix. Docker auto-populates them with the correct files and ownership from the image on first start. Note: this means logo uploads, custom PDF templates, and logs live inside Docker's own volume storage rather than a visible /mnt/user/appdata folder, so they are NOT included in typical Appdata Backup plugin runs. Your invoices, customers, and payments are unaffected either way since those live in your external Postgres database. If you want those files backed up too, see the "Backing up named volumes" note in Support/docs, or switch these to bind-mounted paths if you prefer visibility over zero-touch setup. If running behind Nginx reverse proxy with a nonstandard port (eg. https://your-domain.com:50443), the custom configuration for location '/' must be: proxy_set_header X-Forwarded-Host $host:50443; proxy_set_header X-Forwarded-Port 50443;

Introduction

InvoiceShelf is an open-source web app that helps you track expenses, record payments, and create professional invoices and estimates. It is self-hosted, multi-tenant, and built for individuals and small businesses that want to keep their books on their own infrastructure.

The web application is built with Laravel and Vue 3.

To get started using Docker Compose, follow the Installation guide.

Table of Contents

  1. Documentation
  2. System Requirements
  3. Download
  4. Discord
  5. Roadmap
  6. Translate
  7. License

Documentation

System Requirements

  • PHP 8.4+ is required (since v2.2.0, when InvoiceShelf moved to Laravel 13).
  • Database: MySQL, MariaDB, PostgreSQL, or SQLite.
  • Before updating from inside the app, verify your server meets the target version's PHP and extension requirements.
  • The in-app updater verifies requirements and refuses to proceed if they are not met.

Download

Discord

Join the discussion on the InvoiceShelf Discord: Invite Link

Roadmap

Rough roadmap of things to come, not in any specific order:

  • Automatic Update
  • Email Configuration
  • Installation Wizard
  • Address Customisation & Default Notes
  • Edit Email before Sending Invoice
  • Available as a Docker image
  • Performance Improvements
  • Customer View Page
  • Custom Fields on Invoices & Estimates
  • Multiple Companies
  • Recurring Invoices
  • Customer Portal
  • Decoupled system settings from company settings (v3.0)
  • Proper multi-tenancy system (v3.0)
  • Company member invitations with custom roles (v3.0)
  • Dark mode (v3.0)
  • Full TypeScript refactor of the frontend (v3.0)
  • Improved backend architecture (v3.0)
  • Security hardening (v3.0)
  • Reworked installation wizard (v3.0)
  • Module Directory (v3.0)
  • Rewritten Payments module (v3.0)
  • Accept Payments (Stripe integration)
  • Improved template system for invoices and estimates

Translate

Help us translate InvoiceShelf into your language: https://crowdin.com/project/invoiceshelf

Star History

Star History Chart

License

InvoiceShelf is released under the GNU Affero General Public License v3.0. See LICENSE for the full text.

Install InvoiceShelf on Unraid in a few clicks.

Find InvoiceShelf in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.

Open the Apps tab on your Unraid server Search Community Apps for InvoiceShelf Review the template variables and paths Click Install

Requirements

Requires an already-running external PostgreSQL 16 server with a database + user created for InvoiceShelf. This template does not create the database for you.

Categories

Download Statistics

568,213
Total Downloads
14,610
This Month
15,097
Avg / Month

Total Downloads Over Time

Loading chart...

Related apps

Explore more like this

Explore all

Details

Repository
invoiceshelf/invoiceshelf:latest
Last Updated2026-06-14
First Seen2025-02-11

Runtime arguments

Web UI
http://[IP]:[PORT:8080]/
Network
bridge
Shell
sh
Privileged
false
Extra Params
-v invoiceshelf_storage:/var/www/html/storage/ -v invoiceshelf_modules:/var/www/html/Modules/

Template configuration

WebUI PortPorttcp

Host port for the InvoiceShelf web UI. If you're routing to this container by name through a reverse proxy on a custom network, you can leave this or remove it.

Target
8080
Default
8080
Value
8090
APP_NAMEVariable

Application name

Default
InvoiceShelf
Value
InvoiceShelf
APP_URLVariable

Primary public URL used for generated links (emails, PDFs). Use your external https URL if you access from outside; local network access still works independently as long as SANCTUM_STATEFUL_DOMAINS below includes it too.

Default
https://YOUR-DOMAIN.COM
Value
https://YOUR-DOMAIN.COM
SESSION_DOMAINVariable

Leave BLANK if you access InvoiceShelf from more than one hostname/IP (e.g. local IP + external domain) - a blank value lets the session cookie scope itself to whichever host was used. Only set this to a single domain if you exclusively access via that one domain.

SANCTUM_STATEFUL_DOMAINSVariable

Comma-separated list of every host:port you'll load the app from - e.g. your LAN IP:port AND your external reverse-proxy domain:port. Include the port whenever it isn't the default 80/443.

Default
SERVER-IP:8090,YOUR-DOMAIN.COM
Value
SERVER-IP:8080,YOUR-DOMAIN.COM
TRUSTED_PROXIESVariable

Required for correct HTTPS/host detection behind a reverse proxy. Set to * to trust all proxies, or restrict to your reverse proxy's container/LAN IP for tighter security.

Default
*
Value
*
DB_HOSTVariable

Hostname/container name or IP of your existing PostgreSQL 16 server. If it's on the serverproxy network, its container name works; otherwise use the Unraid server IP.

Default
CHANGE_ME
DB_PORTVariable

PostgreSQL port

Default
5432
Value
5432
DB_DATABASEVariable

Database name (must already exist on the external Postgres server)

Default
invoiceshelf
Value
invoiceshelf
DB_USERNAMEVariable

Database user (must already exist and own the database)

Default
invoiceshelf
Value
postgres
DB_PASSWORDVariable

Database user password

Default
CHANGE_ME
Value
postgres
APP_ENVVariable

Application environment

Default
production
Value
production
APP_DEBUGVariable

Enable debug mode

Default
false
Value
false
DB_CONNECTIONVariable

Database driver

Default
pgsql
Value
pgsql
DB_PASSWORD_FILEVariable

Optional: path to a Docker secret file containing the DB password, instead of DB_PASSWORD

CACHE_STOREVariable

Cache driver

Default
file
Value
file
SESSION_DRIVERVariable

Session driver

Default
file
Value
file
SESSION_LIFETIMEVariable

Session lifetime in minutes

Default
240
Value
240
AUTORUN_ENABLEDVariable

Run startup automation on container boot

Default
true
Value
true
AUTORUN_LARAVEL_MIGRATIONVariable

Auto-run DB migrations on boot (set true for first run against a fresh DB, then false)

Default
false
Value
false
AUTORUN_LARAVEL_OPTIMIZEVariable

Auto-run Laravel optimize on boot

Default
false
Value
false
PHP_OPCACHE_ENABLEVariable

Enable PHP OPcache

Default
1
Value
1