337 lines
14 KiB
Markdown
Executable File
337 lines
14 KiB
Markdown
Executable File
---
|
||
tags:
|
||
- raspberry-pi
|
||
- nas
|
||
- openmediavault
|
||
- how-to
|
||
created: '2026-05-11'
|
||
updated: '2026-05-12'
|
||
status: hermes-pending
|
||
ip: 192.168.1.14
|
||
---
|
||
# OpenMediaVault на Raspberry Pi 5
|
||
|
||
**Статус:** Контейнеры запущены, Time Machine pending (май 2026)
|
||
**Цель:** NAS на RPi 5 — OS на SD-карте, хранилище на USB 3.0 HDD
|
||
|
||
## Прогресс
|
||
|
||
| Шаг | Статус | Заметки |
|
||
|-----|--------|---------|
|
||
| 1 — Флашим SD | ✅ | Bookworm 2025-05-13, RPi Imager |
|
||
| 2 — Первый запуск + обновление | ✅ | apt upgrade выполнен |
|
||
| 3 — Установка OMV | ✅ | OMV 7 установлен |
|
||
| 4 — Первый вход в веб-интерфейс | ✅ | Пароль сменён |
|
||
| 5 — Сеть | ✅ | DHCP static lease `192.168.1.14` (eth0 MAC `2c:cf:67:64:03:f3`); WiFi отключён (modprobe blacklist brcmfmac/brcmutil) |
|
||
| 6 — USB HDD | ✅ | 12TB Seagate ST12000NT001, EXT4, UUID `49e8f586-3839-4c5d-a1e1-58bfc3579ade`, смонтирован через OMV в `/srv/dev-disk-by-uuid-49e8f586-3839-4c5d-a1e1-58bfc3579ade` |
|
||
| 7 — omv-extras + Docker | ✅ | omv-extras 7.0.6, Docker 29.4.3, kraken в группе docker |
|
||
| 8 — Контейнеры | ✅ | Все через отдельные docker compose, конфиги на HDD (см. ниже) |
|
||
| 9 — Time Machine share | ✅ | `mbentley/timemachine:smb`, расписание 10:00-22:00 GMT+6, HDD/timemachine |
|
||
| 10 — Перенос данных | 🔲 | |
|
||
| 11 — Hermes агент Кракен | 🚧 | Dockerfile + config готовы, нужно: заполнить .env, HA token, собрать образ |
|
||
| 12 — Obsidian sync (Taiga↔Kraken↔Eagle) | 🔲 | Настроить синхронизацию vault между всеми тремя агентами |
|
||
|
||
---
|
||
|
||
## Железо
|
||
|
||
- Raspberry Pi 5 (4 или 8 GB RAM)
|
||
- SD-карта ≥16 GB (Samsung/SanDisk A1 Class 10+)
|
||
- USB 3.0 HDD для хранения данных
|
||
- Проводной Ethernet (обязателен)
|
||
|
||
---
|
||
|
||
## Шаг 1 — Флашим SD-карту
|
||
|
||
**Образ:** Raspberry Pi OS Lite **64-bit (Bookworm / Debian 12)**
|
||
> ⚠️ Брать именно 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
|
||
|
||
**Инструмент:** Raspberry Pi Imager (https://www.raspberrypi.com/software/)
|
||
|
||
> ⚠️ Не Balena Etcher — только RPi Imager поддерживает OS Customisation!
|
||
> При выборе образа из каталога (не custom file) появляется кнопка "Edit Settings"
|
||
|
||
**Настройки (Edit Settings → шестерёнка):**
|
||
- Hostname: `kraken`
|
||
- Username: `kraken` (не `admin` — зарезервировано для OMV!)
|
||
- Password: сохранён в 1Password (запись "Kraken RPi")
|
||
- SSH: Enable → Allow public-key authentication → вставить `~/.ssh/id_rsa.pub`
|
||
|
||
После флаша вставить карту в Pi и включить.
|
||
|
||
---
|
||
|
||
## Шаг 2 — Первый запуск, обновление и настройка сети
|
||
|
||
SSH подключение (пока через WiFi/роутер):
|
||
```bash
|
||
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
|
||
|
||
```bash
|
||
# Pre-install
|
||
wget -qO- https://github.com/OpenMediaVault-Plugin-Developers/installScript/raw/master/preinstall | sudo bash
|
||
sudo reboot
|
||
|
||
# После перезагрузки — основная установка (~30 мин)
|
||
wget -qO- https://github.com/OpenMediaVault-Plugin-Developers/installScript/raw/master/install | sudo bash
|
||
```
|
||
|
||
Pi перезагрузится автоматически по окончании.
|
||
|
||
---
|
||
|
||
## Шаг 4 — Первый вход в веб-интерфейс
|
||
|
||
- URL: `http://192.168.100.2` (или `http://kraken.local`)
|
||
- Логин: `admin`
|
||
- Пароль: `openmediavault`
|
||
- **Сразу сменить пароль!** (System → General Settings → Web Administrator Password)
|
||
|
||
---
|
||
|
||
## Шаг 5 — Сеть: DHCP + static lease, отключить WiFi
|
||
|
||
Переключить кабель Pi → роутер. Настроить DHCP через netplan (OMV управляет `/etc/netplan/20-openmediavault-eth0.yaml`):
|
||
|
||
```yaml
|
||
network:
|
||
ethernets:
|
||
eth0:
|
||
match:
|
||
macaddress: "2c:cf:67:64:03:f3"
|
||
dhcp4: yes
|
||
dhcp6: no
|
||
link-local: []
|
||
```
|
||
|
||
В роутере (ASUS): добавить static lease в `dhcp_staticlist` через nvram:
|
||
```bash
|
||
ssh -i ~/.ssh/id_rsa admin@192.168.1.1 \
|
||
"nvram set dhcp_staticlist='...<2C:CF:67:64:03:F3>192.168.1.14>kraken>' && nvram commit && service restart_dnsmasq"
|
||
```
|
||
|
||
Отключить WiFi навсегда (modprobe blacklist):
|
||
```bash
|
||
sudo sh -c 'echo blacklist brcmfmac > /etc/modprobe.d/disable-wifi.conf' < /dev/null
|
||
sudo sh -c 'echo blacklist brcmutil >> /etc/modprobe.d/disable-wifi.conf' < /dev/null
|
||
sudo update-initramfs -u -k all < /dev/null
|
||
```
|
||
|
||
> ⚠️ Все sudo команды через SSH требуют `< /dev/null` — иначе sudo ждёт stdin и зависает
|
||
|
||
---
|
||
|
||
## Шаг 6 — USB HDD
|
||
|
||
1. Подключить HDD к синему (USB 3.0) порту Pi
|
||
2. Проверить скорость: `sudo apt install hdparm && sudo hdparm -t --direct /dev/sda` → должно быть ~200-250 MB/s
|
||
3. Разметить: `sudo parted -s /dev/sda mklabel gpt mkpart primary 0% 100%`
|
||
4. Форматировать (агент не может — только вручную или через скрипт):
|
||
```bash
|
||
sudo bash /tmp/fmt.sh # скрипт с mkfs.ext4 -L storage /dev/sda1
|
||
```
|
||
5. OMV Web UI → Storage → File Systems → выбрать `/dev/sda1` → Mount
|
||
6. OMV монтирует в: `/srv/dev-disk-by-uuid-<UUID>/`
|
||
|
||
> ⚠️ Не монтировать вручную через fstab — OMV должен управлять монтированием сам
|
||
|
||
---
|
||
|
||
## Шаг 7 — omv-extras + Docker
|
||
|
||
```bash
|
||
# omv-extras
|
||
wget -qO- https://github.com/OpenMediaVault-Plugin-Developers/packages/raw/master/install | sudo bash < /dev/null
|
||
|
||
# Docker
|
||
curl -fsSL https://get.docker.com -o /tmp/get-docker.sh && sudo sh /tmp/get-docker.sh < /dev/null
|
||
sudo usermod -aG docker kraken < /dev/null
|
||
```
|
||
|
||
---
|
||
|
||
## Шаг 8 — Docker контейнеры
|
||
|
||
Каждый сервис — отдельный `docker-compose.yml` в `/home/kraken/<name>/`.
|
||
Все конфиги на HDD: `/srv/dev-disk-by-uuid-49e8f586-3839-4c5d-a1e1-58bfc3579ade/docker/<name>/`
|
||
|
||
| Сервис | Compose | URL | Данные |
|
||
|--------|---------|-----|--------|
|
||
| Portainer | `/home/kraken/portainer/` | :9000 | HDD/docker/portainer |
|
||
| Watchtower | `/home/kraken/watchtower/` | — | stateless |
|
||
| Home Assistant | `/home/kraken/homeassistant/` | :8123 | HDD/docker/homeassistant |
|
||
| Jellyfin | `/home/kraken/media/` | :8096 | HDD/docker/jellyfin, media:ro |
|
||
| Transmission | `/home/kraken/media/` | :9091 | HDD/docker/transmission, HDD/media/downloads |
|
||
| Rclone | `/home/kraken/rclone/` | — | cron воскр. 03:00 → mailru-crypt:kraken/docker |
|
||
|
||
Управление:
|
||
```bash
|
||
cd /home/kraken/<name> && sudo docker compose up -d # запустить
|
||
cd /home/kraken/<name> && sudo docker compose restart # рестарт
|
||
cd /home/kraken/<name> && sudo docker compose pull && sudo docker compose up -d # обновить
|
||
```
|
||
|
||
> ⚠️ Watchtower: нужна переменная `DOCKER_API_VERSION=1.54` — иначе крашится (API mismatch)
|
||
> ⚠️ sudo через SSH требует `< /dev/null` для каждой команды с tee/pipe
|
||
|
||
---
|
||
|
||
## Шаг 9 — Time Machine share
|
||
|
||
Контейнер: `mbentley/timemachine:smb`
|
||
Compose: `/home/kraken/timemachine/docker-compose.yml`
|
||
Данные: `/srv/dev-disk-by-uuid-49e8f586-3839-4c5d-a1e1-58bfc3579ade/timemachine/`
|
||
|
||
**Расписание** (crontab kraken-пользователя):
|
||
- `0 4 * * *` UTC (10:00 GMT+6) → `/usr/local/bin/tm-start.sh` — поднять контейнер
|
||
- `0 16 * * *` UTC (22:00 GMT+6) → `/usr/local/bin/tm-stop.sh` — остановить контейнер
|
||
- `restart: no` — при загрузке Pi не стартует автоматически
|
||
|
||
**Credentials:**
|
||
- Пользователь: `timemachine`
|
||
- Пароль: `timemachine` ⚠️ сменить позже
|
||
|
||
**Подключение с Mac:**
|
||
1. Finder → `⌘K` → `smb://192.168.1.14`
|
||
2. Логин: `timemachine` / `timemachine`
|
||
3. System Preferences → Time Machine → Add Disk → выбрать `kraken`
|
||
|
||
Лог cron: `/var/log/timemachine-cron.log`
|
||
|
||
---
|
||
|
||
## Шаг 10 — Перенос данных
|
||
|
||
### Фильмы с Mac на NAS
|
||
```bash
|
||
rsync -avh --progress /path/to/movies/ kraken@kraken.local:/srv/.../media/movies/
|
||
```
|
||
|
||
### Time Machine
|
||
> ⚠️ Старый TM-бэкап перенести нельзя напрямую — TM привязывает бэкап к конкретному диску/хосту.
|
||
> Начать новый бэкап на NAS, старый HDD хранить как архив или отформатировать после нескольких успешных новых бэкапов.
|
||
|
||
---
|
||
|
||
## Шаг 11 — Hermes агент Кракен
|
||
|
||
### Файлы
|
||
```
|
||
/home/kraken/hermes/
|
||
Dockerfile — образ на базе node:20-slim + hermes-agent + obsidian-mcp
|
||
docker-compose.yml — restart: unless-stopped, network_mode: host
|
||
.env — API ключи (заполнить вручную)
|
||
config.yaml → копируется в /srv/.../docker/hermes/config/config.yaml
|
||
```
|
||
|
||
### Модели (проверено 2026-05-12)
|
||
Бесплатные модели с tool calling на OpenRouter:
|
||
| Модель | Статус |
|
||
|--------|--------|
|
||
| `nvidia/nemotron-3-super-120b-a12b:free` | ✅ работает |
|
||
| `openrouter/free` | ✅ fallback (авто-роутинг) |
|
||
| `deepseek/deepseek-chat-v3-0324:free` | ❌ 404 |
|
||
| `qwen/qwen3-235b-a22b:free` | ❌ 404 |
|
||
| `google/gemma-4-31b-it:free` | ❌ 429 rate limit |
|
||
|
||
**Primary**: `nvidia/nemotron-3-super-120b-a12b:free` (262K ctx, tools ✅)
|
||
**Auxiliary/Fallback**: `openrouter/free`
|
||
**Рекомендуется**: добавить `GOOGLE_API_KEY` → Gemini Flash как auxiliary
|
||
|
||
### Telegram бот
|
||
- Имя: Кракен
|
||
- Bot: [@kraken_htpc_bot](https://t.me/kraken_htpc_bot)
|
||
- Token: `8750114596:AAH625OBSdb_Bn7ZSwshjDD3mbENnkSRYag`
|
||
|
||
### Toolsets
|
||
`hermes-cli, terminal, file, web, web_crawler, memory, spotify, homeassistant`
|
||
|
||
### Деплой (после заполнения .env)
|
||
```bash
|
||
# Заполнить ключи:
|
||
nano /home/kraken/hermes/.env
|
||
# OPENROUTER_API_KEY=sk-or-...
|
||
# GOOGLE_API_KEY=...
|
||
# HASS_TOKEN=... (создать в HA UI → Profile → Long-Lived Access Tokens)
|
||
|
||
# Собрать и запустить:
|
||
cd /home/kraken/hermes
|
||
sudo docker compose build
|
||
sudo docker compose up -d
|
||
|
||
# Проверить:
|
||
sudo docker logs hermes-kraken --tail 20
|
||
```
|
||
|
||
### TODO
|
||
- [ ] Заполнить .env (OPENROUTER_API_KEY, GOOGLE_API_KEY)
|
||
- [ ] Настроить HA → создать Long-Lived token → вписать в HASS_TOKEN
|
||
- [ ] Собрать и запустить контейнер
|
||
- [ ] Настроить obsidian-mcp (vault path = /vault)
|
||
- [ ] Перенести Spotify auth с Eagle (или запарить заново)
|
||
|
||
---
|
||
|
||
## Шаг 12 — Obsidian sync (Taiga ↔ Kraken ↔ Eagle)
|
||
|
||
Все три агента должны работать с одним vault. Варианты:
|
||
- **Git sync** — vault в git repo, каждый агент делает pull/push
|
||
- **rsync** — периодическая синхронизация через SSH
|
||
- **Syncthing** — p2p sync без облака
|
||
|
||
Текущее состояние vault:
|
||
- Eagle (Mac): `~/obsidian/` — git repo, auto-commit 23:00
|
||
- Taiga (TrueNAS): `/mnt/RED_2TB/storage/obsidian/` — read-only mount
|
||
- Kraken (RPi): `/vault` — пока не подключён
|
||
|
||
**Следующие шаги:**
|
||
- [ ] Определить схему sync (git vs syncthing vs rsync)
|
||
- [ ] Настроить write-доступ на Тайге и Кракене
|
||
- [ ] Автоматический pull на всех агентах при изменениях
|
||
|
||
---
|
||
|
||
## Уроки (что пошло не так при установке)
|
||
|
||
- **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`)
|
||
|
||
---
|
||
|
||
## Полезные ссылки
|
||
|
||
- Официальный вики 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/
|