From 2e96c1b2713a8b97e54aa2e058e52bde4df2405a Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Tue, 12 May 2026 18:46:45 +0600 Subject: [PATCH] =?UTF-8?q?[2026-05-12]=20kraken=20NAS:=20=D0=BE=D0=B1?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=BB=D1=91=D0=BD=20=D0=BF=D0=BB=D0=B0=D0=BD?= =?UTF-8?q?=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA=D0=B8=20OMV?= =?UTF-8?q?,=20=D1=88=D0=B0=D0=B3=D0=B8=205-11?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- family/how-to/openmediavault-rpi5.md | 256 +++++++++++++++++++++++---- wiki/personal-os-agent-rules.md | 4 +- wiki/personal-os-architecture.md | 8 +- 3 files changed, 227 insertions(+), 41 deletions(-) diff --git a/family/how-to/openmediavault-rpi5.md b/family/how-to/openmediavault-rpi5.md index e62e3163..d4a333eb 100644 --- a/family/how-to/openmediavault-rpi5.md +++ b/family/how-to/openmediavault-rpi5.md @@ -5,11 +5,12 @@ tags: - openmediavault - how-to created: '2026-05-11' -status: in-progress +updated: '2026-05-12' +status: omv-installed --- # OpenMediaVault на Raspberry Pi 5 -**Статус:** В процессе настройки (май 2026) +**Статус:** OMV установлен (май 2026) **Цель:** NAS на RPi 5 — OS на SD-карте, хранилище на USB 3.0 HDD --- @@ -19,58 +20,69 @@ status: in-progress - Raspberry Pi 5 (4 или 8 GB RAM) - SD-карта ≥16 GB (Samsung/SanDisk A1 Class 10+) - USB 3.0 HDD для хранения данных -- Проводной Ethernet (обязателен при установке) +- Проводной Ethernet (обязателен) --- ## Шаг 1 — Флашим SD-карту **Образ:** Raspberry Pi OS Lite **64-bit (Bookworm / Debian 12)** -> ⚠️ Брать именно Bookworm, не новый Trixie (Debian 13) — OMV 7 на Trixie не поддерживается! +> ⚠️ Брать именно Bookworm, не Trixie (Debian 13) — OMV не поддерживается на Trixie! - Последний Bookworm: **2025-05-13** - Прямая ссылка: https://downloads.raspberrypi.com/raspios_lite_arm64/images/raspios_lite_arm64-2025-05-13/2025-05-13-raspios-bookworm-arm64-lite.img.xz -- SHA256: `2025-05-13-raspios-bookworm-arm64-lite.img.xz.sha256` (в той же папке) -- Размер: ~423 MB -**Инструмент:** Balena Etcher (https://etcher.balena.io/) +**Инструмент:** Raspberry Pi Imager (https://www.raspberrypi.com/software/) -**Флашим через Balena Etcher** (не RPi Imager — настройка делается скриптом после флаша): +> ⚠️ Не Balena Etcher — только RPi Imager поддерживает OS Customisation! +> При выборе образа из каталога (не custom file) появляется кнопка "Edit Settings" -После флаша вставить SD-карту в мак и запустить: -```bash -bash ~/Downloads/setup-kraken-sdcard.sh -``` +**Настройки (Edit Settings → шестерёнка):** +- Hostname: `kraken` +- Username: `kraken` (не `admin` — зарезервировано для OMV!) +- Password: сохранён в 1Password (запись "Kraken RPi") +- SSH: Enable → Allow public-key authentication → вставить `~/.ssh/id_rsa.pub` -Что скрипт настраивает: -- **Hostname:** `kraken` -- **Username:** `kraken` (не `admin` — зарезервировано для OMV!) -- **SSH:** включён, ключ `id_rsa` добавлен автоматически -- **Подключение:** `ssh kraken@kraken.local` -- Пароль сохранён в 1Password (запись: "Kraken RPi") +После флаша вставить карту в Pi и включить. --- -## Шаг 2 — Первый запуск и обновление +## Шаг 2 — Первый запуск, обновление и настройка сети +SSH подключение (пока через WiFi/роутер): ```bash -ssh @ - -sudo apt-get update -sudo apt-get upgrade -y +ssh -i ~/.ssh/id_rsa kraken@kraken.local ``` +Обновление системы: +```bash +sudo apt-get update && sudo apt-get upgrade -y +``` + +Static IP на eth0 (прямой кабель Mac ↔ Pi для установки): +```bash +sudo nmcli con add type ethernet ifname eth0 con-name eth0-static \ + ipv4.method manual \ + ipv4.addresses 192.168.100.2/24 \ + ipv4.gateway 192.168.100.1 \ + ipv4.never-default yes \ + connection.autoconnect yes +sudo nmcli con up eth0-static +``` + +> ⚠️ `ipv4.never-default yes` — обязательно! Иначе интернет пойдёт через Mac, а не WiFi, и установка зависнет. + --- -## Шаг 3 — Установка OMV 7 +## Шаг 3 — Установка OMV ```bash -# Pre-install (настраивает сеть, grub и т.д.) -wget -O - https://github.com/OpenMediaVault-Plugin-Developers/installScript/raw/master/preinstall | sudo bash +# Pre-install +wget -qO- https://github.com/OpenMediaVault-Plugin-Developers/installScript/raw/master/preinstall | sudo bash sudo reboot # После перезагрузки — основная установка (~30 мин) -wget -O - https://github.com/OpenMediaVault-Plugin-Developers/installScript/raw/master/install | sudo bash +wget -qO- https://github.com/OpenMediaVault-Plugin-Developers/installScript/raw/master/install | sudo bash ``` Pi перезагрузится автоматически по окончании. @@ -79,24 +91,198 @@ Pi перезагрузится автоматически по окончани ## Шаг 4 — Первый вход в веб-интерфейс -- URL: `http://` +- URL: `http://192.168.100.2` (или `http://kraken.local`) - Логин: `admin` - Пароль: `openmediavault` -- **Сразу сменить пароль!** +- **Сразу сменить пароль!** (System → General Settings → Web Administrator Password) --- -## Шаг 5 — Подключение USB HDD +## Шаг 5 — Подключить Pi к роутеру, настроить static IP, отключить WiFi -1. Подключить HDD после установки OMV -2. Storage → Disks → инициализировать диск -3. Storage → File Systems → создать EXT4, смонтировать -4. Storage → Shared Folders → создать шары +1. Переключить ethernet-кабель: Pi → роутер (не Mac) +2. В роутере: DHCP reservation для MAC `2c:cf:67:64:03:f3` → выбрать постоянный IP (например `192.168.1.X`) +3. Отключить WiFi на Pi: +```bash +sudo nmcli radio wifi off +``` +4. Убедиться что Pi доступен по новому IP, проверить OMV web UI + +--- + +## Шаг 6 — Подключить USB HDD, форматировать, смонтировать + +1. Подключить HDD к USB 3.0 порту Pi (синий разъём) +2. OMV Web UI → Storage → Disks → убедиться что диск виден +3. Storage → File Systems → Create → выбрать диск → EXT4 → Save → Mount +4. Storage → Shared Folders → Add: + - `media` — для фильмов/музыки + - `timemachine` — для Time Machine бэкапов + - `docker` — для данных контейнеров + +--- + +## Шаг 7 — omv-extras + Docker + Portainer + +Установить omv-extras (даёт доступ к Docker плагину): +```bash +wget -qO- https://github.com/OpenMediaVault-Plugin-Developers/packages/raw/master/install | sudo bash +``` + +В OMV Web UI: +- System → Plugins → найти `openmediavault-compose` → установить +- Или через SSH: установить Docker + Portainer вручную: + +```bash +curl -fsSL https://get.docker.com | sudo bash +sudo usermod -aG docker kraken + +# Portainer +sudo docker volume create portainer_data +sudo docker run -d \ + --name portainer \ + --restart always \ + -p 9000:9000 \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v portainer_data:/data \ + portainer/portainer-ce:latest +``` + +Portainer UI: `http://kraken.local:9000` + +--- + +## Шаг 8 — Docker контейнеры + +Все контейнеры управляются через Portainer или `docker compose`. +Данные хранить на HDD в `/srv//docker/`. + +### Watchtower (авто-обновление контейнеров) +```yaml +watchtower: + image: containrrr/watchtower + restart: always + volumes: + - /var/run/docker.sock:/var/run/docker.sock + environment: + - WATCHTOWER_CLEANUP=true + - WATCHTOWER_SCHEDULE=0 0 4 * * * # каждую ночь в 4:00 +``` + +### Home Assistant +```yaml +homeassistant: + image: ghcr.io/home-assistant/home-assistant:stable + restart: always + network_mode: host + volumes: + - /srv/.../docker/homeassistant:/config + privileged: true +``` + +### Zigbee2MQTT +```yaml +zigbee2mqtt: + image: koenkk/zigbee2mqtt + restart: always + volumes: + - /srv/.../docker/zigbee2mqtt:/app/data + - /run/udev:/run/udev:ro + devices: + - /dev/ttyUSB0:/dev/ttyUSB0 # Zigbee адаптер +``` + +### Jellyfin +```yaml +jellyfin: + image: jellyfin/jellyfin + restart: always + ports: + - 8096:8096 + volumes: + - /srv/.../docker/jellyfin:/config + - /srv/.../media:/media:ro +``` + +### Transmission +```yaml +transmission: + image: lscr.io/linuxserver/transmission + restart: always + ports: + - 9091:9091 + - 51413:51413 + volumes: + - /srv/.../docker/transmission:/config + - /srv/.../media/downloads:/downloads +``` + +### Rclone (бэкап на облако) +```yaml +rclone: + image: rclone/rclone + restart: unless-stopped + volumes: + - /srv/.../:/data:ro + - /home/kraken/.config/rclone:/config/rclone + command: sync /data remote:backup --progress +``` + +--- + +## Шаг 9 — Time Machine share (macOS бэкапы на NAS) + +В OMV Web UI: +1. Services → SMB/CIFS → Enable +2. Services → SMB/CIFS → Shares → Add: + - Shared folder: `timemachine` + - Enable Time Machine support: ✅ +3. На Mac: Finder → Go → Connect to Server → `smb://kraken.local/timemachine` +4. System Preferences → Time Machine → Add Disk → выбрать kraken + +--- + +## Шаг 10 — Перенос данных + +### Фильмы с Mac на NAS +```bash +rsync -avh --progress /path/to/movies/ kraken@kraken.local:/srv/.../media/movies/ +``` + +### Time Machine +> ⚠️ Старый TM-бэкап перенести нельзя напрямую — TM привязывает бэкап к конкретному диску/хосту. +> Начать новый бэкап на NAS, старый HDD хранить как архив или отформатировать после нескольких успешных новых бэкапов. + +--- + +## Шаг 11 — Hermes агент Кракен + +По образу агента Тайга (TrueNAS). Установить Hermes на Pi: + +```bash +# TODO: уточнить команду установки по образу Тайги +``` + +- Конфиг: `~/.hermes/config.yaml` +- Namespace: `family` +- Подключить к Discord/Zulip +- Настроить доступ к vault через obsidian-mcp + +--- + +## Уроки (что пошло не так при установке) + +- **Balena Etcher** не поддерживает OS Customisation — использовать только **RPi Imager** +- **`userconf.txt`** deprecated на Bookworm — правильный способ через RPi Imager (он пишет `custom.toml`) +- **`systemd.run=` в cmdline.txt** нужно указывать `/usr/lib/raspberrypi-sys-mods/firstboot`, а не свой скрипт +- **`ipv4.never-default yes`** при настройке static IP на eth0 — обязательно, иначе интернет идёт через Mac и установка зависает +- **OMV install script** при зависании — скорее всего нет интернета, проверить маршруты (`ip route`) --- ## Полезные ссылки -- Официальный вики: https://wiki.omv-extras.org/ +- Официальный вики OMV: https://wiki.omv-extras.org/ - Install script: https://github.com/OpenMediaVault-Plugin-Developers/installScript +- RPi Imager: https://www.raspberrypi.com/software/ - RPi Downloads: https://www.raspberrypi.com/software/operating-systems/ diff --git a/wiki/personal-os-agent-rules.md b/wiki/personal-os-agent-rules.md index 0683c0d9..07062598 100644 --- a/wiki/personal-os-agent-rules.md +++ b/wiki/personal-os-agent-rules.md @@ -7,7 +7,7 @@ confidence: 1.0 # Personal OS — Agent Rules & Architecture -Eagle (Орёл) is the Discord-facing Hermes agent. This page documents what Eagle knows about its own environment and how to reason about it. +Eagle (Орёл) is the Zulip-facing Hermes agent. This page documents what Eagle knows about its own environment and how to reason about it. ## Data Flow @@ -44,7 +44,7 @@ VALUES (current_date, EXTRACT(WEEK FROM current_date)::int, ARRAY[]::text[], ''); ``` -`source` values: `discord_pushback` | `morning_brief_correction` | `manual` +`source` values: `zulip_pushback` | `morning_brief_correction` | `manual` `reason_tag` examples: `ship-review-crunch` | `urgent-bug` | `meeting-day` | `over-estimated` | `scope-change` Never announce the log insertion. It is silent instrumentation. diff --git a/wiki/personal-os-architecture.md b/wiki/personal-os-architecture.md index bb0deffd..2325a1ce 100644 --- a/wiki/personal-os-architecture.md +++ b/wiki/personal-os-architecture.md @@ -17,11 +17,11 @@ See: `personal-os-purpose.md` - `~/scripts/run-pipeline.sh` → sync.js + generate-status.js every 30 min (workdays via Hermes cron) - Writes `~/context/status.md` and `~/Developer/personal-os/asana_context.md` - Writes daily AW activity summaries to `activity_daily` table with quadrant classification -- No Discord output — pure data layer +- No Zulip output — pure data layer -### Орёл / Eagle (Tactician + reactive layer) — Hermes v0.11.x Discord bot +### Орёл / Eagle (Tactician + reactive layer) — Hermes Zulip agent - Reads `~/context/status.md`, daily/weekly briefs, vault via obsidian MCP -- Discord channels: `#daily-brief` `#inbox` `#focus` `#executor` `#projects` `#journal` `#retrospector` +- Zulip streams: `daily-brief` `inbox` `focus` `executor` `projects` `journal` `retrospector` - Cron jobs: generate-daily-brief (07:00 MTWRF), morning-brief (08:30 MTWRF), eod-summary (18:00 MTWRF), inbox-check (30 min 09–19 MTWRF), weekly-plan (Mon 08:00), weekly-review (Fri 17:00), retrospector (Fri 17:30), executor-autonomous (every 30 min 09–18 MTWRF), commit-vault (23:00 daily) - Logs corrections to `corrections_log` table (SQL INSERT, silently on pushback) - **Never accesses Asana API directly** — only reads pre-rendered markdown and DB @@ -79,7 +79,7 @@ generate-status.js → ~/context/status.md ← Eagle reads this → ~/Developer/personal-os/asana_context.md ← inbox-check reads this -Eagle corrections in Discord +Eagle corrections in Zulip → corrections_log table (INSERT on pushback, no announcement) → Retrospector reads weekly