From c0654be4e3ebfa8a32af59181d9c825bae359ade Mon Sep 17 00:00:00 2001 From: Naeel Date: Wed, 15 Apr 2026 07:57:43 +0300 Subject: [PATCH] docs: add repo rules, thinking log, and progress update for console --- .github/copilot-instructions.md | 65 ++++++++++++++++++++ doc/progress.md | 102 ++++++++++++++++++++++++++++++++ 2 files changed, 167 insertions(+) create mode 100644 .github/copilot-instructions.md diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 0000000..f03f8e2 --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,65 @@ +# Правила работы агента в проекте fission + +## ГЛАВНОЕ ПРАВИЛО + +**НЕ "СОВЕРШЕНСТВОВАТЬ" РАБОЧИЙ КОД БЕЗ ЯВНОГО УКАЗАНИЯ.** + +--- + +## Файловая система и выполнение команд + +### Маппинг путей + +Локальная папка `~/remote_dev/` примонтирована через sshfs к `~/terra/` на ВМ `5.172.178.213`. +Это **одна и та же файловая система**: + +| Локально (VS Code) | На ВМ | +|----------------------------------|-------------------------------| +| `/home/naeel/remote_dev/fission` | `/home/naeel/terra/fission` | +| `/home/naeel/remote_dev/sless` | `/home/naeel/terra/sless` | +| `/home/naeel/remote_dev/IoT` | `/home/naeel/terra/IoT` | + +Любой файл, сохранённый локально через VS Code, **мгновенно виден на ВМ**. SCP не нужен. + +### Что можно делать локально + +- **Редактировать файлы** — через VS Code, replace_string_in_file, create_file и т.д. Изменения сразу на ВМ. +- **Читать файлы** — read_file, grep_search, file_search, semantic_search — всё разрешено. + +### Что ЗАПРЕЩЕНО локально + +**Все команды выполнять ИСКЛЮЧИТЕЛЬНО через SSH на ВМ:** + +```bash +ssh -i ~/.ssh/naeel_vm_id_ed25519 -o StrictHostKeyChecking=no -o ConnectTimeout=10 naeel@5.172.178.213 'КОМАНДА' +``` + +**Причина:** локально может быть активен VPN, что вызывает сбои при выполнении сетевых команд, обращениях к кластеру, Docker и пр. + +Запрещено запускать локально (без ssh): +- `go build`, `go test`, `go mod tidy` +- `docker build`, `docker push` +- `kubectl`, `helm` +- `terraform` +- `curl`, `wget` к кластерным сервисам +- `git push`, `git pull` (git операции — через ssh на ВМ) +- Любые bash-скрипты проекта + +### Формат работы + +1. Отредактировать файлы локально (VS Code / инструменты агента) +2. Запустить команды через SSH на ВМ +3. Ждать результата + +--- + +## Документация + +Всё важное фиксировать в `doc/`: +- `doc/thinking/` — лог рассуждений агента (обязательно) +- `doc/progress.md` — трекер задач +- Обновлять после каждого значимого изменения. + +## Git + +Коммитить и пушить после каждого завершённого этапа. diff --git a/doc/progress.md b/doc/progress.md index c889487..674f1a4 100644 --- a/doc/progress.md +++ b/doc/progress.md @@ -164,3 +164,105 @@ ### Следующий шаг - Добавить отдельные Terraform примеры для Node.js и Go функций. + +--- + +## 2026-04-15 + +### Fission Console — Web UI для управления функциями + +**Ветка:** `feat/console` + +#### Реализовано (14 апреля, вечер → 15 апреля, утро) + +**Backend (console/main.go):** +- Go HTTP-сервер с embedded UI +- CRUD API для Fission CRD через dynamic k8s client: + - `POST /api/functions` — создание (Package + Function + HTTPTrigger атомарно с rollback) + - `GET /api/functions` — список всех + - `GET /api/functions/{name}` — детали (с декодированным кодом, route, methods) + - `PUT /api/functions/{name}/code` — обновление кода + - `POST /api/functions/{name}/invoke` — вызов функции через роутер + - `DELETE /api/functions/{name}` — удаление (trigger + function + package) +- Двойная маршрутизация: `/api/*` и `/console/api/*` (для работы через ingress `/console/`) +- CORS middleware, request logging + +**UI (console/ui/index.html):** +- SPA-дашборд с карточками (environments, packages, functions, httptriggers, timetriggers) +- Таблица функций с кнопками Edit/Invoke/Delete +- Модал Create: выбор environment, ввод кода, route, methods +- Модал Edit Code: редактирование и сохранение +- Модал Invoke: отправка запроса, отображение статуса/latency/response +- Модал Delete: подтверждение +- Динамический `API_BASE` для работы как с `/` так и с `/console/` prefix + +**Тесты (console/main_test.go):** +- 5 unit-тестов: + - `TestNormalizeMethods` — нормализация HTTP-методов + - `TestCreateFunctionValidation` — валидация обязательных полей + - `TestCreateFunctionSuccessAndGetDetails` — полный CRUD flow + Get с декодированным кодом + - `TestUpdateFunctionCode` — обновление кода в package + - `TestInvokeFunctionWithJWTAuth` — invoke с mock-роутером, проверка JWT auth flow +- Используется `dynamicfake.NewSimpleDynamicClientWithCustomListKinds` + +**Docker (console/Dockerfile):** +- Multi-stage: `golang:1.26-alpine` → `alpine:3.20` +- Бинарник ~15MB + +**K8s deployment (console/deploy/console.yaml):** +- ServiceAccount `fission-console` +- ClusterRole с доступом к fission.io CRD (get/list/create/update/patch/delete) +- ClusterRoleBinding +- Deployment (1 replica, port 8090, health probes, resource limits) +- Service (ClusterIP:8090) +- Ingress (fission.kube5s.ru/console, nginx, TLS) + +#### Invoke auth — проблема и решение + +**Проблема:** invoke через console возвращал 401 от Fission router. + +**Исследование:** +1. Попробовал SA token из пода → `key is of invalid type` (K8s SA = RS256, router ожидает HS256) +2. Прочитал feature-config: `auth.enabled: true`, endpoint `/auth/login`, JWT expiry 120s +3. Нашёл credentials в секрете `router`: username=admin, password=..., jwtSigningKey=... +4. Протестировал: `POST /auth/login` → получил JWT → invoke с Bearer JWT → 200 OK + +**Решение:** console при invoke делает POST `/auth/login` к роутеру, получает JWT, кеширует на 100s. + +**Баги по пути:** +- Router возвращает 201 Created (не 200) на login — код проверял строго 200 → добавил `|| 201` +- Кешированный Docker-образ: пересобрал тот же тег v0.2.0, нод использовал старый → перешёл на v0.2.2 + +**Env переменные для auth:** +- `FISSION_AUTH_USERNAME` → secretKeyRef из `router.username` +- `FISSION_AUTH_PASSWORD` → secretKeyRef из `router.password` + +#### E2E результат (все через ingress https://fission.kube5s.ru/console/) + +| Операция | Результат | +|----------|-----------| +| health | 200 ok | +| create | 201 Created (function + package + httptrigger) | +| get | 200 (code, route, methods, environment) | +| update code | 200 | +| invoke | **200**, response_raw = ответ функции, latency_ms = 138 | +| delete | 200 (trigger + function + package очищены) | + +#### Коммиты + +- `6731e89` — feat: deliver fission console UI, k8s deploy, and tests +- `8920ba1` — fix: invoke auth via Fission router JWT login + +**Docker Hub:** `naeel/fission-console:v0.2.2` + +#### Правила репозитория + +Создан `.github/copilot-instructions.md` с правилами: +- Маппинг путей (локально ~/remote_dev/ = ВМ ~/terra/) +- Редактирование файлов — разрешено локально +- Команды — ИСКЛЮЧИТЕЛЬНО через SSH (VPN-конфликты) + +### Следующий шаг +- UI: автоматическое обновление дашборда после create/delete +- Рассмотреть добавление логов функций (kubectl logs) +- Рассмотреть добавление time triggers в UI