fix(nodes): Normalize Router/Swapper endpoints and fix NODE2 display
Major changes: - Normalize get_node_endpoints to use ENV vars (ROUTER_BASE_URL, SWAPPER_BASE_URL) - Remove node_id-based URL selection logic - Add fallback direct API call in get_node_swapper_detail - Fix Swapper API endpoint (/models instead of /api/v1/models) - Add router_healthy and router_version to node_heartbeat fallback - Add ENV vars to docker-compose for Router/Swapper URLs Documentation: - Add TASK_PHASE_NODE2_ROUTER_SWAPPER_FIX.md with full task description - Add NODE2_GUARDIAN_SETUP.md with setup instructions This fixes: - Swapper models not showing for NODE1 and NODE2 - DAGI Router agents not showing for NODE2 - Router/Swapper showing as Down/Degraded when they're actually up
This commit is contained in:
@@ -3345,36 +3345,41 @@ async def get_node_metrics_current(node_id: str) -> Optional[Dict[str, Any]]:
|
||||
|
||||
async def get_node_endpoints(node_id: str) -> Dict[str, str]:
|
||||
"""
|
||||
Отримати URL endpoints для конкретної ноди.
|
||||
Якщо в БД немає значень — підставляє дефолти на основі node_id.
|
||||
Отримати URL endpoints для DAGI Router та Swapper Service.
|
||||
|
||||
Використовує ENV змінні для базових URL (один для всіх нод у проді).
|
||||
Якщо в БД є специфічні URL для ноди - використовує їх, інакше - ENV дефолти.
|
||||
|
||||
ENV змінні:
|
||||
- ROUTER_BASE_URL (default: http://dagi-router:9102 для проді)
|
||||
- SWAPPER_BASE_URL (default: http://swapper-service:8890 для проді)
|
||||
|
||||
Для DEV (локальний запуск на Mac):
|
||||
- ROUTER_BASE_URL=http://localhost:9102
|
||||
- SWAPPER_BASE_URL=http://localhost:8890
|
||||
"""
|
||||
pool = await get_pool()
|
||||
|
||||
# Get node-specific URLs from DB if exist
|
||||
row = await pool.fetchrow("""
|
||||
SELECT router_url, swapper_url
|
||||
FROM node_cache
|
||||
WHERE node_id = $1
|
||||
""", node_id)
|
||||
|
||||
# Determine defaults based on node_id
|
||||
is_node2 = "node-2" in node_id.lower() or "macbook" in node_id.lower()
|
||||
# Get base URLs from ENV (one for all nodes in production)
|
||||
router_base = os.getenv("ROUTER_BASE_URL", "http://dagi-router:9102")
|
||||
swapper_base = os.getenv("SWAPPER_BASE_URL", "http://swapper-service:8890")
|
||||
|
||||
if is_node2:
|
||||
# NODE2 defaults (localhost or IP-based)
|
||||
defaults = {
|
||||
"router_url": "http://localhost:9102",
|
||||
"swapper_url": "http://localhost:8890"
|
||||
}
|
||||
else:
|
||||
# NODE1 defaults (Docker-based)
|
||||
defaults = {
|
||||
"router_url": "http://dagi-router:9102",
|
||||
"swapper_url": "http://swapper-service:8890"
|
||||
}
|
||||
defaults = {
|
||||
"router_url": router_base,
|
||||
"swapper_url": swapper_base
|
||||
}
|
||||
|
||||
if not row:
|
||||
return defaults
|
||||
|
||||
# Use DB values if present, otherwise fallback to ENV defaults
|
||||
return {
|
||||
"router_url": row["router_url"] or defaults["router_url"],
|
||||
"swapper_url": row["swapper_url"] or defaults["swapper_url"]
|
||||
@@ -3863,7 +3868,11 @@ async def node_heartbeat(
|
||||
swapper_state = CASE
|
||||
WHEN $12::jsonb IS NOT NULL THEN $12::jsonb
|
||||
ELSE swapper_state
|
||||
END
|
||||
END,
|
||||
router_healthy = COALESCE($13::boolean, router_healthy),
|
||||
router_version = COALESCE($14, router_version),
|
||||
router_url = COALESCE($15, router_url),
|
||||
swapper_url = COALESCE($16, swapper_url)
|
||||
WHERE node_id = $1
|
||||
""",
|
||||
node_id,
|
||||
@@ -3877,7 +3886,11 @@ async def node_heartbeat(
|
||||
metrics.get("swapper_healthy"),
|
||||
metrics.get("swapper_models_loaded"),
|
||||
metrics.get("swapper_models_total"),
|
||||
swapper_state_json
|
||||
swapper_state_json,
|
||||
metrics.get("router_healthy"),
|
||||
metrics.get("router_version"),
|
||||
metrics.get("router_url"),
|
||||
metrics.get("swapper_url")
|
||||
)
|
||||
|
||||
return {
|
||||
|
||||
Reference in New Issue
Block a user