]> Git [git.vados.ru] :: Repos - Mikrotiks/ros.vados.ru.git/commitdiff
Autocommit in repo: ros.vados.ru, generated by owner: root, in 21:42:40 08.03.2026.
authorvados-dev <vados@vados.ru>
Sun, 8 Mar 2026 18:42:40 +0000 (21:42 +0300)
committervados-dev <vados@vados.ru>
Sun, 8 Mar 2026 18:42:40 +0000 (21:42 +0300)
.config/config.mk [new file with mode: 0644]
bin/check_repo.sh [new file with mode: 0755]
bin/notify_telegram.sh [new file with mode: 0755]
html/func-collection/codex_recepts/Readme.md [new file with mode: 0644]
html/func-collection/codex_recepts/repo_struct.md [new file with mode: 0644]

diff --git a/.config/config.mk b/.config/config.mk
new file mode 100644 (file)
index 0000000..ca80039
--- /dev/null
@@ -0,0 +1,4 @@
+  export BOT_TOKEN ?= "8390868324:AAG3_d1hfVR2M6pGAgDK6ZvhOe4J97nyopw"
+  export CHAT_ID ?= "454403445"
+  export REPO_DIR ?= $(BUILD_DIR)
+  export DRY_RUN ?= 0
diff --git a/bin/check_repo.sh b/bin/check_repo.sh
new file mode 100755 (executable)
index 0000000..7612e13
--- /dev/null
@@ -0,0 +1,27 @@
+#!/usr/bin/env bash
+
+cd "${REPO_DIR:-.}"
+
+dirty="$(git status --porcelain || true)"
+diff="$(git diff --quiet && git diff --cached --quiet || true)"
+ls-files="$([ -z "$$(git ls-files --others --exclude-standard)" ] || true)"
+if [[ -n "$diff" && -n "$ls-files" ]]; then
+    echo "[check] repo diff, go to proclean check."
+    if [[ -n "$dirty" ]]; then
+        echo "[check] repo dirty, stop"
+        bash scripts/notify_telegram.sh "STOP: repo dirty in $(pwd)"
+        exit 1
+    else
+        echo "[check] repo clean"
+    fi
+else
+    echo "[check] not clean. Go to autocommit him."
+    if [[ -n "$ls-files" ]]; then
+        git add .
+        git commit -m "${COMM_INFO}"
+    else
+        git -v brnch
+        git commit -am "${COMM_INFO}"
+    fi
+    git push
+fi
diff --git a/bin/notify_telegram.sh b/bin/notify_telegram.sh
new file mode 100755 (executable)
index 0000000..af2a3ce
--- /dev/null
@@ -0,0 +1,17 @@
+#!/usr/bin/env bash
+
+
+msg="${1:-no message}"
+
+  if [[ "${DRY_RUN:-0}" == "1" ]]; then
+    echo "[notify][dry-run] $msg"
+    exit 0
+  if [[ -z "${BOT_TOKEN:-}" || -z "${CHAT_ID:-}" ]]; then
+    echo "[notify] BOT_TOKEN/CHAT_ID not set, skip"
+    exit 0
+  fi
+
+  curl -fsS --connect-timeout 5 --max-time 10 \
+    -X POST "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \
+    -d "chat_id=${CHAT_ID}" \
+    --data-urlencode "text=${msg}" >/dev/null || true
diff --git a/html/func-collection/codex_recepts/Readme.md b/html/func-collection/codex_recepts/Readme.md
new file mode 100644 (file)
index 0000000..f18371b
--- /dev/null
@@ -0,0 +1,100 @@
+<ol>
+<li>Makefile &#56532;&#56527;&#56524;&#56536;&#56523;&#56527; &#56523;&#56513;&#56523; &#56527;&#56530;&#56523;&#56517;&#56531;&#56532;&#56530;&#56513;&#56532;&#56527;&#56530; &#56515;&#56517;&#56524;&#56517;&#56522;.</li>
+<li>&#56567;&#56531;&#56529; &#56524;&#56527;&#56519;&#56521;&#56523;&#56513; &#56535; scripts/*.sh.</li>
+<li>&#56563;&#56532;&#56530;&#56527;&#56519;&#56521;&#56522; &#56530;&#56517;&#56534;&#56521;&#56525; &#56535; &#56531;&#56523;&#56530;&#56521;&#56528;&#56532;&#56513;&#56520;: set -euo pipefail.</li>
+<li>&#56555;&#56527;&#56526;&#56518;&#56521;&#56519; &#56527;&#56532;&#56516;&#56517;&#56524;&#56536;&#56526;&#56527;: .env/config.mk.</li>
+<li>&#56556;&#56527;&#56519;&#56521; &#56521; &#56533;&#56535;&#56517;&#56516;&#56527;&#56525;&#56524;&#56517;&#56526;&#56521;&#56529; &#56535; &#56527;&#56516;&#56526;&#56527;&#56525; &#56525;&#56517;&#56531;&#56532;&#56517; (&#56518;&#56533;&#56526;&#56523;&#56515;&#56521;&#56529; notify).</li>
+<li>&#56558;&#56521;&#56523;&#56513;&#56523;&#56527;&#56522; &#56525;&#56513;&#56519;&#56521;&#56521; &#56535; &#56527;&#56516;&#56526;&#56527;&#56531;&#56532;&#56530;&#56527;&#56542;&#56526;&#56521;&#56523;&#56513;&#56520;, &#56517;&#56531;&#56524;&#56521; &#56542;&#56517;&#56530;&#56517;&#56538; 3 &#56525;&#56517;&#56531;&#56529;&#56515;&#56513; &#56514;&#56533;&#56516;&#56517;&#56532; &#56526;&#56517;&#56527;&#56542;&#56517;&#56535;&#56521;&#56516;&#56526;&#56527;.</li>
+</ol>
+<p>&#56571;&#56513;&#56514;&#56524;&#56527;&#56526;:</p>
+<ul>
+<li>Makefile -&gt; scripts/check_repo.sh</li>
+<li>scripts/check_repo.sh -&gt; git/telegram/exit-&#56523;&#56527;&#56516;&#56537;</li>
+</ul>
+<p>&#56549;&#56531;&#56524;&#56521; &#56520;&#56527;&#56542;&#56517;&#56539;&#56536;, &#56535; &#56531;&#56524;&#56517;&#56516;&#56533;&#56512;&#56541;&#56517;&#56525; &#56531;&#56527;&#56527;&#56514;&#56541;&#56517;&#56526;&#56521;&#56521; &#56516;&#56513;&#56525; &#56532;&#56517;&#56514;&#56517; &#56525;&#56521;&#56526;&#56521;&#56525;&#56513;&#56524;&#56536;&#56526;&#56537;&#56522; &#56513;&#56516;&#56525;&#56521;&#56526;&#56531;&#56523;&#56521;&#56522; &#56523;&#56513;&#56530;&#56523;&#56513;&#56531; &#56521;&#56538; 3 &#56518;&#56513;&#56522;&#56524;&#56527;&#56535;, &#56523;&#56527;&#56532;&#56527;&#56530;&#56537;&#56522; &#56526;&#56517; &#56531;&#56532;&#56537;&#56516;&#56526;&#56527; &#56527;&#56531;&#56532;&#56513;&#56535;&#56521;&#56532;&#56536; &#56526;&#56513; &#56519;&#56527;&#56516;&#56537;.</p>
+<p>&#56552;&#56527;&#56542;&#56533; &#56523;&#56527;&#56526;&#56517;&#56542;&#56526;&#56527; )</p>
+<p>&#56559;&#56532;&#56524;&#56521;&#56542;&#56526;&#56527;. &#56567;&#56527;&#56532; &#56525;&#56521;&#56526;&#56521;&#56525;&#56513;&#56524;&#56536;&#56526;&#56537;&#56522; &#56523;&#56513;&#56530;&#56523;&#56513;&#56531; &#56526;&#56513; &#56519;&#56527;&#56516;&#56537;.</p>
+<p>Makefile</p>
+<p>SHELL := /bin/bash
+  .ONESHELL:
+  .DEFAULT_GOAL := run</p>
+<p>include config.mk</p>
+<p>.PHONY: run check notify test</p>
+<p>run: check
+        @echo "[run] start main flow"
+        @# &#56532;&#56533;&#56532; &#56532;&#56535;&#56527;&#56521; &#56516;&#56517;&#56522;&#56531;&#56532;&#56535;&#56521;&#56529;
+        @echo "[run] done"</p>
+<p>check:
+        @bash scripts/check_repo.sh</p>
+<p>notify:
+        @bash scripts/notify_telegram.sh "manual notify from make"</p>
+<p>test:
+        @bash -n scripts/check_repo.sh
+        @bash -n scripts/notify_telegram.sh
+        @echo "syntax ok"</p>
+<p>config.mk</p>
+<p># &#56558;&#56517; &#56523;&#56527;&#56525;&#56525;&#56521;&#56532;&#56536; &#56531;&#56517;&#56523;&#56530;&#56517;&#56532;&#56537;. &#56556;&#56533;&#56542;&#56539;&#56517; &#56540;&#56523;&#56531;&#56528;&#56527;&#56530;&#56532; &#56521;&#56538; &#56527;&#56523;&#56530;&#56533;&#56534;&#56517;&#56526;&#56521;&#56529;/CI.
+  export BOT_TOKEN ?=
+  export CHAT_ID ?=
+  export REPO_DIR ?= .
+  export DRY_RUN ?= 0</p>
+<p>scripts/notify_telegram.sh</p>
+<p>#!/usr/bin/env bash
+  msg="${1:-no message}"</p>
+<p>if [[ "${DRY_RUN:-0}" == "1" ]]; then
+    echo "[notify][dry-run] $msg"
+    exit 0
+  if [[ -z "${BOT_TOKEN:-}" || -z "${CHAT_ID:-}" ]]; then
+    echo "[notify] BOT_TOKEN/CHAT_ID not set, skip"
+    exit 0
+  fi</p>
+<p>curl -fsS --connect-timeout 5 --max-time 10 \
+    -X POST "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \
+    -d "chat_id=${CHAT_ID}" \
+    --data-urlencode "text=${msg}" &gt;/dev/null || true</p>
+<p>scripts/check_repo.sh</p>
+<p>cd "${REPO_DIR:-.}"</p>
+<p>dirty="$(git status --porcelain || true)"
+  if [[ -n "$dirty" ]]; then
+    echo "[check] repo dirty, stop"
+    bash scripts/notify_telegram.sh "STOP: repo dirty in $(pwd)"
+    exit 1
+  echo "[check] repo clean"</p>
+<p>&#56570;&#56513;&#56528;&#56533;&#56531;&#56523;:</p>
+<ol>
+<li>chmod +x scripts/*.sh</li>
+<li>BOT_TOKEN=... CHAT_ID=... make run</li>
+<li>&#56548;&#56524;&#56529; &#56514;&#56517;&#56538;&#56527;&#56528;&#56513;&#56531;&#56526;&#56527;&#56522; &#56528;&#56530;&#56527;&#56535;&#56517;&#56530;&#56523;&#56521; &#56514;&#56517;&#56538; &#56527;&#56532;&#56528;&#56530;&#56513;&#56535;&#56523;&#56521;: DRY_RUN=1 make run</li>
+</ol>
+<p>&#56549;&#56531;&#56524;&#56521; &#56520;&#56527;&#56542;&#56517;&#56539;&#56536;, &#56531;&#56524;&#56517;&#56516;&#56533;&#56512;&#56541;&#56521;&#56525; &#56539;&#56513;&#56519;&#56527;&#56525; &#56516;&#56527;&#56514;&#56513;&#56535;&#56524;&#56512; &#56532;&#56521;&#56520;&#56521;&#56522; &#56535;&#56537;&#56520;&#56527;&#56516; exit 0 &#56528;&#56527;&#56531;&#56524;&#56517; &#56521;&#56538;&#56525;&#56517;&#56526;&#56517;&#56526;&#56521;&#56522; &#56523;&#56513;&#56523; &#56527;&#56532;&#56516;&#56517;&#56524;&#56536;&#56526;&#56537;&#56522; &#56530;&#56517;&#56534;&#56521;&#56525;.</p>
+<p>&#56532;&#56513;&#56523; &#56531;&#56532;&#56527;&#56522;,</p>
+<p>&#56563;&#56532;&#56527;&#56512;.
+  &#56574;&#56532;&#56527; &#56525;&#56517;&#56526;&#56529;&#56517;&#56525; &#56528;&#56517;&#56530;&#56535;&#56537;&#56525;: &#56531;&#56532;&#56530;&#56533;&#56523;&#56532;&#56533;&#56530;&#56533;, exit-&#56524;&#56527;&#56519;&#56521;&#56523;&#56533;, &#56521;&#56524;&#56521; Telegram-&#56533;&#56535;&#56517;&#56516;&#56527;&#56525;&#56524;&#56517;&#56526;&#56521;&#56517;?</p>
+<p>&#56535;&#56527;&#56532; &#56542;&#56517;&#56525; &#56533;&#56516;&#56527;&#56514;&#56526;&#56517;&#56517; &#56542;&#56513;&#56532; &#56535; &#56530;&#56517;&#56516;&#56513;&#56523;&#56532;&#56527;&#56530;&#56517;, &#56529; &#56531;&#56530;&#56513;&#56538;&#56533; &#56525;&#56527;&#56519;&#56533; &#56531;&#56527;&#56520;&#56530;&#56513;&#56526;&#56521;&#56532;&#56536; &#56532;&#56535;&#56527;&#56522; &#56530;&#56517;&#56515;&#56517;&#56528;&#56532; )))</p>
+<p>&#56548;&#56513;, &#56540;&#56532;&#56527; &#56523;&#56513;&#56523; &#56530;&#56513;&#56538; &#56531;&#56521;&#56524;&#56536;&#56526;&#56513;&#56529; &#56531;&#56532;&#56527;&#56530;&#56527;&#56526;&#56513; &#56530;&#56517;&#56516;&#56513;&#56523;&#56532;&#56527;&#56530;&#56513;: &#56531;&#56530;&#56513;&#56538;&#56533; &#56528;&#56530;&#56521;&#56525;&#56517;&#56526;&#56521;&#56524; &#56521; &#56531;&#56527;&#56520;&#56530;&#56513;&#56526;&#56521;&#56524; &#56530;&#56529;&#56516;&#56527;&#56525; &#56531; &#56528;&#56530;&#56527;&#56517;&#56523;&#56532;&#56527;&#56525;.</p>
+<p>&#56574;&#56532;&#56527;&#56514;&#56537; &#56526;&#56517; &#56532;&#56517;&#56530;&#56529;&#56524;&#56527;&#56531;&#56536;, &#56531;&#56516;&#56517;&#56524;&#56513;&#56522; &#56532;&#56513;&#56523;:</p>
+<ol>
+<li>&#56563;&#56527;&#56538;&#56516;&#56513;&#56522; docs/ops-notes.md.</li>
+<li>&#56564;&#56533;&#56516;&#56513; &#56531;&#56523;&#56524;&#56513;&#56516;&#56537;&#56535;&#56513;&#56522; &#56530;&#56513;&#56514;&#56527;&#56542;&#56521;&#56517; &#56530;&#56517;&#56515;&#56517;&#56528;&#56532;&#56537; (make/git/cron/alerts).</li>
+<li>&#56562;&#56529;&#56516;&#56527;&#56525; &#56516;&#56517;&#56530;&#56534;&#56521; scripts/ &#56531; &#56519;&#56527;&#56532;&#56527;&#56535;&#56537;&#56525;&#56521; &#56535;&#56517;&#56530;&#56531;&#56521;&#56529;&#56525;&#56521; &#56523;&#56527;&#56525;&#56513;&#56526;&#56516;.</li>
+</ol>
+<p>&#56564;&#56513;&#56523; &#56542;&#56517;&#56530;&#56517;&#56538; &#56525;&#56517;&#56531;&#56529;&#56515; &#56527;&#56532;&#56523;&#56530;&#56537;&#56535;&#56513;&#56517;&#56539;&#56536; &#56527;&#56516;&#56521;&#56526; &#56518;&#56513;&#56522;&#56524; &#56521; &#56535;ӣ &#56528;&#56527;&#56516; &#56530;&#56533;&#56523;&#56527;&#56522;.</p>
+<p>&#56564;&#56533;&#56532; &#56526;&#56513;&#56516;&#56527; &#56524;&#56527;&#56535;&#56521;&#56532;&#56536; &#56521; &#56526;&#56517; &#56538;&#56513;&#56514;&#56537;&#56535;&#56513;&#56532;&#56536; ))</p>
+<p>&#56548;&#56513;. &#56556;&#56533;&#56542;&#56539;&#56521;&#56522; &#56531;&#56528;&#56527;&#56531;&#56527;&#56514; &#56526;&#56517; &#56538;&#56513;&#56514;&#56537;&#56535;&#56513;&#56532;&#56536;: &#56531;&#56530;&#56513;&#56538;&#56533; &#56518;&#56521;&#56523;&#56531;&#56521;&#56530;&#56527;&#56535;&#56513;&#56532;&#56536; &#56535; &#56530;&#56517;&#56528;&#56527;.</p>
+<p>&#56557;&#56521;&#56526;&#56521;&#56525;&#56533;&#56525;:</p>
+<ol>
+<li>docs/runbook.md  &#56542;&#56532;&#56527; &#56516;&#56517;&#56524;&#56513;&#56532;&#56536; &#56528;&#56530;&#56521; &#56531;&#56514;&#56527;&#56517;.</li>
+<li>make help  &#56531;&#56528;&#56521;&#56531;&#56527;&#56523; &#56515;&#56517;&#56524;&#56517;&#56522; &#56531; &#56523;&#56527;&#56530;&#56527;&#56532;&#56523;&#56521;&#56525; &#56527;&#56528;&#56521;&#56531;&#56513;&#56526;&#56521;&#56517;&#56525;.</li>
+<li>scripts/  &#56532;&#56527;&#56524;&#56536;&#56523;&#56527; &#56521;&#56531;&#56528;&#56527;&#56524;&#56526;&#56529;&#56517;&#56525;&#56513;&#56529; &#56524;&#56527;&#56519;&#56521;&#56523;&#56513;, &#56514;&#56517;&#56538; &#56525;&#56513;&#56519;&#56521;&#56521; &#56535; &#56542;&#56513;&#56532;&#56517;.</li>
+</ol>
+<p>&#56564;&#56527;&#56519;&#56516;&#56513; &#56528;&#56513;&#56525;&#56529;&#56532;&#56536; &#56526;&#56517; &#56526;&#56533;&#56534;&#56526;&#56513;, &#56535;ӣ &#56524;&#56517;&#56534;&#56521;&#56532; &#56535; &#56528;&#56530;&#56527;&#56517;&#56523;&#56532;&#56517;.</p>
+<p>&#56558;&#56533; &#56535;&#56527;&#56532;&#56521;&#56538; ros.vados.ru &#56529; &#56521; &#56526;&#56513;&#56542;&#56513;&#56524; &#56516;&#56517;&#56524;&#56513;&#56532;&#56536; &#56531;&#56535;&#56527;&#56522; &#56514;&#56524;&#56527;&#56523;&#56526;&#56527;&#56532; &#56521; &#56528;&#56524;&#56513;&#56532;&#56518;&#56527;&#56525;&#56533; &#56516;&#56524;&#56529; &#56525;&#56521;&#56523;&#56530;&#56527;&#56532;&#56527;&#56535;</p>
+<p>&#56559;&#56532;&#56524;&#56521;&#56542;&#56526;&#56537;&#56522; &#56520;&#56527;&#56516;. &#56572;&#56532;&#56527; &#56523;&#56513;&#56523; &#56530;&#56513;&#56538; &#56528;&#56530;&#56513;&#56535;&#56521;&#56524;&#56536;&#56526;&#56537;&#56522; &#56528;&#56533;&#56532;&#56536; &#56516;&#56524;&#56529; &#56513;&#56516;&#56525;&#56521;&#56526;&#56513;: &#56531;&#56535;&#56527;&#56522; runbook + &#56531;&#56535;&#56527;&#56521; &#56513;&#56535;&#56532;&#56527;&#56525;&#56513;&#56532;&#56521;&#56538;&#56513;&#56515;&#56521;&#56521;.</p>
+<p>&#56574;&#56532;&#56527;&#56514;&#56537; &#56528;&#56524;&#56513;&#56532;&#56518;&#56527;&#56530;&#56525;&#56513; &#56526;&#56517; &#56530;&#56513;&#56531;&#56528;&#56527;&#56524;&#56538;&#56524;&#56513;&#56531;&#56536;, &#56538;&#56513;&#56518;&#56521;&#56523;&#56531;&#56521;&#56530;&#56533;&#56522; &#56525;&#56521;&#56526;&#56521;&#56525;&#56533;&#56525;:</p>
+<ol>
+<li>docs/runbook.md</li>
+<li>docs/decisions.md (&#56528;&#56527;&#56542;&#56517;&#56525;&#56533; &#56528;&#56530;&#56521;&#56526;&#56529;&#56532;&#56527; &#56521;&#56525;&#56517;&#56526;&#56526;&#56527; &#56532;&#56513;&#56523;)</li>
+<li>scripts/ (&#56535;&#56531;&#56529; &#56524;&#56527;&#56519;&#56521;&#56523;&#56513;)</li>
+<li>Makefile (&#56532;&#56527;&#56524;&#56536;&#56523;&#56527; &#56538;&#56513;&#56528;&#56533;&#56531;&#56523; &#56515;&#56517;&#56524;&#56517;&#56522;)</li>
+<li>configs/ (&#56539;&#56513;&#56514;&#56524;&#56527;&#56526;&#56537; MikroTik)</li>
+</ol>
\ No newline at end of file
diff --git a/html/func-collection/codex_recepts/repo_struct.md b/html/func-collection/codex_recepts/repo_struct.md
new file mode 100644 (file)
index 0000000..1adf49d
--- /dev/null
@@ -0,0 +1,140 @@
+  1. Makefile ������ ��� ����������� �����.
+  2. ��� ������ � scripts/*.sh.
+  3. ������� ����� � ��������: set -euo pipefail.
+  4. ������ ��������: .env/config.mk.
+  5. ���� � ����������� � ����� ����� (������� notify).
+  6. ������� ����� � ��������������, ���� ����� 3 ������ ����� ����������.
+
+  ������:
+
+  - Makefile -> scripts/check_repo.sh
+  - scripts/check_repo.sh -> git/telegram/exit-����
+
+  ���� ������, � ��������� ��������� ��� ���� ����������� ��������� ������ �� 3 ������, ������� �� ������ �������� �� ����.
+
+
+ ���� ������� )
+
+
+ �������. ��� ����������� ������ �� ����.
+
+  Makefile
+
+  SHELL := /bin/bash
+  .ONESHELL:
+  .DEFAULT_GOAL := run
+
+  include config.mk
+
+  .PHONY: run check notify test
+
+  run: check
+        @echo "[run] start main flow"
+        @# ��� ���� ��������
+        @echo "[run] done"
+
+  check:
+        @bash scripts/check_repo.sh
+
+  notify:
+        @bash scripts/notify_telegram.sh "manual notify from make"
+
+  test:
+        @bash -n scripts/check_repo.sh
+        @bash -n scripts/notify_telegram.sh
+        @echo "syntax ok"
+
+  config.mk
+
+  # �� ������� �������. ����� ������� �� ���������/CI.
+  export BOT_TOKEN ?=
+  export CHAT_ID ?=
+  export REPO_DIR ?= .
+  export DRY_RUN ?= 0
+
+  scripts/notify_telegram.sh
+
+  #!/usr/bin/env bash
+  msg="${1:-no message}"
+
+  if [[ "${DRY_RUN:-0}" == "1" ]]; then
+    echo "[notify][dry-run] $msg"
+    exit 0
+  if [[ -z "${BOT_TOKEN:-}" || -z "${CHAT_ID:-}" ]]; then
+    echo "[notify] BOT_TOKEN/CHAT_ID not set, skip"
+    exit 0
+  fi
+
+  curl -fsS --connect-timeout 5 --max-time 10 \
+    -X POST "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \
+    -d "chat_id=${CHAT_ID}" \
+    --data-urlencode "text=${msg}" >/dev/null || true
+
+  scripts/check_repo.sh
+
+
+  cd "${REPO_DIR:-.}"
+
+  dirty="$(git status --porcelain || true)"
+  if [[ -n "$dirty" ]]; then
+    echo "[check] repo dirty, stop"
+    bash scripts/notify_telegram.sh "STOP: repo dirty in $(pwd)"
+    exit 1
+  echo "[check] repo clean"
+
+  ������:
+
+  1. chmod +x scripts/*.sh
+  2. BOT_TOKEN=... CHAT_ID=... make run
+  3. ��� ���������� �������� ��� ��������: DRY_RUN=1 make run
+
+  ���� ������, ��������� ����� ������� ����� ����� exit 0 ����� ��������� ��� ��������� �����.
+
+
+ ��� ����,
+
+
+ ����.
+  ��� ������ ������: ���������, exit-������, ��� Telegram-�����������?
+
+
+ ��� ��� ������� ��� � ���������, � ����� ���� ��������� ���� ������ )))
+
+
+ ��, ��� ��� ��� ������� ������� ���������: ����� �������� � �������� ����� � ��������.
+
+  ����� �� ��������, ������ ���:
+
+  1. ������ docs/ops-notes.md.
+  2. ���� ��������� ������� ������� (make/git/cron/alerts).
+  3. ����� ����� scripts/ � �������� �������� ������.
+
+  ��� ����� ����� ���������� ���� ���� � �ӣ ��� �����.
+
+
+ ��� ���� ������ � �� �������� ))
+
+
+ ��. ������ ������ �� ��������: ����� ����������� � ����.
+
+  �������:
+
+  1. docs/runbook.md  ��� ������ ��� ����.
+  2. make help  ������ ����� � �������� ���������.
+  3. scripts/  ������ ����������� ������, ��� ����� � ����.
+
+  ����� ������ �� �����, �ӣ ����� � �������.
+
+
+ �� ����� ros.vados.ru � � ����� ������ ���� ������� � �������� ��� ��������
+
+
+ �������� ���. ��� ��� ��� ���������� ���� ��� ������: ���� runbook + ���� �������������.
+
+  ����� ��������� �� �����������, ���������� �������:
+
+  1. docs/runbook.md
+  2. docs/decisions.md (������ ������� ������ ���)
+  3. scripts/ (��� ������)
+  4. Makefile (������ ������ �����)
+  5. configs/ (������� MikroTik)