diff --git a/family/how-to/hermes-docker-kraken.md b/family/how-to/hermes-docker-kraken.md index af9290cf..c710ec88 100644 --- a/family/how-to/hermes-docker-kraken.md +++ b/family/how-to/hermes-docker-kraken.md @@ -85,6 +85,59 @@ docker compose up -d | `hermes/config/` | `/opt/data` | `HERMES_HOME` — config, sessions, skills, memory | | `/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@`. +3. Закрытый ключ на хосте **обязан быть 600**: `ssh kraken@ "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@ "echo OK && hostname" # доступен ли хост +ssh kraken@ "sudo docker ps --filter name=hermes-kraken --format '{{.Names}} {{.Status}}'" +# изнутри контейнера на хост (loopback алиас kraken-host) +ssh kraken@ "sudo docker exec hermes-kraken ssh -o ConnectTimeout=5 kraken-host 'echo HELLO'" +# verbose — какие конфиги читает SSH +ssh kraken@ "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@ "sudo docker exec hermes-kraken getent passwd 1000" # uid 1000 в passwd? +ssh kraken@ "sudo docker exec hermes-kraken ls -la /opt/data/.ssh/id_ed25519" +ssh kraken@ "sudo docker exec hermes-kraken cat /opt/data/.ssh/config" +ssh kraken@ "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 - `network_mode: host` — port 8642 is directly on the Kraken host, no port mapping needed diff --git a/family/how-to/kraken-network.md b/family/how-to/kraken-network.md index fa702dc2..667f66f6 100644 --- a/family/how-to/kraken-network.md +++ b/family/how-to/kraken-network.md @@ -1,7 +1,7 @@ --- title: Kraken Network & Infra created: '2026-05-23' -updated: '2026-05-23' +updated: '2026-09-02' type: tech namespace: personal tags: [infra, kraken, ssh, wireguard, network] @@ -17,7 +17,20 @@ related: 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