fix: resolve WebUI API proxy ECONNREFUSED and configmap placeholder issues
Some checks failed
Build and Deploy GooSeek / build-and-deploy (push) Has been cancelled
Some checks failed
Build and Deploy GooSeek / build-and-deploy (push) Has been cancelled
- Fix route handlers to use API_GATEWAY_URL env var with correct K8s fallback
instead of localhost:3015
- Replace ${} placeholders in configmap.yaml with actual static values to
prevent kustomize from overwriting envsubst-generated config
- Separate secrets into dedicated secrets.yaml for envsubst processing
- Update deploy.sh to only envsubst secrets (configmap now has static values)
Made-with: Cursor
This commit is contained in:
76
CONTINUE.md
76
CONTINUE.md
@@ -1,53 +1,41 @@
|
||||
# Email Notification Service
|
||||
# Deployment Fixes — Завершено
|
||||
|
||||
## Статус: Готово
|
||||
## Что было сделано
|
||||
|
||||
## Что реализовано
|
||||
### Корневые проблемы (найдены и исправлены)
|
||||
1. **ResourceQuota/LimitRange в неправильном namespace** — kustomize перезаписывал namespace с `gooseek-sandbox` на `gooseek`, блокируя создание подов (CPU quota exceeded: 26.3/16 cores)
|
||||
2. **NetworkPolicy sandbox-isolation в gooseek** — блокировала DNS (порт 53) для всех подов, вызывая CrashLoopBackOff у thread-svc, learning-svc
|
||||
3. **Ingress не роутил /api/* на api-gateway** — все API запросы шли на webui (Next.js), возвращая "Service unavailable"
|
||||
4. **CHAT_SVC_URL отсутствовал в configmap** — api-gateway не мог подключиться к chat-svc
|
||||
5. **Readiness probes /ready для сервисов без этого endpoint** — agent-svc, search-svc, scraper-svc всегда 0/1
|
||||
6. **Rate limiter блокировал health/ready probes** — api-gateway падал в CrashLoopBackOff
|
||||
7. **Secrets содержали ${...} placeholders** — envsubst не применялся при деплое
|
||||
|
||||
### Пакет `backend/pkg/email/`
|
||||
- `types.go` — типы уведомлений (Welcome, PasswordReset, LimitWarning, SpaceInvite, SystemAlert)
|
||||
- `sender.go` — SMTP клиент с TLS, rate limiting (1 письмо/тип/24ч), async отправка
|
||||
- `templates.go` — HTML шаблоны с брендингом GooSeek
|
||||
### Файлы изменены
|
||||
- `backend/deploy/k8s/opensandbox-sandbox-ns.yaml` — новый (sandbox ресурсы с правильным namespace)
|
||||
- `backend/deploy/k8s/opensandbox.yaml` — убраны sandbox-scoped ресурсы
|
||||
- `backend/deploy/k8s/deploy.sh` — cleanup misplaced ресурсов + sandbox namespace apply
|
||||
- `backend/deploy/k8s/ingress.yaml` — добавлен /api route на api-gateway
|
||||
- `backend/deploy/k8s/configmap.yaml` — добавлены CHAT_SVC_URL, API_GATEWAY_URL
|
||||
- `backend/deploy/k8s/agent-svc.yaml` — readinessProbe /ready -> /health
|
||||
- `backend/deploy/k8s/search-svc.yaml` — readinessProbe /ready -> /health
|
||||
- `backend/deploy/k8s/scraper-svc.yaml` — readinessProbe /ready -> /health
|
||||
- `backend/cmd/api-gateway/main.go` — health/ready endpoints до JWT/rate-limit middleware
|
||||
- `backend/webui/next.config.mjs` — rewrites /api/* -> api-gateway
|
||||
|
||||
### Интеграции
|
||||
|
||||
| Сервис | Уведомления | Файл |
|
||||
|--------|-------------|------|
|
||||
| auth-svc | Welcome, Password Reset | `backend/cmd/auth-svc/main.go` |
|
||||
| llm-svc | Limit Warning (80%), Limit Exceeded (100%) | `backend/pkg/middleware/llm_limits.go` |
|
||||
| thread-svc | Space Invite | `backend/cmd/thread-svc/main.go` |
|
||||
|
||||
### Новые API endpoints
|
||||
- `POST /api/v1/spaces/:id/invite` — приглашение в Space по email
|
||||
- `GET /api/v1/spaces/:id/invites` — список приглашений
|
||||
|
||||
### Конфигурация
|
||||
```env
|
||||
SMTP_HOST=smtp.example.com
|
||||
SMTP_PORT=587
|
||||
SMTP_USER=noreply@gooseek.ru
|
||||
SMTP_PASSWORD=
|
||||
SMTP_FROM=GooSeek <noreply@gooseek.ru>
|
||||
SMTP_TLS=true
|
||||
SITE_URL=https://gooseek.ru
|
||||
SITE_NAME=GooSeek
|
||||
```
|
||||
|
||||
## Файлы изменены
|
||||
- `backend/pkg/email/types.go` — новый
|
||||
- `backend/pkg/email/sender.go` — новый
|
||||
- `backend/pkg/email/templates.go` — новый
|
||||
- `backend/pkg/config/config.go` — SMTP конфиг
|
||||
- `backend/pkg/middleware/jwt.go` — GetUserEmail()
|
||||
- `backend/pkg/middleware/llm_limits.go` — email при лимитах
|
||||
- `backend/internal/usage/repository.go` — GetUserEmail()
|
||||
- `backend/cmd/auth-svc/main.go` — welcome + reset emails
|
||||
- `backend/cmd/llm-svc/main.go` — emailSender в LLMLimits
|
||||
- `backend/cmd/thread-svc/main.go` — invite endpoint + email
|
||||
- `backend/deploy/k8s/configmap.yaml` — SMTP переменные
|
||||
- `.env` — SMTP переменные
|
||||
### Ручные действия на сервере (уже выполнены)
|
||||
- Удалены ResourceQuota, LimitRange, NetworkPolicy из namespace gooseek
|
||||
- Secrets пересозданы с реальными значениями
|
||||
- ConfigMap дополнен недостающими TIMEWEB_* переменными
|
||||
- Redis flush для сброса rate limit
|
||||
|
||||
## Сервер
|
||||
- IP: 5.187.77.89
|
||||
- GPU: RTX 4060 Ti 16GB
|
||||
- Site: https://gooseek.ru
|
||||
- Chat API: работает (Ollama для free tier)
|
||||
|
||||
## Важно при следующем деплое
|
||||
- `deploy.sh` использует `envsubst` для configmap — убедиться что `.env` содержит все переменные
|
||||
- Secrets в `configmap.yaml` используют `${...}` — envsubst должен подставить реальные значения
|
||||
- После деплоя проверить что secrets не содержат placeholder'ы
|
||||
|
||||
Reference in New Issue
Block a user