chore(infra): add NODA2 setup files, docker-compose configs and root config

- AGENTS.md: Sofiia Chief AI Architect role definition
- SOFIIA_IN_OPENCODE.md, SOFIIA_NODA2_SETUP.md: NODA2 setup documentation
- agromatrix_stepan_noda1_APPLY.md, agromatrix_stepan_noda1_prod.patch: AgroMatrix production patch
- docker-compose.memory-node2.yml: memory service for NODA2
- docker-compose.node2-sofiia-supervisor.yml: sofiia supervisor for NODA2
- gateway-bot/gateway_boot.py, monitor_prompt.txt, vision_guard.py: gateway extras
- models/Modelfile.qwen3.5-35b-a3b: Qwen model definition for NODA3
- opencode.json: OpenCode providers and agents config
- scripts/init-sofiia-memory.py, scripts/node2/*, start-memory-node2.sh: NODA2 init scripts
- setup_sofiia_node2.sh: NODA2 full setup script

Made-with: Cursor
This commit is contained in:
Apple
2026-03-03 07:15:20 -08:00
parent 67225a39fa
commit fa749fa56c
16 changed files with 2849 additions and 0 deletions

View File

@@ -0,0 +1,211 @@
version: "3.8"
services:
# Vector Database - Qdrant
qdrant-node2:
image: qdrant/qdrant:v1.12.4
container_name: dagi-qdrant-node2
ports:
- "6333:6333"
- "6334:6334"
volumes:
- ./data/qdrant-node2:/qdrant/storage
environment:
- QDRANT__SERVICE__HOST=0.0.0.0
- QDRANT__SERVICE__GRPC_PORT=6334
networks:
dagi-memory-network:
aliases:
- qdrant
- dagi-qdrant
- qdrant-node2
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "bash -lc '</dev/tcp/127.0.0.1/6333'"]
interval: 30s
timeout: 10s
retries: 3
start_period: 20s
# Relational Database - PostgreSQL
postgres-node2:
image: postgres:16-alpine
container_name: dagi-postgres-node2
ports:
- "5433:5432"
environment:
- POSTGRES_DB=daarion_memory
- POSTGRES_USER=daarion
- POSTGRES_PASSWORD=daarion_secret_node2
- POSTGRES_INITDB_ARGS=--encoding=UTF-8 --locale=en_US.UTF-8
volumes:
- ./data/postgres-node2:/var/lib/postgresql/data
- ./services/memory-service/init.sql:/docker-entrypoint-initdb.d/init.sql:ro
networks:
dagi-memory-network:
aliases:
- postgres
- dagi-postgres
- postgres-node2
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "pg_isready -U daarion -d daarion_memory"]
interval: 30s
timeout: 10s
retries: 3
start_period: 30s
# Graph Database - Neo4j (Optional but recommended)
neo4j-node2:
image: neo4j:5.15-community
container_name: dagi-neo4j-node2
ports:
- "7474:7474"
- "7687:7687"
environment:
- NEO4J_AUTH=neo4j/daarion_node2_secret
- NEO4J_server_memory_heap_initial__size=512m
- NEO4J_server_memory_heap_max__size=1G
- NEO4J_server_memory_pagecache_size=512m
- NEO4J_dbms_security_procedures_unrestricted=apoc.*
- NEO4J_dbms_security_allow__csv__import__from__file__urls=true
volumes:
- ./data/neo4j-node2:/data
- ./data/neo4j-node2/logs:/logs
networks:
dagi-memory-network:
aliases:
- neo4j
- dagi-neo4j
- neo4j-node2
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "wget -q --spider http://localhost:7474 || exit 1"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
# Memory Service
memory-service-node2:
build:
context: ./services/memory-service
dockerfile: Dockerfile
container_name: dagi-memory-service-node2
ports:
- "8000:8000"
environment:
# Settings in app/config.py use env_prefix="MEMORY_"
- MEMORY_SERVICE_NAME=memory-service
- MEMORY_POSTGRES_HOST=postgres-node2
- MEMORY_POSTGRES_PORT=5432
- MEMORY_POSTGRES_USER=daarion
- MEMORY_POSTGRES_PASSWORD=daarion_secret_node2
- MEMORY_POSTGRES_DB=daarion_memory
- MEMORY_QDRANT_HOST=qdrant-node2
- MEMORY_QDRANT_PORT=6333
- MEMORY_COHERE_API_KEY=${COHERE_API_KEY}
- MEMORY_DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY}
# Qdrant configuration
- QDRANT_HOST=qdrant-node2
- QDRANT_PORT=6333
- QDRANT_GRPC_PORT=6334
# PostgreSQL configuration
- DATABASE_URL=postgresql://daarion:daarion_secret_node2@postgres-node2:5432/daarion_memory
- DB_HOST=postgres-node2
- DB_PORT=5432
- DB_NAME=daarion_memory
- DB_USER=daarion
- DB_PASSWORD=daarion_secret_node2
# Neo4j configuration (optional)
- NEO4J_URI=bolt://neo4j-node2:7687
- NEO4J_USER=neo4j
- NEO4J_PASSWORD=daarion_node2_secret
# Cohere API for embeddings
- COHERE_API_KEY=${COHERE_API_KEY}
# Node identification
- NODE_ID=node2
- NODE_ENV=development
# Logging
- LOG_LEVEL=INFO
- PYTHONUNBUFFERED=1
# Memory settings
- MEMORY_MODE=local
- EMBEDDING_MODEL=embed-multilingual-v3.0
- EMBEDDING_DIMENSION=1024
# Optional: Remote NODA1 access (hybrid mode)
# Uncomment to enable read access to NODA1
# - REMOTE_QDRANT_HOST=144.76.224.179
# - REMOTE_QDRANT_PORT=6333
# - REMOTE_DATABASE_URL=postgresql://daarion_reader:***@144.76.224.179:5432/daarion_memory
# - READ_ONLY_MODE=false
depends_on:
qdrant-node2:
condition: service_healthy
postgres-node2:
condition: service_healthy
neo4j-node2:
condition: service_healthy
networks:
dagi-memory-network:
aliases:
- memory-service
- memory-service-node2
restart: unless-stopped
healthcheck:
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')"]
interval: 30s
timeout: 10s
retries: 3
start_period: 30s
volumes:
- /Users/apple/Desktop/R&D:/vault/rd:ro
- /Users/apple/Documents/Obsidian Vault:/vault/obsidian:ro
# Redis for caching (optional but recommended)
redis-node2:
image: redis:7-alpine
container_name: dagi-redis-node2
ports:
- "6379:6379"
volumes:
- ./data/redis-node2:/data
networks:
- dagi-memory-network
restart: unless-stopped
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 30s
timeout: 10s
retries: 3
# Adminer - Database management UI (optional)
adminer:
image: adminer:latest
container_name: dagi-adminer-node2
ports:
- "8080:8080"
networks:
- dagi-memory-network
restart: unless-stopped
depends_on:
- postgres-node2
networks:
dagi-memory-network:
driver: bridge
name: dagi-memory-network-node2
volumes:
qdrant-data:
postgres-data:
neo4j-data:
redis-data: