[2026-09-02] eagle: family/how-to/hermes-docker-kraken.md family/how-to/kraken-network.md
This commit is contained in:
@@ -85,6 +85,59 @@ docker compose up -d
|
|||||||
| `hermes/config/` | `/opt/data` | `HERMES_HOME` — config, sessions, skills, memory |
|
| `hermes/config/` | `/opt/data` | `HERMES_HOME` — config, sessions, skills, memory |
|
||||||
| `/home/kraken/obsidian` | `/vault` | Obsidian vault read/write access |
|
| `/home/kraken/obsidian` | `/vault` | Obsidian vault read/write access |
|
||||||
|
|
||||||
|
## SSH из контейнера → хост (диагностика и фиксы)
|
||||||
|
|
||||||
|
> Перенесено из удалённого скилла `kraken-omv-maintenance` / `kraken-docker-ssh`. Актуальные пути и фиксы для случая, когда `ssh kraken-host` изнутри контейнера `hermes-kraken` не работает.
|
||||||
|
|
||||||
|
**Архитектура**
|
||||||
|
|
||||||
|
```
|
||||||
|
Container (hermes-kraken)
|
||||||
|
uid=10000 (dropped from root by entrypoint)
|
||||||
|
HOME=/opt/data
|
||||||
|
~/.ssh/config = /opt/data/.ssh/config (bind mount from host)
|
||||||
|
/etc/ssh/ssh_config — bind mount (полный /etc/ssh/)
|
||||||
|
|
||||||
|
Host (Kraken RPi5)
|
||||||
|
User kraken (uid=1000) owns /home/kraken/.ssh/
|
||||||
|
/home/kraken/.ssh/id_ed25519 — закрытый ключ (обязательно 600)
|
||||||
|
/home/kraken/.ssh/authorized_keys — должен содержать публичный ключ
|
||||||
|
```
|
||||||
|
|
||||||
|
**Fixed points (НЕ менять)**
|
||||||
|
|
||||||
|
1. В compose **не задавать** `user:`, `entrypoint:`, `HERMES_UID/GID` — entrypoint сам сбрасывает uid (image defaults).
|
||||||
|
2. Публичный ключ на хост один раз: `ssh-copy-id kraken@<host>`.
|
||||||
|
3. Закрытый ключ на хосте **обязан быть 600**: `ssh kraken@<host> "chmod 600 /home/kraken/.ssh/id_ed25519"` — OpenSSH 10.x (Bookworm) отвергает 644.
|
||||||
|
4. В `/etc/passwd` контейнера должен быть `kraken:x:1000` — не выставлять `user:` в compose.
|
||||||
|
5. SSH config обязан лежать в `$HOME/.ssh/config` (`$HOME=/opt/data` → `/opt/data/.ssh/config`).
|
||||||
|
|
||||||
|
**Диагностика по порядку**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh kraken@<host> "echo OK && hostname" # доступен ли хост
|
||||||
|
ssh kraken@<host> "sudo docker ps --filter name=hermes-kraken --format '{{.Names}} {{.Status}}'"
|
||||||
|
# изнутри контейнера на хост (loopback алиас kraken-host)
|
||||||
|
ssh kraken@<host> "sudo docker exec hermes-kraken ssh -o ConnectTimeout=5 kraken-host 'echo HELLO'"
|
||||||
|
# verbose — какие конфиги читает SSH
|
||||||
|
ssh kraken@<host> "sudo docker exec hermes-kraken ssh -v kraken-host 'echo HELLO' 2>&1 | grep -E 'config|debug1.*/ssh|Host|connect|Permission|authenticate|bad|owner' | head -15"
|
||||||
|
ssh kraken@<host> "sudo docker exec hermes-kraken getent passwd 1000" # uid 1000 в passwd?
|
||||||
|
ssh kraken@<host> "sudo docker exec hermes-kraken ls -la /opt/data/.ssh/id_ed25519"
|
||||||
|
ssh kraken@<host> "sudo docker exec hermes-kraken cat /opt/data/.ssh/config"
|
||||||
|
ssh kraken@<host> "sudo docker exec hermes-kraken sh -c 'echo HOME=\$HOME; ls -la \"\$HOME/.ssh/config\"'"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Pitfalls**
|
||||||
|
|
||||||
|
- Не менять `user:` в compose — entrypoint должен стартовать как root, чтобы сделать chown.
|
||||||
|
- Не chown'ить `/opt/data` на `1000:1000` — entrypoint делает `chown -R hermes:hermes` (uid 10000).
|
||||||
|
- Не ставить 644 на закрытый ключ.
|
||||||
|
- НЕ использовать `Include ~/.ssh/config` в системном `/etc/ssh/ssh_config` — OpenSSH не резолвит `~` в системных Include.
|
||||||
|
- Если `$HOME=/opt/data`, а конфиг живёт в `/opt/data/home/.ssh/` — SSH его не прочитает (путь не совпадает).
|
||||||
|
- Может быть несколько пар ключей: bind mount приносит хост-ключ, а агент может иметь свой в `/opt/data/home/.ssh/`.
|
||||||
|
- passwd сбрасывается при пересоздании контейнера.
|
||||||
|
- Полный mount `/etc/ssh/` перезаписывает и host keys тоже.
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
|
|
||||||
- `network_mode: host` — port 8642 is directly on the Kraken host, no port mapping needed
|
- `network_mode: host` — port 8642 is directly on the Kraken host, no port mapping needed
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
title: Kraken Network & Infra
|
title: Kraken Network & Infra
|
||||||
created: '2026-05-23'
|
created: '2026-05-23'
|
||||||
updated: '2026-05-23'
|
updated: '2026-09-02'
|
||||||
type: tech
|
type: tech
|
||||||
namespace: personal
|
namespace: personal
|
||||||
tags: [infra, kraken, ssh, wireguard, network]
|
tags: [infra, kraken, ssh, wireguard, network]
|
||||||
@@ -17,7 +17,20 @@ related:
|
|||||||
ssh kraken
|
ssh kraken
|
||||||
```
|
```
|
||||||
|
|
||||||
IP: `192.168.1.15` (wlan0, primary). SSH alias `kraken` resolves via `~/.ssh/config`.
|
SSH alias `kraken` resolves via `~/.ssh/config`.
|
||||||
|
|
||||||
|
## Актуальная сеть (проверено 2026-09-02)
|
||||||
|
|
||||||
|
> Оба интерфейса живы. **eth0 — активный uplink** (default route metric 100), wlan0 — fallback (metric 600).
|
||||||
|
|
||||||
|
| Интерфейс | IP | MAC | Uplink role |
|
||||||
|
|---|---|---|---|
|
||||||
|
| **eth0** (Ethernet, Gigabit RPi5 rp1-gem/macb) | `192.168.1.14/24` (DHCP) | `2c:cf:67:64:03:f3` | **primary** — default via `192.168.1.1`, metric 100 |
|
||||||
|
| **wlan0** (WiFi) | `192.168.1.15/24` (DHCP) | `2c:cf:67:64:03:f4` | fallback — metric 600 |
|
||||||
|
|
||||||
|
- Ethernet link: **1000 Mbit/s full duplex** (как и ожидалось для Gigabit-порта RPi5), carrier up, стабильно.
|
||||||
|
- Router/gateway: `192.168.1.1` (`f0:79:59:77:9b:70`). eth0 MAC соответствует static lease в доке [[family/how-to/openmediavault-rpi5|openmediavault-rpi5]].
|
||||||
|
- ⚠️ Ранее эта заметка утверждала «wlan0 = .15 primary» — устарело (см. таблицу выше).
|
||||||
|
|
||||||
## WireGuard Topology
|
## WireGuard Topology
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user