Self-hosted estimates and invoices for small teams. Write estimates, get them approved, convert them to invoices, record payments, and print any document to a clean PDF.
One container serves both the web app and its API; all data lives in PostgreSQL.
Save this as compose.yaml, then run docker compose up -d and open http://localhost:8787.
services:
db:
image: postgres:17-alpine
restart: unless-stopped
environment:
POSTGRES_USER: invoice
POSTGRES_PASSWORD: change-this-db-password
POSTGRES_DB: invoice
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U invoice -d invoice"]
interval: 5s
retries: 10
app:
image: meetrix/invantra:1.0.0
restart: unless-stopped
depends_on:
db:
condition: service_healthy
environment:
DATABASE_URL: postgres://invoice:change-this-db-password@db:5432/invoice
ADMIN_EMAIL: [email protected]
ADMIN_PASSWORD: change-me-at-first-login
COOKIE_SECURE: "false" # plain HTTP on localhost; remove behind HTTPS
ports:
- "8787:8787"
volumes:
pgdata:
Sign in with ADMIN_EMAIL / ADMIN_PASSWORD; you are asked to choose a new password straight away.
| Variable | Purpose |
|---|---|
DATABASE_URL | PostgreSQL connection string (PostgreSQL 13 or newer). Required. |
ADMIN_EMAIL, ADMIN_PASSWORD | The first admin, created only while no user exists. |
PORT | Port to listen on. Default 8787. |
COOKIE_SECURE | true by default. false for plain HTTP, auto behind a proxy that sets X-Forwarded-Proto. |
Host header intact in your reverse proxy.GET /api/health returns 200 once the database is reachable; the image has a built-in HEALTHCHECK.1.0.0 and other version tags never change.latest follows the newest release.Image: linux/amd64, runs as the unprivileged node user.
MIT © Meetrix Pty Ltd.
Content type
Image
Digest
sha256:9026437ac…
Size
60.3 MB
Last updated
9 days ago
docker pull meetrix/invantra