Generative UI SDK for React
docker pull library/tambo-web
docker run -d --name tambo -p 9000:9000 --restart always tambo-web:latest
podman run -d --name tambo -p 9000:9000 --restart always tambo-web:latest
skopeo inspect docker://docker.io/library/tambo-web:latest
oras pull tambo-web:latest
docker compose up -d
volumes:
tambo_postgres_data:
minio_data:
services:
# MinIO S3-compatible storage
minio:
image: minio/minio:latest
container_name: tambo_minio
command: server /data --console-address ":9001"
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: minioadmin
volumes:
- minio_data:/data
ports:
- "9000:9000"
- "9001:9001"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/ready"]
interval: 5s
timeout: 5s
retries: 5
restart: unless-stopped
# PostgreSQL Database
postgres:
image: postgres:17
container_name: tambo_postgres
restart: unless-stopped
env_file:
- ./docker.env
environment:
POSTGRES_DB: ${POSTGRES_DB:-tambo}
POSTGRES_USER: ${POSTGRES_USER:-postgres}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres}
PGDATA: /var/lib/postgresql/data/pgdata
volumes:
- tambo_postgres_data:/var/lib/postgresql/data
ports:
- "5433:5432"
healthcheck:
test:
[
"CMD-SHELL",
"pg_isready -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-tambo}",
]
interval: 8s
timeout: 5s
retries: 4
start_period: 20s
# Web Service (Next.js)
web:
image: tambo-web:latest
env_file:
- ./docker.env
build:
context: .
dockerfile: apps/web/Dockerfile
args:
NODE_ENV: ${NODE_ENV:-production}
container_name: tambo_web
ports:
- "8260:3000"
environment:
- PORT=3000
- NODE_ENV=${NODE_ENV:-production}
- NEXT_PUBLIC_TAMBO_API_URL=${NEXT_PUBLIC_TAMBO_API_URL:-http://localhost:8261}
- NEXT_PUBLIC_TAMBO_API_KEY=${NEXT_PUBLIC_TAMBO_API_KEY:-}
- NEXT_PUBLIC_POSTHOG_HOST=${NEXT_PUBLIC_POSTHOG_HOST:-}
- NEXT_PUBLIC_POSTHOG_KEY=${NEXT_PUBLIC_POSTHOG_KEY:-}
- DATABASE_URL=postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@postgres:5432/${POSTGRES_DB:-tambo}
- API_KEY_SECRET=${API_KEY_SECRET}
- PROVIDER_KEY_SECRET=${PROVIDER_KEY_SECRET}
- RESEND_API_KEY=${RESEND_API_KEY:-}
- RESEND_AUDIENCE_ID=${RESEND_AUDIENCE_ID:-}
- WEATHER_API_KEY=${WEATHER_API_KEY:-}
- ALLOW_LOCAL_MCP_SERVERS=${ALLOW_LOCAL_MCP_SERVERS:-}
- GITHUB_TOKEN=${GITHUB_TOKEN:-}
- EMAIL_FROM_DEFAULT=${EMAIL_FROM_DEFAULT:-}
- EMAIL_FROM_PERSONAL=${EMAIL_FROM_PERSONAL:-}
- EMAIL_REPLY_TO_SUPPORT=${EMAIL_REPLY_TO_SUPPORT:-}
- EMAIL_REPLY_TO_PERSONAL=${EMAIL_REPLY_TO_PERSONAL:-}
- GOOGLE_CLIENT_ID=${GOOGLE_CLIENT_ID:-}
- GOOGLE_CLIENT_SECRET=${GOOGLE_CLIENT_SECRET:-}
- NEXTAUTH_SECRET=${NEXTAUTH_SECRET}
- NEXTAUTH_URL=${NEXTAUTH_URL}
- NEXT_PUBLIC_SENTRY_DSN=${NEXT_PUBLIC_SENTRY_DSN:-}
- NEXT_PUBLIC_SENTRY_ORG=${NEXT_PUBLIC_SENTRY_ORG:-}
- NEXT_PUBLIC_SENTRY_PROJECT=${NEXT_PUBLIC_SENTRY_PROJECT:-}
depends_on:
postgres:
condition: service_healthy
api:
condition: service_healthy
restart: unless-stopped
# API Service (NestJS)
api:
image: tambo-api:latest
env_file:
- ./docker.env
build:
# Run context from the repo top level so that Docker can access shared files
context: .
dockerfile: apps/api/Dockerfile
args:
NODE_ENV: ${NODE_ENV:-production}
container_name: tambo_api
ports:
- "8261:3000"
environment:
- PORT=3000
- NODE_ENV=${NODE_ENV:-production}
- DATABASE_URL=postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@postgres:5432/${POSTGRES_DB:-tambo}
- API_KEY_SECRET=${API_KEY_SECRET}
- PROVIDER_KEY_SECRET=${PROVIDER_KEY_SECRET}
- OPENAI_API_KEY=${OPENAI_API_KEY:-}
- EXTRACTION_OPENAI_API_KEY=${EXTRACTION_OPENAI_API_KEY:-}
- FALLBACK_OPENAI_API_KEY=${FALLBACK_OPENAI_API_KEY:-}
- RESEND_API_KEY=${RESEND_API_KEY:-}
- RESEND_AUDIENCE_ID=${RESEND_AUDIENCE_ID:-}
- LANGFUSE_PUBLIC_KEY=${LANGFUSE_PUBLIC_KEY:-}
- LANGFUSE_SECRET_KEY=${LANGFUSE_SECRET_KEY:-}
- LANGFUSE_HOST=${LANGFUSE_HOST:-}
- SLACK_OAUTH_TOKEN=${SLACK_OAUTH_TOKEN:-}
- SLACK_TEAM_ID=${SLACK_TEAM_ID:-}
- INTERNAL_SLACK_USER_ID=${INTERNAL_SLACK_USER_ID:-}
- DISALLOWED_EMAIL_DOMAINS=${DISALLOWED_EMAIL_DOMAINS:-}
- WEATHER_API_KEY=${WEATHER_API_KEY:-}
- ALLOW_LOCAL_MCP_SERVERS=${ALLOW_LOCAL_MCP_SERVERS:-}
- EMAIL_FROM_DEFAULT=${EMAIL_FROM_DEFAULT:-}
- EMAIL_FROM_PERSONAL=${EMAIL_FROM_PERSONAL:-}
- EMAIL_REPLY_TO_PERSONAL=${EMAIL_REPLY_TO_PERSONAL:-}
- EMAIL_REPLY_TO_SUPPORT=${EMAIL_REPLY_TO_SUPPORT:-}
- SENTRY_DSN=${SENTRY_DSN:-}
- POSTHOG_API_KEY=${POSTHOG_API_KEY:-}
- POSTHOG_HOST=${POSTHOG_HOST:-}
depends_on:
postgres:
condition: service_healthy
restart: unless-stopped