🔧 Worker Daemon: базова реалізація v1
Some checks failed
Update Documentation / update-repos-info (push) Has been cancelled

- Capability Registry (Postgres heartbeat)
- NATS Client (підписка на streams)
- Job Executor (виконання jobs)
- Metrics Exporter (Prometheus)
- Dockerfile для deployment
- Виправлено server_name в NATS (emptyDir)

TODO: Реальна реалізація embed/retrieve/summarize, Matrix Gateway, Auth
This commit is contained in:
Apple
2026-01-10 10:24:13 -08:00
parent 8fe0b58978
commit a688666fa1
10 changed files with 778 additions and 0 deletions

View File

@@ -0,0 +1,76 @@
#!/bin/bash
# Ініціалізація NATS JetStream streams через kubectl exec
# Використання: ./init-streams-kubectl.sh
set -e
echo "🚀 Ініціалізація NATS JetStream streams через kubectl..."
# Встановлюємо NATS CLI в pod (якщо потрібно)
echo "=== Встановлення NATS CLI в pod ==="
kubectl exec -n nats nats-0 -- sh -c 'apk add --no-cache curl && curl -L https://github.com/nats-io/natscli/releases/latest/download/nats-linux-amd64.zip -o /tmp/nats.zip && unzip -o /tmp/nats.zip -d /tmp && chmod +x /tmp/nats' || echo "NATS CLI встановлення..."
NATS_URL="nats://nats-client.nats:4222"
echo ""
echo "=== Створення Stream MM_ONLINE ==="
kubectl exec -n nats nats-0 -- /tmp/nats stream add MM_ONLINE \
--server="$NATS_URL" \
--subjects="mm.embed.online,mm.retrieve.online,mm.summarize.online" \
--storage=file \
--replicas=2 \
--max-age=30m \
--max-deliver=3 \
--ack \
--discard=old \
--duplicate-window=5m \
--retention=limits \
--yes || echo "Stream вже існує або помилка"
echo ""
echo "=== Створення Stream MM_OFFLINE ==="
kubectl exec -n nats nats-0 -- /tmp/nats stream add MM_OFFLINE \
--server="$NATS_URL" \
--subjects="mm.embed.offline,mm.index.offline,mm.backfill.offline" \
--storage=file \
--replicas=2 \
--max-age=7d \
--max-deliver=10 \
--ack \
--discard=old \
--retention=limits \
--yes || echo "Stream вже існує або помилка"
echo ""
echo "=== Створення Stream MM_WRITE ==="
kubectl exec -n nats nats-0 -- /tmp/nats stream add MM_WRITE \
--server="$NATS_URL" \
--subjects="mm.qdrant.upsert,mm.pg.write,mm.neo4j.write" \
--storage=file \
--replicas=2 \
--max-age=7d \
--max-deliver=10 \
--ack \
--discard=old \
--retention=limits \
--yes || echo "Stream вже існує або помилка"
echo ""
echo "=== Створення Stream MM_EVENTS ==="
kubectl exec -n nats nats-0 -- /tmp/nats stream add MM_EVENTS \
--server="$NATS_URL" \
--subjects="mm.event.audit,mm.event.status" \
--storage=file \
--replicas=2 \
--max-age=30d \
--ack \
--discard=old \
--retention=limits \
--yes || echo "Stream вже існує або помилка"
echo ""
echo "=== Перевірка streams ==="
kubectl exec -n nats nats-0 -- /tmp/nats stream ls --server="$NATS_URL" || echo "Помилка перевірки"
echo ""
echo "✅ Streams створено!"

View File

@@ -0,0 +1,93 @@
#!/usr/bin/env python3
"""
Ініціалізація NATS JetStream streams для Memory Module
Використання: python3 init-streams.py <nats-url>
"""
import sys
import json
import requests
from typing import Dict, Any
NATS_URL = sys.argv[1] if len(sys.argv) > 1 else "nats://nats-client.nats:4222"
NATS_HTTP = NATS_URL.replace("nats://", "http://").replace(":4222", ":8222")
def create_stream(stream_config: Dict[str, Any]) -> bool:
"""Створює stream через NATS HTTP API"""
url = f"{NATS_HTTP}/jsz?streams=1"
# NATS HTTP API використовує інший формат
# Спробуємо через JetStream API
try:
# Для створення stream потрібен NATS CLI або Go/Python клієнт
# Тимчасово використовуємо curl через kubectl exec
print(f"⚠️ Stream '{stream_config['name']}' потрібно створити через NATS CLI")
print(f" Використайте: kubectl exec -n nats nats-0 -- nats stream add {stream_config['name']} ...")
return False
except Exception as e:
print(f"❌ Помилка створення stream: {e}")
return False
def main():
print(f"🚀 Ініціалізація NATS JetStream streams...")
print(f"NATS URL: {NATS_URL}")
print(f"NATS HTTP: {NATS_HTTP}")
streams = [
{
"name": "MM_ONLINE",
"subjects": ["mm.embed.online", "mm.retrieve.online", "mm.summarize.online"],
"retention": "limits",
"max_age": 1800000000000, # 30 хв
"max_deliver": 3,
"ack_policy": "explicit",
"storage": "file",
"replicas": 2,
"discard": "old",
"duplicate_window": 300000000000
},
{
"name": "MM_OFFLINE",
"subjects": ["mm.embed.offline", "mm.index.offline", "mm.backfill.offline"],
"retention": "limits",
"max_age": 604800000000000, # 7 днів
"max_deliver": 10,
"ack_policy": "explicit",
"storage": "file",
"replicas": 2,
"discard": "old"
},
{
"name": "MM_WRITE",
"subjects": ["mm.qdrant.upsert", "mm.pg.write", "mm.neo4j.write"],
"retention": "limits",
"max_age": 604800000000000, # 7 днів
"max_deliver": 10,
"ack_policy": "explicit",
"storage": "file",
"replicas": 2,
"discard": "old"
},
{
"name": "MM_EVENTS",
"subjects": ["mm.event.audit", "mm.event.status"],
"retention": "limits",
"max_age": 2592000000000000, # 30 днів
"ack_policy": "explicit",
"storage": "file",
"replicas": 2,
"discard": "old"
}
]
print("\n📋 Streams для створення:")
for stream in streams:
print(f" - {stream['name']}: {', '.join(stream['subjects'])}")
print("\n⚠️ Для створення streams потрібен NATS CLI.")
print(" Використайте init-streams.sh або встановіть NATS CLI в контейнер.")
return 0
if __name__ == "__main__":
sys.exit(main())