visionA/.env.stage.example
jim800121chen 9e29ebf767 feat(visionA-backend): Phase 0.8b v0.6 T4 — config FAA 欄位砍 + .env 清 + i18n/godoc polish
對齊 ADR-016 / conversion.md v0.6.1 §3.1:visionA 端不再需要 FAA 設定(v0.5 T1 加的 FAAAPIKey/FAABaseURL 撤回)。

config 砍除:
- internal/config/config.go: ConversionConfig.FAABaseURL + FAAAPIKey 兩欄位
- internal/config/load.go: VISIONA_FAA_BASE_URL + VISIONA_FAA_API_KEY 兩 env 讀取
- Enabled() 簡化為「ConverterBaseURL + ConverterAPIKey 兩個非空」
- internal/config/load_test.go: TestLoad_ConversionEnabled 從 6 case 簡化為 4 case (all_set / missing_converter_url / missing_converter_key / all_empty)

.env*.example 對齊(3 個檔):
- visionA-backend/.env.example: 砍 2 個 FAA env row + 註解;header 改「2 欄位啟用」
- .env.stage.example: 同上;VISIONA_CONVERTER_API_KEY 保留 CHANGE_ME_OPENSSL_RAND_HEX_32 placeholder
- .env.dev.example: 註解區塊統一對齊

T3 review polish:
- m-2 internal/api/conversion.go: i18n message map 砍 4 個 dead case (download_token_failed / mc_token_unavailable / idp_misconfigured / idp_unavailable) — 對應 v0.5 mc_token_client 撤回時砍的 sentinel;落入 default「內部錯誤」、行為不變
- m-3 internal/conversion/util.go: hashObjectKey godoc 補「設計約束(重要)」段 + 3 條「不應做的事」(不出現在 response body/header / 不組 URL / 不寫進 user-facing 錯誤訊息)— 明示用途限定於 slog 欄位內、避免 misuse vector
- cmd/api-server/main.go: godoc 對齊 T4 完成狀態

驗證:
- B 層 verification 主動跑(T3 reviewer 接受暫緩、backend 主動跑避免 reviewer 二次要求):
  * 跨檔 grep: production code 0 functional 命中(殘留全是註解 audit trail / test fixture name)
  * 17 packages race -count=3 全綠
  * 3 個 .env 環境一致性驗證
- go build ./... exit 0
- go test -race -count=3 ./... 17 packages 全綠
- Reviewer 5 軸(v0.6-t4-review) 通過(0 Critical / 0 Major / 2 Minor / 4 Suggestion)

v0.6 對齊改造事實上完工:
- T1 ConverterClient.GetResult method
- T2 flow.go DownloadStream/PromoteToModels 改用 GetResult + e2e endpoint
- T3 faa_client 整檔砍 + ErrFAA* sentinel 清 + s-3/s-4/s-5 必補 + mockFAA regression-only
- T4 config FAA 欄位砍 + .env 清 + i18n/godoc polish

main.go startup log 已是「converter_api_key_set only」、無 FAA 殘留 / 無 tenant_id(T2-T3 已處理)。e2e regression 防護由 mockFAA negative assertion 守住(T3)。

下一步:
- visionA backend 端 ADR-016 對齊完工,等使用者跨 repo 加 converter GET /api/v1/jobs/{id}/result endpoint
- stage redeploy + e2e 完整測試

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 19:16:28 +08:00

144 lines
6.9 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# visionA — stage 環境變數範本
#
# 使用方式:
# 1. 在 stage host 上:
# cp .env.stage.example .env.stage
# nano .env.stage # 填入 secrets見下方說明
# 2. .env.stage 與 docker-compose.stage.yml 同目錄
# 3. ⚠️ 不進 git.gitignore 已排除)
#
# Secret 產生方式:
# openssl rand -hex 32
#
# 對齊:
# - visionA-backend/internal/config/config.goA1 後 ClientSecret 變選填、預留 ServiceClient*
# - .autoflow/04-architecture/oidc-tdd.md §13.1
# - .autoflow/progress.md Phase 0.7 → S6OIDC public PKCE-only client
# ============================================================
# OIDC — Member Center @ stage
# ============================================================
# Issuer URL — 結尾斜線**必要**MC discovery 回的 issuer 帶 slash否則 client init reject
VISIONA_OIDC_ISSUER_URL=https://stage-9527.innovedus.com:7850/
# Login clientpublic PKCE-only — 無 secret
VISIONA_OIDC_CLIENT_ID=b8093fea1a504a5d8f0e04bee9f78f2e
# 留空 → backend 走 PKCE-only modeA1 後支援;見 ADR-013
VISIONA_OIDC_CLIENT_SECRET=
# Phase 0.8b 移除VISIONA_OIDC_SERVICE_CLIENT_ID / _SECRET
# 服務間認證從 OAuth client_credentials 改為 pre-shared API key見 ADR-015
# 兩個 service client env 不再讀取OIDCConfig.ServiceClientID/Secret struct 欄位
# 為了 backward compat 暫保留、但 conversion 模組不再依賴)。
# 已洩漏的 stage service client secret 自此作廢,無 rotate 需求。
# Callback URL — 必須與 MC 端 client 設定的 redirect_uri 完全一致
VISIONA_OIDC_REDIRECT_URL=https://stage-9527.innovedus.com:9527/api/auth/callback
# Frontend URL — OIDC callback 完成後 302 回的目標(同 host 同 port
VISIONA_FRONTEND_URL=https://stage-9527.innovedus.com:9527
# ============================================================
# Cookie sessionOIDC 登入後在 browser 端的 session cookie
# ============================================================
# Cookie HMAC 簽章金鑰 — **必須換掉**
# 產生openssl rand -hex 32
VISIONA_SESSION_SECRET=CHANGE_ME_OPENSSL_RAND_HEX_32
# CookieDomain留空 = host-only cookie推薦stage 只有單一 host
# 若未來要跨子網域共享 session 才設成 .innovedus.com 之類
VISIONA_SESSION_COOKIE_DOMAIN=
# CookieSecurestage 走 HTTPS → 必須 true
VISIONA_SESSION_COOKIE_SECURE=true
# Session TTL預設值。如要改去掉註解填值
# VISIONA_SESSION_ABSOLUTE_TTL=168h
# VISIONA_SESSION_IDLE_TTL=24h
# ============================================================
# Server — port 都對齊 nginx.stage.conf
# ============================================================
VISIONA_HOST=0.0.0.0
VISIONA_API_PORT=3721
VISIONA_TUNNEL_PORT=3800
VISIONA_PROXY_INTERNAL_PORT=3801
VISIONA_PROXY_INTERNAL_URL=http://127.0.0.1:3801
# api-server 端的 SessionStore backendproxy-client = 透過 internal HTTP 查 remote-proxy
# remote-proxy 端的 SessionStore backendinmemory = 自己持有 yamux session
# 兩個 binary 共讀此 .env但各自只看自己需要的欄位
VISIONA_SESSION_BACKEND=proxy-client
# Agent 連 tunnel 用的對外 URL/api/pairing/exchange 回給 agent
# 注意 ws→wss、host:port 與對外 HTTPS 一致
VISIONA_RELAY_PUBLIC_URL=wss://stage-9527.innovedus.com:9527
# ============================================================
# CORS — stage 同 host 同源frontend 與 backend 都從 :9527 出來),不需放
# ============================================================
VISIONA_CORS_ALLOWED_ORIGINS=
# ============================================================
# Storage — 雛形 LocalFShost 的 /opt/visiona/data/ 掛進 container
# ============================================================
VISIONA_STORAGE_BACKEND=localfs
VISIONA_STORAGE_LOCALFS_ROOT=/data/storage
# presigned URL 對外可達 base與公司 host nginx 對外一致
VISIONA_STORAGE_LOCALFS_BASE_URL=https://stage-9527.innovedus.com:9527/storage
# presigned URL HMAC secret — **必須換掉**
# 產生openssl rand -hex 32
VISIONA_STORAGE_SIGNING_SECRET=CHANGE_ME_OPENSSL_RAND_HEX_32
# ============================================================
# Model upload
# ============================================================
# 模型上傳大小上限MB— 注意要與 nginx.stage.conf 的 client_max_body_size 對齊
# 目前 nginx 設 100M這裡也 100要改大兩處要一起改
VISIONA_MODEL_MAX_SIZE_MB=100
# ============================================================
# Pairing token雛形留空 = 動態配發;填值 = 寫死)
# 對齊 .autoflow/02-prd/feature-pairing-token.md
# ============================================================
VISIONA_PAIRING_TOKEN=
# ============================================================
# Misc
# ============================================================
VISIONA_LOG_LEVEL=info
# stage 不塞 demo data避免 storage 被假資料污染)
VISIONA_SEED_DEMO_DATA=false
# Phase 0.7 security audit (2026-05-01) 後 stage/prod 不再讀此值;
# 已從 api.Deps 移除(見 .autoflow/05-implementation/review/phase-0.7-security-audit.md C1
# 留註解作為 audit trailstage 部署不需設定 VISIONA_STATIC_USER_ID。
# ============================================================
# Phase 0.8 / 0.8b — 轉檔功能整合converter pre-shared API key
# ============================================================
# 對齊 docs/autoflow/04-architecture/conversion.md §3 + ADR-015 + ADR-016。
#
# Phase 0.8b 變更:服務間認證從 OAuth client_credentials 改為 pre-shared API key。
#
# 啟用判定2 個欄位ConverterBaseURL / ConverterAPIKey**全部非空**才視為啟用;
# 任一缺 → 5 個 /api/conversion/* endpoint 不註冊。
#
# Phase 0.8b 移除(不再讀取,也別再放進 .env.stage
# - VISIONA_OIDC_SERVICE_CLIENT_ID / _SECRET服務間認證取消 MC client_credentials
# - VISIONA_CONVERSION_TENANT_ID / VISIONA_OIDC_TENANT_ID取消 tenant 概念)
# - VISIONA_FAA_DELEGATED_TTL_SECONDS取消 delegated download token 機制;改 server-side stream proxy
#
# Phase 0.8b v0.6 T4 移除(不再讀取,也別再放進 .env.stageADR-016 撤回 v0.5 設計缺口):
# - VISIONA_FAA_BASE_URLvisionA 端不再直接呼叫 FAA
# - VISIONA_FAA_API_KEY同上download / promote 改走 converter.GetResult
# kneron_model_converter task-scheduler base URLstage 公司內網)
VISIONA_CONVERTER_BASE_URL=http://192.168.0.130:9501
# Pre-shared API key — visionA → converter 服務間認證Phase 0.8b 新增ADR-015 §3
# **必須換掉**openssl rand -hex 32 產生 64 字元 hex與 converter 端 CONVERTER_API_KEY 對齊
# 雙方獨立持有、不共用、嚴格分環境dev / stage / prod 各自獨立 key
# log 永遠不印此值全文;部署時用 AWS Secrets Manager / Vault 注入
VISIONA_CONVERTER_API_KEY=CHANGE_ME_OPENSSL_RAND_HEX_32