Skip to main content
Docker Compose deployments default to basic email / password authentication. Production deployments should use OIDC or SAML SSO. See Security for additional production hardening recommendations. Tracecat SAML SSO always requires signed assertions and signed responses.

Prerequisites

Core secrets

The env.sh script (next step) generates these automatically. If you need to generate them manually:

Download configuration files

After running env.sh, you’ll be prompted to input the following:
  • Set PUBLIC_APP_URL. Defaults to localhost.
  • Require PostgreSQL SSL mode? Defaults to n.
  • Required field: Enter email address for the first user (superadmin).

Download Caddyfile

Tracecat uses Caddy as a reverse proxy. You’ll need to download the following Caddyfile to configure this service.

Download Docker Compose file

Start Tracecat

Run the command below to start Tracecat and all related services. Make sure your docker-compose.yml and generated .env files are in the same directory.

Access Tracecat

Once deployed, access your instance at:
  • UI: http://localhost:${PUBLIC_APP_PORT}
  • API docs: http://localhost:${PUBLIC_APP_PORT}/api/docs
  • MCP: http://localhost:${PUBLIC_APP_PORT}/mcp
Plain HTTP is fine for local development on localhost, but do not expose an HTTP-only deployment to a public domain. Modern browsers upgrade requests to a public hostname to HTTPS, so the UI fails with ERR_CONNECTION_REFUSED even while curl over HTTP still works. Enable TLS before going to production. See TLS and certificates.

Updating Tracecat

Be careful when updating Tracecat. Do not accidentally overwrite or lose your existing TRACECAT__SERVICE_KEY, TRACECAT__SIGNING_SECRET, TRACECAT__DB_ENCRYPTION_KEY, and USER_AUTH_SECRET secrets. Losing these secrets will break your credentials and webhooks.
The migration script creates a backup of your existing .env before rewriting it. After the stack starts, verify that your containers are healthy and that you can sign in successfully.

Scaling

Docker Compose runs all services on a single host. These are recommended minimums for different workload sizes.
  • Small: Development, testing, small teams (1-10 users)
  • Standard: Mid-size teams (10-50 users), moderate workflow execution
  • Production: Large teams (50+ users), high throughput
Memory is typically the constraining factor. Workflow throughput is lower than dedicated Kubernetes deployments where services have guaranteed resources and can scale independently. For production workloads that exceed single-host capacity, consider converting to Docker Swarm or deploying on Kubernetes.

Convert to Docker Swarm

Docker Swarm lets you scale individual services with resource limits and replicas across one or more nodes.

Service resource recommendations

Stateful services (postgres_db, temporal_postgres_db, minio, redis) must remain at 1 replica. Scaling these requires external managed services (e.g., RDS, ElastiCache) or specialized clustering.

Deploy with Docker Swarm

  1. Initialize Swarm:
  1. Add deploy configuration to each service in your docker-compose.yml. For example, for the api service:
  1. Deploy the stack:
  1. Verify services are running:

FAQ

For an overview of all services and networking, see Architecture.
Yes but don’t forget to set PUBLIC_APP_URL to 127.0.0.1 instead of localhost in your .env file.
Yes but you’ll need to set PUBLIC_APP_URL to the WSL IP address instead of localhost. Run ip addr to find your WSL IP address (usually 172.x.x.x).
This suggests that the Tracecat UI is healthy but is unable to communicate with the Tracecat API.
  • Check that the api service is healthy
  • Check that this is not a CORS issue (see next FAQ)
  • Check that you changed PUBLIC_APP_URL and PUBLIC_APP_PORT to the correct address
  • Check the Chrome developer console for any errors
You must configure PUBLIC_APP_URL and PUBLIC_API_URL to the same domain that your browser is accessing the Tracecat UI from. Tracecat strictly enforces CORS to prevent XSS attacks.This error occurs when your browser cannot connect to Tracecat API via PUBLIC_APP_URL. Please check the following:
  • Do not set PUBLIC_APP_URL to 0.0.0.0. Browsers cannot connect to this address. Use localhost, 127.0.0.1, or your machine’s actual IP address instead.
  • WSL users: Do not use 127.0.0.1. Run ip addr to find your WSL IP address (usually 172.x.x.x) and use that instead.
  • If your frontend is running on a different machine than the API, set NEXT_PUBLIC_API_URL to an address your browser can reach.
  • Run docker compose ps to verify all services are running.
  • Check the temporal service is healthy. Worker connectivity issues can sometimes affect login.
  • View container logs: docker compose logs api and docker compose logs temporal.
  • Check firewall and port forwarding if using a reverse proxy.
For example, if you’ve deployed Tracecat into a VM and exposed it to your browser as https://my-tracecat-instance.com, you must set:
  • PUBLIC_APP_URL to https://my-tracecat-instance.com
  • PUBLIC_API_URL to https://my-tracecat-instance.com/api
Set both values to the exact browser-reachable URLs for your deployment, including the scheme:
  • Local example:
    • PUBLIC_APP_URL=http://localhost:8000
    • PUBLIC_API_URL=http://localhost:8000/api
  • Reverse proxy or public domain example:
    • PUBLIC_APP_URL=https://tracecat.example.com
    • PUBLIC_API_URL=https://tracecat.example.com/api
Use full URLs once. Do not prepend http:// or https:// twice, and do not use addresses that only work inside Docker such as 0.0.0.0 or internal container hostnames.If sign-in still fails:
  • Verify that the domain in your browser exactly matches PUBLIC_APP_URL.
  • Verify that PUBLIC_API_URL is the same origin plus /api.
  • Run docker compose ps and check that api, worker, and temporal are healthy.
  • Review docker compose logs api for startup, auth, or CORS errors.
Undersized Temporal clusters cause No hosts available errors and workflow execution failures. Ensure the Temporal server has at least 4 CPU cores and 8 GB of memory.Temporal also requires a well-provisioned PostgreSQL backend for adequate query throughput. The bundled temporal_postgres_db container is suitable for development and small deployments only. For production workloads, use a managed PostgreSQL instance (e.g., Amazon Aurora Serverless) for better QPS and reliability.
Your deployment is serving plain HTTP, but the browser is upgrading the request to HTTPS. See Browsers force HTTPS.
See TLS and certificates for automatic Let’s Encrypt setup with Caddy, custom certificates, and trusting internal CAs for outbound connections.