docs: add repo rules, thinking log, and progress update for console
This commit is contained in:
@@ -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
|
||||
|
||||
Коммитить и пушить после каждого завершённого этапа.
|
||||
+102
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user