Skip to main content

Overview

This guide covers running Comp with Docker Compose. The stack includes:

Prerequisites

  • Docker Desktop or Docker Engine installed
  • External PostgreSQL 14+ with SSL (e.g., Neon, DigitalOcean, RDS)
  • Resend account for transactional email
  • Trigger.dev account for background workflows

Environment File Layout

Docker uses per-service env files, not a root .env file.
Each service reads only its designated env file via env_file: in docker-compose.yml.

Minimal Required Environment

For a functional Docker deployment, you need:
See the Environment Reference for all variables.

Build-Time vs Runtime Variables

The Dockerfile defines these build args for the app:
  • NEXT_PUBLIC_BETTER_AUTH_URL
  • NEXT_PUBLIC_PORTAL_URL
  • NEXT_PUBLIC_POSTHOG_KEY
  • NEXT_PUBLIC_POSTHOG_HOST
  • NEXT_PUBLIC_IS_DUB_ENABLED
  • NEXT_PUBLIC_API_URL
For portal, only NEXT_PUBLIC_BETTER_AUTH_URL is used at build time.
docker-compose.yml passes build args from shell environment variables (e.g., ${BETTER_AUTH_URL}). Export these before running docker compose build, or set them inline.

Build & Run

1. Prepare Environment Files

2. Export Build Args

Export the build-time variables needed by docker-compose.yml:

3. Build Images

4. Run Migrations & Seed

migrator runs prisma migrate deploy — safe to run repeatedly.
seeder upserts reference data (frameworks, controls) — idempotent.

5. Start Services

6. Verify Health

Deploy Trigger.dev Tasks

Trigger.dev runs as a hosted service. Deploy your tasks from your workstation:
Set TRIGGER_SECRET_KEY in apps/app/.env from your Trigger.dev project settings.

Fresh Install (Optional Clean)

To remove all images and volumes for a clean rebuild:

Logging

Docker Compose is configured with log rotation to prevent disk exhaustion. All services use the json-file driver with these defaults:

Viewing Logs

Custom Log Configuration

To adjust logging for a specific service (e.g., if app is particularly chatty), create a docker-compose.override.yml:
For centralized logging (ELK, Loki, Splunk), you can switch the logging driver to fluentd, gelf, or loki. See Docker’s logging driver documentation.

Production Tips

HTTPS & Domains

Place a reverse proxy (nginx, Caddy, Traefik) in front. Update BETTER_AUTH_URL and NEXT_PUBLIC_BETTER_AUTH_URL to your public HTTPS domains.

Strong Secrets

Generate secrets with openssl rand -base64 32. Rotate periodically.

Database Security

Require SSL. Restrict network access via VPC, IP allowlist, or private networking.

Disk Monitoring

Monitor /var/lib/docker disk usage. Periodically prune unused containers and images.

Troubleshooting

Builds succeed but containers crash at startup

The Dockerfile sets SKIP_ENV_VALIDATION=true at build time, so missing env vars are only caught at runtime. Check logs to identify missing variables:
Look for errors mentioning process.env.* or “Missing env var”, then compare with the Environment Reference.

Common Misconfigurations

Container won’t start

Database connection fails

  1. Verify DATABASE_URL format: postgresql://user:pass@host:5432/db?sslmode=require
  2. Ensure your IP is allowlisted in the database firewall
  3. Test connectivity: docker compose run --rm app sh -c "nc -zv <db-host> 5432"