Files
openbrain/docker-compose.portainer.yml
Jason Woltje 5771ec5260 feat: initial alpha scaffold — FastAPI + MCP + pgvector
Implements v0.0.1 of OpenBrain:

- FastAPI REST API (capture, search, recent, stats) with Bearer auth
- MCP server (streamable HTTP at /mcp) exposing all 4 tools
- pgvector schema (vector(1024) for bge-m3)
- asyncpg connection pool with lazy init + graceful close
- Ollama embedding client with fallback (stores thought without vector if Ollama unreachable)
- Woodpecker CI pipeline (lint + kaniko build + push to Gitea registry)
- Portainer/Swarm deployment compose
- Mosaic framework files: AGENTS.md, PRD.md, TASKS.md, scratchpad

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-02 18:25:07 -06:00

66 lines
1.9 KiB
YAML

# OpenBrain — Portainer / Docker Swarm deployment
#
# Required environment variables (set in Portainer stack env):
# POSTGRES_PASSWORD — postgres user password
# API_KEY — secret key for API/MCP auth
# OLLAMA_URL — Ollama endpoint (e.g. http://10.x.x.x:11434)
# IMAGE_TAG — image tag to deploy (e.g. sha-abc1234 or 0.0.1)
#
# Optional:
# OLLAMA_EMBEDDING_MODEL — default: bge-m3:latest
# LOG_LEVEL — default: info
services:
brain-db:
image: pgvector/pgvector:pg17
environment:
POSTGRES_USER: openbrain
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: openbrain
volumes:
- brain_db_data:/var/lib/postgresql/data
- /opt/openbrain/init.sql:/docker-entrypoint-initdb.d/init.sql:ro
healthcheck:
test: ["CMD-SHELL", "pg_isready -U openbrain -d openbrain"]
interval: 10s
timeout: 5s
retries: 5
networks:
- brain-internal
deploy:
replicas: 1
restart_policy:
condition: on-failure
brain-api:
image: git.mosaicstack.dev/mosaic/openbrain:${IMAGE_TAG:-latest}
environment:
DATABASE_URL: postgresql://openbrain:${POSTGRES_PASSWORD}@brain-db:5432/openbrain
API_KEY: ${API_KEY}
OLLAMA_URL: ${OLLAMA_URL}
OLLAMA_EMBEDDING_MODEL: ${OLLAMA_EMBEDDING_MODEL:-bge-m3:latest}
LOG_LEVEL: ${LOG_LEVEL:-info}
ports:
- "8765:8000"
depends_on:
- brain-db
networks:
- brain-internal
deploy:
replicas: 1
restart_policy:
condition: on-failure
labels:
- "traefik.enable=true"
- "traefik.http.routers.openbrain.rule=Host(`brain.woltje.com`)"
- "traefik.http.routers.openbrain.entrypoints=websecure"
- "traefik.http.routers.openbrain.tls=true"
- "traefik.http.services.openbrain.loadbalancer.server.port=8000"
volumes:
brain_db_data:
networks:
brain-internal:
driver: overlay