diff --git a/family/how-to/hermes-docker-kraken.md b/family/how-to/hermes-docker-kraken.md index 23492b1e..91c846b7 100644 --- a/family/how-to/hermes-docker-kraken.md +++ b/family/how-to/hermes-docker-kraken.md @@ -74,20 +74,40 @@ docker compose logs -f # follow logs ## Image -Built locally from `Dockerfile` — clones **upstream** `NousResearch/hermes-agent` -(`--depth=1` from `main`). Not a custom fork. To update Hermes: +⚠️ **ОБНОВЛЕНО 2026-09-23 — прежнее описание было неверным.** -```bash -cd /srv/.../docker/hermes-build -docker compose build --no-cache -docker compose up -d +Фактически compose использует готовый образ **`ghcr.io/mallexxx/hermes-kraken:latest`** +(`image:`, без `build:`). Локальный `hermes-build/Dockerfile` в репозитории **есть** и в нём прописан +`git clone --depth=1 https://github.com/mallexxx/hermes-agent.git` — это **форк Alex**, а НЕ upstream +`NousResearch/hermes-agent`, как утверждалось ранее. То есть «not a custom fork» — неверно. + +**Локальный `Dockerfile` (актуальное содержимое, ключевое):** +```dockerfile +FROM ghcr.io/astral-sh/uv:0.11.6-python3.13-trixie AS uv_source +FROM tianon/gosu:1.19-trixie AS gosu_source +FROM debian:13.4 # Trixie, не Bookworm +ENV HERMES_HOME=/opt/data +RUN useradd -u 10000 -m -d /opt/data hermes # ← единственный пользователь в образе = uid 10000 +... +ENTRYPOINT [ "/usr/bin/tini", "-g", "--", "/opt/hermes/docker/entrypoint.sh" ] ``` +В этом Dockerfile **нет** `USER` — значит uid 1000 приходит из **ghcr-сборки**, а файл в +`hermes-build/` её не воспроизводит (расхождение образ ↔ Dockerfile). **Это надо развести перед +правкой** — иначе правка Dockerfile не попадёт в работающий контейнер. + +🔴 **Открытый вопрос (блокирует шаг 2 плана):** где собирается `ghcr.io/mallexxx/hermes-kraken:latest` +— CI в репозитории `mallexxx/hermes-agent`, или локально на Kraken с `docker push`? Пока не выяснено, +`docker compose pull` может перезаписать любой локальный фикс. + +Обновление Hermes: либо `docker compose pull && up -d` (если образ из GHCR), либо +`docker compose build --no-cache && up -d` (если собирается локально). ## Volumes | Host path | Container path | Purpose | |-----------|----------------|---------| | `hermes/config/` | `/opt/data` | `HERMES_HOME` — config, sessions, skills, memory | +| `hermes/config/.ssh/` | `/root/.ssh` | ⚠️ SSH-ключи; при `HOME=/opt/data` **не читается** SSH | | `/home/kraken/obsidian` | `/vault` | Obsidian vault read/write access | ## SSH из контейнера → хост (диагностика и фиксы) diff --git a/family/how-to/kraken-access.md b/family/how-to/kraken-access.md index 1ec524fb..0f43cd4b 100644 --- a/family/how-to/kraken-access.md +++ b/family/how-to/kraken-access.md @@ -183,6 +183,31 @@ sudo systemd-run --unit=hermes-chown --collect --property=Type=oneshot \ - `chown -R` по большому дереву на USB-HDD идёт **минуты** → **обычный ssh-вызов рвётся по таймауту и правка НЕ применяется**. Запускать через `systemd-run … --collect` в фоне, потом проверять `systemctl is-active hermes-chown` и `ls -ldn` каталога. - Логи после старта содержат «хвост» прежних `mkdir` ошибок из буфера — не пугаться, если дальше идёт `Hermes Gateway Starting...` и скиллы синхронизированы. +> ### 🔁 2026-09-23 — ПОВТОРНЫЙ СИМПТОМ, НАЙДЕН ДРУГОЙ КОРЕНЬ +> +> Kraken-агент сообщил: **«нет SSH доступа к хосту»**. Проверка: +> ``` +> sudo docker exec hermes-kraken ssh kraken-host "echo HELLO" +> → No user exists for uid 1000 +> ``` +> Это **не про ключ** и **не связано** с crash-loop 2026-09-20. `ssh` падает на `getpwuid(1000)` — +> **в `/etc/passwd` образа нет записи для uid 1000**, там только `hermes:x:10000:10000`. +> Контейнер запущен под uid 1000 (из `USER` в образе), т.е. анонимный uid. +> +> **Не путать три разных вещи** (все они про uid и все ломались отдельно): +> | Дефект | Что не так | Фикс | Дата | +> |---|---|---|---| +> | crash-loop `mkdir /opt/data: Permission denied` | владелец **файлов** на хосте = `10000:10000` | `chown 1000:1000` на хосте | 2026-09-20 ✅ | +> | гонка docker↔mount | data-root на USB раньше dockerd | `RequiresMountsFor` drop-in | 2026-09-20 ✅ | +> | `No user exists for uid 1000` | нет записи uid 1000 в **passwd образа** | завести `kraken` uid 1000 в Dockerfile | 2026-09-23 ⏳ план согласован | +> +> **Полный разбор + план фикса (вариант A):** [[family/how-to/hermes-docker-kraken]] → раздел +> «ПЛАН: фикс uid 1000». Статус: **согласован, НЕ применён**. +> +> Дополнительно найдено: 3-й bind-mount `config/.ssh → /root/.ssh` при `HOME=/opt/data` — SSH его не +> читает; в самом образе есть `entrypoint.sh` с логикой `gosu`/`usermod`, но вся она обёрнута в +> `if [ "$(id -u)" = "0" ]` и при старте под 1000 **пропускается целиком**. + ## Cloudflared туннель — публичные маршруты (состояние на 2026-09-04) Туннель `kraken` в Zero Trust, remote-managed по `TUNNEL_TOKEN`, `network_mode: host`, образ `cloudflare/cloudflared:latest`. Актуальный ingress конфиг (виден в логах cloudflared на Kraken, `INF Updated to new configuration`):