Files
SQS-service/HISTORY/2026-08-14-session-log.md
T

139 lines
8.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Журнал сессии — 2026-08-14 (продолжение миграции shared-sqs)
**Рабочая папка:** /home/naeel/nubes/SQS-service
---
## Текущее состояние
- Сервис ЗАДЕПЛОЕН и работает: `https://sqs.containerk8s.dev.nubes.ru`
- `/health` → `OK` (200)
- Образ: Docker Hub `naeel/shared-sqs:latest`
- Репа: Gitea `gitea.services.ngcloud.ru/Nail/SQS-service`
---
## Что сделано сегодня
1. Добавлен инфо-блок «Информация о сервисе» на страницу входа `/ui` (`app/ui/index.html`).
Коммит `032ca66`. Образ пересобран, запушен (`digest 4bb4f20d`).
2. **Проблема:** вход в UI с реальным JWT → `Ошибка: token rejected by cloud API (HTTP 403)`.
Причина: контейнер валидировал JWT на `deck-api-test.ngcloud.ru/api/v1`
(default в `app/admin/admin.go`), а production JWT туда не подходит.
3. **Поиск правильного endpoint** (в `~/tf_provider`, по указанию пользователя):
- `deck-api*.ngcloud.ru` — **ЛЕГАСИ** (пользователь явно запретил этот формат)
- Правильный: **API Gateway** `lk-api-gateway.ngcloud.ru`
4. Найдено в `~/tf_provider/TOOLS/config/prod/profile.env`:
```
NUBES_API_ENDPOINT="https://lk-api-gateway.ngcloud.ru/api/v1/svc"
```
(test: `...-test...`, dev: `...-dev...`)
Также default в `TOOLS/yaml-generator/internal/config/config.go`:
`getenvDefault("NUBES_API_ENDPOINT", "https://lk-api-gateway.ngcloud.ru/api/v1/svc")`
5. **Тест токенов против gateway** (токены из `/home/naeel/nubes/tokens_all.txt`):
- БЕЗ User-Agent → **все 403** (DDoS-Guard блокирует)
- С `User-Agent: Mozilla/5.0`:
| Токен | gateway-PROD | gateway-TEST |
|---|---|---|
| tazetdinovn@gmail.com (TEST) | 401 | **200** |
| tazet@narod.ru (PROD) | **200** | 401 |
| ntazetdinov@nubes.ru (PROD) | **200** | 401 |
---
## Выводы (факты)
1. Правильный `NUBES_ENDPOINT` = **`https://lk-api-gateway.ngcloud.ru/api/v1/svc`**
2. **КРИТИЧНО:** наш код `PingNubesAPI` (`app/auth/jwt.go`) **НЕ шлёт User-Agent** →
gateway возвращает 403 → токен всегда отклоняется.
Нужна правка кода: добавить `User-Agent: Mozilla/5.0`.
---
## Предстоящие правки (СОГЛАСОВАНЫ? — нет, ждут «делай»)
1. `Dockerfile`: `ENV NUBES_ENDPOINT=https://lk-api-gateway.ngcloud.ru/api/v1/svc`
2. `app/auth/jwt.go`: в `PingNubesAPI` добавить `User-Agent: Mozilla/5.0`
3. `app/admin/admin.go`: сменить default endpoint на gateway PROD
После правок: пересборка → push Docker Hub → redeploy → проверка входа в UI.
---
## Правила, зафиксированные в этой сессии
- Код менять ТОЛЬКО после согласования с пользователем.
- deck-api*.ngcloud.ru — ЛЕГАСИ, НЕ использовать (только lk-api-gateway).
- ngcloud за DDoS-Guard: curl-запросы всегда с `User-Agent: Mozilla/5.0`.
- Всё документировать в HISTORY.
---
## v0.1.26 — вывод версии на экран + фикс схемы тегов (14.08.2026, утро)
**Проблема**: пользователь заметил, что версии не повышаются — всё время пушился только `latest`,
под мог кэшировать `latest` и redeploy подтягивал старый образ. Плюс запрос: выводить версию на экран.
**Что сделано**:
1. `app/models/constants.go`: `var Version = "dev"` (переопределяется через ldflags).
2. `app/router/router.go`: публичный `/health` теперь отдаёт JSON `{"status":"ok","version":"v0.1.26"}`.
3. `app/admin/admin.go`: `adminHealthDetail` дополнен полем `version` (в /admin/health и /ui/api/health).
4. `app/ui/index.html`:
- блок «Информация о сервисе» на странице входа: строка «Версия» (fetch публичного /health);
- образ в инфо-блоке теперь `naeel/shared-sqs:v0.1.26`;
- дашборд: карточка «Версия» (health.version).
5. `Makefile`: `VERSION=v0.1.26`, `LDFLAGS=-X shared-sqs/app/models.Version=$(VERSION)`,
`docker-build` тегает `$(VERSION)` + `latest`; исправлена цель `build` (`./app/cmd/` вместо одного файла goaws.go).
6. `Dockerfile`: `ARG VERSION=dev`, ldflags при сборке.
**Проверки**: make build OK; `/health` → `{"status":"ok","version":"v0.1.26"}`; go test router/admin/models — ok.
**Git**: коммит `3a105de` «v0.1.26: …», пуш в Gitea (`166baa9..3a105de`).
**Образ**: `naeel/shared-sqs:v0.1.26` собран и запушен на Docker Hub,
digest `sha256:b4d1dccda75a67e1a5db3887576e1112993d6485504e683d0fa82a2374bca99b`,
`latest` указывает на него же.
**Следующий шаг**: в deck указать путь образа `naeel/shared-sqs:v0.1.26` и сделать redeploy —
тогда под гарантированно стянет новый образ (код с перебором стендов NUBES_ENDPOINT + версия на экране).
---
## РАЗВЯЗКА: образ обновлён через kubectl, вход в UI работает (14.08.2026, утро)
**Как выяснилось**:
- Наш deck-контейнер — это deployment `containerk8s` в namespace `f1ffb134-7d16-45bd-8bef-69f6ec8ab33c`
(ns = UUID инстанса), образ `naeel/shared-sqs:latest`, pullPolicy=Always.
- Старый апрельский Helm-релиз `shared-sqs` (ns `shared-sqs`, v0.1.24, 122 дня) — ЛЕГАСИ,
не имел отношения к живому сервису. УДАЛЁН по команде пользователя: `helm uninstall shared-sqs`
+ `kubectl delete namespace shared-sqs` (кластер подтвердил NotFound).
- Причина «redeploy не помогает»: под с pullPolicy=Always получал из кэша платформенного
зеркала `docker.io` (в kube-system всё на mirror.k8s.ngcloud.ru) старый digest `be2108fd…`,
хотя в Docker Hub `latest` = `b4d1dccd…` (v0.1.26). Кэш зеркала по тегу `latest` не протухал
из-за частых пушей.
**Что сделано**:
1. `kubectl -n f1ffb134-… set image deployment/containerk8s app=naeel/shared-sqs:v0.1.26`
(внимание: контейнер в поде называется `app`, а не `containerk8s`).
Уникальный тег обошёл кэш зеркала → под `containerk8s-cc5849c-8rx6l` с digest `b4d1dccd…`.
2. Проверка: `GET /health` → `{"status":"ok","version":"v0.1.26"}`.
3. Вход в UI с JWT `tazetdinovn@gmail.com` — УСПЕШНО: тенант auto-provisioned
(`SSAK-0f00384dc3cdc9ca18a50e3a10`), на дашборде карточка «Версия: v0.1.26».
**Наблюдения по gateway (важно на будущее)**:
- TEST-токен: с рабочей станции (python urllib) TEST-стенд = 200; с ВМ (curl) = 401;
из пода (wget) = 401. При этом Go-клиент сервиса (crypto/tls) проходит и получает 200 —
DDoS-Guard/шлюз различает клиентов по TLS-фингерпринту/IP. Тесты curl/wget из пода
НЕ показательны для Go-клиента сервиса.
- Перебор стендов PROD→TEST→DEV в `PingNubesAPI` работает как задумано.
**Правила этой сессии** (дополнено):
- Deck-контейнер «Простой HTTP контейнер» = deployment `containerk8s`, контейнер `app`,
ns = UUID инстанса. Правки образа через kubectl НЕ откатываются (ownerReferences нет).
- `latest` в этом кластере кэшируется зеркалом → обновлять только уникальным тегом
через `kubectl set image`.