From 7ef4d0b3e52144f6488d963f590a9b6cd7b2ec0b Mon Sep 17 00:00:00 2001 From: gilfanovr Date: Sun, 11 Oct 2026 21:20:06 +0300 Subject: [PATCH] =?UTF-8?q?rpi:=20Obsidian-vault=20=D1=87=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=B7=20Obsidian=20Sync,=20=D1=81=D1=83=D1=82=D0=BE?= =?UTF-8?q?=D1=87=D0=BD=D1=8B=D0=B9=20=D0=B0=D1=80=D1=85=D0=B8=D0=B2=20?= =?UTF-8?q?=D0=B2=20ruzzy/MyVault,=20=D1=81=D0=BA=D0=B8=D0=BB=D0=BB=20obsi?= =?UTF-8?q?dian=20=D1=83=20Astra;=20=D0=B0=D0=BB=D0=B5=D1=80=D1=82=D1=8B?= =?UTF-8?q?=20backup=5Fvault?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- TODO.md | 3 +-- servers/rpi.md | 9 ++++++++ stacks/monitoring/prometheus/rules/alerts.yml | 7 +++++++ stacks/rpi-backup/bin/vault-archive | 21 +++++++++++++++++++ .../rpi-backup/systemd/obsidian-sync.service | 15 +++++++++++++ .../rpi-backup/systemd/vault-archive.service | 12 +++++++++++ stacks/rpi-backup/systemd/vault-archive.timer | 10 +++++++++ 7 files changed, 75 insertions(+), 2 deletions(-) create mode 100755 stacks/rpi-backup/bin/vault-archive create mode 100644 stacks/rpi-backup/systemd/obsidian-sync.service create mode 100644 stacks/rpi-backup/systemd/vault-archive.service create mode 100644 stacks/rpi-backup/systemd/vault-archive.timer diff --git a/TODO.md b/TODO.md index ece762f..87f56ba 100644 --- a/TODO.md +++ b/TODO.md @@ -33,8 +33,7 @@ _Собрано 2026-10-11._ ## 🧩 Новые возможности Astra (разберём позже) -- [ ] 1. Интеграция с Obsidian - Сделано 2026-10-11: синхронизация vault через git убрана везде (cron на fr1, плагин obsidian-git и `.git` на Mac; на iPhone/iPad его не было) — vault живёт только в Obsidian Sync. `ruzzy/MyVault` — архив на 2026-09-23. Дальше: клиент `obsidian-headless` (`ob`) на rpi + скилл для Astra. +- [x] 1. ~~Интеграция с Obsidian~~ — **сделано 2026-10-11**: vault на rpi через Obsidian Sync (`ob`), суточный архив в gitea, скилл `obsidian` у Astra (см. `servers/rpi.md`). - [ ] 2. Интеграция с двумя календарями — личным и рабочим - [ ] 3. Скилл для работы с PDF с книгами - [ ] 4. Скилл составления и слежения за планами обучения diff --git a/servers/rpi.md b/servers/rpi.md index 6c18c60..eabb24d 100644 --- a/servers/rpi.md +++ b/servers/rpi.md @@ -160,6 +160,15 @@ Docker CE 29.9 + Compose v5.6 из репо download.docker.com (в Debian ст - Реестр устройств уточнён 2026-10-11 по сообщению владельца: `Xiaomi-Pad-7`, `ce:14:42:fd:a2:d5`, при обнаружении `192.168.10.45` — «Планшет подруги Полины (Xiaomi Pad 7)». Записано через `router known add`; MAC частный, при его смене потребуется новая отметка. +## Obsidian-vault (с 2026-10-11) +- Vault владельца «MyVault» (Obsidian Sync, тариф **Standard**: 1 vault, 1 ГБ, файл ≤ 6 МБ, история 31 день, продление помесячное) — на rpi в `/home/astra/vault` (~60 МБ, 332 файла). +- Клиент — официальный `obsidian-headless` 0.0.14 (`/usr/bin/ob`, npm, Node.js 24 LTS из репо NodeSource — в Debian 13 только Node 20, а клиенту нужен ≥ 22). Вход `ob login` делал владелец (учётка ruzzyrullezz@gmail.com), привязка `ob sync-setup` — vault id `469340a4…`, устройство `rpi-astra`, без E2E-пароля. +- `obsidian-sync.service` (user astra, `ob sync --path /home/astra/vault --continuous`, Restart=always). Режим **bidirectional** (решение владельца: Astra правит заметки по его просьбе); конфиги `.obsidian` не синхронизируются; типы файлов — все (`unsupported` включён). +- ⚠️ Mac владельца не выгружает в Sync «прочие типы» (`.mmd` — 7 диаграмм `Работа/Perps/flows/`): их нет ни в облаке, ни на rpi/iPhone. Лечится на Mac: Настройки → Синхронизация → Другие типы файлов. Суточный архив пока записал их удаление (в истории они есть, коммит `014b2a9`). +- **Архив в git** — `vault-archive.timer` (03:45) → `/usr/local/bin/vault-archive` (`stacks/rpi-backup/`): односторонний commit+push в `ruzzy/MyVault` (продолжает историю git-эпохи; Astra — коллаборатор с записью). Git-каталог отдельно — `~astra/vault.git` с `core.worktree=/home/astra/vault`, в vault нет `.git`. Скрытые файлы не стейджатся (Sync их не приносит — иначе были бы ложные удаления). Первый снимок 2026-10-11 — `014b2a9` (изменения с 2026-09-23). Итог → `backup_*{job="backup_vault"}`, алерты `BackupStale` (>26 ч) и `BackupNeverReported`. +- Astra — скилл `obsidian` (`ruzzy/astra-bot`, `codex/skills/obsidian/`): читать свободно, писать только по прямой просьбе, новое — в `Неотсортированное/`, правка — с показом изменений, в стиле владельца (вики-ссылки, без тегов/frontmatter, заметка-папка, картинки в `static/images/`); служебные файлы агента в vault — никогда. Запись в vault вне песочницы Codex → каждая правка через кнопку подтверждения. Проверено 2026-10-11: ответ по заметке «Читаем и слушаем». +- ⚠️ Бот `claude-channels` на fr1 доступа к vault больше не имеет (см. `servers/fr1.md`). + ## Открытые хвосты (на 2026-10-11) - USB3-хаб с питанием — теперь только ради скорости: WD Elements 1 ТБ работает второй копией в роутере (~10 МБ/с); на малине через хаб было бы ~100 МБ/с (обновлено 2026-10-11, было «копия одна»). - Нет node-exporter (CPU/RAM/диск самой малины в Prometheus не видны) — пуш через pushgateway для node-метрик неудобен; решить, нужен ли. diff --git a/stacks/monitoring/prometheus/rules/alerts.yml b/stacks/monitoring/prometheus/rules/alerts.yml index cad0b3c..fd45e66 100644 --- a/stacks/monitoring/prometheus/rules/alerts.yml +++ b/stacks/monitoring/prometheus/rules/alerts.yml @@ -99,6 +99,7 @@ groups: or (time() - backup_last_success_timestamp{job="backup_onedrive_verify"} > 8 * 86400) or (time() - backup_last_success_timestamp{job="backup_servers"} > 26 * 3600) or (time() - backup_last_success_timestamp{job="backup_router"} > 30 * 3600) + or (time() - backup_last_success_timestamp{job="backup_vault"} > 26 * 3600) or (time() - backup_last_success_timestamp{job="backup_router_sample"} > 35 * 86400) for: 10m labels: {severity: critical} @@ -191,3 +192,9 @@ groups: labels: {severity: warning} annotations: summary: "Дом: необычно большая ОТДАЧА в интернет — {{ $value | humanize1024 }}Б/с 30+ мин (облачная синхронизация, торрент или что-то подозрительное). Кто: `router traffic --live`." + - alert: BackupNeverReported + expr: absent(backup_last_success_timestamp{instance="rpi",job="backup_vault"}) + for: 26h + labels: {severity: warning, instance: rpi, job: backup_vault} + annotations: + summary: "rpi: архив Obsidian-vault в gitea не отчитывался 26+ ч — проверь vault-archive / obsidian-sync" diff --git a/stacks/rpi-backup/bin/vault-archive b/stacks/rpi-backup/bin/vault-archive new file mode 100755 index 0000000..0fe6114 --- /dev/null +++ b/stacks/rpi-backup/bin/vault-archive @@ -0,0 +1,21 @@ +#!/bin/bash +# Суточный ОДНОСТОРОННИЙ архив Obsidian-vault в gitea (ruzzy/MyVault). +# Vault синхронизирует Obsidian Sync (obsidian-sync.service, ~astra/vault); git — только история: +# commit + push, никогда не pull — в vault отсюда ничего не попадает. +# Git-каталог отдельно (~astra/vault.git, core.worktree=~astra/vault), чтобы в vault не было .git. +# Скрытые файлы (.obsidian, данные плагинов, .gitignore) Sync на rpi не приносит — их не трогаем, +# иначе git записал бы их удаление. +set -euo pipefail +cd "$HOME" +G=(git --git-dir="$HOME/vault.git" --work-tree="$HOME/vault") +systemctl is-active -q obsidian-sync || { echo "obsidian-sync не работает — архив устарел бы, пропуск"; exit 1; } +"${G[@]}" add -A -- . ":(exclude).*" ":(exclude)**/.*" +if "${G[@]}" diff --cached --quiet; then + echo "изменений нет" +else + stat=$("${G[@]}" diff --cached --shortstat) + "${G[@]}" commit -q -m "Архив vault $(date +%F)" -m "$stat" + echo "коммит: $stat" +fi +"${G[@]}" push -q origin HEAD:main +echo "OK: $("${G[@]}" log -1 --format='%h %s')" diff --git a/stacks/rpi-backup/systemd/obsidian-sync.service b/stacks/rpi-backup/systemd/obsidian-sync.service new file mode 100644 index 0000000..ac9fa11 --- /dev/null +++ b/stacks/rpi-backup/systemd/obsidian-sync.service @@ -0,0 +1,15 @@ +[Unit] +Description=Obsidian Sync (headless) for vault /home/astra/vault +Wants=network-online.target +After=network-online.target + +[Service] +User=astra +Environment=HOME=/home/astra +WorkingDirectory=/home/astra/vault +ExecStart=/usr/bin/ob sync --path /home/astra/vault --continuous +Restart=always +RestartSec=30 + +[Install] +WantedBy=multi-user.target diff --git a/stacks/rpi-backup/systemd/vault-archive.service b/stacks/rpi-backup/systemd/vault-archive.service new file mode 100644 index 0000000..cb47828 --- /dev/null +++ b/stacks/rpi-backup/systemd/vault-archive.service @@ -0,0 +1,12 @@ +[Unit] +Description=Daily one-way archive of Obsidian vault to gitea (ruzzy/MyVault) +Wants=network-online.target +After=network-online.target obsidian-sync.service + +[Service] +Type=oneshot +User=astra +Environment=HOME=/home/astra +ExecStart=/usr/local/bin/vault-archive +ExecStopPost=+/usr/local/bin/backup-metrics backup_vault +TimeoutStartSec=15min diff --git a/stacks/rpi-backup/systemd/vault-archive.timer b/stacks/rpi-backup/systemd/vault-archive.timer new file mode 100644 index 0000000..b4aadf9 --- /dev/null +++ b/stacks/rpi-backup/systemd/vault-archive.timer @@ -0,0 +1,10 @@ +[Unit] +Description=Daily Obsidian vault archive + +[Timer] +OnCalendar=*-*-* 03:45 +RandomizedDelaySec=10m +Persistent=true + +[Install] +WantedBy=timers.target