## Agents Added - Alateya: R&D, biotech, innovations - Clan (Spirit): Community spirit agent - Eonarch: Consciousness evolution agent ## Changes - docker-compose.node1.yml: Added tokens for all 3 new agents - gateway-bot/http_api.py: Added configs and webhook endpoints - gateway-bot/clan_prompt.txt: New prompt file - gateway-bot/eonarch_prompt.txt: New prompt file ## Fixes - Fixed ROUTER_URL from :9102 to :8000 (internal container port) - All 9 Telegram agents now working ## Documentation - Created PROJECT-MASTER-INDEX.md - single entry point - Added various status documents and scripts Tokens configured: - Helion, NUTRA, Agromatrix (existing) - Alateya, Clan, Eonarch (new) - Druid, GreenFood, DAARWIZZ (configured)
14 KiB
🗄️ Database & Persistence Audit — NODA1 & NODA2
Date: 2026-01-22
Purpose: Повний аудит конфігурації БД, агентів та persistent storage
Goal: Запобігти втраті даних при rebuild контейнерів
🔍 Проблема
"Агенти працюють нормально, але ми вже вдруге налаштовуємо базу даних"
Symptoms:
- Дані зникають після rebuild контейнерів
- Потрібно повторно налаштовувати БД
- Collections в Qdrant порожні
✅ Що працює ПРАВИЛЬНО
1. Docker Volumes налаштовані
NODA1 (docker-compose.node1.yml)
volumes:
qdrant-data-node1: ✅ 20KB (порожній)
neo4j-data-node1: ✅ Є
postgres_data_node1: ✅ 81MB (АКТИВНИЙ)
redis-data-node1: ✅ Є
minio-data-node1: ✅ Є
nats-data-node1: ✅ Є
# ... інші volumes
Поточний стан:
- ✅ Volumes створені
- ✅ PostgreSQL має 81MB даних
- ✅ Дані зберігаються в
/var/lib/docker/volumes/
2. Агенти налаштовані
7 активних Telegram ботів:
- DAARWIZZ (
agent_id="daarwizz") - Helion (
agent_id="helion") - GREENFOOD (
agent_id="greenfood") - AgroMatrix (
agent_id="agromatrix") - NUTRA (
agent_id="nutra") - Druid (
agent_id="druid") - Alateya (
agent_id="alateya") - без токену
Конфігурації:
- Файл:
gateway-bot/http_api.py - Кожен має унікальний
agent_id - Кожен має окремий prompt файл
3. PostgreSQL працює
Бази даних:
daarion_main -- Artifacts (3 таблиці)
daarion_memory -- user_facts (з agent_id полем!)
rag -- RAG сервіс
postgres -- System DB
user_facts structure:
Columns:
- agent_id TEXT (з індексом!)
- user_id TEXT
- team_id TEXT
- fact_key TEXT
- fact_value TEXT
- fact_value_json JSONB
Unique constraint:
(user_id, team_id, agent_id, fact_key)
Реальні дані (станом на 2026-01-22):
nutra- 3 записиagromatrix- 2 записи- Деякі без
agent_id(глобальні profiles)
✅ PostgreSQL зберігає дані правильно!
⚠️ Проблеми та їх причини
1. Qdrant Collections порожні
Факт:
curl http://localhost:6333/collections
# Result: {"collections": []}
Причина:
- Volume існує:
qdrant-data-node1(20KB - тільки metadata) - Router ще не створив collections
- Або collections створені, але volume був очищений
Як має бути: Router динамічно створює collections:
{agent_id}_messages{agent_id}_memory_items{agent_id}_docs
Приклад: agromatrix_messages, greenfood_messages, тощо
2. Volume naming мismatch
Виявлено дублювання:
postgres_data_node1 81MB (СТАРИЙ)
microdao-daarion_postgres_data_node1 81MB (АКТИВНИЙ)
Активний: microdao-daarion_postgres_data_node1
Проблема:
- Docker Compose автоматично додає prefix
microdao-daarion_ - В
docker-compose.node1.ymlвказано простоpostgres_data_node1 - Docker створює
{project}_postgres_data_node1
3. Відсутність backup стратегії
Поточний стан:
- ❌ Немає автоматичних backups PostgreSQL
- ❌ Немає backups Qdrant
- ❌ Немає backups Neo4j
- ✅ Є cron backup (3 AM) на host рівні
З документації (docker-compose.db.yml):
db-backup:
image: prodrigestivill/postgres-backup-local:latest
environment:
SCHEDULE: "@every 12h"
BACKUP_KEEP_DAYS: 7
BACKUP_KEEP_WEEKS: 4
BACKUP_KEEP_MONTHS: 6
volumes:
- ./db_backups:/backups
⚠️ Цей сервіс НЕ запущений на NОДА1!
🎯 Чому дані "зникають"
Сценарій 1: Rebuild контейнера БЕЗ volumes
# НЕБЕЗПЕЧНО!
docker rm -f dagi-postgres
docker run ... postgres:16 # Без -v
# Результат: Новий контейнер з порожньою БД
Сценарій 2: Очищення volumes
# ДУЖЕ НЕБЕЗПЕЧНО!
docker volume rm qdrant-data-node1
# Результат: Всі дані Qdrant втрачені назавжди
Сценарій 3: Неправильний COMPOSE_PROJECT_NAME
# Якщо змінюється project name:
COMPOSE_PROJECT_NAME=dagi_node1 docker compose up
# vs
COMPOSE_PROJECT_NAME=microdao-daarion docker compose up
# Docker створює РІЗНІ volumes!
🔧 Рекомендації (КРИТИЧНО)
1. Зафіксувати volume names
Оновити docker-compose.node1.yml:
volumes:
qdrant-data-node1:
name: qdrant-data-node1 # EXPLICIT NAME
driver: local
postgres_data_node1:
name: postgres-data-node1 # EXPLICIT NAME
driver: local
neo4j-data-node1:
name: neo4j-data-node1
driver: local
Чому: Запобігає створенню volumes з prefix-ами
2. Додати автоматичні backups
Створити docker-compose.backups.yml:
version: "3.9"
services:
postgres-backup:
image: prodrigestivill/postgres-backup-local:15
container_name: postgres-backup-node1
restart: unless-stopped
environment:
POSTGRES_HOST: dagi-postgres
POSTGRES_DB: daarion_main,daarion_memory,rag
POSTGRES_USER: daarion
POSTGRES_PASSWORD: DaarionDB2026!
SCHEDULE: "@every 6h"
BACKUP_KEEP_DAYS: 7
BACKUP_KEEP_WEEKS: 4
BACKUP_KEEP_MONTHS: 6
POSTGRES_EXTRA_OPTS: "-Z9 --schema=public --blobs"
volumes:
- /opt/backups/postgres:/backups
networks:
- dagi-network
qdrant-backup:
image: qdrant/qdrant:latest
container_name: qdrant-backup-node1
restart: "no"
environment:
SCHEDULE: "@daily"
volumes:
- qdrant-data-node1:/qdrant/storage:ro
- /opt/backups/qdrant:/backups
command: >
sh -c "
tar czf /backups/qdrant-$(date +%Y%m%d-%H%M%S).tar.gz /qdrant/storage &&
find /backups -name 'qdrant-*.tar.gz' -mtime +30 -delete
"
networks:
- dagi-network
networks:
dagi-network:
external: true
volumes:
qdrant-data-node1:
external: true
name: qdrant-data-node1
Запуск:
docker compose -f docker-compose.backups.yml up -d postgres-backup
3. Створити restore процедури
Файл: scripts/restore-from-backup.sh
#!/bin/bash
# Restore PostgreSQL from backup
BACKUP_FILE="$1"
DATABASE="${2:-daarion_memory}"
if [ -z "$BACKUP_FILE" ]; then
echo "Usage: $0 <backup_file> [database]"
echo "Example: $0 /opt/backups/postgres/daarion_memory-20260122-030000.sql.gz"
exit 1
fi
echo "Restoring $DATABASE from $BACKUP_FILE..."
# Stop services that use this DB
docker compose -f docker-compose.node1.yml stop dagi-memory-service-node1 dagi-router-node1
# Restore
gunzip -c "$BACKUP_FILE" | docker exec -i dagi-postgres psql -U daarion -d "$DATABASE"
# Restart services
docker compose -f docker-compose.node1.yml start dagi-memory-service-node1 dagi-router-node1
echo "✅ Restore complete!"
4. Додати pre-rebuild checks
Файл: scripts/safe-rebuild.sh
#!/bin/bash
# Safe container rebuild with backup verification
SERVICE="$1"
if [ -z "$SERVICE" ]; then
echo "Usage: $0 <service_name>"
exit 1
fi
echo "🔍 Pre-rebuild checks for $SERVICE..."
# 1. Check volumes
echo "📦 Checking volumes..."
docker inspect "$SERVICE" | grep -A20 "Mounts"
# 2. Backup first
echo "💾 Creating backup..."
case "$SERVICE" in
dagi-postgres)
docker exec dagi-postgres pg_dumpall -U daarion | gzip > "/opt/backups/manual/postgres-$(date +%Y%m%d-%H%M%S).sql.gz"
;;
dagi-qdrant-node1)
tar czf "/opt/backups/manual/qdrant-$(date +%Y%m%d-%H%M%S).tar.gz" /var/lib/docker/volumes/qdrant-data-node1/_data
;;
esac
# 3. Confirm
read -p "⚠️ Proceed with rebuild? (yes/no): " CONFIRM
if [ "$CONFIRM" != "yes" ]; then
echo "❌ Aborted"
exit 0
fi
# 4. Rebuild
echo "🔨 Rebuilding $SERVICE..."
docker compose -f docker-compose.node1.yml up -d --build --force-recreate "$SERVICE"
echo "✅ Rebuild complete!"
5. Документувати volume layout
Створити VOLUMES-LAYOUT.md:
# Docker Volumes Layout — NODA1
## PostgreSQL
Volume: `postgres-data-node1` (або `microdao-daarion_postgres_data_node1`)
Path: `/var/lib/docker/volumes/postgres-data-node1/_data`
Size: ~81MB
Databases: daarion_main, daarion_memory, rag
Backup: Every 6h → /opt/backups/postgres/
## Qdrant
Volume: `qdrant-data-node1`
Path: `/var/lib/docker/volumes/qdrant-data-node1/_data`
Size: ~20KB (пусто після rebuild!)
Collections: {agent_id}_messages, {agent_id}_memory_items, {agent_id}_docs
Backup: Daily → /opt/backups/qdrant/
## Neo4j
Volume: `neo4j-data-node1`, `neo4j-logs-node1`
Path: `/var/lib/docker/volumes/neo4j-data-node1/_data`
Backup: Manual (cypher-shell DUMP)
## Redis
Volume: `redis-data-node1`
Path: `/var/lib/docker/volumes/redis-data-node1/_data`
Backup: RDB snapshots every 1h
## MinIO
Volume: `minio-data-node1`
Path: `/var/lib/docker/volumes/minio-data-node1/_data`
Purpose: Artifacts, images, files
Backup: S3 sync to external storage
📋 Action Plan (Терміново)
Крок 1: Backup ЗАРАЗ
# На НОДА1
ssh root@144.76.224.179
# PostgreSQL
docker exec dagi-postgres pg_dumpall -U daarion | gzip > /root/postgres-emergency-$(date +%Y%m%d-%H%M%S).sql.gz
# Qdrant
tar czf /root/qdrant-emergency-$(date +%Y%m%d-%H%M%S).tar.gz /var/lib/docker/volumes/qdrant-data-node1/_data
# Neo4j
tar czf /root/neo4j-emergency-$(date +%Y%m%d-%H%M%S).tar.gz /var/lib/docker/volumes/neo4j-data-node1/_data
ls -lh /root/*emergency*.tar.gz
Крок 2: Зафіксувати volume names
# На НОДА1
cd /opt/microdao-daarion
cp docker-compose.node1.yml docker-compose.node1.yml.backup-$(date +%Y%m%d)
# Редагувати volumes секцію (додати explicit names)
nano docker-compose.node1.yml
# Рестарт з новими іменами
docker compose -f docker-compose.node1.yml up -d
Крок 3: Налаштувати автоматичні backups
# Створити директорії
mkdir -p /opt/backups/{postgres,qdrant,neo4j,manual}
# Створити docker-compose.backups.yml
nano docker-compose.backups.yml
# Запустити
docker compose -f docker-compose.backups.yml up -d
Крок 4: Створити restore scripts
mkdir -p /opt/scripts
nano /opt/scripts/restore-from-backup.sh
chmod +x /opt/scripts/restore-from-backup.sh
nano /opt/scripts/safe-rebuild.sh
chmod +x /opt/scripts/safe-rebuild.sh
Крок 5: Протестувати backup/restore
# Test backup
docker exec postgres-backup-node1 sh -c "/backup.sh"
ls -lh /opt/backups/postgres/
# Test restore (на staging БД)
# НЕ на production!
🔐 Safety Rules (ЗАВЖДИ дотримуватись)
НІКОЛИ не робити:
❌ docker volume rm <volume-name>
❌ docker compose down -v
❌ docker system prune -a --volumes
❌ rm -rf /var/lib/docker/volumes/<volume>
ЗАВЖДИ робити:
✅ Backup ПЕРЕД rebuild
✅ Перевірити volumes ПЕРЕД видаленням контейнера
✅ Використовувати explicit volume names
✅ Тестувати restore процедури
✅ Зберігати backups поза сервером
📊 Поточний стан volumes
# NОДА1 volumes (станом на 2026-01-22)
postgres_data_node1: 81MB ✅ АКТИВНИЙ, є дані
microdao-daarion_postgres_data_node1: 81MB ✅ АКТИВНИЙ (те саме)
qdrant-data-node1: 20KB ⚠️ ПОРОЖНІЙ
microdao-daarion_qdrant-data-node1: 20KB ⚠️ ПОРОЖНІЙ
neo4j-data-node1: ??? ✅ Є
redis-data-node1: ??? ✅ Є
🎯 Висновок
Що працює:
✅ Docker volumes налаштовані
✅ PostgreSQL зберігає дані (81MB)
✅ Агенти працюють з правильними agent_id
✅ Ізоляція пам'яті між агентами правильна
Що потрібно:
⚠️ Зафіксувати volume names (explicit)
⚠️ Налаштувати автоматичні backups
⚠️ Створити restore процедури
⚠️ Протестувати backup/restore
⚠️ Документувати процедури
Чому "знову налаштовуємо":
❌ Qdrant контейнер пересоздавали без збереження даних
❌ Collections не створилися автоматично після rebuild
❌ Немає backup стратегії
❌ Немає документації про restore
Next Steps: Виконати Action Plan (5 кроків)
Priority: КРИТИЧНО - створити backups ЗАРАЗ
Документація: Оновити INFRASTRUCTURE.md з процедурами backup/restore