diff --git a/doc/decisions/log.md b/doc/decisions/log.md index 61b70b6..3f22e59 100644 --- a/doc/decisions/log.md +++ b/doc/decisions/log.md @@ -103,3 +103,30 @@ **Решение:** Postgres нужен только для логов вызовов (`invocations`). Для базового деплоя функций — не нужен. Оператор работает без него (просто не пишет логи). **Минимальные зависимости для production:** k8s кластер + S3 + Docker registry + Ingress. + +## 2026-03-07 — Версионированные теги для runtime образов (не :latest) + +**Решение:** Runtime базовые образы (`sless-runtime-python3.11`, `sless-runtime-nodejs20`) и образ оператора (`sless-operator`) тегируются по схеме `v..`. `:latest` не используется. + +**Причина:** +- `:latest` приводит к непредсказуемому поведению: kaniko может взять старый кешированный образ, pod не перезапускается если `imagePullPolicy: IfNotPresent`. +- Версионированные теги дают явный контроль: при изменении runtime нужно обновить тег в `upload.go` → это принудительно пересобирает все функции с новым базовым образом. +- Аудит и откат: можно пинить конкретную версию runtime. + +**Соглашение:** +- Runtime образы: `naeel/sless-runtime-{lang}:v{версия}` (например `v0.1.0`) +- Оператор: `naeel/sless-operator:v{версия}` +- При изменении runtime — инкрементировать минорную версию образа и обновить константу в `upload.go` + +--- + +## 2026-03-07 — nodejs20 как второй поддерживаемый runtime + +**Решение:** Добавлен nodejs20 runtime (`node:20-alpine` base, `server.js` HTTP wrapper, `exports.handle(event)`). + +**Причина:** Node.js — стандарт для serverless (AWS Lambda, Vercel). Покрывает JS/TypeScript аудиторию. Паттерн идентичен python3.11: runtime image → kaniko → Deployment. + +**Детали реализации:** +- `runtimes/nodejs20/server.js` — `http.createServer`, динамический `require(HANDLER_PATH)` +- Зависимости через `package.json` → `npm install --omit=dev` (аналог `requirements.txt` → `pip install`) +- `entrypoint` в HCL игнорируется для Node.js (всегда `handler.js` + `exports.handle`) — TODO: поддержать произвольный entrypoint в v1.1 diff --git a/doc/errors/log.md b/doc/errors/log.md index 9e7ee3d..8ebf926 100644 --- a/doc/errors/log.md +++ b/doc/errors/log.md @@ -150,3 +150,44 @@ deployment.Spec.Template.Annotations["kubectl.kubernetes.io/restartedAt"] = time **Решение:** В `Makefile` заменить `CONTROLLER_TOOLS_VERSION ?= v0.11.1` на `v0.14.0`. --- + +## 2026-03-07 — Dockerfile: operator не находит migrations/ при старте + +**Проблема:** Оператор в кластере сразу падает в CrashLoopBackOff: +``` +level=ERROR msg="read migration file" err="open migrations/001_initial.sql: no such file or directory" +``` +**Причина:** Оригинальный `Dockerfile` копировал только `api/`, `controllers/`, `main.go`. Директории `internal/` и `migrations/` в образ не попадали. +**Решение:** Добавить в оба stage Dockerfile: +```dockerfile +COPY internal/ internal/ # в builder stage +COPY migrations/ migrations/ # и в builder, и в финальный alpine stage +``` +`migrations/` нужен в финальном образе — оператор читает SQL-файлы в runtime при каждом старте. + +--- + +## 2026-03-07 — Dockerfile: golang:1.23 несовместим с go.mod (требует 1.25) + +**Проблема:** `docker build` падает на `go mod download`: +``` +go: go.mod requires go >= 1.25 (running go 1.23.12; GOTOOLCHAIN=local) +``` +**Причина:** В `go.mod` указан `go 1.25`, Dockerfile использовал `golang:1.23-alpine`. +**Решение:** `FROM golang:1.23-alpine` → `FROM golang:1.25-alpine`. + +--- + +## 2026-03-07 — go.mod: прямые зависимости помечены как indirect + +**Проблема:** gopls показывал ошибки в `go.mod`: +``` +github.com/gorilla/mux should be direct +github.com/lib/pq should be direct +github.com/minio/minio-go/v7 should be direct +k8s.io/api should be direct +``` +**Причина:** Пакеты получили `// indirect` несмотря на прямые импорты — побочный эффект scaffold-генерации operator-sdk. +**Решение:** `go mod tidy` автоматически расставил правильные аннотации. + +--- diff --git a/doc/progress.md b/doc/progress.md index 9103817..a800718 100644 --- a/doc/progress.md +++ b/doc/progress.md @@ -43,7 +43,7 @@ | # | Компонент | Статус | Заметки | |---|-----------|--------|---------| | 1 | runtimes/python3.11/server.py | ✅ | HTTP wrapper :8080, loads /app/function/handler.py | -| 2 | runtimes/python3.11/Dockerfile | ✅ | FROM python:3.11-slim, naeel/sless-runtime-python3.11:latest | +| 2 | runtimes/python3.11/Dockerfile | ✅ | FROM python:3.11-slim, naeel/sless-runtime-python3.11:v0.1.0 | | 3 | Secret sless-registry-auth | ✅ | DockerHub creds для kaniko в namespace sless | | 4 | internal/api/handler/upload.go | ✅ | POST /v1/namespaces/{ns}/functions/{name}/upload | | 5 | Fix: kaniko S3 endpoint | ✅ | https:// + S3_FORCE_PATH_STYLE=true (Ceph) | @@ -58,6 +58,8 @@ | 3 | Function phase=Ready, Deployment Running | ✅ namespace sless-fn-default | | 4 | `GET /health` | ✅ `{"status": "ok"}` | | 5 | `POST / {"name":"Naeel"}` | ✅ `{"message": "Hello, Naeel!"}` | +| 6 | terraform apply (pg-query python3.11) | ✅ `{"invocations": [], "count": 0}` через https://sless-api.kube5s.ru | +| 7 | hello-node (nodejs20) E2E | ✅ `{"message": "Hello, Naeel! (nodejs20)"}` |} ### Terraform провайдер (2026-03-07) @@ -81,8 +83,13 @@ |---|-----------|--------|---------| | 1 | terraform apply e2e — функция с postgres | ✅ | `{"invocations": [], "count": 0}` — функция подключилась к postgres.sless.svc, таблица пустая | | 2 | HTTP trigger e2e тест | ⏳ | Service+Ingress через TriggerController | -| 3 | deployments/k8s/operator.yaml | ✅ | Deployment+Service+Ingress, naeel/sless-operator:v0.1.1, Running | +| 3 | deployments/k8s/operator.yaml | ✅ | Deployment+Service+Ingress, naeel/sless-operator:v0.1.2, Running | | 4 | Внешний доступ к API оператора | ✅ | https://sless-api.kube5s.ru → HTTP/2 200, TLS cert OK | +| 5 | DNS запись sless-api.kube5s.ru | ✅ | A → 5.172.178.182, TTL 3600, zone kube5s.ru | +| 6 | nodejs20 runtime | ✅ | runtimes/nodejs20/server.js + Dockerfile, naeel/sless-runtime-nodejs20:v0.1.0 | +| 7 | upload.go: nodejs20 + package.json | ✅ | runtimeBaseImage switch, hasPackageJSON → npm install | +| 8 | go.mod: direct/indirect fix | ✅ | go mod tidy — gorilla/mux, lib/pq, minio-go, k8s.io/api помечены direct | +| 9 | Runtime образы: версионированные теги | ✅ | python3.11:v0.1.0, nodejs20:v0.1.0 (убираем :latest) | ---