Skip to content

Production checklist

  • Served over HTTPS behind a reverse proxy.
  • PUBLIC_APP_URL is the exact public origin (https://…, no trailing slash).
  • CORS_ORIGIN set to the public origin rather than *.
  • BETTER_AUTH_SECRET is long, random, stored as a secret, and never changes.
  • MongoDB is not exposed to the internet, and has authentication enabled.
  • Automated MongoDB backups, with a tested restore.
  • A single app instance (see Scaling).
  • Health check on GET /api/health.
  • Access restricted if the instance is private (sign-up is open by default).

Imprime listens on plain HTTP (port 3023). Terminate TLS in front of it and forward everything — including /.well-known/* — to the app. For the MCP endpoint, disable response buffering so streamed responses go through immediately.

Caddyfile
imprime.example.com {
reverse_proxy localhost:3023 {
flush_interval -1
}
}

Caddy obtains and renews certificates automatically.

Two pieces of state live in the memory of the process:

  • MCP sessions (closed after 30 minutes of inactivity);
  • MCP preview renders, held briefly so the link can be opened.

They are lost on restart and are not shared between instances. Run one instance and scale it vertically (more CPU speeds up PDF rendering). If you must run several, use sticky sessions so a client always reaches the same instance. The REST export endpoint is stateless and unaffected.

MongoDB holds everything: accounts, API keys, templates, variables and images.

Terminal window
# Daily dump (cron), keeps 14 days
docker compose exec -T mongodb mongodump --archive --gzip > /backups/imprime-$(date +%F).gz
find /backups -name 'imprime-*.gz' -mtime +14 -delete

Restore with mongorestore --archive --gzip --drop < file.gz. Test it regularly.

Terminal window
git pull
docker compose up -d --build

Read the release notes / commit log before updating: the project is under active development.