From cbb4b467ad4c53a0899980e7d10b7cd31afec63e Mon Sep 17 00:00:00 2001 From: Denozordec Date: Mon, 25 May 2026 10:34:03 +0700 Subject: [PATCH] fix(agentserver): hide upstream errors from clients MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Generic 502 detail как в httpapi; добавлен docs/production-checklist.md. Co-authored-by: Cursor --- docs/production-checklist.md | 26 ++++++++++++++++++++++++++ internal/agentserver/server.go | 6 ++++-- 2 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 docs/production-checklist.md diff --git a/docs/production-checklist.md b/docs/production-checklist.md new file mode 100644 index 0000000..fefa3f6 --- /dev/null +++ b/docs/production-checklist.md @@ -0,0 +1,26 @@ +# Production checklist + +Краткий чеклист перед выводом EvoBGP в production (10+ клиентов, нестабильная сеть). + +## Обязательно + +- `EVOBGP_SEED_DEMO=0` — отключить demo-tenant и токен `Bearer dev`. +- `EVOBGP_DEV_INSECURE` не задавать или `0` — не использовать lab-флаги в prod. +- `EVOBGP_BUNDLE_SEED_HEX` — задать стабильный hex-ключ подписи бандлов; сохранить pubkey для нод. +- PostgreSQL с TLS (`sslmode` не `disable`) при доступе вне private network. +- `EVOBGP_CORS_ORIGINS` — явный whitelist origin веб-панели. +- `EVOBGP_STALE_ON_UPSTREAM_ERROR=1` (по умолчанию) — stale snapshot при сбоях CDN/ASN/DoH. + +## Рекомендуется + +- `EVOBGP_JOB_MAX_CONCURRENT=16`, `EVOBGP_DB_MAX_CONNS=25`, `EVOBGP_COLLECT_CONCURRENCY=16` при росте tenants. +- `EVOBGP_NODE_DISPATCH_INSECURE_TLS=0` — только валидный TLS к agent. +- Ограничить `/metrics` сетевой политикой или reverse proxy. +- Профиль `evobgp-all` или HA API + персистентная `job_audit` (PostgreSQL). +- Мониторинг drift: `evobgp-deploy`, `last_applied_revision_id` vs published. + +## Не использовать в prod + +- `EVOBGP_CDN_ALLOW_PRIVATE=1` — только тесты/lab. +- Plaintext `EVOBGP_API_KEYS` без ротации (break-glass — временно). +- Ручное редактирование `evobgp_*.conf` на нодах без ревизии. diff --git a/internal/agentserver/server.go b/internal/agentserver/server.go index 75d0b95..9918981 100644 --- a/internal/agentserver/server.go +++ b/internal/agentserver/server.go @@ -14,6 +14,8 @@ import ( "evobgp/internal/nodecli" ) +const upstreamErrorDetail = "upstream request failed" + // Config holds evobgp-agent serve settings. type Config struct { Listen string @@ -85,7 +87,7 @@ func (s *Server) handleBirdProtocols(w http.ResponseWriter, r *http.Request) { out, err := birdfmt.ShowProtocols(ctx, sock, strings.TrimSpace(s.cfg.BirdcBin)) if err != nil { log.Printf("agentserver: bird protocols: %v", err) - writeProblem(w, http.StatusBadGateway, err.Error()) + writeProblem(w, http.StatusBadGateway, upstreamErrorDetail) return } writeJSON(w, http.StatusOK, map[string]any{ @@ -126,7 +128,7 @@ func (s *Server) handleSync(w http.ResponseWriter, r *http.Request) { }) if err != nil { log.Printf("agentserver: sync: %v", err) - writeProblem(w, http.StatusBadGateway, err.Error()) + writeProblem(w, http.StatusBadGateway, upstreamErrorDetail) return } if s.cfg.OnSyncSuccess != nil {