diff --git a/family/how-to/kraken-portainer-access.md b/family/how-to/kraken-portainer-access.md index d1cba4ab..53d06a91 100644 --- a/family/how-to/kraken-portainer-access.md +++ b/family/how-to/kraken-portainer-access.md @@ -237,6 +237,91 @@ ssh ssh.kraken.qentra.top --- +## Шаг 6 — Создать скилл по внешнему доступу (выполняет Кракен) + +После того как cloudflared запущен и SSH-поддомен работает — создать скилл чтобы знать как пользоваться внешним доступом в будущем. + +Скиллы живут в `/opt/data/skills/` (HDD-volume, переживают rebuild образа). Создать через terminal: + +```bash +mkdir -p /opt/data/skills/devops/kraken-external-access +cat > /opt/data/skills/devops/kraken-external-access/SKILL.md << 'EOF' +--- +name: kraken-external-access +category: devops +description: Внешний доступ к Kraken через Cloudflare Tunnel — SSH с Eagle, Portainer API, управление cloudflared контейнером. +triggers: + - "доступ к кракену снаружи" + - "ssh к кракену с орла" + - "управление docker на кракене удалённо" + - "cloudflared крякен" +--- + +# Kraken — External Access via Cloudflare Tunnel + +## SSH с Eagle + +```bash +# ~/.ssh/config на Eagle (уже настроен): +# Host ssh.kraken.qentra.top +# ProxyCommand cloudflared access ssh --hostname %h +# User kraken +# IdentityFile ~/.ssh/id_rsa + +ssh ssh.kraken.qentra.top +``` + +## Portainer API (локально на Кракене) + +```bash +BASE=http://localhost:9000 +KEY="ptr_AJY+Ba9A7f6pcAHZfDD5koU4stkKgJCdbTEXLDLxn0g=" +EP=1 + +# Список контейнеров +curl -s -H "X-API-Key: $KEY" "$BASE/api/endpoints/$EP/docker/containers/json?all=true" \ + | jq '[.[] | {name: .Names[0], status: .Status}]' +``` + +## Управление cloudflared + +```bash +# Статус +curl -s -H "X-API-Key: $KEY" "$BASE/api/endpoints/$EP/docker/containers/json" \ + | jq '.[] | select(.Names[] | contains("cloudflared")) | {status: .Status}' + +# Логи (последние 30 строк) +CID=$(curl -s -H "X-API-Key: $KEY" "$BASE/api/endpoints/$EP/docker/containers/json" \ + | jq -r '.[] | select(.Names[] | contains("cloudflared")) | .Id') +curl -s -H "X-API-Key: $KEY" \ + "$BASE/api/endpoints/$EP/docker/containers/$CID/logs?stdout=1&stderr=1&tail=30" + +# Рестарт +curl -s -X POST -H "X-API-Key: $KEY" \ + "$BASE/api/endpoints/$EP/docker/containers/$CID/restart" +``` + +## Питфолы + +- cloudflared запускается с `network_mode: host` — видит все локальные порты Кракена +- Если туннель отвалился — проверить логи: ищи `ERR` и `failed to` +- `restart: unless-stopped` — при падении поднимается автоматически +- Токен туннеля хранится в env `TUNNEL_TOKEN` контейнера — не менять без пересоздания контейнера +- CF Zero Trust tunnel: проверить статус на https://one.dash.cloudflare.com/ → Networks → Tunnels → kraken + +## Связанные заметки в vault + +- `family/how-to/kraken-portainer-access.md` — полная инструкция по деплою +- `family/how-to/openmediavault-rpi5.md` — структура Docker на Кракене +EOF +echo "Скилл создан: /opt/data/skills/devops/kraken-external-access/SKILL.md" +``` + +> ⚠️ `/opt/data/` — это HDD-backed volume, скилл переживёт `docker stop/start` и даже rebuild образа +> ⚠️ Путь внутри контейнера — `/opt/data/skills/`, на хосте это `/srv/dev-disk-by-uuid-49e8f586.../docker/hermes/config/skills/` + +--- + ## Связанные заметки - [[openmediavault-rpi5]] — настройка Kraken (Docker, Hermes, структура папок)