[2026-09-23] eagle: family/how-to/hermes-docker-kraken.md family/how-to/kraken-access.md

This commit is contained in:
Alexey Martemyanov committed 2026-09-23 12:35:38 +06:00
1 parent 2f42fd12e5
commit d00c95d76b
2 files changed
+51 -6

No files matched your search

+26 -6
View File
@@ -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 из контейнера → хост (диагностика и фиксы)
+25
View File
@@ -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`):