[2026-09-23] eagle: family/how-to/hermes-docker-kraken.md family/how-to/kraken-access.md
This commit is contained in:
1 parent
2f42fd12e5
commit
d00c95d76b
2 files changed
+51
-6
No files matched your search
@@ -74,20 +74,40 @@ docker compose logs -f # follow logs
|
|||||||
|
|
||||||
## Image
|
## Image
|
||||||
|
|
||||||
Built locally from `Dockerfile` — clones **upstream** `NousResearch/hermes-agent`
|
⚠️ **ОБНОВЛЕНО 2026-09-23 — прежнее описание было неверным.**
|
||||||
(`--depth=1` from `main`). Not a custom fork. To update Hermes:
|
|
||||||
|
|
||||||
```bash
|
Фактически compose использует готовый образ **`ghcr.io/mallexxx/hermes-kraken:latest`**
|
||||||
cd /srv/.../docker/hermes-build
|
(`image:`, без `build:`). Локальный `hermes-build/Dockerfile` в репозитории **есть** и в нём прописан
|
||||||
docker compose build --no-cache
|
`git clone --depth=1 https://github.com/mallexxx/hermes-agent.git` — это **форк Alex**, а НЕ upstream
|
||||||
docker compose up -d
|
`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
|
## Volumes
|
||||||
|
|
||||||
| Host path | Container path | Purpose |
|
| Host path | Container path | Purpose |
|
||||||
|-----------|----------------|---------|
|
|-----------|----------------|---------|
|
||||||
| `hermes/config/` | `/opt/data` | `HERMES_HOME` — config, sessions, skills, memory |
|
| `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 |
|
| `/home/kraken/obsidian` | `/vault` | Obsidian vault read/write access |
|
||||||
|
|
||||||
## SSH из контейнера → хост (диагностика и фиксы)
|
## SSH из контейнера → хост (диагностика и фиксы)
|
||||||
|
|||||||
@@ -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` каталога.
|
- `chown -R` по большому дереву на USB-HDD идёт **минуты** → **обычный ssh-вызов рвётся по таймауту и правка НЕ применяется**. Запускать через `systemd-run … --collect` в фоне, потом проверять `systemctl is-active hermes-chown` и `ls -ldn` каталога.
|
||||||
- Логи после старта содержат «хвост» прежних `mkdir` ошибок из буфера — не пугаться, если дальше идёт `Hermes Gateway Starting...` и скиллы синхронизированы.
|
- Логи после старта содержат «хвост» прежних `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)
|
## 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`):
|
Туннель `kraken` в Zero Trust, remote-managed по `TUNNEL_TOKEN`, `network_mode: host`, образ `cloudflare/cloudflared:latest`. Актуальный ingress конфиг (виден в логах cloudflared на Kraken, `INF Updated to new configuration`):
|
||||||
|
|||||||
Reference in new issue
Block a user