Hashboard ships a multi-stageDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/cryguy/hashboard/llms.txt
Use this file to discover all available pages before exploring further.
Dockerfile that compiles better-sqlite3 from source on Alpine, prunes dev dependencies in place, and produces a minimal runtime image. A single named volume at /data holds both the SQLite database and the attachments directory, so one backup of that directory captures everything. Migrations are applied automatically each time the container starts — no separate migration step is needed.
Before you start
Opencompose.yaml and set ORIGIN to the public URL where Hashboard will be reachable. Without it, adapter-node cannot build absolute URLs and OIDC redirect_uri values will be wrong. If you are placing Hashboard behind a reverse proxy (the recommended setup), also uncomment ADDRESS_HEADER and XFF_DEPTH — see the Reverse Proxy guide for why these are required in production.
Deployment
Configure compose.yaml
Edit For OIDC sign-in, also fill in
compose.yaml and fill in the environment variables for your deployment. At a minimum, uncomment and set ORIGIN:OIDC_ISSUER, OIDC_CLIENT_ID, and OIDC_CLIENT_SECRET. Local username/password accounts work without OIDC.Build and start the container
/data/hashboard.db, applies all pending migrations, and begins serving on 127.0.0.1:3000. Subsequent starts only apply new migrations.compose.yaml reference
The fullcompose.yaml is shown below. Most environment variables are pinned with safe defaults; only ORIGIN (and the proxy vars) need to be filled in for production.
Networking
The port binding127.0.0.1:3000:3000 intentionally limits exposure to localhost. TLS termination and the public hostname belong to the reverse proxy in front of Hashboard — see the Reverse Proxy guide for nginx, NPMplus, and Caddy examples.
If you widen the binding to 0.0.0.0:3000:3000 you are responsible for terminating TLS elsewhere. The session cookie carries the Secure flag; over plain HTTP on any non-localhost address the browser accepts the cookie on login and then never sends it back, making sign-in appear to do nothing with no visible error.
Live backup
Both the database and attachments live under/data in the container, so a single backup covers both. To take a consistent database snapshot from a running container without stopping it:
/data/backup.db inside the named volume. Copy it out with docker cp or a volume-aware backup tool. For full backup procedures — including the order in which to snapshot the database and attachments — see the Backups guide.