From c235db00de12fbecac759b5db62535f3e1b82859 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Thu, 6 Aug 2026 21:49:45 +0400 Subject: [PATCH] =?UTF-8?q?doc:=20HISTORY/FULL-2026-08-06.md=20=E2=80=94?= =?UTF-8?q?=20=D0=B2=D1=81=D1=91=20=D1=87=D1=82=D0=BE=20=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D0=B0=D0=BB=D0=B8,=20=D0=BE=D0=B1=D1=81=D1=83=D0=B6=D0=B4?= =?UTF-8?q?=D0=B0=D0=BB=D0=B8,=20=D0=BF=D0=BB=D0=B0=D0=BD=20=D0=BD=D0=B0?= =?UTF-8?q?=20=D0=B1=D1=83=D0=B4=D1=83=D1=89=D0=B5=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HISTORY/FULL-2026-08-06.md | 171 +++++++++++++++++++++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 HISTORY/FULL-2026-08-06.md diff --git a/HISTORY/FULL-2026-08-06.md b/HISTORY/FULL-2026-08-06.md new file mode 100644 index 0000000..e54fc8e --- /dev/null +++ b/HISTORY/FULL-2026-08-06.md @@ -0,0 +1,171 @@ +# tf_registry — ПОЛНАЯ история (2026-08-06) + +## Итог: что работает сейчас + +| Сервис | Тип | Домен | Статус | +|---|---|---|---| +| `registry` | pythonk8s | `registry.pythonk8s.dev.nubes.ru` | Flask (не обновлён, висит старая версия) | +| `go-registry` | containerk8s | `go-registry.containerk8s.dev.nubes.ru` | Go ✅ (полностью работает) | + +### Что проверено на Go: +- `GET /` — HTML с версией v1.0.0 ✅ +- `GET /.well-known/terraform.json` ✅ +- `GET /v1/providers/nubes-test/nubes/versions` — 17 версий ✅ +- `GET /v1/providers/.../download/linux/amd64` — shasum + 2 GPG ключа ✅ +- Платформы: darwin, linux, windows ✅ +- GPG: `3EC4673EB798238A` (основной) + `CB3A0DF161ECC416` (legacy) ✅ + +--- + +## Хронология + +### Этап 1: Flask (pythonk8s) +1. Создан `site/app.py` — 7 роутов, структура `site/` (требование Nubes) +2. `requirements.txt`: flask, boto3 +3. Первый деплой — ошибка `Init:Error` (gitea приватный) +4. Репо сделан публичным → деплой успешен +5. API не работал: `versions: []`, `shasum: ""` +6. **Причина:** S3-ключи под `registry.kube5s.ru`, а Flask ищет под `registry.pythonk8s.dev.nubes.ru` +7. Добавлен `S3_PREFIX` в код Flask +8. GPG — в исходниках 1 ключ, живой деплой отдаёт 2 → заменён на 2 ключа +9. Добавлен darwin в платформы + +### Этап 2: Go-контейнер (containerk8s) +1. Обнаружен тип сервиса `containerk8s` — generic HTTP контейнер +2. Создана ветка `go-container` +3. Правки Go: порт `:5000` (вместо `:8080`), `PORT` из ENV +4. GPG: 2 ключа в `gpg_key.go` (без импорта registrykeys) +5. Платформы: добавлен darwin +6. Dockerfile: multi-stage (golang:1.24-alpine → alpine:3.21) +7. Gitea Docker registry: `docker login gitea.services.ngcloud.ru -u Nail` ✅ +8. Образ: `gitea.services.ngcloud.ru/nail/tf_registry:latest` +9. S3_PREFIX: хардкод `registry.kube5s.ru` (с TODO-комментарием) +10. VERSION: `const VERSION = "1.0.0"`, на главной странице + +### Ошибки при деплое containerk8s +1. `docker build` — `repository name must be lowercase` → `nail/tf_registry` +2. `minio-go/v7` требует Go >= 1.25 → `GOTOOLCHAIN=auto` +3. modify не даёт менять `jsonEnv` → пришлось хардкодить `S3_PREFIX` + +--- + +## Проблема S3_PREFIX + +**Суть:** S3-объекты хранятся с префиксом `registry.kube5s.ru/...` (старый Go-реестр). +Новый реестр имеет домен `go-registry.containerk8s.dev.nubes.ru` — не совпадает. + +**Текущее решение (временное):** хардкод `s3Prefix = "registry.kube5s.ru"` в `main.go`. +```go +// ── TEMPORARY HARDCODE ────────────────────────────────────────────────── +// TODO: REMOVE after devops adds jsonEnv editing to containerk8s "modify". +// Then read from ENV: s3Prefix = os.Getenv("S3_PREFIX") +// And set in UI jsonEnv: "S3_PREFIX": "registry.kube5s.ru" +// ───────────────────────────────────────────────────────────────────────── +``` + +**Правильные решения (на будущее):** + +Путь 1 — скопировать S3-объекты под новый домен: +``` +mc cp s3/.../registry.kube5s.ru/ s3/.../go-registry.containerk8s.dev.nubes.ru/ --recursive +``` + +Путь 2 — убрать домен из S3-путей вообще: +``` +Вместо: {hostname}/{ns}/{name}/{ver}/... +Сделать: {ns}/{name}/{ver}/... +``` + +После любого из путей — `s3Prefix = hostname`, хардкод не нужен. + +--- + +## Структура репозитория + +### Ветка `master` +``` +tf_registry/ +├── site/ # Flask (НЕ ИСПОЛЬЗУЕТСЯ, мёртвый код) +│ └── app.py +├── requirements.txt # Для Flask (НЕ ИСПОЛЬЗУЕТСЯ) +├── server/ # Go-код (LEGACY, без правок) +├── operator/ # Go operator (LEGACY) +├── k8s/ # Манифесты (LEGACY) +├── charts/ # Helm (LEGACY) +├── registrykeys/ # Старый GPG (LEGACY) +├── secrets/ +│ ├── env.txt # S3-креды + jsonEnv (в .gitignore) +│ └── llm.key # Токены (Gitea, LLM) +├── HISTORY/ # Документация +│ ├── README-NEW-CHAT.md +│ ├── plan-sonnet-full.md +│ ├── 2026-08-06-plan-review.md +│ └── 2026-08-06-first-deploy.md +├── Dockerfile # Для Go-контейнера +└── .gitignore # secrets/, __pycache__/ +``` + +### Ветка `go-container` (АКТУАЛЬНАЯ) +``` +server/ +├── main.go # Порт 5000, S3_PREFIX hardcode, VERSION, darwin +├── gpg_key.go # 2 GPG ключа (primary + legacy) +├── docs.go # Без изменений +└── gpg/ # Без изменений +Dockerfile # golang:1.24-alpine → alpine:3.21 +``` + +--- + +## CI/CD + +### Сборка и пуш образа +```bash +docker build -t gitea.services.ngcloud.ru/nail/tf_registry:latest . +docker push gitea.services.ngcloud.ru/nail/tf_registry:latest +``` + +### Деплой +- Тип: `containerk8s` (Простой HTTP контейнер) +- `registryPath`: `gitea.services.ngcloud.ru/nail/tf_registry:latest` +- `resourceRealm`: `iot-naeel` +- `jsonEnv`: в UI, креды в `secrets/env.txt` + +### Что можно менять в modify +- ТОЛЬКО: CPU, Memory, количество узлов +- jsonEnv и registryPath — НЕЛЬЗЯ (надо просить devops добавить) + +--- + +## Что дальше + +1. **Devops** — добавить редактирование `jsonEnv` в modify для containerk8s +2. **S3** — решить что делать с префиксом (копировать или убрать домен) +3. **Убрать хардкод** — `s3Prefix` из ENV `S3_PREFIX` +4. **Домен** — пересоздать с именем `registry` (вместо `go-registry`) +5. **Удалить Flask** — `site/app.py`, `requirements.txt` из master (мёртвый код) +6. **Удалить старые Go-файлы** — `operator/`, `k8s/`, `charts/`, `registrykeys/` + +--- + +## Креды и доступы + +| Что | Где | +|---|---| +| S3 креды | `secrets/env.txt`, K8s Secret `s3-credentials` | +| Gitea токен | `secrets/llm.key` (строка `gitea`) | +| Docker login | `gitea.services.ngcloud.ru`, user `Nail`, токен `1999993c...` | +| ВМ | `ssh naeel@5.172.178.213` | +| Кубер | только через ВМ | +| Go-реестр (старый) | `https://registry.kube5s.ru` | +| Flask-реестр | `https://registry.pythonk8s.dev.nubes.ru` | +| Go-реестр (новый) | `https://go-registry.containerk8s.dev.nubes.ru` | +| Gitea репо | `https://gitea.services.ngcloud.ru/Nail/tf_registry.git` | + +--- + +## Правила +- После каждого коммита → сразу push +- Перед деплоем → `docker build && docker push` +- `containerk8s` берёт образ из `registryPath`, НЕ клонирует git +- Gitea Docker registry требует lowercase-имён: `nail/tf_registry`, не `Nail/...`