For those that are using InvoiceShelf docker, as of 01 Sep, 2025 we made some changes to the docker image:
This image features InvoiceShelf, nginx and PHP-FPM. The provided configuration (PHP, nginx...) follows InvoiceShelf's official recommendations and is meant to be used by end-users.
Important: If you are a developer, please check the InvoiceShelf main repository and use the docker/development image for development.
Images are published on release (there are no nightly builds). The following tags are available:
| Docker Tag | Points at | Updated |
|---|---|---|
:latest |
Newest stable release (currently the 2.x line) | On every stable release |
:2 / :3 |
Newest release of that major | On every release of that major |
:2.4 / :2.4.0 |
Newest patch of that minor / that exact version | On release |
:beta / :next |
Newest 3.x pre-release (alpha/beta) — not for production | On every 3.x pre-release |
:3.0.0-beta.1 … |
A specific pre-release, pinned | On release |
To summarize:
- Production (recommended): use
:latest, or pin a major (:2) or exact version (:2.4.0). - Want to test 3.x early: use
:beta(or:next), knowing it is pre-release software. :latesttracks the 2.x stable line today and will move to 3.x only once 3.0 is released as stable — a 2.x→3.x major upgrade is never applied silently on a routinedocker compose pull.
Deprecated:
:nightlyis going away (and:alpha/:devwere never actually published). For a transition period:nightlyis kept pointing at:latestso existing setups converge onto stable; it will then stop updating. Switch:nightly→:latest(and:alpha→:beta). See the upgrade guide.
The recommended way to run InvoiceShelf is by using the provided docker-compose.yaml files within this repository.
If you like a small footprint and no external dependencies, you can use the docker-compose.sqlite.yml file. By using SQLite you don't run a database server, and your database is easily portable with the database.sqlite file.
The desired workflow is basically as follows:
- Decide which database you want to use (sqlite, mysql, postgresql).
- Copy the docker-compose file. E.g., for SQLite you need to copy
docker-compose.sqlite.ymltodocker-compose.yml - Change the environment variables to reflect your desired setup
- Execute
docker compose upto run it, anddocker compose downto shut down
Once a new version of InvoiceShelf is released, we also release a new Docker image.
To pull the latest version, you need to spin down, pull, rebuild and spin up again.
- Shut down your current environment:
docker compose down - Pull the latest image version:
docker compose pull - Start and rebuild:
docker compose up --force-recreate --build -d - Prune/clean up the old/unused images:
docker image prune
By default, all the provided docker-compose.{db}.yaml files use the :latest tag, which tracks the
newest stable release. For a more predictable production setup, pin a major (:2) or an exact
version (:2.4.0) instead.
For more details see: How tags work section.
To use the built-in SQLite, no external dependencies are required. At its simplest:
docker run -d \
--name=invoiceshelf \
-v ./invoiceshelf/storage:/var/www/html/storage \
-e APP_NAME=InvoiceShelf \
-e APP_ENV=production \
-e APP_DEBUG=false \
-e APP_URL=http://localhost:8090 \
-e DB_CONNECTION=sqlite \
-e DB_DATABASE=/var/www/html/database/database.sqlite \
-e CACHE_STORE=file \
-e SESSION_DRIVER=file \
-e SESSION_LIFETIME=240 \
-e SESSION_DOMAIN=localhost \
-e SANCTUM_STATEFUL_DOMAINS=localhost:8090 \
-p 8090:8080 \
invoiceshelf/invoiceshelf:latestThis will start the InvoiceShelf instance on port 8090. The data will be persisted in ./invoiceshelf/storage for the storage directory and ./invoiceshelf/database for the SQLite database.
InvoiceShelf images are built on top of the serversideup/php image.
For more advanced configuration, please refer to the serversideup/php repository.