No description
- Shell 55.3%
- Dockerfile 44.7%
| .gitignore | ||
| Containerfile | ||
| entrypoint.sh | ||
| README.md | ||
InvoicePlane Container
Runs InvoicePlane v1.7.1 in an Apache/PHP container.
ipconfig.php is generated at startup from environment variables.
Environment Variables
Required
| Variable | Description |
|---|---|
IP_URL |
Base URL of the installation, no trailing slash (e.g. https://invoices.example.com) |
DB_HOSTNAME |
MySQL/MariaDB hostname |
DB_USERNAME |
Database user |
DB_PASSWORD |
Database password |
DB_DATABASE |
Database name |
ENCRYPTION_KEY |
256-bit encryption key used to encrypt session data and sensitive fields |
Generating ENCRYPTION_KEY
Generate a secure random key before the first deployment and store it somewhere safe (e.g. a secret manager). Do not rotate it after setup — doing so invalidates all existing sessions and encrypted data.
openssl rand -base64 32
Optional
| Variable | Default | Description |
| ----------------------------------- | ------------ | ----------------------------------------------------------------------------- |
| `DB_PORT` | `3306` | Database port |
| `REMOVE_INDEXPHP` | `false` | Remove `index.php` from URLs (requires `.htaccess` rewriting) |
| `DISABLE_SETUP` | `false` | Disable the web-based setup wizard after initial setup |
| `SETUP_COMPLETED` | `false` | Set to `true` after completing initial setup |
| `ENABLE_DEBUG` | `false` | Enable advanced debug logging |
| `CI_ENV` | `production` | CodeIgniter environment (`production` or `development`) |
| `SESS_EXPIRATION` | `864000` | Session lifetime in seconds (default: 10 days; `0` = expire on browser close) |
| `SESS_MATCH_IP` | `true` | Invalidate session if client IP changes |
| `SESS_REGENERATE_DESTROY` | `false` | Destroy old session on regeneration |
| `ENCRYPTION_CIPHER` | `AES-256` | Cipher used with `ENCRYPTION_KEY` |
| `LEGACY_CALCULATION` | `true` | Use legacy tax/discount calculation (pre-1.6.3 behaviour) |
| `ENABLE_INVOICE_DELETION` | `false` | Allow permanent deletion of invoices |
| `DISABLE_READ_ONLY` | `false` | Disable read-only mode for sent invoices |
| `X_FRAME_OPTIONS` | `SAMEORIGIN` | `X-Frame-Options` response header value |
| `ENABLE_X_CONTENT_TYPE_OPTIONS` | `true` | Send `X-Content-Type-Options: nosniff` header |
| `PASSWORD_RESET_IP_MAX_ATTEMPTS` | `5` | Max password reset attempts per IP per window |
| `PASSWORD_RESET_IP_WINDOW_MINUTES` | `60` | IP rate-limit window (minutes) |
| `PASSWORD_RESET_EMAIL_MAX_ATTEMPTS` | `3` | Max password reset attempts per email per window |
| `PASSWORD_RESET_EMAIL_WINDOW_HOURS` | `1` | Email rate-limit window (hours) |
| `SUMEX_SETTINGS` | `false` | Enable Swiss medical invoice (Sumex) support |
| `SUMEX_URL` | _(empty)_ | URL to post Sumex XML for PDF generation |
| `CUSTOM_TEMPLATES_FOLDER` | _(empty)_ | Path to custom template directory |
| `CUSTOM_INVOICE_TEMPLATES_PDF` | _(empty)_ | Name for templates for pdf invoices |
| `CUSTOM_INVOICE_TEMPLATES_PUBLIC` | _(empty)_ | Name for templates for html invoices |
| `CUSTOM_QUOTE_TEMPLATES_PDF` | _(empty)_ | Name for templates for pdf quotes |
| `CUSTOM_QUOTE_TEMPLATES_PUBLIC` | _(empty)_ | Name for templates for html quotes |
Quick Start
# Generate a secret key once and save it
ENCRYPTION_KEY=$(openssl rand -base64 32)
podman run -d \
-e IP_URL=https://invoices.example.com \
-e DB_HOSTNAME=db \
-e DB_USERNAME=invoiceplane \
-e DB_PASSWORD=secret \
-e DB_DATABASE=invoiceplane \
-e ENCRYPTION_KEY="$ENCRYPTION_KEY" \
-p 8080:80 \
invoiceplane