172 lines
7.8 KiB
Markdown
172 lines
7.8 KiB
Markdown
# 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/...`
|