Prerequisites
- Docker version 26.0.0+
- Docker Compose version 2.29.0+
- openssl
Core secrets
Theenv.sh script (next step) generates these automatically. If you need to generate them manually:
Download configuration files
env.sh, you’ll be prompted to input the following:
- Set
PUBLIC_APP_URL. Defaults tolocalhost. - 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 followingCaddyfile to configure this service.
Download Docker Compose file
Start Tracecat
Run the command below to start Tracecat and all related services. Make sure yourdocker-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
Updating Tracecat
.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.| Resource | Small | Standard | Production |
|---|---|---|---|
| CPU | 8 cores | 16 cores | 32+ cores |
| RAM | 16 GB | 32 GB | 64+ GB |
| Storage | 20 GB SSD | 50 GB SSD | 100+ GB SSD |
| Docker | 26.0.0+ | 26.0.0+ | 26.0.0+ |
| Workflow starts/sec | ~5 | ~15 | ~40 |
| Concurrent seats | 1-10 | 10-50 | 50+ |
| Concurrent agents/sec | 1-2 | 5-10 | 10+ |
- 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
Convert to Docker Swarm
Docker Swarm lets you scale individual services with resource limits and replicas across one or more nodes.Service resource recommendations
| Service | CPU (cores) | Memory | Replicas |
|---|---|---|---|
| caddy | 0.25 | 256 Mi | 1 |
| api | 2 | 4 Gi | 2 |
| worker | 2 | 2 Gi | 4 |
| executor | 4 | 8 Gi | 4 |
| agent-worker | 2 | 2 Gi | 2 |
| agent-executor | 4 | 16 Gi | 2 |
| ui | 0.5 | 1 Gi | 2 |
| mcp | 1 | 1 Gi | 1 |
| postgres_db | 2 | 4 Gi | 1 |
| temporal | 2 | 4 Gi | 1 |
| temporal_postgres_db | 1 | 2 Gi | 1 |
| redis | 0.5 | 1 Gi | 1 |
| minio | 0.5 | 1 Gi | 1 |
| Total | ~22 | ~46 Gi | 23 |
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
- Initialize Swarm:
- Add
deployconfiguration to each service in yourdocker-compose.yml. For example, for theapiservice:
- Deploy the stack:
- Verify services are running:
FAQ
What services are started by docker-compose.yml?
What services are started by docker-compose.yml?
The stack runs 15 containers grouped into application and infrastructure services.Application services:
caddy— Reverse proxy that routes traffic to the UI, API, and MCPapi— FastAPI backend (port 8000)ui— Next.js frontend (port 3000)worker— Workflow orchestrator (Temporal worker)executor— Action executor with optional sandbox isolationagent-worker— AI agent orchestratoragent-executor— AI agent executor with LLM gateway supportmcp— Model Context Protocol server (port 8099)
postgres_db— PostgreSQL 16 (application database)temporal— Temporal workflow engine (auto-setup)temporal_postgres_db— PostgreSQL 13 (Temporal database)temporal_ui— Temporal web UI (not exposed by default)minio— S3-compatible object storageredis— Cache and task queuemigrations— One-shot database migration runner (exits after completion)
Does Docker Compose support Tracecat MCP?
Does Docker Compose support Tracecat MCP?
Yes. Tracecat uses Dex as a built-in OIDC provider for MCP.
Dex is shipped with the Tracecat Docker Compose stack.Seek assistance in our #help-chat channel if you encounter any issues.
Does Tracecat support Windows?
Does Tracecat support Windows?
Yes but don’t forget to set
PUBLIC_APP_URL to 127.0.0.1 instead of localhost in your .env file.Does Tracecat support WSL?
Does Tracecat support WSL?
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).I can see the landing page but not the login page
I can see the landing page but not the login page
This suggests that the Tracecat UI is healthy but is unable to communicate with the Tracecat API.
- Check that the
apiservice is healthy - Check that this is not a CORS issue (see next FAQ)
- Check that you changed
PUBLIC_APP_URLandPUBLIC_APP_PORTto the correct address - Check the Chrome developer console for any errors
What is the CORS issue?
What is the CORS issue?
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_URLto0.0.0.0. Browsers cannot connect to this address. Uselocalhost,127.0.0.1, or your machine’s actual IP address instead. - WSL users: Do not use
127.0.0.1. Runip addrto find your WSL IP address (usually172.x.x.x) and use that instead. - If your frontend is running on a different machine than the API, set
NEXT_PUBLIC_API_URLto an address your browser can reach. - Run
docker compose psto verify all services are running. - Check the temporal service is healthy. Worker connectivity issues can sometimes affect login.
- View container logs:
docker compose logs apianddocker compose logs temporal. - Check firewall and port forwarding if using a reverse proxy.
https://my-tracecat-instance.com,
you must set:PUBLIC_APP_URLtohttps://my-tracecat-instance.comPUBLIC_API_URLtohttps://my-tracecat-instance.com/api
What should PUBLIC_APP_URL and PUBLIC_API_URL be, and how do I fix login or CORS issues?
What should PUBLIC_APP_URL and PUBLIC_API_URL be, and how do I fix login or CORS issues?
Set both values to the exact browser-reachable URLs for your deployment, including the scheme:
- Local example:
PUBLIC_APP_URL=http://localhost:8000PUBLIC_API_URL=http://localhost:8000/api
- Reverse proxy or public domain example:
PUBLIC_APP_URL=https://tracecat.example.comPUBLIC_API_URL=https://tracecat.example.com/api
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_URLis the same origin plus/api. - Run
docker compose psand check thatapi,worker, andtemporalare healthy. - Review
docker compose logs apifor startup, auth, or CORS errors.
How do I configure SSL for production?
How do I configure SSL for production?
Tracecat ships with Caddy as a reverse proxy.
Caddy automatically provisions and renews TLS certificates from Let’s Encrypt when configured with a domain name.
Update environment variables
In your
.env file, set BASE_DOMAIN to your domain and update the public URLs to use HTTPS:Expose ports 80 and 443
Update the Port 80 must remain open for the ACME HTTP-01 challenge. Port 443 serves HTTPS traffic.
caddy service ports in your docker-compose.yml: