🔧 Worker Daemon: базова реалізація v1
Some checks failed
Update Documentation / update-repos-info (push) Has been cancelled
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:
76
infrastructure/nats/init-streams-kubectl.sh
Executable file
76
infrastructure/nats/init-streams-kubectl.sh
Executable 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 створено!"
|
||||
93
infrastructure/nats/init-streams.py
Executable file
93
infrastructure/nats/init-streams.py
Executable 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())
|
||||
Reference in New Issue
Block a user