TAK ecosystem infrastructure — deployed with docker compose up.
A Docker Compose stack for deploying and managing the TAK ecosystem:
- TAK Server — Official tak.gov Docker images (messaging, CA, web admin)
- Caddy — Automatic Let's Encrypt TLS and reverse proxy
- MediaMTX — RTSP/RTMP/HLS video streaming with optional recording (guide)
- LLDAP + ldap-proxy — Lightweight LDAP authentication and user management
- Node-RED — Flow-based automation engine with pre-configured PostgreSQL and TAK Server connections
- Monitor — Management dashboard (user/group/certificate management and QR enrollment), health monitoring, and operations API
- Docker Engine and Docker Compose v2 (v2.20+) installed
- Official TAK Server release ZIP from tak.gov
- DNS (subdomain mode only) — required for Let's Encrypt TLS and subdomain routing. Your FQDN and subdomains must resolve to the host's public IP. Not needed for direct mode.
FastTAK supports two deployment modes, controlled by DEPLOY_MODE in .env:
direct — Port-based routing through Caddy with self-signed TLS. No DNS needed. Each service gets its own port (e.g., https://192.168.1.50:8446). Good for field deployments, air-gapped networks, and getting started quickly.
subdomain — Subdomain-based routing through Caddy with automatic Let's Encrypt TLS. Requires public DNS. Each service gets a subdomain (e.g., https://monitor.tak.example.com).
git clone https://github.com/pounde/FastTAK.git FastTAK && cd FastTAK
# One-time setup (builds images, extracts tak/, generates secrets)
./setup.sh takserver-docker-5.6-RELEASE-6.zip
# Set SERVER_ADDRESS to your IP or hostname, pick a DEPLOY_MODE
vim .env
# Start
./start.shsetup.sh extracts the TAK Server release, builds Docker images, creates .env with generated secrets. You only run it once (or again to upgrade).
start.sh brings up the stack, waits for healthy, and shows connection info.
The fastest path to a working stack is DEPLOY_MODE=direct with SERVER_ADDRESS set to your machine's IP address — no DNS required.
For the full end-to-end walkthrough (user enrollment, video streaming), see docs/quickstart-walkthrough.md.
If you prefer to run each step yourself:
git clone https://github.com/pounde/FastTAK.git FastTAK && cd FastTAK
# 1. Extract the tak.gov ZIP and copy tak/ into this directory
unzip takserver-docker-5.6-RELEASE-6.zip
cp -r takserver-docker-5.6-RELEASE-6/tak ./tak
# 2. Build Docker images (from the extracted release directory)
docker build -t takserver-database:5.6-RELEASE-6 -f takserver-docker-5.6-RELEASE-6/docker/Dockerfile.takserver-db takserver-docker-5.6-RELEASE-6
docker build -t takserver:5.6-RELEASE-6 -f takserver-docker-5.6-RELEASE-6/docker/Dockerfile.takserver takserver-docker-5.6-RELEASE-6
# 3. Create .env and generate secrets
cp .env.example .env
# Edit .env: set SERVER_ADDRESS and DEPLOY_MODE, then generate each empty
# secret with the command shown in the comment above it (e.g., openssl rand -hex 16).
# All empty fields must be filled — the stack will not start without them.
# 4. Start
docker compose up -d --buildEdit .env and re-run the init containers to apply changes — no need to stop TAK Server:
docker compose up -d --force-recreate init-config init-identityThis re-runs the configuration and identity bootstrap containers, which read from .env and patch the running services. If you're running the monitor dashboard, it will detect .env changes and show the command to run.
For version changes or Dockerfile modifications, a full rebuild is needed:
docker compose up -d --buildCaution
docker compose down -v destroys all database data (PostgreSQL volumes). Use it only for a full reset. Certs and config in ./tak/ are always preserved.
All services start together — TAK Server, Caddy, MediaMTX, LLDAP (LDAP authentication), Node-RED, Monitor. Init containers handle configuration before TAK Server starts — no restart needed.
FastTAK includes a monitoring service with two components:
API (/api/*) — JSON endpoints for health checks, operations, and alerts. Use this to integrate with external tools, scripts, or your own dashboards. API documentation is available at /api/docs (Swagger UI).
GET /api/health/containers— container health status for all servicesGET /api/health/resources— CPU/memory stats per containerGET /api/health/certs— TAK certificate expiryGET /api/health/tls— TLS (Let's Encrypt) certificate expiryGET /api/health/database— CoT database sizeGET /api/health/disk— filesystem usageGET /api/health/updates— available version updatesGET /api/health/config— configuration drift detectionGET /api/ops/certs/list— list all certificatesPOST /api/ops/certs/create-client/{name}— create client certificatePOST /api/ops/certs/create-server/{name}— create server certificatePOST /api/ops/certs/revoke/{name}— revoke a certificateGET /api/ops/service/{name}/logs— view container logsPOST /api/ops/database/vacuum— database maintenancePOST /api/ops/alerts/test-email— test email alertingPOST /api/ops/alerts/test-sms— test SMS alerting
Dashboard — A web UI built on top of the API. Auto-refreshing health grid, certificate status, update notifications, disk usage, activity log, and an operations page for cert management and database maintenance.
Access the dashboard at https://<SERVER_ADDRESS>:8180 (direct mode) or https://monitor.<SERVER_ADDRESS> (subdomain mode). Both use LDAP authentication via Caddy.
All configuration lives in a single .env file. See .env.example for the full reference.
| Variable | Description |
|---|---|
SERVER_ADDRESS |
IP, hostname, or FQDN that clients use to reach this server (e.g. 192.168.1.50) |
DEPLOY_MODE |
direct (port-based, self-signed TLS) or subdomain (DNS-based, Let's Encrypt TLS) |
TAK_WEBADMIN_PASSWORD |
Password for the webadmin account — auto-generated by setup.sh, stored in .env (run grep TAK_WEBADMIN_PASSWORD .env to retrieve it). Leave empty to skip webadmin user creation. |
Additional optional variables (SMTP relay, LDAP base DN, admin email) are documented in .env.example.
| Variable | Default | Description |
|---|---|---|
TAK_VERSION |
5.6 |
TAK Server Docker image tag |
LLDAP_VERSION |
v0.6.1 |
LLDAP lightweight LDAP server |
MEDIAMTX_VERSION |
1.15.5 |
MediaMTX video streaming |
NODERED_VERSION |
4.1 |
Node-RED |
In direct mode, each service gets its own port on Caddy with self-signed TLS:
| Variable | Default | Service |
|---|---|---|
TAKSERVER_ADMIN_PORT |
8446 |
TAK Server web admin |
MEDIAMTX_PORT |
8888 |
MediaMTX streaming |
NODERED_PORT |
1880 |
Node-RED |
MONITOR_PORT |
8180 |
Monitor dashboard |
In direct mode, the bare https://<SERVER_ADDRESS> (port 443) redirects to the Monitor dashboard. Ignored in subdomain mode.
In subdomain mode, each service gets a configurable subdomain:
| Variable | Default | Routes to |
|---|---|---|
TAKSERVER_SUBDOMAIN |
takserver |
TAK Server web admin |
MEDIAMTX_SUBDOMAIN |
stream |
MediaMTX streaming |
NODERED_SUBDOMAIN |
nodered |
Node-RED |
MONITOR_SUBDOMAIN |
monitor |
Monitor dashboard |
Ignored in direct mode. The Caddyfile is generated by init-config based on the deploy mode — changing variables requires re-running the init containers.
Generated by setup.sh — users don't interact with these directly. If not using setup.sh, generate with the noted commands.
| Variable | Description |
|---|---|
TAK_DB_PASSWORD |
TAK database password (openssl rand -hex 16) |
APP_DB_PASSWORD |
App database password — shared by LLDAP and Node-RED (openssl rand -hex 16) |
LDAP_BIND_PASSWORD |
LDAP service account password (openssl rand -hex 16) |
| Port | Service | Protocol | Auth |
|---|---|---|---|
| 80 | Caddy | HTTP (redirect to HTTPS) | — |
| 443 | Caddy | HTTPS — redirects to Monitor (direct) or subdomains | LDAP |
| 8089 | TAK Server | CoT over TLS | Client cert |
| 8443 | TAK Server | Client-cert HTTPS (mutual TLS) | Client cert |
| 8554 | MediaMTX | RTSP — video ingress from cameras, drones | None |
| 1935 | MediaMTX | RTMP — video ingress from OBS, encoders | None |
In direct mode, Caddy also listens on per-service ports (configurable in .env):
| Port (default) | Service | Auth |
|---|---|---|
| 8446 | TAK Server web admin | LDAP |
| 8888 | MediaMTX HLS | LDAP |
| 1880 | Node-RED | LDAP |
| 8180 | Monitor dashboard | LDAP |
In subdomain mode, all services route through Caddy on port 443 via subdomains.
| Service | Container Port | Purpose |
|---|---|---|
| tak-database | 5432 | TAK PostgreSQL (CoT data) |
| app-db | 5432 | App PostgreSQL (LLDAP + Node-RED) |
| lldap | 3890 | LDAP server + GraphQL API (internal) |
| ldap-proxy | 3389 | LDAP proxy (TAK Server → LLDAP) + forward auth |
Ports 8089 and 8443 are direct TAK client connections — they bypass Caddy because TAK clients use mutual TLS with client certificates.
Use certs.sh for certificate operations:
./certs.sh list # List all certs
./certs.sh create-client alice # Create client cert
./certs.sh download alice.p12 # Download .p12 to host
./certs.sh create-server my.domain.com # Create server cert for hostname
./certs.sh ca-info # Show CA details + expiry
./certs.sh create-user webadmin 'Pass!' # Create TAK admin user
./certs.sh revoke alice # Revoke a certificateRun ./certs.sh help for the full reference. Some certificate operations are also available via the monitor API and dashboard.
Certificate files are also directly accessible on the host at ./tak/certs/files/.
For detailed information about how TAK certificates work, see docs/certificates.md.
The Monitor dashboard is the primary interface for managing users, groups, and certificate enrollment. Access it at https://<SERVER_ADDRESS>:8180 (direct mode) or https://monitor.<SERVER_ADDRESS> (subdomain mode), logging in as webadmin.
- Create a user in the Monitor dashboard (Users → New User)
- Assign groups — groups prefixed with
tak_become TAK channels - Click the Enroll button next to the user
- A QR code (and a
tak://enrollment URL) appears with a ~15-minute token - User scans the QR code with ATAK/iTAK/TAK Aware
- The TAK client enrolls directly with TAK Server and receives its certificate
For details on authentication flows and LDAP, see docs/authentication.md.
Node-RED is available at https://<SERVER_ADDRESS>:1880 (direct mode) or https://nodered.<SERVER_ADDRESS> (subdomain mode).
On first boot, FastTAK pre-installs node-red-contrib-postgresql and node-red-contrib-tak, and configures a PostgreSQL connection to app-db. Flows needing spatial queries should point at tak-database instead — it has PostGIS natively. A nodered LDAP user is automatically created in the tak_ROLE_ADMIN group so CoT messages from Node-RED flows reach all TAK clients.
Edit the version pin in .env, then pull and restart:
docker compose pull
docker compose up -dTAK Server images are built locally from the tak.gov release ZIP. setup.sh handles extraction, image builds, and updating TAK_VERSION in .env:
# 1. Download the new release ZIP from tak.gov
# 2. Run setup (rebuilds images, updates .env)
./setup.sh takserver-docker-X.X-RELEASE-N.zip
# 3. Restart with new images
docker compose down
docker compose up -d --builddocker compose down is needed because the local images are rebuilt — a rolling update isn't possible.
Run a full greenfield integration test (setup → start → verify → teardown):
./start.sh --test takserver-docker-5.6-RELEASE-6.zipThis builds from scratch, starts the full stack, runs automated checks, and tears everything down. Requires the tak.gov release ZIP.
# Stop services (preserves databases and ./tak/ .env config)
docker compose down
# Full reset (destroys database data, keeps ./tak/ certs and .env config)
docker compose down -v
# Complete wipe (including certs and .env config)
docker compose down -v && rm -rf tak/ .env./tak/ is a bind-mount — certs, CoreConfig.xml, and logs always survive down. Only named volumes (PostgreSQL data) are removed with -v.
Each service has a memory cap enforced in docker-compose.yml (via
deploy.resources.limits.memory). Starting points below — if your
deployment has larger needs, override per-service via a
docker-compose.override.yml.
| Service | Cap | Notes |
|---|---|---|
tak-server |
4 GB | JVM heap; scales with connected clients |
tak-database |
2 GB | PostgreSQL on write-heavy CoT workload |
app-db |
1 GB | PostgreSQL shared by LLDAP + Node-RED |
nodered |
512 MB | Node-RED runtime |
monitor |
512 MB | FastAPI management API |
mediamtx |
512 MB | Scales with concurrent streams |
lldap |
256 MB | Rust LDAP server |
caddy |
256 MB | Reverse proxy |
ldap-proxy |
128 MB | Go LDAP bind proxy |
init-config |
128 MB | One-shot bash (exits after bootstrap) |
init-identity |
256 MB | One-shot Python |
init-ldap-ready |
64 MB | One-shot LDAP bind probe |
See DD-034 for rationale.
Services not starting?
docker compose ps # check status
docker compose logs -f # follow all logs
docker compose logs tak-server --tail 50 # specific serviceTAK Server not healthy after 5 minutes?
docker compose logs tak-server | tail -30Identity bootstrap failed?
docker compose logs init-identityQR enrollment not working?
- Ensure TAK Server is healthy:
docker compose ps tak-server - Check Monitor logs:
docker compose logs monitor - Verify
SERVER_ADDRESSis reachable from the client device - Enrollment tokens expire after 15 minutes — generate a fresh QR
Certificate issues?
./certs.sh ca-info # check CA cert expiryCaddy auto-manages Let's Encrypt certs. TAK Server internal CA cert expiry is monitored by the healthcheck — the container becomes unhealthy when any cert is within 30 days of expiring. The monitor dashboard also tracks cert expiry across all TAK certificates.