docker-compose.yml
Rama main · réplica de lectura del repositorio original.
version: '3.8'
services:
# AgentRQ main application
agentrq:
image: agentrq/agentrq:latest
container_name: agentrq
restart: unless-stopped
ports:
- "${PORT:-2026}:${PORT:-2026}"
environment:
# Core settings
ENV: ${ENV:-production}
PORT: ${PORT:-2026}
AGENTRQ_BASE_URL: ${AGENTRQ_BASE_URL}
AGENTRQ_DOMAIN: ${AGENTRQ_DOMAIN}
AGENTRQ_BASE_PATH: ${AGENTRQ_BASE_PATH:-}
AGENTRQ_COOKIE_SECURE: ${AGENTRQ_COOKIE_SECURE:-}
AGENTRQ_PROXY_DOMAIN: ${AGENTRQ_PROXY_DOMAIN:-}
# Auth (required)
AGENTRQ_AUTH_JWT_SECRET: ${AGENTRQ_AUTH_JWT_SECRET}
AGENTRQ_AUTH_WORKSPACE_TOKEN_KEY: ${AGENTRQ_AUTH_WORKSPACE_TOKEN_KEY}
AGENTRQ_AUTH_ROOT_LOGIN_ENABLED: ${AGENTRQ_AUTH_ROOT_LOGIN_ENABLED:-false}
AGENTRQ_AUTH_ROOT_ACCESS_TOKEN: ${AGENTRQ_AUTH_ROOT_ACCESS_TOKEN:-}
AGENTRQ_AUTH_ALLOWED_REDIRECT_DOMAINS: ${AGENTRQ_AUTH_ALLOWED_REDIRECT_DOMAINS:-}
# Google OAuth (required)
AGENTRQ_ACCOUNTS_OAUTH2_CLI_GOOGLE_CLIENT_ID: ${AGENTRQ_ACCOUNTS_OAUTH2_CLI_GOOGLE_CLIENT_ID}
AGENTRQ_ACCOUNTS_OAUTH2_CLI_GOOGLE_CLIENT_SECRET: ${AGENTRQ_ACCOUNTS_OAUTH2_CLI_GOOGLE_CLIENT_SECRET}
# GitHub OAuth (optional)
AGENTRQ_ACCOUNTS_OAUTH2_CLI_GITHUB_CLIENT_ID: ${AGENTRQ_ACCOUNTS_OAUTH2_CLI_GITHUB_CLIENT_ID:-}
AGENTRQ_ACCOUNTS_OAUTH2_CLI_GITHUB_CLIENT_SECRET: ${AGENTRQ_ACCOUNTS_OAUTH2_CLI_GITHUB_CLIENT_SECRET:-}
# Database: SQLite (default)
AGENTRQ_SQLITE_ENABLED: ${AGENTRQ_SQLITE_ENABLED:-true}
AGENTRQ_SQLITE_DSN: ${AGENTRQ_SQLITE_DSN:-/storage/agentrq.db}
# Database: PostgreSQL (optional, disable SQLite if using Postgres)
AGENTRQ_POSTGRES_ENABLED: ${AGENTRQ_POSTGRES_ENABLED:-false}
AGENTRQ_POSTGRES_HOST: ${AGENTRQ_POSTGRES_HOST:-postgres}
AGENTRQ_POSTGRES_PORT: ${AGENTRQ_POSTGRES_PORT:-5432}
AGENTRQ_POSTGRES_USER: ${AGENTRQ_POSTGRES_USER:-postgres}
AGENTRQ_POSTGRES_PASSWORD: ${AGENTRQ_POSTGRES_PASSWORD:-}
AGENTRQ_POSTGRES_DBNAME: ${AGENTRQ_POSTGRES_DBNAME:-agentrq}
# TLS (for production)
AGENTRQ_SSL_ENABLED: ${AGENTRQ_SSL_ENABLED:-false}
AGENTRQ_SSL_LETSENCRYPT_EMAIL: ${AGENTRQ_SSL_LETSENCRYPT_EMAIL:-}
AGENTRQ_SSL_CACHE_DIR: ${AGENTRQ_SSL_CACHE_DIR:-/_certs}
AGENTRQ_SSL_CLOUDFLARE_API_TOKEN: ${AGENTRQ_SSL_CLOUDFLARE_API_TOKEN:-}
AGENTRQ_SSL_S3_ENABLED: ${AGENTRQ_SSL_S3_ENABLED:-false}
AGENTRQ_SSL_S3_ENDPOINT: ${AGENTRQ_SSL_S3_ENDPOINT:-}
AGENTRQ_SSL_S3_ACCESS_KEY: ${AGENTRQ_SSL_S3_ACCESS_KEY:-}
AGENTRQ_SSL_S3_SECRET_ACCESS_KEY: ${AGENTRQ_SSL_S3_SECRET_ACCESS_KEY:-}
AGENTRQ_SSL_S3_REGION: ${AGENTRQ_SSL_S3_REGION:-us-east-1}
AGENTRQ_SSL_S3_BUCKET: ${AGENTRQ_SSL_S3_BUCKET:-}
# Email notifications (optional)
AGENTRQ_SMTP_ENABLED: ${AGENTRQ_SMTP_ENABLED:-false}
AGENTRQ_SMTP_HOST: ${AGENTRQ_SMTP_HOST:-}
AGENTRQ_SMTP_PORT: ${AGENTRQ_SMTP_PORT:-587}
AGENTRQ_SMTP_USERNAME: ${AGENTRQ_SMTP_USERNAME:-}
AGENTRQ_SMTP_PASSWORD: ${AGENTRQ_SMTP_PASSWORD:-}
AGENTRQ_SMTP_FROM: ${AGENTRQ_SMTP_FROM:-}
# Slack integration (optional)
AGENTRQ_SLACK_ENABLED: ${AGENTRQ_SLACK_ENABLED:-false}
AGENTRQ_SLACK_CLIENT_ID: ${AGENTRQ_SLACK_CLIENT_ID:-}
AGENTRQ_SLACK_CLIENT_SECRET: ${AGENTRQ_SLACK_CLIENT_SECRET:-}
AGENTRQ_SLACK_SIGNING_SECRET: ${AGENTRQ_SLACK_SIGNING_SECRET:-}
AGENTRQ_SLACK_APP_ID: ${AGENTRQ_SLACK_APP_ID:-}
# Skill and attachment storage: local (default) or s3
AGENTRQ_SKILLS_STORAGE: ${AGENTRQ_SKILLS_STORAGE:-local}
AGENTRQ_ARTIFACTS_STORAGE: ${AGENTRQ_ARTIFACTS_STORAGE:-local}
AGENTRQ_PANO_STORAGE: ${AGENTRQ_PANO_STORAGE:-local}
AGENTRQ_PANO_MAX_TTL_DAYS: ${AGENTRQ_PANO_MAX_TTL_DAYS:-365}
# Memory and skill size limits
AGENTRQ_MEMORY_MAX_FILE_SIZE: ${AGENTRQ_MEMORY_MAX_FILE_SIZE:-16384}
AGENTRQ_SKILLS_MAX_FILE_SIZE: ${AGENTRQ_SKILLS_MAX_FILE_SIZE:-98304}
AGENTRQ_SKILLS_MAX_FILES: ${AGENTRQ_SKILLS_MAX_FILES:-256}
AGENTRQ_ACP_V1_ENABLED: ${AGENTRQ_ACP_V1_ENABLED:-true}
AGENTRQ_MCP_OPENAI_APPS_CHALLENGE: ${AGENTRQ_MCP_OPENAI_APPS_CHALLENGE:-}
AGENTRQ_S3_ENDPOINT: ${AGENTRQ_S3_ENDPOINT:-}
AGENTRQ_S3_ACCESS_KEY: ${AGENTRQ_S3_ACCESS_KEY:-}
AGENTRQ_S3_SECRET_ACCESS_KEY: ${AGENTRQ_S3_SECRET_ACCESS_KEY:-}
AGENTRQ_S3_REGION: ${AGENTRQ_S3_REGION:-us-east-1}
AGENTRQ_S3_BUCKET: ${AGENTRQ_S3_BUCKET:-}
AGENTRQ_S3_PUBLIC_URL: ${AGENTRQ_S3_PUBLIC_URL:-}
# Web Push notifications (optional)
AGENTRQ_WEBPUSH_VAPID_PUBLIC_KEY: ${AGENTRQ_WEBPUSH_VAPID_PUBLIC_KEY:-}
AGENTRQ_WEBPUSH_VAPID_PRIVATE_KEY: ${AGENTRQ_WEBPUSH_VAPID_PRIVATE_KEY:-}
AGENTRQ_WEBPUSH_SUBSCRIBER: ${AGENTRQ_WEBPUSH_SUBSCRIBER:-mailto:hi@example.com}
# Attachments and local skills, on the mounted volume
AGENTRQ_STORAGE_DIR: ${AGENTRQ_STORAGE_DIR:-/storage}
# Attachment retention
AGENTRQ_APP_ATTACHMENT_RETENTION: ${AGENTRQ_APP_ATTACHMENT_RETENTION:-7d}
# Instance identity
MONOFLAKE_NODE: ${MONOFLAKE_NODE:-}
AGENTRQ_INSTANCE_ID: ${AGENTRQ_INSTANCE_ID:-}
AGENTRQ_APP_DRAIN_DELAY: ${AGENTRQ_APP_DRAIN_DELAY:-0s}
# Security
AGENTRQ_DDOS_ENABLED: ${AGENTRQ_DDOS_ENABLED:-true}
AGENTRQ_DDOS_MAX_REQ_PER_SEC: ${AGENTRQ_DDOS_MAX_REQ_PER_SEC:-20}
AGENTRQ_DDOS_BLOCK_DURATION: ${AGENTRQ_DDOS_BLOCK_DURATION:-5m}
AGENTRQ_RATELIMIT_ENABLED: ${AGENTRQ_RATELIMIT_ENABLED:-true}
AGENTRQ_RATELIMIT_MAX_PER_IP: ${AGENTRQ_RATELIMIT_MAX_PER_IP:-60}
AGENTRQ_RATELIMIT_MAX_PER_USER: ${AGENTRQ_RATELIMIT_MAX_PER_USER:-100}
AGENTRQ_RATELIMIT_WINDOW: ${AGENTRQ_RATELIMIT_WINDOW:-60s}
AGENTRQ_TRUSTED_PROXIES: ${AGENTRQ_TRUSTED_PROXIES:-}
AGENTRQ_CLIENT_IP_HEADER: ${AGENTRQ_CLIENT_IP_HEADER:-X-Real-IP}
volumes:
- ./storage:/storage
- ./certs:/_certs
depends_on:
postgres:
condition: service_healthy
required: false
# Optional: PostgreSQL database (for production)
postgres:
image: postgres:16-alpine
container_name: agentrq-postgres
restart: unless-stopped
environment:
POSTGRES_DB: ${AGENTRQ_POSTGRES_DBNAME:-agentrq}
POSTGRES_USER: ${AGENTRQ_POSTGRES_USER:-postgres}
POSTGRES_PASSWORD: ${AGENTRQ_POSTGRES_PASSWORD:-postgres}
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U ${AGENTRQ_POSTGRES_USER:-postgres}']
interval: 10s
timeout: 5s
retries: 5
# Only start if AGENTRQ_POSTGRES_ENABLED=true
profiles:
- postgres
volumes:
postgres_data:
driver: local
networks:
default:
name: agentrq-network