You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

147 lines
4.4 KiB

services:
# ---------------------------------------------------------------------------
# PostgreSQL with pgvector
# ---------------------------------------------------------------------------
postgres:
image: pgvector/pgvector:pg16
container_name: second-brain-postgres
restart: unless-stopped
environment:
POSTGRES_DB: second_brain
POSTGRES_USER: brain
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-brain}
volumes:
- postgres_data:/var/lib/postgresql/data
- ./infra/database/schema.sql:/docker-entrypoint-initdb.d/01_schema.sql:ro
ports:
- "${POSTGRES_PORT:-5433}:5432"
networks:
- brain-net
healthcheck:
test: ["CMD-SHELL", "pg_isready -U brain -d second_brain"]
interval: 10s
timeout: 5s
retries: 5
# ---------------------------------------------------------------------------
# Redis (job queue)
# ---------------------------------------------------------------------------
redis:
image: redis:7-alpine
container_name: second-brain-redis
restart: unless-stopped
volumes:
- redis_data:/data
networks:
- brain-net
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 5
# ---------------------------------------------------------------------------
# RAG API (FastAPI)
# ---------------------------------------------------------------------------
rag-api:
build:
context: ./services/rag-api
dockerfile: Dockerfile
container_name: second-brain-rag-api
restart: unless-stopped
environment:
DATABASE_URL: postgresql://brain:${POSTGRES_PASSWORD:-brain}@postgres:5432/second_brain
OLLAMA_URL: ${OLLAMA_URL:-http://192.168.1.217:11434}
EMBEDDING_MODEL: ${EMBEDDING_MODEL:-nomic-embed-text}
CHAT_MODEL: ${CHAT_MODEL:-qwen3:8b}
LOG_LEVEL: ${LOG_LEVEL:-INFO}
SEARCH_TOP_K: ${SEARCH_TOP_K:-10}
SEARCH_THRESHOLD: ${SEARCH_THRESHOLD:-0.65}
CORS_ORIGINS: ${CORS_ORIGINS:-*}
depends_on:
postgres:
condition: service_healthy
ports:
- "${API_PORT:-8001}:8000"
networks:
- brain-net
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/api/v1/health"]
interval: 15s
timeout: 5s
retries: 5
start_period: 30s
# ---------------------------------------------------------------------------
# Ingestion Worker
# ---------------------------------------------------------------------------
ingestion-worker:
build:
context: ./services/ingestion-worker
dockerfile: Dockerfile
container_name: second-brain-ingestion
restart: unless-stopped
environment:
DATABASE_URL: postgresql://brain:${POSTGRES_PASSWORD:-brain}@postgres:5432/second_brain
OLLAMA_URL: ${OLLAMA_URL:-http://192.168.1.217:11434}
VAULT_PATH: /vault
EMBEDDING_MODEL: ${EMBEDDING_MODEL:-nomic-embed-text}
CHUNK_SIZE: ${CHUNK_SIZE:-700}
CHUNK_OVERLAP: ${CHUNK_OVERLAP:-70}
volumes:
- ${VAULT_PATH:-./vault}:/vault:ro
depends_on:
postgres:
condition: service_healthy
networks:
- brain-net
# ---------------------------------------------------------------------------
# AI Agents
# ---------------------------------------------------------------------------
agents:
build:
context: ./services/agents
dockerfile: Dockerfile
container_name: second-brain-agents
restart: unless-stopped
environment:
DATABASE_URL: postgresql://brain:${POSTGRES_PASSWORD:-brain}@postgres:5432/second_brain
OLLAMA_URL: ${OLLAMA_URL:-http://192.168.1.217:11434}
VAULT_PATH: /vault
CHAT_MODEL: ${CHAT_MODEL:-qwen3:8b}
volumes:
- ${VAULT_PATH:-./vault}:/vault:ro
depends_on:
postgres:
condition: service_healthy
networks:
- brain-net
# ---------------------------------------------------------------------------
# Web UI (Next.js)
# ---------------------------------------------------------------------------
web-ui:
build:
context: ./services/web-ui
dockerfile: Dockerfile
container_name: second-brain-ui
restart: unless-stopped
environment:
NEXT_PUBLIC_API_URL: ${PUBLIC_API_URL:-http://localhost:8001}
depends_on:
- rag-api
ports:
- "${UI_PORT:-3001}:3000"
networks:
- brain-net
volumes:
postgres_data:
redis_data:
networks:
brain-net:
driver: bridge

Powered by TurnKey Linux.