From v5.1.0 onwards — PDF generation now runs entirely client-side via
@react-pdf/renderer. None of the examples below require a Browserless or Chromium service. Older configurations that still define a printer service or set BROWSERLESS_TOKEN / PRINTER_* will continue to start, but those services are inert and can be removed.Overview
Self-hosted setups vary. You might run on a single VPS or a Kubernetes cluster, behind Cloudflare Tunnel, or behind a reverse proxy like Traefik or nginx. This page collects Docker Compose configurations for those cases. They go further than the basic setup in the Self-hosting with Docker guide, with reverse proxies, SSL termination, and other common patterns.Share your setup. If you have a working configuration that isn’t covered here, I’d love to include it. Open a
pull request with your example added to this page.
Reuse an existing PostgreSQL service
Reactive Resume always uses a separate PostgreSQL service; do not embed another database server in the app container. If your homelab or hosting platform already manages PostgreSQL, reuse it by settingDATABASE_URL to that service and
allowing the app container to reach it over the intended private network. Keep database credentials private and do not
expose PostgreSQL to the public internet.
When the database connection crosses a host or network boundary, require TLS with certificate and hostname verification.
Use sslmode=verify-full in DATABASE_URL where the provider supports it, or the provider’s equivalent verified-TLS
configuration. Private routing limits exposure, but does not itself verify the database server’s identity.
For generic Unraid and homelab container fields, including the localhost networking warning, see
Unraid and other homelab platforms. The core resume workflow
does not require Redis or S3. Redis is a separate optional dependency for the AI Agent workspace, while S3-compatible
storage is optional unless you need features that require private object storage; see the
environment variable reference for those boundaries.
Docker with Traefik
This example uses Traefik as a reverse proxy with automatic SSL certificate management via Let’s Encrypt. Postgres stays on an internal network. The Traefik dashboard is also routed, attraefik.${DOMAIN} behind basic auth — drop those labels if you do not want it reachable.
compose-traefik.yml
.env):
.env
Docker with nginx
This example uses nginx as a reverse proxy with SSL certificates (you’ll need to provide your own certificates or use certbot separately).compose-nginx.yml
nginx.conf):
nginx.conf
Docker Swarm
This example is a Docker Swarm deployment with health checks, rolling updates, and Traefik integration. It includes SeaweedFS for S3-compatible storage and a PostgreSQL database with custom configuration.compose-swarm.yml
This example assumes you have an external Traefik network already set up. Adjust the
traefik_network reference and
labels based on your Traefik configuration.Contributing your setup
Have a different deployment setup that works well? Consider contributing it here. Some examples:- Kubernetes / Helm charts
- Cloudflare Tunnel
- Caddy reverse proxy
- Docker with Portainer
- Podman configurations
- Cloud-specific deployments (AWS ECS, Google Cloud Run, Azure Container Apps)
- A brief description of when/why someone would use this setup
- The complete Docker Compose (or equivalent) configuration
- Any additional configuration files (nginx.conf, etc.)
- Required environment variables