a image based of the githib archon project https://github.com/coleam00/Archon for ease of use
1.8K
Docker compose file with traefik labels
services:
# Server Service (FastAPI + Socket.IO + Crawling)
archon-server:
image: otakulabz/archon:server-latest
container_name: archon-server
restart: unless-stopped
ports:
- "8181:8181"
environment:
- SUPABASE_URL=${SUPABASE_URL}
- SUPABASE_SERVICE_KEY=${SUPABASE_SERVICE_KEY}
- OPENAI_API_KEY=${OPENAI_API_KEY:-}
- LOGFIRE_TOKEN=${LOGFIRE_TOKEN:-}
- SERVICE_DISCOVERY_MODE=docker_compose
- LOG_LEVEL=${LOG_LEVEL:-INFO}
- ARCHON_SERVER_PORT=${ARCHON_SERVER_PORT:-8181}
- ARCHON_MCP_PORT=${ARCHON_MCP_PORT:-8051}
- ARCHON_AGENTS_PORT=${ARCHON_AGENTS_PORT:-8052}
- AGENTS_ENABLED=${AGENTS_ENABLED:-false}
- ARCHON_HOST=${HOST:-localhost}
networks:
- nat
volumes:
- /var/run/docker.sock:/var/run/docker.sock # Docker socket for MCP container control
- ./python/src:/app/src # Mount source code for hot reload
- ./python/tests:/app/tests # Mount tests for UI test execution
extra_hosts:
- "host.docker.internal:host-gateway"
command:
[
"python",
"-m",
"uvicorn",
"src.server.main:app",
"--host",
"0.0.0.0",
"--port",
"${ARCHON_SERVER_PORT:-8181}",
"--reload",
]
healthcheck:
test:
[
"CMD",
"sh",
"-c",
'python -c "import urllib.request; urllib.request.urlopen(''http://localhost:${ARCHON_SERVER_PORT:-8181}/health'')"',
]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
# labels:
# - "traefik.enable=true"
# - "traefik.http.routers.archon-server.entrypoints=websecure"
# - "traefik.http.routers.archon-server.rule=Host(`archon-server.your-server.com`)"
# - "traefik.http.routers.archon-server.tls=true"
# - "traefik.http.routers.archon-server.tls.certresolver=cloudflare"
# - "traefik.http.services.archon-server.loadbalancer.server.port=8181"
# - "traefik.docker.network=nat"
# - "traefik.http.routers.archon-server.service=archon-server"
#######################################################################################################
# Lightweight MCP Server Service (HTTP-based)
archon-mcp:
image: otakulabz/archon:mcp-latest
container_name: archon-mcp
restart: unless-stopped
ports:
- "8051:8051"
environment:
- SUPABASE_URL=${SUPABASE_URL}
- SUPABASE_SERVICE_KEY=${SUPABASE_SERVICE_KEY}
- LOGFIRE_TOKEN=${LOGFIRE_TOKEN:-}
- SERVICE_DISCOVERY_MODE=docker_compose
- TRANSPORT=sse
- LOG_LEVEL=${LOG_LEVEL:-INFO}
# MCP needs to know where to find other services
- API_SERVICE_URL=http://archon-server:8181
- AGENTS_ENABLED=${AGENTS_ENABLED:-false}
- AGENTS_SERVICE_URL=${AGENTS_SERVICE_URL:-http://archon-agents:8052}
- ARCHON_MCP_PORT=8051
- ARCHON_SERVER_PORT=8181
- ARCHON_AGENTS_PORT=8052
networks:
- nat
depends_on:
archon-server:
condition: service_healthy
extra_hosts:
- "host.docker.internal:host-gateway"
healthcheck:
test:
[
"CMD",
"sh",
"-c",
'python -c "import socket; s=socket.socket(); s.connect((''localhost'', ${ARCHON_MCP_PORT:-8051})); s.close()"',
]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s # Give dependencies time to start
# labels:
# - "traefik.enable=true"
# - "traefik.http.routers.archon-mcp.entrypoints=websecure"
# - "traefik.http.routers.archon-mcp.rule=Host(`archon-mcp.your-server.com`)"
# - "traefik.http.routers.archon-mcp.tls=true"
# - "traefik.http.routers.archon-mcp.tls.certresolver=cloudflare"
# - "traefik.http.services.archon-mcp.loadbalancer.server.port=8051"
# - "traefik.docker.network=nat"
# - "traefik.http.routers.archon-mcp.service=archon-mcp"
#######################################################################################################
# AI Agents Service (ML/Reranking)
archon-agents:
image: otakulabz/archon:agents-latest
container_name: archon-agents
restart: unless-stopped
ports:
- "8052:8052"
environment:
- SUPABASE_URL=${SUPABASE_URL}
- SUPABASE_SERVICE_KEY=${SUPABASE_SERVICE_KEY}
- OPENAI_API_KEY=${OPENAI_API_KEY:-}
- LOGFIRE_TOKEN=${LOGFIRE_TOKEN:-}
- SERVICE_DISCOVERY_MODE=docker_compose
- LOG_LEVEL=${LOG_LEVEL:-INFO}
- ARCHON_AGENTS_PORT=8052
- ARCHON_SERVER_PORT=8181
networks:
- nat
healthcheck:
test:
[
"CMD",
"sh",
"-c",
'python -c "import urllib.request; urllib.request.urlopen(''http://localhost:8052/health'')"',
]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
# labels:
# - "traefik.enable=true"
# - "traefik.http.routers.archon-agents.entrypoints=websecure"
# - "traefik.http.routers.archon-agents.rule=Host(`archon-agents.your-server.com`)"
# - "traefik.http.routers.archon-agents.tls=true"
# - "traefik.http.routers.archon-agents.tls.certresolver=cloudflare"
# - "traefik.http.services.archon-agents.loadbalancer.server.port=8052"
# - "traefik.docker.network=nat"
# - "traefik.http.routers.archon-agents.service=archon-agents"
#######################################################################################################
# Frontend
archon-frontend:
image: otakulabz/archon:frontend-latest
restart: unless-stopped
container_name: archon-ui
ports:
- "3737:3737"
environment:
# Don't set VITE_API_URL so frontend uses relative URLs through proxy
# - VITE_API_URL=http://${HOST:-localhost}:${ARCHON_SERVER_PORT:-8181}
- VITE_ARCHON_SERVER_PORT=8181
- ARCHON_SERVER_PORT=8181
- HOST=${HOST:-localhost}
- PROD=${PROD:-false}
- VITE_ALLOWED_HOSTS=${VITE_ALLOWED_HOSTS:-}
- VITE_SHOW_DEVTOOLS=${VITE_SHOW_DEVTOOLS:-false}
- DOCKER_ENV=true
networks:
- nat
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3737"]
interval: 30s
timeout: 10s
retries: 3
volumes:
- ./archon-ui-main/src:/app/src
- ./archon-ui-main/public:/app/public
depends_on:
archon-server:
condition: service_healthy
# labels:
# - "traefik.enable=true"
# - "traefik.http.routers.archon-ui.entrypoints=websecure"
# - "traefik.http.routers.archon-ui.rule=Host(`archon-ui.your-server.com`)"
# - "traefik.http.routers.archon-ui.tls=true"
# - "traefik.http.routers.archon-ui.tls.certresolver=cloudflare"
# - "traefik.http.services.archon-ui.loadbalancer.server.port=3737"
# - "traefik.docker.network=nat"
# - "traefik.http.routers.archon-ui.service=archon-ui"
# ###################################################################################################
docs: # Documentation Server (optional)
image: otakulabz/archon:docs-latest
pull_policy: always
container_name: archon-documents
restart: unless-stopped
ports:
- "3838:80"
# labels:
# - "traefik.enable=true"
# - "traefik.http.routers.archon-documents.entrypoints=websecure"
# - "traefik.http.routers.archon-documents.rule=Host(`archon-documents.your-server.com`)"
# - "traefik.http.routers.archon-documents.tls=true"
# - "traefik.http.routers.archon-documents.tls.certresolver=cloudflare"
# - "traefik.http.services.archon-documents.loadbalancer.server.port=80"
# - "traefik.docker.network=nat"
# - "traefik.http.routers.archon-documents.service=archon-documents"
networks:
- nat
networks:
nat:
external: true
Env example
# Minimal startup configuration - only Supabase connection required
# All other settings (API keys, model choices, RAG flags) are managed via the Settings page
# Get your SUPABASE_URL from the Data API section of your Supabase project settings -
# https://supabase.com/dashboard/project/<your project ID>/settings/api
SUPABASE_URL=
# ⚠️ CRITICAL: You MUST use the SERVICE ROLE key, NOT the Anon key! ⚠️
#
# COMMON MISTAKE: Using the anon (public) key will cause ALL saves to fail with "permission denied"!
#
# How to get the CORRECT key:
# 1. Go to: https://supabase.com/dashboard/project/<your project ID>/settings/api
# 2. In the Settings menu, click on "API keys"
# 3. Find "Project API keys" section
# 4. You will see TWO keys - choose carefully:
# ❌ anon (public): WRONG - This is shorter, starts with "eyJhbGc..." and contains "anon" in the JWT
# ✅ service_role (secret): CORRECT - This is longer and contains "service_role" in the JWT
#
# The service_role key is typically much longer than the anon key.
# If you see errors like "Failed to save" or "Permission denied", you're using the wrong key!
#
# On the Supabase dashboard, it's labeled as "service_role" under "Project API keys"
SUPABASE_SERVICE_KEY=
# Optional: Set log level for debugging
LOGFIRE_TOKEN=
LOG_LEVEL=INFO
# Service Ports Configuration
# These ports are used for external access to the services
HOST=localhost
ARCHON_SERVER_PORT=8181
ARCHON_MCP_PORT=8051
ARCHON_AGENTS_PORT=8052
ARCHON_UI_PORT=3737
ARCHON_DOCS_PORT=3838
# Frontend Configuration
# VITE_ALLOWED_HOSTS: Comma-separated list of additional hosts allowed for Vite dev server
# Example: VITE_ALLOWED_HOSTS=192.168.1.100,myhost.local,example.com
# If not set, defaults to localhost, 127.0.0.1, ::1, and the HOST value above
VITE_ALLOWED_HOSTS=
# Development Tools
# VITE_SHOW_DEVTOOLS: Show TanStack Query DevTools (for developers only)
# Set to "true" to enable the DevTools panel in bottom right corner
# Defaults to "false" for end users
VITE_SHOW_DEVTOOLS=false
# When enabled, PROD mode will proxy ARCHON_SERVER_PORT through ARCHON_UI_PORT. This exposes both the
# Archon UI and API through a single port. This is useful when deploying Archon behind a reverse
# proxy where you want to expose the frontend on a single external domain.
PROD=false
# NOTE: All other configuration has been moved to database management!
# Run the credentials_setup.sql file in your Supabase SQL editor to set up the credentials table.
# Then use the Settings page in the web UI to manage:
# - OPENAI_API_KEY (encrypted)
# - MODEL_CHOICE
# - TRANSPORT settings
# - RAG strategy flags (USE_CONTEXTUAL_EMBEDDINGS, USE_HYBRID_SEARCH, etc.)
# - Crawler settings:
# * CRAWL_MAX_CONCURRENT (default: 10) - Max concurrent pages per crawl operation
# * CRAWL_BATCH_SIZE (default: 50) - URLs processed per batch
# * MEMORY_THRESHOLD_PERCENT (default: 80) - Memory % before throttling
# * DISPATCHER_CHECK_INTERVAL (default: 0.5) - Memory check interval in seconds
Content type
Image
Digest
sha256:4e6569158…
Size
1014.1 MB
Last updated
11 months ago
docker pull otakulabz/archon:server-latest