Docker Compose is the recommended way to deploy agtOS in production or when you want Redis and all services running together.Documentation Index
Fetch the complete documentation index at: https://docs.agtos.ai/llms.txt
Use this file to discover all available pages before exploring further.
Quick start
| Service | Image | Port | Purpose |
|---|---|---|---|
| agtos | Built from source | 3000, 4100, 4102 | agtOS server (voice, MCP, API) |
| redis | redis/redis-stack:latest | 6379 | Memory, scheduling, devices, sessions |
| speaches | ghcr.io/speaches-ai/speaches | 8000 | STT/TTS fallback server (Faster Whisper + Kokoro) |
Configuration
Environment variables
Create a.env.local file in the project root with your API keys:
.env.local for secrets.
Connecting to host services
When running in Docker, usehost.docker.internal to reach services on the host machine:
On Linux,
host.docker.internal may not work out of the box. Use --network=host or add extra_hosts: ["host.docker.internal:host-gateway"] to your compose file.GPU acceleration
For GPU-accelerated speech processing (STT/TTS), use the GPU override:- NVIDIA GPU with CUDA support
- NVIDIA Container Toolkit installed
Redis only
If you’re running agtOS via the CLI or desktop app but want Redis for memory and scheduling:Resource limits
The default Docker Compose configuration sets resource limits:| Service | CPU | Memory |
|---|---|---|
| agtos | 2 cores | 1 GB |
| redis | 1 core | 512 MB |
| speaches | 4 cores | 4 GB |
docker-compose.yml under deploy.resources.limits based on your hardware.
Volumes
Named volumes persist data across container restarts:| Volume | Purpose |
|---|---|
redis-data | Redis database persistence |
speaches-models | Cached STT/TTS model files |
node-modules | npm dependencies |
Health checks
The agtOS container includes a built-in health check:Production tips
- Set
NODE_ENV=productionfor structured JSON logging and credential salt enforcement - Set
AGTOS_API_KEYto protect API endpoints - Set
AGTOS_CREDENTIAL_SALTfor persistent encrypted credential storage - Use
restart: unless-stopped(already configured) for automatic recovery - Mount
.env.localasenv_filefor secrets management - Use a reverse proxy (nginx, Caddy) for TLS termination if exposing externally