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>
1719 lines
59 KiB
HTML
1719 lines
59 KiB
HTML
|
||
<!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 & 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">¶</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">¶</a></h2>
|
||
<h3 id="1-consistency-first">1. <strong>Consistency First</strong><a class="headerlink" href="#1-consistency-first" title="Permanent link">¶</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">¶</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">¶</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">¶</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">¶</a></h3>
|
||
<p>Кожен deployment має чіткий rollback plan.</p>
|
||
<hr />
|
||
<h2 id="_2">📁 Стандартна Структура Ноди<a class="headerlink" href="#_2" title="Permanent link">¶</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">¶</a></h2>
|
||
<h3 id="core-infrastructure">Core Infrastructure<a class="headerlink" href="#core-infrastructure" title="Permanent link">¶</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">¶</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">¶</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">¶</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">¶</a></h2>
|
||
<h3 id="nginxgateway">Через Nginx/Gateway<a class="headerlink" href="#nginxgateway" title="Permanent link">¶</a></h3>
|
||
<div class="codehilite"><pre><span></span><code>https://<domain>/api/<service>/<endpoint>
|
||
</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">¶</a></h3>
|
||
<div class="codehilite"><pre><span></span><code>wss://<domain>/ws/<service>/<channel>
|
||
</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">¶</a></h2>
|
||
<h3 id="naming-convention">Naming Convention<a class="headerlink" href="#naming-convention" title="Permanent link">¶</a></h3>
|
||
<p><strong>Containers:</strong></p>
|
||
<div class="codehilite"><pre><span></span><code><project>-<service>
|
||
</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><project>_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><service>_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">¶</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">"com.daarion.service=agents"</span>
|
||
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">"com.daarion.tier=backend"</span>
|
||
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">"com.daarion.phase=mvp"</span>
|
||
</code></pre></div>
|
||
|
||
<hr />
|
||
<h2 id="health-check-standards">📊 Health Check Standards<a class="headerlink" href="#health-check-standards" title="Permanent link">¶</a></h2>
|
||
<h3 id="endpoint">Endpoint<a class="headerlink" href="#endpoint" title="Permanent link">¶</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">"status"</span><span class="p">:</span><span class="w"> </span><span class="s2">"healthy"</span><span class="p">,</span>
|
||
<span class="w"> </span><span class="nt">"service"</span><span class="p">:</span><span class="w"> </span><span class="s2">"agents-service"</span><span class="p">,</span>
|
||
<span class="w"> </span><span class="nt">"version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"1.0.0"</span><span class="p">,</span>
|
||
<span class="w"> </span><span class="nt">"uptime"</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">"dependencies"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
||
<span class="w"> </span><span class="nt">"database"</span><span class="p">:</span><span class="w"> </span><span class="s2">"connected"</span><span class="p">,</span>
|
||
<span class="w"> </span><span class="nt">"redis"</span><span class="p">:</span><span class="w"> </span><span class="s2">"connected"</span><span class="p">,</span>
|
||
<span class="w"> </span><span class="nt">"nats"</span><span class="p">:</span><span class="w"> </span><span class="s2">"connected"</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">¶</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">"CMD"</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="s">"curl"</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="s">"-f"</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="s">"http://localhost:7002/health"</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">¶</a></h2>
|
||
<h3 id="endpoint_1">Endpoint<a class="headerlink" href="#endpoint_1" title="Permanent link">¶</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="agents",method="GET",status="200"} 1234
|
||
|
||
<span class="gh">#</span> Response time
|
||
http_request_duration_seconds_bucket{le="0.1"} 100
|
||
|
||
<span class="gh">#</span> Active connections
|
||
active_connections{service="agents"} 42
|
||
|
||
<span class="gh">#</span> Health status
|
||
service_health{service="agents",dependency="database"} 1
|
||
</code></pre></div>
|
||
|
||
<hr />
|
||
<h2 id="security-standards">🔐 Security Standards<a class="headerlink" href="#security-standards" title="Permanent link">¶</a></h2>
|
||
<h3 id="1-secrets-management">1. <strong>Secrets Management</strong><a class="headerlink" href="#1-secrets-management" title="Permanent link">¶</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">¶</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">"80:80"</span>
|
||
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">"443:443"</span>
|
||
</code></pre></div>
|
||
|
||
<h3 id="3-rate-limiting">3. <strong>Rate Limiting</strong><a class="headerlink" href="#3-rate-limiting" title="Permanent link">¶</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">¶</a></h2>
|
||
<h3 id="migrations">Migrations<a class="headerlink" href="#migrations" title="Permanent link">¶</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">¶</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>><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><<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">¶</a></h2>
|
||
<h3 id="pre-deployment-checklist">Pre-Deployment Checklist<a class="headerlink" href="#pre-deployment-checklist" title="Permanent link">¶</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">¶</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 <service></code></li>
|
||
<li><strong>Start:</strong> <code>docker compose up -d <service></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">¶</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">¶</a></h2>
|
||
<h3 id="log-format-json">Log Format (JSON)<a class="headerlink" href="#log-format-json" title="Permanent link">¶</a></h3>
|
||
<div class="codehilite"><pre><span></span><code><span class="p">{</span>
|
||
<span class="w"> </span><span class="nt">"timestamp"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2025-11-25T10:30:00Z"</span><span class="p">,</span>
|
||
<span class="w"> </span><span class="nt">"level"</span><span class="p">:</span><span class="w"> </span><span class="s2">"INFO"</span><span class="p">,</span>
|
||
<span class="w"> </span><span class="nt">"service"</span><span class="p">:</span><span class="w"> </span><span class="s2">"agents-service"</span><span class="p">,</span>
|
||
<span class="w"> </span><span class="nt">"message"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Agent invoked"</span><span class="p">,</span>
|
||
<span class="w"> </span><span class="nt">"agent_id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"ag_123"</span><span class="p">,</span>
|
||
<span class="w"> </span><span class="nt">"user_id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"u_456"</span><span class="p">,</span>
|
||
<span class="w"> </span><span class="nt">"request_id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"req_789"</span>
|
||
<span class="p">}</span>
|
||
</code></pre></div>
|
||
|
||
<h3 id="log-levels">Log Levels<a class="headerlink" href="#log-levels" title="Permanent link">¶</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">¶</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">¶</a></h2>
|
||
<h3 id="node-roles">Node Roles<a class="headerlink" href="#node-roles" title="Permanent link">¶</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">¶</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">¶</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">¶</a></h2>
|
||
<h3 id="phase-multi-multimodal-integration">Phase MULTI (Multimodal Integration)<a class="headerlink" href="#phase-multi-multimodal-integration" title="Permanent link">¶</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">¶</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">¶</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">¶</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 & Resources<a class="headerlink" href="#contacts-resources" title="Permanent link">¶</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">¶</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> |