- Add FUTURE_DEVELOPMENT.md with comprehensive v2 protocol specification - Add MCP integration design and implementation foundation - Add infrastructure and deployment configurations - Update system architecture for v2 evolution 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
402 lines
9.7 KiB
YAML
402 lines
9.7 KiB
YAML
version: '3.8'
|
|
|
|
services:
|
|
# BZZZ v2 Main Agent
|
|
bzzz-agent:
|
|
image: registry.home.deepblack.cloud/bzzz:v2.0.0
|
|
networks:
|
|
- tengig
|
|
- bzzz-internal
|
|
ports:
|
|
- "9000-9100:9000-9100"
|
|
volumes:
|
|
- /rust/bzzz-v2/data:/app/data
|
|
- /rust/bzzz-v2/config:/app/config:ro
|
|
environment:
|
|
- BZZZ_VERSION=2.0.0
|
|
- BZZZ_PROTOCOL=bzzz://
|
|
- DHT_BOOTSTRAP_NODES=walnut:9101,ironwood:9102,acacia:9103
|
|
- CONTENT_STORE_PATH=/app/data/blobs
|
|
- POSTGRES_HOST=postgres
|
|
- REDIS_HOST=redis
|
|
- LOG_LEVEL=info
|
|
secrets:
|
|
- postgres_password
|
|
- openai_api_key
|
|
configs:
|
|
- source: bzzz_config
|
|
target: /app/config/config.yaml
|
|
deploy:
|
|
replicas: 3
|
|
placement:
|
|
max_replicas_per_node: 1
|
|
constraints:
|
|
- node.labels.bzzz.role == agent
|
|
resources:
|
|
limits:
|
|
memory: 4G
|
|
cpus: '2.0'
|
|
reservations:
|
|
memory: 2G
|
|
cpus: '1.0'
|
|
restart_policy:
|
|
condition: on-failure
|
|
delay: 10s
|
|
max_attempts: 3
|
|
update_config:
|
|
parallelism: 1
|
|
delay: 30s
|
|
failure_action: rollback
|
|
order: stop-first
|
|
labels:
|
|
- "traefik.enable=true"
|
|
- "traefik.http.routers.bzzz-agent.rule=Host(`bzzz.deepblack.cloud`)"
|
|
- "traefik.http.services.bzzz-agent.loadbalancer.server.port=9000"
|
|
- "traefik.http.routers.bzzz-agent.tls=true"
|
|
- "traefik.http.routers.bzzz-agent.tls.certresolver=letsencrypt"
|
|
|
|
# MCP Server for external tool integration
|
|
mcp-server:
|
|
image: registry.home.deepblack.cloud/bzzz-mcp:v2.0.0
|
|
networks:
|
|
- tengig
|
|
- bzzz-internal
|
|
ports:
|
|
- "3001:3001"
|
|
environment:
|
|
- MCP_VERSION=1.0.0
|
|
- BZZZ_ENDPOINT=http://bzzz-agent:9000
|
|
- MAX_CONNECTIONS=1000
|
|
- TIMEOUT_SECONDS=30
|
|
configs:
|
|
- source: mcp_config
|
|
target: /app/config/mcp.yaml
|
|
deploy:
|
|
replicas: 3
|
|
placement:
|
|
max_replicas_per_node: 1
|
|
resources:
|
|
limits:
|
|
memory: 2G
|
|
cpus: '1.0'
|
|
reservations:
|
|
memory: 512M
|
|
cpus: '0.5'
|
|
restart_policy:
|
|
condition: on-failure
|
|
delay: 5s
|
|
labels:
|
|
- "traefik.enable=true"
|
|
- "traefik.http.routers.mcp-server.rule=Host(`mcp.deepblack.cloud`)"
|
|
- "traefik.http.services.mcp-server.loadbalancer.server.port=3001"
|
|
- "traefik.http.routers.mcp-server.tls=true"
|
|
|
|
# OpenAI Proxy with rate limiting and cost tracking
|
|
openai-proxy:
|
|
image: registry.home.deepblack.cloud/bzzz-openai-proxy:v2.0.0
|
|
networks:
|
|
- tengig
|
|
- bzzz-internal
|
|
ports:
|
|
- "3002:3002"
|
|
environment:
|
|
- RATE_LIMIT_RPM=1000
|
|
- RATE_LIMIT_TPM=100000
|
|
- COST_TRACKING_ENABLED=true
|
|
- REDIS_HOST=redis
|
|
- POSTGRES_HOST=postgres
|
|
- LOG_REQUESTS=true
|
|
secrets:
|
|
- openai_api_key
|
|
- postgres_password
|
|
configs:
|
|
- source: proxy_config
|
|
target: /app/config/proxy.yaml
|
|
deploy:
|
|
replicas: 2
|
|
placement:
|
|
max_replicas_per_node: 1
|
|
resources:
|
|
limits:
|
|
memory: 2G
|
|
cpus: '1.0'
|
|
reservations:
|
|
memory: 1G
|
|
cpus: '0.5'
|
|
restart_policy:
|
|
condition: on-failure
|
|
delay: 10s
|
|
labels:
|
|
- "traefik.enable=true"
|
|
- "traefik.http.routers.openai-proxy.rule=Host(`openai.deepblack.cloud`)"
|
|
- "traefik.http.services.openai-proxy.loadbalancer.server.port=3002"
|
|
- "traefik.http.routers.openai-proxy.tls=true"
|
|
|
|
# Content Resolver for bzzz:// address resolution
|
|
content-resolver:
|
|
image: registry.home.deepblack.cloud/bzzz-resolver:v2.0.0
|
|
networks:
|
|
- bzzz-internal
|
|
- tengig
|
|
ports:
|
|
- "3003:3003"
|
|
volumes:
|
|
- /rust/bzzz-v2/data/blobs:/app/blobs:ro
|
|
environment:
|
|
- BLAKE3_INDEX_PATH=/app/blobs/index
|
|
- DHT_BOOTSTRAP_NODES=walnut:9101,ironwood:9102,acacia:9103
|
|
- CACHE_SIZE_MB=512
|
|
deploy:
|
|
replicas: 3
|
|
placement:
|
|
max_replicas_per_node: 1
|
|
resources:
|
|
limits:
|
|
memory: 1G
|
|
cpus: '1.0'
|
|
reservations:
|
|
memory: 512M
|
|
cpus: '0.5'
|
|
restart_policy:
|
|
condition: on-failure
|
|
labels:
|
|
- "traefik.enable=true"
|
|
- "traefik.http.routers.content-resolver.rule=Host(`resolve.deepblack.cloud`)"
|
|
|
|
# DHT Bootstrap Nodes (one per physical node)
|
|
dht-bootstrap-walnut:
|
|
image: registry.home.deepblack.cloud/bzzz-dht:v2.0.0
|
|
networks:
|
|
- bzzz-internal
|
|
ports:
|
|
- "9101:9101"
|
|
volumes:
|
|
- /rust/bzzz-v2/data/dht/walnut:/app/data
|
|
environment:
|
|
- DHT_PORT=9101
|
|
- NODE_NAME=walnut
|
|
- PEER_STORE_PATH=/app/data/peers
|
|
deploy:
|
|
replicas: 1
|
|
placement:
|
|
constraints:
|
|
- node.hostname == walnut
|
|
resources:
|
|
limits:
|
|
memory: 1G
|
|
cpus: '1.0'
|
|
restart_policy:
|
|
condition: on-failure
|
|
|
|
dht-bootstrap-ironwood:
|
|
image: registry.home.deepblack.cloud/bzzz-dht:v2.0.0
|
|
networks:
|
|
- bzzz-internal
|
|
ports:
|
|
- "9102:9102"
|
|
volumes:
|
|
- /rust/bzzz-v2/data/dht/ironwood:/app/data
|
|
environment:
|
|
- DHT_PORT=9102
|
|
- NODE_NAME=ironwood
|
|
- PEER_STORE_PATH=/app/data/peers
|
|
deploy:
|
|
replicas: 1
|
|
placement:
|
|
constraints:
|
|
- node.hostname == ironwood
|
|
resources:
|
|
limits:
|
|
memory: 1G
|
|
cpus: '1.0'
|
|
restart_policy:
|
|
condition: on-failure
|
|
|
|
dht-bootstrap-acacia:
|
|
image: registry.home.deepblack.cloud/bzzz-dht:v2.0.0
|
|
networks:
|
|
- bzzz-internal
|
|
ports:
|
|
- "9103:9103"
|
|
volumes:
|
|
- /rust/bzzz-v2/data/dht/acacia:/app/data
|
|
environment:
|
|
- DHT_PORT=9103
|
|
- NODE_NAME=acacia
|
|
- PEER_STORE_PATH=/app/data/peers
|
|
deploy:
|
|
replicas: 1
|
|
placement:
|
|
constraints:
|
|
- node.hostname == acacia
|
|
resources:
|
|
limits:
|
|
memory: 1G
|
|
cpus: '1.0'
|
|
restart_policy:
|
|
condition: on-failure
|
|
|
|
# PostgreSQL for metadata and conversation threading
|
|
postgres:
|
|
image: postgres:15-alpine
|
|
networks:
|
|
- bzzz-internal
|
|
environment:
|
|
- POSTGRES_DB=bzzz_v2
|
|
- POSTGRES_USER=bzzz
|
|
- POSTGRES_PASSWORD_FILE=/run/secrets/postgres_password
|
|
- POSTGRES_INITDB_ARGS=--auth-host=scram-sha-256
|
|
volumes:
|
|
- /rust/bzzz-v2/data/postgres:/var/lib/postgresql/data
|
|
- /rust/bzzz-v2/config/postgres/init:/docker-entrypoint-initdb.d:ro
|
|
secrets:
|
|
- postgres_password
|
|
deploy:
|
|
replicas: 1
|
|
placement:
|
|
constraints:
|
|
- node.hostname == walnut
|
|
resources:
|
|
limits:
|
|
memory: 4G
|
|
cpus: '2.0'
|
|
reservations:
|
|
memory: 2G
|
|
cpus: '1.0'
|
|
restart_policy:
|
|
condition: on-failure
|
|
delay: 10s
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "pg_isready -U bzzz -d bzzz_v2"]
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 3
|
|
|
|
# Redis for caching and DHT coordination
|
|
redis:
|
|
image: redis:7-alpine
|
|
networks:
|
|
- bzzz-internal
|
|
volumes:
|
|
- /rust/bzzz-v2/data/redis:/data
|
|
configs:
|
|
- source: redis_config
|
|
target: /usr/local/etc/redis/redis.conf
|
|
command: redis-server /usr/local/etc/redis/redis.conf
|
|
deploy:
|
|
replicas: 1
|
|
placement:
|
|
constraints:
|
|
- node.hostname == ironwood
|
|
resources:
|
|
limits:
|
|
memory: 2G
|
|
cpus: '1.0'
|
|
reservations:
|
|
memory: 512M
|
|
cpus: '0.5'
|
|
restart_policy:
|
|
condition: on-failure
|
|
healthcheck:
|
|
test: ["CMD", "redis-cli", "ping"]
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 3
|
|
|
|
# Conversation Thread Manager
|
|
conversation-manager:
|
|
image: registry.home.deepblack.cloud/bzzz-conversation:v2.0.0
|
|
networks:
|
|
- bzzz-internal
|
|
environment:
|
|
- POSTGRES_HOST=postgres
|
|
- REDIS_HOST=redis
|
|
- LAMPORT_CLOCK_PRECISION=microsecond
|
|
volumes:
|
|
- /rust/bzzz-v2/data/conversations:/app/conversations
|
|
secrets:
|
|
- postgres_password
|
|
deploy:
|
|
replicas: 2
|
|
placement:
|
|
max_replicas_per_node: 1
|
|
resources:
|
|
limits:
|
|
memory: 2G
|
|
cpus: '1.0'
|
|
restart_policy:
|
|
condition: on-failure
|
|
|
|
# Content Store Manager
|
|
content-store:
|
|
image: registry.home.deepblack.cloud/bzzz-content-store:v2.0.0
|
|
networks:
|
|
- bzzz-internal
|
|
volumes:
|
|
- /rust/bzzz-v2/data/blobs:/app/blobs
|
|
environment:
|
|
- BLAKE3_SHARD_DEPTH=2
|
|
- REPLICATION_FACTOR=3
|
|
- GARBAGE_COLLECTION_INTERVAL=24h
|
|
deploy:
|
|
replicas: 3
|
|
placement:
|
|
max_replicas_per_node: 1
|
|
resources:
|
|
limits:
|
|
memory: 8G
|
|
cpus: '2.0'
|
|
reservations:
|
|
memory: 4G
|
|
cpus: '1.0'
|
|
restart_policy:
|
|
condition: on-failure
|
|
|
|
networks:
|
|
tengig:
|
|
external: true
|
|
bzzz-internal:
|
|
driver: overlay
|
|
internal: true
|
|
attachable: false
|
|
ipam:
|
|
driver: default
|
|
config:
|
|
- subnet: 10.200.0.0/16
|
|
|
|
volumes:
|
|
postgres_data:
|
|
driver: local
|
|
driver_opts:
|
|
type: nfs
|
|
o: addr=192.168.1.27,rw,sync
|
|
device: ":/rust/bzzz-v2/data/postgres"
|
|
|
|
redis_data:
|
|
driver: local
|
|
driver_opts:
|
|
type: nfs
|
|
o: addr=192.168.1.27,rw,sync
|
|
device: ":/rust/bzzz-v2/data/redis"
|
|
|
|
secrets:
|
|
openai_api_key:
|
|
external: true
|
|
name: bzzz_openai_api_key
|
|
postgres_password:
|
|
external: true
|
|
name: bzzz_postgres_password
|
|
|
|
configs:
|
|
bzzz_config:
|
|
external: true
|
|
name: bzzz_v2_config
|
|
mcp_config:
|
|
external: true
|
|
name: bzzz_mcp_config
|
|
proxy_config:
|
|
external: true
|
|
name: bzzz_proxy_config
|
|
redis_config:
|
|
external: true
|
|
name: bzzz_redis_config |