Files
microdao-daarion/site/NODE_INFRASTRUCTURE_STANDARDS/index.html
Apple ef3473db21 snapshot: NODE1 production state 2026-02-09
Complete snapshot of /opt/microdao-daarion/ from NODE1 (144.76.224.179).
This represents the actual running production code that has diverged
significantly from the previous main branch.

Key changes from old main:
- Gateway (http_api.py): expanded from ~40KB to 164KB with full agent support
- Router: new /v1/agents/{id}/infer endpoint with vision + DeepSeek routing
- Behavior Policy: SOWA v2.2 (3-level: FULL/ACK/SILENT)
- Agent Registry: config/agent_registry.yml as single source of truth
- 13 agents configured (was 3)
- Memory service integration
- CrewAI teams and roles

Excluded from snapshot: venv/, .env, data/, backups, .tgz archives

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-09 08:46:46 -08:00

1719 lines
59 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="canonical" href="https://IvanTytar.github.io/microdao-daarion/NODE_INFRASTRUCTURE_STANDARDS/">
<link rel="icon" href="../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.5.3, mkdocs-material-9.5.18">
<title>🏗️ Стандарти Інфраструктури НОД — DAARION Ecosystem - DAARION Documentation</title>
<link rel="stylesheet" href="../assets/stylesheets/main.66ac8b77.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#daarion-ecosystem" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href=".." title="DAARION Documentation" class="md-header__button md-logo" aria-label="DAARION Documentation" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z"/></svg>
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
DAARION Documentation
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
🏗️ Стандарти Інфраструктури НОД — DAARION Ecosystem
</span>
</div>
</div>
</div>
<script>var media,input,key,value,palette=__md_get("__palette");if(palette&&palette.color){"(prefers-color-scheme)"===palette.color.media&&(media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']"),palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent"));for([key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
</button>
</nav>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href=".." title="DAARION Documentation" class="md-nav__button md-logo" aria-label="DAARION Documentation" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z"/></svg>
</a>
DAARION Documentation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../public/" class="md-nav__link">
<span class="md-ellipsis">
Home
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../public/getting-started/" class="md-nav__link">
<span class="md-ellipsis">
Getting Started
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../public/architecture-overview/" class="md-nav__link">
<span class="md-ellipsis">
Architecture
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../public/daiS_daos_overview/" class="md-nav__link">
<span class="md-ellipsis">
DAIS & DAOS
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="">
<span class="md-ellipsis">
Internal
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
Internal
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_1" >
<label class="md-nav__link" for="__nav_5_1" id="__nav_5_1_label" tabindex="0">
<span class="md-ellipsis">
Infra
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_1_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5_1">
<span class="md-nav__icon md-icon"></span>
Infra
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../internal/infra/INFRA_AUTOMATION_PACK_V1/" class="md-nav__link">
<span class="md-ellipsis">
Infra Automation Pack v1
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../internal/infra/monitoring_overview/" class="md-nav__link">
<span class="md-ellipsis">
Monitoring Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../internal/infra/nodes_registry_v0/" class="md-nav__link">
<span class="md-ellipsis">
Nodes Registry v0
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_2" >
<label class="md-nav__link" for="__nav_5_2" id="__nav_5_2_label" tabindex="0">
<span class="md-ellipsis">
Specs
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5_2">
<span class="md-nav__icon md-icon"></span>
Specs
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../internal/specs/matrix_presence_aggregator/" class="md-nav__link">
<span class="md-ellipsis">
Matrix Presence Aggregator
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../internal/specs/city_map_spec/" class="md-nav__link">
<span class="md-ellipsis">
City Map Spec
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../internal/specs/node_join_protocol_draft/" class="md-nav__link">
<span class="md-ellipsis">
Node Join Protocol (Draft)
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#_1" class="md-nav__link">
<span class="md-ellipsis">
🎯 Принципи
</span>
</a>
<nav class="md-nav" aria-label="🎯 Принципи">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#1-consistency-first" class="md-nav__link">
<span class="md-ellipsis">
1. Consistency First
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#2-isolation-with-integration" class="md-nav__link">
<span class="md-ellipsis">
2. Isolation with Integration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#3-observable-by-default" class="md-nav__link">
<span class="md-ellipsis">
3. Observable by Default
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#4-git-as-source-of-truth" class="md-nav__link">
<span class="md-ellipsis">
4. Git as Source of Truth
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#5-rollback-ready" class="md-nav__link">
<span class="md-ellipsis">
5. Rollback Ready
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#_2" class="md-nav__link">
<span class="md-ellipsis">
📁 Стандартна Структура Ноди
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_3" class="md-nav__link">
<span class="md-ellipsis">
🔢 Стандартні Порти
</span>
</a>
<nav class="md-nav" aria-label="🔢 Стандартні Порти">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#core-infrastructure" class="md-nav__link">
<span class="md-ellipsis">
Core Infrastructure
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#dagi-stack-production" class="md-nav__link">
<span class="md-ellipsis">
DAGI Stack (Production)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#phase-1-3-mvp-services" class="md-nav__link">
<span class="md-ellipsis">
Phase 1-3 MVP Services
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#multimodal-services-2-initially" class="md-nav__link">
<span class="md-ellipsis">
Multimodal Services (НОДА2 initially)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#api-routing-standards" class="md-nav__link">
<span class="md-ellipsis">
🌐 API Routing Standards
</span>
</a>
<nav class="md-nav" aria-label="🌐 API Routing Standards">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#nginxgateway" class="md-nav__link">
<span class="md-ellipsis">
Через Nginx/Gateway
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#websocket" class="md-nav__link">
<span class="md-ellipsis">
WebSocket
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#docker-standards" class="md-nav__link">
<span class="md-ellipsis">
🐳 Docker Standards
</span>
</a>
<nav class="md-nav" aria-label="🐳 Docker Standards">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#naming-convention" class="md-nav__link">
<span class="md-ellipsis">
Naming Convention
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#labels" class="md-nav__link">
<span class="md-ellipsis">
Labels (для моніторингу)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#health-check-standards" class="md-nav__link">
<span class="md-ellipsis">
📊 Health Check Standards
</span>
</a>
<nav class="md-nav" aria-label="📊 Health Check Standards">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#endpoint" class="md-nav__link">
<span class="md-ellipsis">
Endpoint
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#docker-healthcheck" class="md-nav__link">
<span class="md-ellipsis">
Docker Healthcheck
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#metrics-standards-prometheus" class="md-nav__link">
<span class="md-ellipsis">
📈 Metrics Standards (Prometheus)
</span>
</a>
<nav class="md-nav" aria-label="📈 Metrics Standards (Prometheus)">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#endpoint_1" class="md-nav__link">
<span class="md-ellipsis">
Endpoint
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#security-standards" class="md-nav__link">
<span class="md-ellipsis">
🔐 Security Standards
</span>
</a>
<nav class="md-nav" aria-label="🔐 Security Standards">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#1-secrets-management" class="md-nav__link">
<span class="md-ellipsis">
1. Secrets Management
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#2-network-isolation" class="md-nav__link">
<span class="md-ellipsis">
2. Network Isolation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#3-rate-limiting" class="md-nav__link">
<span class="md-ellipsis">
3. Rate Limiting
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#database-standards" class="md-nav__link">
<span class="md-ellipsis">
🗄️ Database Standards
</span>
</a>
<nav class="md-nav" aria-label="🗄️ Database Standards">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#migrations" class="md-nav__link">
<span class="md-ellipsis">
Migrations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#backup-schedule" class="md-nav__link">
<span class="md-ellipsis">
Backup Schedule
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#deployment-standards" class="md-nav__link">
<span class="md-ellipsis">
🔄 Deployment Standards
</span>
</a>
<nav class="md-nav" aria-label="🔄 Deployment Standards">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#pre-deployment-checklist" class="md-nav__link">
<span class="md-ellipsis">
Pre-Deployment Checklist
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#deployment-process" class="md-nav__link">
<span class="md-ellipsis">
Deployment Process
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post-deployment" class="md-nav__link">
<span class="md-ellipsis">
Post-Deployment
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#logging-standards" class="md-nav__link">
<span class="md-ellipsis">
📝 Logging Standards
</span>
</a>
<nav class="md-nav" aria-label="📝 Logging Standards">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#log-format-json" class="md-nav__link">
<span class="md-ellipsis">
Log Format (JSON)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#log-levels" class="md-nav__link">
<span class="md-ellipsis">
Log Levels
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#centralized-logging" class="md-nav__link">
<span class="md-ellipsis">
Centralized Logging (майбутнє)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#multi-node-standards" class="md-nav__link">
<span class="md-ellipsis">
🌍 Multi-Node Standards
</span>
</a>
<nav class="md-nav" aria-label="🌍 Multi-Node Standards">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#node-roles" class="md-nav__link">
<span class="md-ellipsis">
Node Roles
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#service-distribution" class="md-nav__link">
<span class="md-ellipsis">
Service Distribution
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cross-node-communication" class="md-nav__link">
<span class="md-ellipsis">
Cross-Node Communication
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#future-standards-roadmap" class="md-nav__link">
<span class="md-ellipsis">
🔮 Future Standards (Roadmap)
</span>
</a>
<nav class="md-nav" aria-label="🔮 Future Standards (Roadmap)">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#phase-multi-multimodal-integration" class="md-nav__link">
<span class="md-ellipsis">
Phase MULTI (Multimodal Integration)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#phase-matrix-federation" class="md-nav__link">
<span class="md-ellipsis">
Phase MATRIX (Federation)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#phase-scale-horizontal-scaling" class="md-nav__link">
<span class="md-ellipsis">
Phase SCALE (Horizontal Scaling)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#phase-monitor-advanced-monitoring" class="md-nav__link">
<span class="md-ellipsis">
Phase MONITOR (Advanced Monitoring)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#contacts-resources" class="md-nav__link">
<span class="md-ellipsis">
📞 Contacts &amp; Resources
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#compliance-checklist" class="md-nav__link">
<span class="md-ellipsis">
✅ Compliance Checklist
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="daarion-ecosystem">🏗️ Стандарти Інфраструктури НОД — DAARION Ecosystem<a class="headerlink" href="#daarion-ecosystem" title="Permanent link">&para;</a></h1>
<p><strong>Версія:</strong> 1.0.0<br />
<strong>Дата:</strong> 25 листопада 2025<br />
<strong>Мета:</strong> Уніфікація архітектури на всіх нодах системи</p>
<hr />
<h2 id="_1">🎯 Принципи<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h2>
<h3 id="1-consistency-first">1. <strong>Consistency First</strong><a class="headerlink" href="#1-consistency-first" title="Permanent link">&para;</a></h3>
<p>Кожна нода має <strong>однакову структуру</strong> каталогів, конфігів, портів (де можливо).</p>
<h3 id="2-isolation-with-integration">2. <strong>Isolation with Integration</strong><a class="headerlink" href="#2-isolation-with-integration" title="Permanent link">&para;</a></h3>
<p>Сервіси ізольовані (Docker), але інтегруються через стандартні протоколи (HTTP, WS, NATS).</p>
<h3 id="3-observable-by-default">3. <strong>Observable by Default</strong><a class="headerlink" href="#3-observable-by-default" title="Permanent link">&para;</a></h3>
<p>Кожна нода має Prometheus metrics + health endpoints.</p>
<h3 id="4-git-as-source-of-truth">4. <strong>Git as Source of Truth</strong><a class="headerlink" href="#4-git-as-source-of-truth" title="Permanent link">&para;</a></h3>
<p>Всі конфігурації та код в Git. Ніяких "ручних правок".</p>
<h3 id="5-rollback-ready">5. <strong>Rollback Ready</strong><a class="headerlink" href="#5-rollback-ready" title="Permanent link">&para;</a></h3>
<p>Кожен deployment має чіткий rollback plan.</p>
<hr />
<h2 id="_2">📁 Стандартна Структура Ноди<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h2>
<div class="codehilite"><pre><span></span><code><span class="o">/</span><span class="n">opt</span><span class="o">/</span><span class="n">microdao</span><span class="o">-</span><span class="n">daarion</span><span class="o">/</span><span class="w"> </span><span class="p">(</span><span class="err">або</span><span class="w"> </span><span class="o">/</span><span class="n">Users</span><span class="o">/</span><span class="n">apple</span><span class="o">/</span><span class="n">github</span><span class="o">-</span><span class="n">projects</span><span class="o">/</span><span class="n">microdao</span><span class="o">-</span><span class="n">daarion</span><span class="o">/</span><span class="p">)</span>
<span class="err"></span>
<span class="err">├──</span><span class="w"> </span><span class="o">.</span><span class="n">env</span><span class="w"> </span><span class="c1"># Environment variables (не в Git!)</span>
<span class="err">├──</span><span class="w"> </span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">example</span><span class="w"> </span><span class="c1"># Template (в Git)</span>
<span class="err">├──</span><span class="w"> </span><span class="n">docker</span><span class="o">-</span><span class="n">compose</span><span class="o">.</span><span class="n">all</span><span class="o">.</span><span class="n">yml</span><span class="w"> </span><span class="c1"># Головний compose file</span>
<span class="err">├──</span><span class="w"> </span><span class="n">docker</span><span class="o">-</span><span class="n">compose</span><span class="o">.</span><span class="n">dev</span><span class="o">.</span><span class="n">yml</span><span class="w"> </span><span class="c1"># Dev overrides (опційно)</span>
<span class="err"></span>
<span class="err">├──</span><span class="w"> </span><span class="n">services</span><span class="o">/</span><span class="w"> </span><span class="c1"># Всі мікросервіси</span>
<span class="err"></span><span class="w"> </span><span class="err">├──</span><span class="w"> </span><span class="n">agents</span><span class="o">-</span><span class="n">service</span><span class="o">/</span>
<span class="err"></span><span class="w"> </span><span class="err">├──</span><span class="w"> </span><span class="n">city</span><span class="o">-</span><span class="n">service</span><span class="o">/</span>
<span class="err"></span><span class="w"> </span><span class="err">├──</span><span class="w"> </span><span class="n">secondme</span><span class="o">-</span><span class="n">service</span><span class="o">/</span>
<span class="err"></span><span class="w"> </span><span class="err">├──</span><span class="w"> </span><span class="n">router</span><span class="o">/</span>
<span class="err"></span><span class="w"> </span><span class="err">├──</span><span class="w"> </span><span class="n">gateway</span><span class="o">/</span>
<span class="err"></span><span class="w"> </span><span class="err">└──</span><span class="w"> </span><span class="o">...</span>
<span class="err"></span>
<span class="err">├──</span><span class="w"> </span><span class="n">migrations</span><span class="o">/</span><span class="w"> </span><span class="c1"># Database migrations</span>
<span class="err"></span><span class="w"> </span><span class="err">├──</span><span class="w"> </span><span class="mi">001</span><span class="n">_</span><span class="o">*.</span><span class="n">sql</span>
<span class="err"></span><span class="w"> </span><span class="err">├──</span><span class="w"> </span><span class="mi">002</span><span class="n">_</span><span class="o">*.</span><span class="n">sql</span>
<span class="err"></span><span class="w"> </span><span class="err">└──</span><span class="w"> </span><span class="o">...</span>
<span class="err"></span>
<span class="err">├──</span><span class="w"> </span><span class="n">scripts</span><span class="o">/</span><span class="w"> </span><span class="c1"># Automation scripts</span>
<span class="err"></span><span class="w"> </span><span class="err">├──</span><span class="w"> </span><span class="n">deploy</span><span class="o">-</span><span class="n">prod</span><span class="o">.</span><span class="n">sh</span>
<span class="err"></span><span class="w"> </span><span class="err">├──</span><span class="w"> </span><span class="n">backup</span><span class="o">-</span><span class="n">db</span><span class="o">.</span><span class="n">sh</span>
<span class="err"></span><span class="w"> </span><span class="err">├──</span><span class="w"> </span><span class="n">health</span><span class="o">-</span><span class="n">check</span><span class="o">.</span><span class="n">sh</span>
<span class="err"></span><span class="w"> </span><span class="err">└──</span><span class="w"> </span><span class="n">rollback</span><span class="o">.</span><span class="n">sh</span>
<span class="err"></span>
<span class="err">├──</span><span class="w"> </span><span class="n">docs</span><span class="o">/</span><span class="w"> </span><span class="c1"># Documentation</span>
<span class="err"></span><span class="w"> </span><span class="err">├──</span><span class="w"> </span><span class="n">INFRASTRUCTURE</span><span class="o">.</span><span class="n">md</span>
<span class="err"></span><span class="w"> </span><span class="err">├──</span><span class="w"> </span><span class="n">DEPLOY_</span><span class="o">*.</span><span class="n">md</span>
<span class="err"></span><span class="w"> </span><span class="err">└──</span><span class="w"> </span><span class="n">NODE_INFRASTRUCTURE_STANDARDS</span><span class="o">.</span><span class="n">md</span><span class="w"> </span><span class="p">(</span><span class="err">цей</span><span class="w"> </span><span class="err">файл</span><span class="p">)</span>
<span class="err"></span>
<span class="err">├──</span><span class="w"> </span><span class="n">infra</span><span class="o">/</span><span class="w"> </span><span class="c1"># Infrastructure configs</span>
<span class="err"></span><span class="w"> </span><span class="err">├──</span><span class="w"> </span><span class="n">nginx</span><span class="o">/</span>
<span class="err"></span><span class="w"> </span><span class="err">├──</span><span class="w"> </span><span class="n">prometheus</span><span class="o">/</span>
<span class="err"></span><span class="w"> </span><span class="err">├──</span><span class="w"> </span><span class="n">grafana</span><span class="o">/</span>
<span class="err"></span><span class="w"> </span><span class="err">└──</span><span class="w"> </span><span class="n">caddy</span><span class="o">/</span><span class="w"> </span><span class="p">(</span><span class="err">якщо</span><span class="w"> </span><span class="err">використовується</span><span class="p">)</span>
<span class="err"></span>
<span class="err">└──</span><span class="w"> </span><span class="n">backups</span><span class="o">/</span><span class="w"> </span><span class="c1"># Database backups (не в Git!)</span>
<span class="w"> </span><span class="err">└──</span><span class="w"> </span><span class="n">daarion_memory_</span><span class="o">*.</span><span class="n">sql</span>
</code></pre></div>
<hr />
<h2 id="_3">🔢 Стандартні Порти<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h2>
<h3 id="core-infrastructure">Core Infrastructure<a class="headerlink" href="#core-infrastructure" title="Permanent link">&para;</a></h3>
<table>
<thead>
<tr>
<th>Service</th>
<th>Port</th>
<th>Protocol</th>
<th>Note</th>
</tr>
</thead>
<tbody>
<tr>
<td>PostgreSQL</td>
<td>5432</td>
<td>TCP</td>
<td>Internal only</td>
</tr>
<tr>
<td>Redis</td>
<td>6379</td>
<td>TCP</td>
<td>Internal only</td>
</tr>
<tr>
<td>NATS</td>
<td>4222</td>
<td>TCP</td>
<td>Internal only</td>
</tr>
<tr>
<td>Prometheus</td>
<td>9090</td>
<td>HTTP</td>
<td>Monitoring</td>
</tr>
<tr>
<td>Grafana</td>
<td>3000</td>
<td>HTTP</td>
<td>Dashboards</td>
</tr>
<tr>
<td>Nginx/Gateway</td>
<td>80/443</td>
<td>HTTP/HTTPS</td>
<td>Public entry</td>
</tr>
</tbody>
</table>
<h3 id="dagi-stack-production">DAGI Stack (Production)<a class="headerlink" href="#dagi-stack-production" title="Permanent link">&para;</a></h3>
<table>
<thead>
<tr>
<th>Service</th>
<th>Port</th>
<th>Protocol</th>
<th>Note</th>
</tr>
</thead>
<tbody>
<tr>
<td>Router</td>
<td>9102</td>
<td>HTTP</td>
<td>DAGI Router</td>
</tr>
<tr>
<td>Gateway</td>
<td>9300</td>
<td>HTTP</td>
<td>Bot Gateway</td>
</tr>
<tr>
<td>DevTools</td>
<td>8008</td>
<td>HTTP</td>
<td>Dev Interface</td>
</tr>
<tr>
<td>Swapper</td>
<td>8890-8891</td>
<td>HTTP</td>
<td>Model Swapper + Metrics</td>
</tr>
<tr>
<td>Frontend</td>
<td>8899</td>
<td>HTTP</td>
<td>Web UI</td>
</tr>
</tbody>
</table>
<h3 id="phase-1-3-mvp-services">Phase 1-3 MVP Services<a class="headerlink" href="#phase-1-3-mvp-services" title="Permanent link">&para;</a></h3>
<table>
<thead>
<tr>
<th>Service</th>
<th>Port</th>
<th>Protocol</th>
<th>Note</th>
</tr>
</thead>
<tbody>
<tr>
<td>City Service</td>
<td>7001</td>
<td>HTTP + WS</td>
<td>Public Rooms + Presence</td>
</tr>
<tr>
<td>Agents Service</td>
<td>7002</td>
<td>HTTP</td>
<td>Agent Core</td>
</tr>
<tr>
<td>Second Me</td>
<td>7003</td>
<td>HTTP</td>
<td>Personal AI</td>
</tr>
<tr>
<td>MicroDAO Service</td>
<td>7004</td>
<td>HTTP</td>
<td>MicroDAO Core</td>
</tr>
</tbody>
</table>
<h3 id="multimodal-services-2-initially">Multimodal Services (НОДА2 initially)<a class="headerlink" href="#multimodal-services-2-initially" title="Permanent link">&para;</a></h3>
<table>
<thead>
<tr>
<th>Service</th>
<th>Port</th>
<th>Protocol</th>
<th>Note</th>
</tr>
</thead>
<tbody>
<tr>
<td>STT Service</td>
<td>8895</td>
<td>HTTP</td>
<td>Speech-to-Text</td>
</tr>
<tr>
<td>OCR Service</td>
<td>8896</td>
<td>HTTP</td>
<td>Image-to-Text</td>
</tr>
<tr>
<td>Web Search</td>
<td>8897</td>
<td>HTTP</td>
<td>Search Engine</td>
</tr>
<tr>
<td>Vector DB</td>
<td>8898</td>
<td>HTTP</td>
<td>Semantic Search</td>
</tr>
</tbody>
</table>
<p><strong>Правило:</strong> Порти 7000-7999 — MVP services, 8000-8999 — Utilities/Multimodal, 9000-9999 — DAGI Stack.</p>
<hr />
<h2 id="api-routing-standards">🌐 API Routing Standards<a class="headerlink" href="#api-routing-standards" title="Permanent link">&para;</a></h2>
<h3 id="nginxgateway">Через Nginx/Gateway<a class="headerlink" href="#nginxgateway" title="Permanent link">&para;</a></h3>
<div class="codehilite"><pre><span></span><code>https://&lt;domain&gt;/api/&lt;service&gt;/&lt;endpoint&gt;
</code></pre></div>
<p><strong>Приклади:</strong></p>
<div class="codehilite"><pre><span></span><code>https://gateway.daarion.city/api/agents/list
https://gateway.daarion.city/api/city/rooms
https://gateway.daarion.city/api/secondme/invoke
https://gateway.daarion.city/api/microdao/members
</code></pre></div>
<h3 id="websocket">WebSocket<a class="headerlink" href="#websocket" title="Permanent link">&para;</a></h3>
<div class="codehilite"><pre><span></span><code>wss://&lt;domain&gt;/ws/&lt;service&gt;/&lt;channel&gt;
</code></pre></div>
<p><strong>Приклади:</strong></p>
<div class="codehilite"><pre><span></span><code>wss://gateway.daarion.city/ws/city/rooms/general
wss://gateway.daarion.city/ws/city/presence
wss://gateway.daarion.city/ws/agents/events
</code></pre></div>
<hr />
<h2 id="docker-standards">🐳 Docker Standards<a class="headerlink" href="#docker-standards" title="Permanent link">&para;</a></h2>
<h3 id="naming-convention">Naming Convention<a class="headerlink" href="#naming-convention" title="Permanent link">&para;</a></h3>
<p><strong>Containers:</strong></p>
<div class="codehilite"><pre><span></span><code>&lt;project&gt;-&lt;service&gt;
</code></pre></div>
<p><strong>Examples:</strong>
- <code>daarion-postgres</code>
- <code>daarion-agents-service</code>
- <code>daarion-city-service</code></p>
<p><strong>Networks:</strong></p>
<div class="codehilite"><pre><span></span><code>&lt;project&gt;_net
</code></pre></div>
<p><strong>Example:</strong>
- <code>daarion_net</code></p>
<p><strong>Volumes:</strong></p>
<div class="codehilite"><pre><span></span><code>&lt;service&gt;_data
</code></pre></div>
<p><strong>Examples:</strong>
- <code>postgres_data</code>
- <code>redis_data</code>
- <code>nats_data</code></p>
<h3 id="labels">Labels (для моніторингу)<a class="headerlink" href="#labels" title="Permanent link">&para;</a></h3>
<div class="codehilite"><pre><span></span><code><span class="nt">services</span><span class="p">:</span>
<span class="w"> </span><span class="nt">agents-service</span><span class="p">:</span>
<span class="w"> </span><span class="nt">labels</span><span class="p">:</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">&quot;com.daarion.service=agents&quot;</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">&quot;com.daarion.tier=backend&quot;</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">&quot;com.daarion.phase=mvp&quot;</span>
</code></pre></div>
<hr />
<h2 id="health-check-standards">📊 Health Check Standards<a class="headerlink" href="#health-check-standards" title="Permanent link">&para;</a></h2>
<h3 id="endpoint">Endpoint<a class="headerlink" href="#endpoint" title="Permanent link">&para;</a></h3>
<p>Кожен сервіс <strong>ОБОВ'ЯЗКОВО</strong> має endpoint:</p>
<div class="codehilite"><pre><span></span><code>GET /health
</code></pre></div>
<p><strong>Response:</strong></p>
<div class="codehilite"><pre><span></span><code><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;status&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;healthy&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;service&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;agents-service&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;version&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;1.0.0&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;uptime&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">3600</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;dependencies&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;database&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;connected&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;redis&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;connected&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;nats&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;connected&quot;</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</code></pre></div>
<p><strong>Status Codes:</strong>
- <code>200</code> — Healthy
- <code>503</code> — Unhealthy (service degraded)</p>
<h3 id="docker-healthcheck">Docker Healthcheck<a class="headerlink" href="#docker-healthcheck" title="Permanent link">&para;</a></h3>
<div class="codehilite"><pre><span></span><code><span class="nt">healthcheck</span><span class="p">:</span>
<span class="w"> </span><span class="nt">test</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="s">&quot;CMD&quot;</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="s">&quot;curl&quot;</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="s">&quot;-f&quot;</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="s">&quot;http://localhost:7002/health&quot;</span><span class="p p-Indicator">]</span>
<span class="w"> </span><span class="nt">interval</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">30s</span>
<span class="w"> </span><span class="nt">timeout</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">10s</span>
<span class="w"> </span><span class="nt">retries</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">3</span>
<span class="w"> </span><span class="nt">start_period</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">40s</span>
</code></pre></div>
<hr />
<h2 id="metrics-standards-prometheus">📈 Metrics Standards (Prometheus)<a class="headerlink" href="#metrics-standards-prometheus" title="Permanent link">&para;</a></h2>
<h3 id="endpoint_1">Endpoint<a class="headerlink" href="#endpoint_1" title="Permanent link">&para;</a></h3>
<div class="codehilite"><pre><span></span><code>GET /metrics
</code></pre></div>
<p><strong>Format:</strong> Prometheus text format</p>
<p><strong>Required Metrics:</strong></p>
<div class="codehilite"><pre><span></span><code><span class="gh">#</span> HTTP requests
http_requests_total{service=&quot;agents&quot;,method=&quot;GET&quot;,status=&quot;200&quot;} 1234
<span class="gh">#</span> Response time
http_request_duration_seconds_bucket{le=&quot;0.1&quot;} 100
<span class="gh">#</span> Active connections
active_connections{service=&quot;agents&quot;} 42
<span class="gh">#</span> Health status
service_health{service=&quot;agents&quot;,dependency=&quot;database&quot;} 1
</code></pre></div>
<hr />
<h2 id="security-standards">🔐 Security Standards<a class="headerlink" href="#security-standards" title="Permanent link">&para;</a></h2>
<h3 id="1-secrets-management">1. <strong>Secrets Management</strong><a class="headerlink" href="#1-secrets-management" title="Permanent link">&para;</a></h3>
<p><strong>НЕ В GIT:</strong>
- <code>.env</code> файли з паролями
- SSL приватні ключі
- API tokens
- DB passwords</p>
<p><strong>В GIT:</strong>
- <code>.env.example</code> з плейсхолдерами
- Public SSL certificates (якщо потрібно)</p>
<h3 id="2-network-isolation">2. <strong>Network Isolation</strong><a class="headerlink" href="#2-network-isolation" title="Permanent link">&para;</a></h3>
<div class="codehilite"><pre><span></span><code><span class="nt">services</span><span class="p">:</span>
<span class="w"> </span><span class="nt">postgres</span><span class="p">:</span>
<span class="w"> </span><span class="nt">networks</span><span class="p">:</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">daarion_net</span>
<span class="w"> </span><span class="c1"># НЕ expose ports на host!</span>
</code></pre></div>
<p><strong>Тільки gateway має публічні порти:</strong></p>
<div class="codehilite"><pre><span></span><code><span class="nt">services</span><span class="p">:</span>
<span class="w"> </span><span class="nt">gateway-nginx</span><span class="p">:</span>
<span class="w"> </span><span class="nt">ports</span><span class="p">:</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">&quot;80:80&quot;</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">&quot;443:443&quot;</span>
</code></pre></div>
<h3 id="3-rate-limiting">3. <strong>Rate Limiting</strong><a class="headerlink" href="#3-rate-limiting" title="Permanent link">&para;</a></h3>
<p>Nginx має rate limiting для API:</p>
<div class="codehilite"><pre><span></span><code><span class="k">limit_req_zone</span><span class="w"> </span><span class="nv">$binary_remote_addr</span><span class="w"> </span><span class="s">zone=api_limit:10m</span><span class="w"> </span><span class="s">rate=10r/s</span><span class="p">;</span>
<span class="k">location</span><span class="w"> </span><span class="s">/api/</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kn">limit_req</span><span class="w"> </span><span class="s">zone=api_limit</span><span class="w"> </span><span class="s">burst=20</span><span class="w"> </span><span class="s">nodelay</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<hr />
<h2 id="database-standards">🗄️ Database Standards<a class="headerlink" href="#database-standards" title="Permanent link">&para;</a></h2>
<h3 id="migrations">Migrations<a class="headerlink" href="#migrations" title="Permanent link">&para;</a></h3>
<p><strong>Naming:</strong></p>
<div class="codehilite"><pre><span></span><code>XXX_description.sql
</code></pre></div>
<p><strong>Examples:</strong>
- <code>001_create_messenger_schema.sql</code>
- <code>007_create_agents_tables.sql</code>
- <code>010_create_city_backend.sql</code></p>
<p><strong>Header (у кожній міграції):</strong></p>
<div class="codehilite"><pre><span></span><code><span class="c1">-- Migration: 007</span>
<span class="c1">-- Description: Create agents tables</span>
<span class="c1">-- Date: 2025-11-20</span>
<span class="c1">-- Author: DAARION Team</span>
<span class="c1">-- Rollback: See 007_rollback.sql</span>
<span class="k">BEGIN</span><span class="p">;</span>
<span class="c1">-- Your changes here</span>
<span class="k">COMMIT</span><span class="p">;</span>
</code></pre></div>
<h3 id="backup-schedule">Backup Schedule<a class="headerlink" href="#backup-schedule" title="Permanent link">&para;</a></h3>
<p><strong>Production (НОДА1):</strong>
- Щоденно о 03:00 UTC
- Зберігати останні 7 днів
- Weekly backup (зберігати 4 тижні)</p>
<p><strong>Commands:</strong></p>
<div class="codehilite"><pre><span></span><code><span class="c1"># Backup</span>
docker<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>daarion-postgres<span class="w"> </span>pg_dump<span class="w"> </span>-U<span class="w"> </span>postgres<span class="w"> </span>daarion_memory<span class="w"> </span>&gt;<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>/root/backups/daarion_memory_<span class="k">$(</span>date<span class="w"> </span>+%Y%m%d_%H%M%S<span class="k">)</span>.sql
<span class="c1"># Restore</span>
docker<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>-i<span class="w"> </span>daarion-postgres<span class="w"> </span>psql<span class="w"> </span>-U<span class="w"> </span>postgres<span class="w"> </span>-d<span class="w"> </span>daarion_memory<span class="w"> </span>&lt;<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>/root/backups/daarion_memory_YYYYMMDD_HHMMSS.sql
</code></pre></div>
<hr />
<h2 id="deployment-standards">🔄 Deployment Standards<a class="headerlink" href="#deployment-standards" title="Permanent link">&para;</a></h2>
<h3 id="pre-deployment-checklist">Pre-Deployment Checklist<a class="headerlink" href="#pre-deployment-checklist" title="Permanent link">&para;</a></h3>
<ul>
<li>[ ] Git branch merged to <code>main</code></li>
<li>[ ] All tests passed (якщо є)</li>
<li>[ ] Database backup created</li>
<li>[ ] Health checks passing on staging/dev</li>
<li>[ ] Rollback plan documented</li>
<li>[ ] Team notified (якщо production)</li>
</ul>
<h3 id="deployment-process">Deployment Process<a class="headerlink" href="#deployment-process" title="Permanent link">&para;</a></h3>
<ol>
<li><strong>Code Sync:</strong> <code>git pull origin main</code></li>
<li><strong>ENV Check:</strong> Verify <code>.env</code> variables</li>
<li><strong>DB Migrations:</strong> Apply sequentially</li>
<li><strong>Build:</strong> <code>docker compose build &lt;service&gt;</code></li>
<li><strong>Start:</strong> <code>docker compose up -d &lt;service&gt;</code></li>
<li><strong>Health Check:</strong> Verify <code>/health</code> endpoint</li>
<li><strong>Smoke Tests:</strong> Run basic API tests</li>
<li><strong>Monitor:</strong> Watch logs for 5-15 minutes</li>
</ol>
<h3 id="post-deployment">Post-Deployment<a class="headerlink" href="#post-deployment" title="Permanent link">&para;</a></h3>
<ul>
<li>[ ] Health checks passing</li>
<li>[ ] Metrics appearing in Prometheus</li>
<li>[ ] No critical errors in logs</li>
<li>[ ] Existing services unaffected</li>
<li>[ ] Update INFRASTRUCTURE.md</li>
</ul>
<hr />
<h2 id="logging-standards">📝 Logging Standards<a class="headerlink" href="#logging-standards" title="Permanent link">&para;</a></h2>
<h3 id="log-format-json">Log Format (JSON)<a class="headerlink" href="#log-format-json" title="Permanent link">&para;</a></h3>
<div class="codehilite"><pre><span></span><code><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;timestamp&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;2025-11-25T10:30:00Z&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;level&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;INFO&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;service&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;agents-service&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;message&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Agent invoked&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;agent_id&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;ag_123&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;user_id&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;u_456&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;request_id&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;req_789&quot;</span>
<span class="p">}</span>
</code></pre></div>
<h3 id="log-levels">Log Levels<a class="headerlink" href="#log-levels" title="Permanent link">&para;</a></h3>
<ul>
<li><code>DEBUG</code> — Детальна інформація (тільки в dev)</li>
<li><code>INFO</code> — Нормальні операції</li>
<li><code>WARNING</code> — Потенційна проблема</li>
<li><code>ERROR</code> — Помилка яку треба перевірити</li>
<li><code>CRITICAL</code> — Система не працює</li>
</ul>
<h3 id="centralized-logging">Centralized Logging (майбутнє)<a class="headerlink" href="#centralized-logging" title="Permanent link">&para;</a></h3>
<p><strong>Варіанти:</strong>
- Grafana Loki
- ELK Stack
- CloudWatch (якщо AWS)</p>
<hr />
<h2 id="multi-node-standards">🌍 Multi-Node Standards<a class="headerlink" href="#multi-node-standards" title="Permanent link">&para;</a></h2>
<h3 id="node-roles">Node Roles<a class="headerlink" href="#node-roles" title="Permanent link">&para;</a></h3>
<table>
<thead>
<tr>
<th>Node</th>
<th>Role</th>
<th>Uptime</th>
<th>Services</th>
</tr>
</thead>
<tbody>
<tr>
<td>НОДА1</td>
<td>Production</td>
<td>24/7</td>
<td>All Core + MVP</td>
</tr>
<tr>
<td>НОДА2</td>
<td>Dev + Backup</td>
<td>On-demand</td>
<td>Core + Multimodal</td>
</tr>
<tr>
<td>НОДА3 (майбутнє)</td>
<td>Federation</td>
<td>24/7</td>
<td>Matrix + City</td>
</tr>
</tbody>
</table>
<h3 id="service-distribution">Service Distribution<a class="headerlink" href="#service-distribution" title="Permanent link">&para;</a></h3>
<p><strong>Production (НОДА1):</strong>
- Router, Gateway, DevTools
- Agents, City, Second Me, MicroDAO
- PostgreSQL, Redis, NATS
- Monitoring (Prometheus, Grafana)</p>
<p><strong>Development (НОДА2):</strong>
- Core services (для тестування)
- Multimodal services (STT, OCR, Web Search, Vector DB)
- Experimental features</p>
<p><strong>Federation (НОДА3, майбутнє):</strong>
- Matrix Synapse
- City Federation
- DAO Governance</p>
<h3 id="cross-node-communication">Cross-Node Communication<a class="headerlink" href="#cross-node-communication" title="Permanent link">&para;</a></h3>
<p><strong>Через публічні API:</strong></p>
<div class="codehilite"><pre><span></span><code>NODE1 → NODE2
https://node2.local:8897/api/search (Web Search)
</code></pre></div>
<p><strong>Через VPN/WireGuard (майбутнє):</strong></p>
<div class="codehilite"><pre><span></span><code>NODE1 ←→ NODE2 ←→ NODE3
10.0.0.1 10.0.0.2 10.0.0.3
</code></pre></div>
<hr />
<h2 id="future-standards-roadmap">🔮 Future Standards (Roadmap)<a class="headerlink" href="#future-standards-roadmap" title="Permanent link">&para;</a></h2>
<h3 id="phase-multi-multimodal-integration">Phase MULTI (Multimodal Integration)<a class="headerlink" href="#phase-multi-multimodal-integration" title="Permanent link">&para;</a></h3>
<ul>
<li>[ ] Router v2.0 з multimodal підтримкою</li>
<li>[ ] Unified API для всіх multimodal сервісів</li>
<li>[ ] Fallback mechanisms (якщо НОДА2 offline)</li>
</ul>
<h3 id="phase-matrix-federation">Phase MATRIX (Federation)<a class="headerlink" href="#phase-matrix-federation" title="Permanent link">&para;</a></h3>
<ul>
<li>[ ] Matrix Synapse на НОДА3</li>
<li>[ ] Element Web client integration</li>
<li>[ ] NATS ↔ Matrix bridge</li>
</ul>
<h3 id="phase-scale-horizontal-scaling">Phase SCALE (Horizontal Scaling)<a class="headerlink" href="#phase-scale-horizontal-scaling" title="Permanent link">&para;</a></h3>
<ul>
<li>[ ] Load balancer перед нодами</li>
<li>[ ] Auto-scaling для сервісів</li>
<li>[ ] Distributed cache (Redis Cluster)</li>
</ul>
<h3 id="phase-monitor-advanced-monitoring">Phase MONITOR (Advanced Monitoring)<a class="headerlink" href="#phase-monitor-advanced-monitoring" title="Permanent link">&para;</a></h3>
<ul>
<li>[ ] Distributed tracing (Jaeger/Tempo)</li>
<li>[ ] APM (Application Performance Monitoring)</li>
<li>[ ] Alerting (Alertmanager)</li>
</ul>
<hr />
<h2 id="contacts-resources">📞 Contacts &amp; Resources<a class="headerlink" href="#contacts-resources" title="Permanent link">&para;</a></h2>
<p><strong>Documentation:</strong>
- Main: <code>/docs/INFRASTRUCTURE.md</code>
- Quick Ref: <code>/docs/infrastructure_quick_ref.ipynb</code>
- Deployment: <code>/docs/DEPLOY_*.md</code></p>
<p><strong>GitHub:</strong>
- Main Repo: <code>git@github.com:IvanTytar/microdao-daarion.git</code>
- DAARION City: <code>git@github.com:DAARION-DAO/daarion-ai-city.git</code></p>
<p><strong>Monitoring:</strong>
- Prometheus: http://localhost:9090
- Grafana: http://localhost:3000</p>
<hr />
<h2 id="compliance-checklist">✅ Compliance Checklist<a class="headerlink" href="#compliance-checklist" title="Permanent link">&para;</a></h2>
<p><strong>Кожна нода має:</strong>
- [ ] Стандартна структура каталогів
- [ ] Docker Compose з усіма сервісами
- [ ] Health endpoints на всіх сервісах
- [ ] Prometheus metrics
- [ ] Backup strategy
- [ ] Rollback plan
- [ ] Nginx/Gateway з SSL
- [ ] <code>.env</code> не в Git
- [ ] Документація актуальна</p>
<hr />
<p><strong>Документ створено:</strong> Cursor AI Assistant<br />
<strong>Для проєкту:</strong> MicroDAO DAARION<br />
<strong>Останнє оновлення:</strong> 2025-11-25</p>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "..", "features": ["navigation.sections", "navigation.instant", "content.code.copy"], "search": "../assets/javascripts/workers/search.b8dbb3d2.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script>
<script src="../assets/javascripts/bundle.3220b9d7.min.js"></script>
</body>
</html>