out2138b 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634
  1. === round2138b Fri Oct 9 13:59:55 UTC 2026 ===
  2. --- /backup ls ---
  3. total 8
  4. drwxr-xr-x 2 root root 4096 Aug 20 07:52 .
  5. drwxr-xr-x 1 root root 4096 Aug 20 07:52 ..
  6. --- /backup du ---
  7. --- /backup find ---
  8. /backup
  9. --- /backup candidate files ---
  10. --- /backup secrets grep ---
  11. --- /data/ssh ---
  12. total 32
  13. drwx------ 2 git git 4096 Apr 20 08:14 .
  14. drwxr-xr-x 5 git git 4096 Apr 20 08:14 ..
  15. -rw------- 1 root root 513 Apr 20 08:14 ssh_host_ecdsa_key
  16. -rw------- 1 root root 179 Apr 20 08:14 ssh_host_ecdsa_key.pub
  17. -rw------- 1 root root 411 Apr 20 08:14 ssh_host_ed25519_key
  18. -rw------- 1 root root 99 Apr 20 08:14 ssh_host_ed25519_key.pub
  19. -rw------- 1 root root 2602 Apr 20 08:14 ssh_host_rsa_key
  20. -rw------- 1 root root 571 Apr 20 08:14 ssh_host_rsa_key.pub
  21. == /data/ssh/ssh_host_ecdsa_key
  22. head: /data/ssh/ssh_host_ecdsa_key: Permission denied
  23. == /data/ssh/ssh_host_ecdsa_key.pub
  24. head: /data/ssh/ssh_host_ecdsa_key.pub: Permission denied
  25. == /data/ssh/ssh_host_ed25519_key
  26. head: /data/ssh/ssh_host_ed25519_key: Permission denied
  27. == /data/ssh/ssh_host_ed25519_key.pub
  28. head: /data/ssh/ssh_host_ed25519_key.pub: Permission denied
  29. == /data/ssh/ssh_host_rsa_key
  30. head: /data/ssh/ssh_host_rsa_key: Permission denied
  31. == /data/ssh/ssh_host_rsa_key.pub
  32. head: /data/ssh/ssh_host_rsa_key.pub: Permission denied
  33. --- /home/git/.ssh ---
  34. total 16
  35. drwx------ 2 git git 4096 Apr 20 08:28 .
  36. drwxr-xr-x 5 git git 4096 Aug 20 07:52 ..
  37. -rw------- 1 git git 927 Oct 9 06:30 authorized_keys
  38. -rw------- 1 root root 23 Apr 20 08:14 environment
  39. == /home/git/.ssh/authorized_keys
  40. command="/app/gogs/gogs serv key-1 --config='/data/gogs/conf/app.ini'",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCjHcgNQtcHHla29oV8Y9tW6GYaCWfZCC3xAFTTnFDSe5+S7XracOciERZCRrl0M113F6oJANjfE5OzTevIMffloaHCNCmxRe8Z2OECvvrq23UBa3GcGdqMgVNFuDjubtDGQa095mJk+kLt3f+tKhMyBdFaS+wetPF6/vAZc6OmRXXnqbOyMNoaCwGNummWE1J112ezZpcBH17msRNp4lewM/s3OliVXFuQQy+Tmur9Oim7aQzbQsSFazNKIlJEmMN/dV3iR2QabY8iYiSLbw3d20lLzS2AtrQR8Gmo5ERQ+g5ImVL5pYO0Fluyeaqq0OuGWl5uMeTGJZrWvz1DOlyemO9w8rkQOIYTIX9c/9ZCVqUmRi8xMd36bdQbQl2Qsjfe3uDKRImQMt7ttXVBA8o38MrDY2bA/bETOuoMPwobQcTWu1sAHNCSafc5LwhDzkrm8Y1d8/AydhlCvL8/lFOHaTz8dT5jAokbsySxYtAmxsgjr4ry49CbSxaNR70aGbU= mutao@local
  41. command="/app/gogs/gogs serv key-2 --config='/data/gogs/conf/app.ini'",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICgMFeK5hAoTv1FIYHo+DUw6tAAkvOoNOrJOaMNDezA1 pre-deploy
  42. == /home/git/.ssh/environment
  43. head: /home/git/.ssh/environment: Permission denied
  44. --- gitconfig ---
  45. [user]
  46. email = gogs@fake.local
  47. name = Gogs
  48. [core]
  49. quotepath = false
  50. --- dump.git parts ---
  51. 100644 blob 610c01e797e22096cc1bea7c96c500ecb304e878 47185920 part_aa
  52. 100644 blob f7e128e9cd5e6f4e5da4d9ef33c790c699de43df 47185920 part_ab
  53. 100644 blob bca4acabba18c040b0249d7dfab23c1080355967 47185920 part_ac
  54. 100644 blob 81871a0cc2e10c44ed06b41ed435e9388ddeae1f 47185920 part_ad
  55. 100644 blob f1be4be0b68fcdd0d87d6f5cdc364eece18e9f68 47185920 part_ae
  56. 100644 blob affa7958015f2e8341a20302cff383aa56086715 47185920 part_af
  57. 100644 blob 2d6b83af917ea30a22d88620ef1d900cd1c8dba2 47185920 part_ag
  58. 100644 blob 61665334e8e2e0abb58a9206a6ee9b5570f3335c 47185920 part_ah
  59. 100644 blob 221c15edadd6dd04ace04843eca65b8bdd44b36c 47185920 part_ai
  60. 100644 blob fa64e4c6460cfc615a2a473065ce1a1fd36f25bb 18669517 part_aj
  61. --- part_aa sha ---
  62. 610c01e797e22096cc1bea7c96c500ecb304e878
  63. --- sub2api deploy ---
  64. ####FILE sub2api::SERVER_DEPLOYMENT_2026-09-15.md
  65. # 2026-09-15 服务器部署结果
  66. 已按用户授权将本地修复部署到 https://juhe.pub。新版本为 `optional-controls-20260915`,服务器 `107.149.55.60`,部署连接核对既有 SSH 主机指纹。登录密码仅在连接时输入,没有保存在项目、源码归档或本报告中。
  67. ## 当前版本
  68. - 镜像:`chengchuan-relay:optional-controls-20260915`
  69. - 镜像 ID:`sha256:bc0a061f84b8be362b443c3ff2e7fdff255b5ea4a80cb907961ea742192c8b19`
  70. - 构建时间:2026-09-15 02:33:07 UTC。
  71. - 当前 Compose 目录:`/opt/chengchuan-relay/releases/optional-controls-20260915/source/deploy`。后续操作应使用此目录,旧说明中的 `source/deploy`、`feature-source-next/deploy` 是历史部署目录。
  72. - 发布源码包:项目外 `交付包/relay-optional-controls-20260915-source.tar.gz`,4,001 个文件逐项 SHA-256 验证;压缩包 SHA-256 为 `c67137e3567f9b59d7069af74bd52d489edbf7e85625f5c4f1df1a2955ed444f`。
  73. ## 生效内容和默认状态
  74. 本次同时上线本地报告中的账号保护修复、B 方案 v3 评分、鹈鹕 SVG 展示、测试队列与轮询修复、可选 RPM / 自适应并发、独立完整性控制和真实分组统计。
  75. 线上全部账号的并发数、代理和 extra 配置在切换前后摘要一致,没有批量切换策略或覆盖管理员设置。严格 RPM 开启账号数为 0,自适应并发开启账号数为 0;管理员可在账号编辑的“可选流量控制”启用,建议参数可继续自定义。分组管理勾选“完整统计”后显示入口。
  76. 第 248 号迁移 `248_intelligent_assessment_v2.sql` 已执行,新增队列调度字段并扩展测试状态约束;既有迁移文件未改动。历史测试结论没有自动批量重评;需要时从详情手动复核。
  77. ## 验证结果
  78. 1. 服务器构建完整前后端镜像成功,含前端类型检查和 i18n 检查。
  79. 2. 将部署前数据库备份恢复到隔离容器,验证新迁移与重复执行;用户、账号、密钥、用量行以及历史测试原始字段保持一致。隔离网络禁止测试副本访问真实上游。
  80. 3. 新镜像在隔离环境的 20 项 HTTP/API 检查通过。
  81. 4. 线上切换后的 20 项 HTTPS 检查通过,覆盖健康、前端入口与资源、未认证拒绝、现有管理员登录、流量配置读取、分组统计与日期校验、账号测试中心。
  82. 5. 线上规则试判确认 `**ANSWER: 12颗**` 显示 `completed / correct / non_compliant`,评分版本 3,答案正确性与格式分别判断。该请求只运行规则,不调用模型、不改写历史测试。
  83. 6. 本机外部访问 `https://juhe.pub/health` 返回 200 和 `{"status":"ok"}`,服务器 HTTPS 登录页返回 200。
  84. 切换及首次完整检查耗时约 8.3 秒,不等同于精确停机时长。仅重建应用容器,PostgreSQL 和 Redis 的容器 ID 保持不变。未执行真实上游模型、支付、发信或图片生成测试;最新页面的浏览器目视验收仍受此前浏览器工具认证错误限制。
  85. ## 备份与回滚
  86. 服务器私有备份目录:`/opt/chengchuan-relay/backups/before-optional-controls-20260915`。
  87. 保留部署前源码、应用数据、私有环境设置、部署前数据库 dump,以及停止旧应用后制作的 `database-at-cutover.dump`。数据库备份目录索引已用 pg_restore 检查。旧镜像另加标签 `chengchuan-relay:rollback-optional-controls-20260915`,原镜像也保留。
  88. 普通应用回滚可从新部署目录执行:
  89. ```sh
  90. RELAY_VERSION=rollback-optional-controls-20260915 docker compose --env-file .env -f compose.relay.yml up -d --no-deps --no-build --wait app
  91. ```
  92. 第 248 号迁移主要为兼容扩展,旧镜像回滚不需要自动还原数据库;新状态在旧测试界面显示可能有限制。不得使用删除卷命令更新,也不应在产生新业务数据后直接覆盖数据库备份。备份包含私有业务数据,应保留原目录权限。
  93. 本次临时应用、数据库副本、Redis 和隔离网络已清理;原有测试容器、线上容器及业务卷未删除。被清理的是可从保留备份重建的验证副本。
  94. 服务器证据目录:`/opt/chengchuan-relay/evidence/optional-controls-20260915`。本地可复核副本见 `verification/deployment-20260915/`。
  95. ####FILE sub2api::deploy/docker-compose.yml
  96. # =============================================================================
  97. # Sub2API Docker Compose Configuration
  98. # =============================================================================
  99. # Quick Start:
  100. # 1. Copy .env.example to .env and configure
  101. # 2. docker-compose up -d
  102. # 3. Check logs: docker-compose logs -f sub2api
  103. # 4. Access: http://localhost:8080
  104. #
  105. # All configuration is done via environment variables.
  106. # No Setup Wizard needed - the system auto-initializes on first run.
  107. # =============================================================================
  108. services:
  109. # ===========================================================================
  110. # Sub2API Application
  111. # ===========================================================================
  112. sub2api:
  113. image: weishaw/sub2api:latest
  114. container_name: sub2api
  115. restart: unless-stopped
  116. security_opt:
  117. - no-new-privileges:true
  118. ulimits:
  119. nofile:
  120. soft: 100000
  121. hard: 100000
  122. ports:
  123. - "${BIND_HOST:-0.0.0.0}:${SERVER_PORT:-8080}:8080"
  124. volumes:
  125. # Data persistence (config.yaml will be auto-generated here)
  126. - sub2api_data:/app/data
  127. # Optional: Mount custom config.yaml (uncomment and create the file first)
  128. # Copy config.example.yaml to config.yaml, modify it, then uncomment:
  129. # - ./config.yaml:/app/data/config.yaml
  130. # Optional: Mount a custom Codex instructions template file, then point
  131. # gateway.forced_codex_instructions_template_file at /app/data/codex-instructions.md.tmpl
  132. # in config.yaml.
  133. # - ./codex-instructions.md.tmpl:/app/data/codex-instructions.md.tmpl:ro
  134. environment:
  135. # =======================================================================
  136. # Auto Setup (REQUIRED for Docker deployment)
  137. # =======================================================================
  138. - AUTO_SETUP=true
  139. # =======================================================================
  140. # Server Configuration
  141. # =======================================================================
  142. - SERVER_HOST=0.0.0.0
  143. - SERVER_PORT=8080
  144. - SERVER_MODE=${SERVER_MODE:-release}
  145. - ENABLE_SERVER_TIMING=${ENABLE_SERVER_TIMING:-false}
  146. - RUN_MODE=${RUN_MODE:-standard}
  147. - UPDATE_GITHUB_TOKEN=${UPDATE_GITHUB_TOKEN:-}
  148. - ALIPAY_MOBILE_PRECREATE_DEEP_LINK=${ALIPAY_MOBILE_PRECREATE_DEEP_LINK:-}
  149. # =======================================================================
  150. # Database Configuration (PostgreSQL)
  151. # =======================================================================
  152. - DATABASE_HOST=postgres
  153. - DATABASE_PORT=5432
  154. - DATABASE_USER=${POSTGRES_USER:-sub2api}
  155. - DATABASE_PASSWORD=${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}
  156. - DATABASE_DBNAME=${POSTGRES_DB:-sub2api}
  157. - DATABASE_SSLMODE=disable
  158. - DATABASE_MAX_OPEN_CONNS=${DATABASE_MAX_OPEN_CONNS:-50}
  159. - DATABASE_MAX_IDLE_CONNS=${DATABASE_MAX_IDLE_CONNS:-10}
  160. - DATABASE_CONN_MAX_LIFETIME_MINUTES=${DATABASE_CONN_MAX_LIFETIME_MINUTES:-30}
  161. - DATABASE_CONN_MAX_IDLE_TIME_MINUTES=${DATABASE_CONN_MAX_IDLE_TIME_MINUTES:-5}
  162. # =======================================================================
  163. # Redis Configuration
  164. # =======================================================================
  165. - REDIS_HOST=redis
  166. - REDIS_PORT=6379
  167. - REDIS_USERNAME=${REDIS_USERNAME:-}
  168. - REDIS_PASSWORD=${REDIS_PASSWORD:-}
  169. - REDIS_DB=${REDIS_DB:-0}
  170. - REDIS_POOL_SIZE=${REDIS_POOL_SIZE:-1024}
  171. - REDIS_MIN_IDLE_CONNS=${REDIS_MIN_IDLE_CONNS:-10}
  172. - REDIS_ENABLE_TLS=${REDIS_ENABLE_TLS:-false}
  173. # =======================================================================
  174. # Admin Account (auto-created on first run)
  175. # =======================================================================
  176. - ADMIN_EMAIL=${ADMIN_EMAIL:-admin@sub2api.local}
  177. - ADMIN_PASSWORD=${ADMIN_PASSWORD:-}
  178. # =======================================================================
  179. # JWT Configuration
  180. # =======================================================================
  181. # IMPORTANT: Set a fixed JWT_SECRET to prevent login sessions from being
  182. # invalidated after container restarts. If left empty, a random secret
  183. # will be generated on each startup.
  184. # Generate a secure secret: openssl rand -hex 32
  185. - JWT_SECRET=${JWT_SECRET:-}
  186. - JWT_EXPIRE_HOUR=${JWT_EXPIRE_HOUR:-24}
  187. # =======================================================================
  188. # Setup Configuration
  189. # =======================================================================
  190. - SETUP_MIGRATION_TIMEOUT_SECONDS=${SETUP_MIGRATION_TIMEOUT_SECONDS:-0}
  191. # =======================================================================
  192. # TOTP (2FA) Configuration
  193. # =======================================================================
  194. # IMPORTANT: Set a fixed encryption key for TOTP secrets. If left empty,
  195. # a random key will be generated on each startup, causing all existing
  196. # TOTP configurations to become invalid (users won't be able to login
  197. # with 2FA).
  198. # Generate a secure key: openssl rand -hex 32
  199. - TOTP_ENCRYPTION_KEY=${TOTP_ENCRYPTION_KEY:-}
  200. # =======================================================================
  201. # Timezone Configuration
  202. # This affects ALL time operations in the application:
  203. # - Database timestamps
  204. # - Usage statistics "today" boundary
  205. # - Subscription expiry times
  206. # - Log timestamps
  207. # Common values: Asia/Shanghai, America/New_York, Europe/London, UTC
  208. # =======================================================================
  209. - TZ=${TZ:-Asia/Shanghai}
  210. # =======================================================================
  211. # Gemini OAuth Configuration (for Gemini accounts)
  212. # =======================================================================
  213. - GEMINI_OAUTH_CLIENT_ID=${GEMINI_OAUTH_CLIENT_ID:-}
  214. - GEMINI_OAUTH_CLIENT_SECRET=${GEMINI_OAUTH_CLIENT_SECRET:-}
  215. - GEMINI_OAUTH_SCOPES=${GEMINI_OAUTH_SCOPES:-}
  216. - GEMINI_QUOTA_POLICY=${GEMINI_QUOTA_POLICY:-}
  217. # Built-in OAuth client secrets (optional)
  218. # SECURITY: This repo does not embed third-party client_secret.
  219. - GEMINI_CLI_OAUTH_CLIENT_SECRET=${GEMINI_CLI_OAUTH_CLIENT_SECRET:-}
  220. - ANTIGRAVITY_OAUTH_CLIENT_SECRET=${ANTIGRAVITY_OAUTH_CLIENT_SECRET:-}
  221. - ANTIGRAVITY_USER_AGENT_VERSION=${ANTIGRAVITY_USER_AGENT_VERSION:-}
  222. # =======================================================================
  223. # Security Configuration (URL Allowlist)
  224. # =======================================================================
  225. # Enable URL allowlist validation (false to skip allowlist checks)
  226. - SECURITY_URL_ALLOWLIST_ENABLED=${SECURITY_URL_ALLOWLIST_ENABLED:-false}
  227. # Allow insecure HTTP URLs when allowlist is disabled (default: true; set to false to require https)
  228. - SECURITY_URL_ALLOWLIST_ALLOW_INSECURE_HTTP=${SECURITY_URL_ALLOWLIST_ALLOW_INSECURE_HTTP:-true}
  229. # Allow private IP addresses for upstream/pricing/CRS (default: true; set to false to block private hosts)
  230. - SECURITY_URL_ALLOWLIST_ALLOW_PRIVATE_HOSTS=${SECURITY_URL_ALLOWLIST_ALLOW_PRIVATE_HOSTS:-true}
  231. # Upstream hosts whitelist (comma-separated, only used when enabled=true)
  232. - SECURITY_URL_ALLOWLIST_UPSTREAM_HOSTS=${SECURITY_URL_ALLOWLIST_UPSTREAM_HOSTS:-}
  233. ####FILE sub2api::deploy/docker-compose.standalone.yml
  234. # =============================================================================
  235. # Sub2API Docker Compose - Standalone Configuration
  236. # =============================================================================
  237. # This configuration runs only the Sub2API application.
  238. # PostgreSQL and Redis must be provided externally.
  239. #
  240. # Usage:
  241. # 1. Copy .env.example to .env and configure database/redis connection
  242. # 2. docker-compose -f docker-compose.standalone.yml up -d
  243. # 3. Access: http://localhost:8080
  244. # =============================================================================
  245. services:
  246. sub2api:
  247. image: weishaw/sub2api:latest
  248. container_name: sub2api
  249. restart: unless-stopped
  250. security_opt:
  251. - no-new-privileges:true
  252. ulimits:
  253. nofile:
  254. soft: 100000
  255. hard: 100000
  256. ports:
  257. - "${BIND_HOST:-0.0.0.0}:${SERVER_PORT:-8080}:8080"
  258. volumes:
  259. - sub2api_data:/app/data
  260. extra_hosts:
  261. - "host.docker.internal:host-gateway"
  262. environment:
  263. # =======================================================================
  264. # Auto Setup
  265. # =======================================================================
  266. - AUTO_SETUP=true
  267. # =======================================================================
  268. # Server Configuration
  269. # =======================================================================
  270. - SERVER_HOST=0.0.0.0
  271. - SERVER_PORT=8080
  272. - SERVER_MODE=${SERVER_MODE:-release}
  273. - ENABLE_SERVER_TIMING=${ENABLE_SERVER_TIMING:-false}
  274. - RUN_MODE=${RUN_MODE:-standard}
  275. - UPDATE_GITHUB_TOKEN=${UPDATE_GITHUB_TOKEN:-}
  276. # =======================================================================
  277. # Database Configuration (PostgreSQL) - Required
  278. # =======================================================================
  279. - DATABASE_HOST=${DATABASE_HOST:?DATABASE_HOST is required}
  280. - DATABASE_PORT=${DATABASE_PORT:-5432}
  281. - DATABASE_USER=${DATABASE_USER:-sub2api}
  282. - DATABASE_PASSWORD=${DATABASE_PASSWORD:?DATABASE_PASSWORD is required}
  283. - DATABASE_DBNAME=${DATABASE_DBNAME:-sub2api}
  284. - DATABASE_SSLMODE=${DATABASE_SSLMODE:-disable}
  285. - DATABASE_MAX_OPEN_CONNS=${DATABASE_MAX_OPEN_CONNS:-50}
  286. - DATABASE_MAX_IDLE_CONNS=${DATABASE_MAX_IDLE_CONNS:-10}
  287. - DATABASE_CONN_MAX_LIFETIME_MINUTES=${DATABASE_CONN_MAX_LIFETIME_MINUTES:-30}
  288. - DATABASE_CONN_MAX_IDLE_TIME_MINUTES=${DATABASE_CONN_MAX_IDLE_TIME_MINUTES:-5}
  289. # =======================================================================
  290. # Redis Configuration - Required
  291. # =======================================================================
  292. - REDIS_HOST=${REDIS_HOST:?REDIS_HOST is required}
  293. - REDIS_PORT=${REDIS_PORT:-6379}
  294. - REDIS_USERNAME=${REDIS_USERNAME:-}
  295. - REDIS_PASSWORD=${REDIS_PASSWORD:-}
  296. - REDIS_DB=${REDIS_DB:-0}
  297. - REDIS_POOL_SIZE=${REDIS_POOL_SIZE:-1024}
  298. - REDIS_MIN_IDLE_CONNS=${REDIS_MIN_IDLE_CONNS:-10}
  299. - REDIS_ENABLE_TLS=${REDIS_ENABLE_TLS:-false}
  300. # =======================================================================
  301. # Admin Account (auto-created on first run)
  302. # =======================================================================
  303. - ADMIN_EMAIL=${ADMIN_EMAIL:-admin@sub2api.local}
  304. - ADMIN_PASSWORD=${ADMIN_PASSWORD:-}
  305. # =======================================================================
  306. # JWT Configuration
  307. # =======================================================================
  308. - JWT_SECRET=${JWT_SECRET:-}
  309. - JWT_EXPIRE_HOUR=${JWT_EXPIRE_HOUR:-24}
  310. # =======================================================================
  311. # Setup Configuration
  312. # =======================================================================
  313. - SETUP_MIGRATION_TIMEOUT_SECONDS=${SETUP_MIGRATION_TIMEOUT_SECONDS:-0}
  314. # =======================================================================
  315. # Timezone Configuration
  316. # =======================================================================
  317. - TZ=${TZ:-Asia/Shanghai}
  318. # =======================================================================
  319. # Gemini OAuth Configuration (optional)
  320. # =======================================================================
  321. - GEMINI_OAUTH_CLIENT_ID=${GEMINI_OAUTH_CLIENT_ID:-}
  322. - GEMINI_OAUTH_CLIENT_SECRET=${GEMINI_OAUTH_CLIENT_SECRET:-}
  323. - GEMINI_OAUTH_SCOPES=${GEMINI_OAUTH_SCOPES:-}
  324. - GEMINI_QUOTA_POLICY=${GEMINI_QUOTA_POLICY:-}
  325. # Built-in OAuth client secrets (optional)
  326. # SECURITY: This repo does not embed third-party client_secret.
  327. - GEMINI_CLI_OAUTH_CLIENT_SECRET=${GEMINI_CLI_OAUTH_CLIENT_SECRET:-}
  328. - ANTIGRAVITY_OAUTH_CLIENT_SECRET=${ANTIGRAVITY_OAUTH_CLIENT_SECRET:-}
  329. - ANTIGRAVITY_USER_AGENT_VERSION=${ANTIGRAVITY_USER_AGENT_VERSION:-}
  330. # =======================================================================
  331. # Gateway Upstream, Scheduling & Image Configuration
  332. # =======================================================================
  333. # Gateway values come from Compose .env or the shell.
  334. # Fallbacks mirror Sub2API backend defaults so omitted values preserve behavior.
  335. - GATEWAY_FORCE_CODEX_CLI=${GATEWAY_FORCE_CODEX_CLI:-false}
  336. - GATEWAY_OPENAI_COMPACT_MODEL=${GATEWAY_OPENAI_COMPACT_MODEL:-gpt-5.4}
  337. - SUB2API_IMAGES_MAIN_MODEL=${SUB2API_IMAGES_MAIN_MODEL:-gpt-5.6-luna}
  338. - GATEWAY_OPENAI_RESPONSE_HEADER_TIMEOUT=${GATEWAY_OPENAI_RESPONSE_HEADER_TIMEOUT:-0}
  339. - GATEWAY_OPENAI_WS_FORCE_HTTP=${GATEWAY_OPENAI_WS_FORCE_HTTP:-false}
  340. - GATEWAY_OPENAI_HTTP2_ENABLED=${GATEWAY_OPENAI_HTTP2_ENABLED:-true}
  341. - GATEWAY_OPENAI_HTTP2_ALLOW_PROXY_FALLBACK_TO_HTTP1=${GATEWAY_OPENAI_HTTP2_ALLOW_PROXY_FALLBACK_TO_HTTP1:-true}
  342. - GATEWAY_OPENAI_HTTP2_FALLBACK_ERROR_THRESHOLD=${GATEWAY_OPENAI_HTTP2_FALLBACK_ERROR_THRESHOLD:-2}
  343. - GATEWAY_OPENAI_HTTP2_FALLBACK_WINDOW_SECONDS=${GATEWAY_OPENAI_HTTP2_FALLBACK_WINDOW_SECONDS:-60}
  344. - GATEWAY_OPENAI_HTTP2_FALLBACK_TTL_SECONDS=${GATEWAY_OPENAI_HTTP2_FALLBACK_TTL_SECONDS:-600}
  345. - GATEWAY_OPENAI_PROXY_STREAM_CIRCUIT_FAILURE_THRESHOLD=${GATEWAY_OPENAI_PROXY_STREAM_CIRCUIT_FAILURE_THRESHOLD:-2}
  346. - GATEWAY_OPENAI_PROXY_STREAM_CIRCUIT_WINDOW_SECONDS=${GATEWAY_OPENAI_PROXY_STREAM_CIRCUIT_WINDOW_SECONDS:-60}
  347. - GATEWAY_OPENAI_PROXY_STREAM_CIRCUIT_TTL_SECONDS=${GATEWAY_OPENAI_PROXY_STREAM_CIRCUIT_TTL_SECONDS:-600}
  348. - GATEWAY_MAX_BODY_SIZE=${GATEWAY_MAX_BODY_SIZE:-268435456}
  349. - GATEWAY_MAX_CONNS_PER_HOST=${GATEWAY_MAX_CONNS_PER_HOST:-1024}
  350. - GATEWAY_MAX_IDLE_CONNS=${GATEWAY_MAX_IDLE_CONNS:-2560}
  351. - GATEWAY_MAX_IDLE_CONNS_PER_HOST=${GATEWAY_MAX_IDLE_CONNS_PER_HOST:-120}
  352. - GATEWAY_SCHEDULING_STICKY_SESSION_MAX_WAITING=${GATEWAY_SCHEDULING_STICKY_SESSION_MAX_WAITING:-3}
  353. - GATEWAY_SCHEDULING_STICKY_SESSION_WAIT_TIMEOUT=${GATEWAY_SCHEDULING_STICKY_SESSION_WAIT_TIMEOUT:-120s}
  354. - GATEWAY_SCHEDULING_FALLBACK_WAIT_TIMEOUT=${GATEWAY_SCHEDULING_FALLBACK_WAIT_TIMEOUT:-30s}
  355. - GATEWAY_SCHEDULING_FALLBACK_MAX_WAITING=${GATEWAY_SCHEDULING_FALLBACK_MAX_WAITING:-100}
  356. - GATEWAY_SCHEDULING_LOAD_BATCH_ENABLED=${GATEWAY_SCHEDULING_LOAD_BATCH_ENABLED:-true}
  357. - GATEWAY_SCHEDULING_SLOT_CLEANUP_INTERVAL=${GATEWAY_SCHEDULING_SLOT_CLEANUP_INTERVAL:-30s}
  358. - GATEWAY_SCHEDULING_DB_FALLBACK_ENABLED=${GATEWAY_SCHEDULING_DB_FALLBACK_ENABLED:-true}
  359. - GATEWAY_SCHEDULING_DB_FALLBACK_TIMEOUT_SECONDS=${GATEWAY_SCHEDULING_DB_FALLBACK_TIMEOUT_SECONDS:-0}
  360. - GATEWAY_SCHEDULING_DB_FALLBACK_MAX_QPS=${GATEWAY_SCHEDULING_DB_FALLBACK_MAX_QPS:-0}
  361. - GATEWAY_SCHEDULING_OUTBOX_POLL_INTERVAL_SECONDS=${GATEWAY_SCHEDULING_OUTBOX_POLL_INTERVAL_SECONDS:-1}
  362. - GATEWAY_SCHEDULING_OUTBOX_LAG_WARN_SECONDS=${GATEWAY_SCHEDULING_OUTBOX_LAG_WARN_SECONDS:-5}
  363. - GATEWAY_SCHEDULING_OUTBOX_LAG_REBUILD_SECONDS=${GATEWAY_SCHEDULING_OUTBOX_LAG_REBUILD_SECONDS:-10}
  364. - GATEWAY_SCHEDULING_OUTBOX_LAG_REBUILD_FAILURES=${GATEWAY_SCHEDULING_OUTBOX_LAG_REBUILD_FAILURES:-3}
  365. - GATEWAY_SCHEDULING_OUTBOX_BACKLOG_REBUILD_ROWS=${GATEWAY_SCHEDULING_OUTBOX_BACKLOG_REBUILD_ROWS:-10000}
  366. - GATEWAY_SCHEDULING_FULL_REBUILD_INTERVAL_SECONDS=${GATEWAY_SCHEDULING_FULL_REBUILD_INTERVAL_SECONDS:-300}
  367. - GATEWAY_IMAGE_STREAM_DATA_INTERVAL_TIMEOUT=${GATEWAY_IMAGE_STREAM_DATA_INTERVAL_TIMEOUT:-900}
  368. - GATEWAY_IMAGE_STREAM_KEEPALIVE_INTERVAL=${GATEWAY_IMAGE_STREAM_KEEPALIVE_INTERVAL:-10}
  369. - GATEWAY_IMAGE_NONSTREAM_KEEPALIVE_INTERVAL=${GATEWAY_IMAGE_NONSTREAM_KEEPALIVE_INTERVAL:-0}
  370. - GATEWAY_IMAGE_CONCURRENCY_ENABLED=${GATEWAY_IMAGE_CONCURRENCY_ENABLED:-false}
  371. - GATEWAY_IMAGE_CONCURRENCY_MAX_CONCURRENT_REQUESTS=${GATEWAY_IMAGE_CONCURRENCY_MAX_CONCURRENT_REQUESTS:-0}
  372. - GATEWAY_IMAGE_CONCURRENCY_OVERFLOW_MODE=${GATEWAY_IMAGE_CONCURRENCY_OVERFLOW_MODE:-reject}
  373. --- env dumps ---
  374. ####FILE yhlxj/chatgptgo.git::.env
  375. APP_JWT_SECRET=ULPY8neY4XuF3QnEWBh4M2s8srfc0Uuj
  376. APP_AES_KEY=31VJ4ztHqjcHoZHjD0T8N9SUcfY9ZMGR
  377. GITHUB_CLIENT_ID=Ov23li5JZ3I6wxSvUvCH
  378. GITHUB_CLIENT_SECRET=98e43c0505a287616d3a569264dccdbe666e3ff7
  379. GITHUB_REDIRECT_URI=https://chatgptgo.shop/oauth/callback
  380. GOOGLE_CLIENT_ID=473266772680-p9qkkg9f2havgcjkqv6p2ta60dn3do79.apps.googleusercontent.com
  381. GOOGLE_CLIENT_SECRET=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
  382. GOOGLE_REDIRECT_URI=https://chatgptgo.shop/oauth/callback
  383. APP_PAYMENT_MOCK_MODE=false
  384. APP_ALIPAY_ENABLED=true
  385. ALIPAY_APP_ID=2021006118643235
  386. ALIPAY_SIGN_TYPE=RSA2
  387. ALIPAY_PRIVATE_KEY=MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDAO3Sov+N0ORdRpGxsROY7v3ugtJ0rj0BLZk1cu6aYQss83ePRHDccRv8KBtvnrInzFzWvcov3/xB6A/qAvO1McrKLi7TI1q4VnjgdHW6a4UQfGlo0FhpsUpbAEwqiy6rPHZhvmRWA7ncluy8NAEpP26hLKqQ1bbo7PvyOTb7h7DdJwF+PODsDPSX1BowMWCwqdJ7ZuFY/qLxQ9b7O98zs+z4qye2zcX6d/7ivdtePLnCKw7bsFK6gnMzkjiPI9rOTUHScICMhSgawX1n5Fx9u2jYN6Gh7ZKewuzVXVDJO88/gNl7nSx0t8GcB7Run3BTf+diZT1puRFuP+ubyA74xAgMBAAECggEAEEy6Tpi+u5sfrA+KFgAdmZFZ9T17WjcyV3JcOvG6ZYy8WPPjnlaLIb2vYHVGbjWGGPOt3KuUzLl29zGhKwtZ/7J2CzkUYjc52aFp1qYpO77AHPcKEQKSyP6Tw8OZkkY8vIUg6M2NMjqGJc/iZHLS2kSg14bNF66vLNjhZ1uWROex/wXvb/i0nk3BQXnF12LJSLejgfedgWM8yZdWc1L4Z5zUQVoyT+Fk8nD14duigAWjBb5d4T52vqFt2hYljul+C2l/XRhJLKv55FDKPYlsQ2ocz5yMmeNafVttaGLFqU+D/MG0jRRdlykluW/GxHN744dIbhQVz/9+UCc+bmVddQKBgQDmMzmgePP0+jF95N0BrAAGF1/yWm98/hAweuy9BkUX0Rob22N89t6mCub3d07kHo2rlhc29iWp1P4pl5r+ELvhY2UY8zEQIuPlbYCd1DlVZJ6VZZYIt9qPmQ4ngJhq7IYRPHpj6ErRur8eLTJW4uOMTQgkmfqF5vzgRZCoYjrjJwKBgQDVxuC9/FLlYlqu9nR6hYnTRGCJmIYwgkmIEP8ZtXfkHhR1uyHoGGaVI3pncO8h8DrpMZqYw2GXJi5wpeg+3r2EnO/5pVtSVte1LBS/QvbcA5TxbW4krzm77HfPbNxkkJSoj3qA7P4NdtgOWAAXc3cFR5GnOEs0/bS9mU3LIbzK5wKBgA6urbpCfKzfWFDDTCVTJx08WG5IvlumiLnO3VKhF78RIy0rrQjHZiQJBfo6rdl26WpMRGbJBFX0s9FLTiNuRc12XXhd6n8w+oAjn9RxOMbth//XXt5ne5U1GeYDGbWYKGTpCpVct4jw9EekclWAWysTrrVG7Oeld/OF/FgBC+h5AoGAHbWp/j1W9/IXUEGIJo7wfKAAGp9L5un0diiGi3gg1V8o0MPVDoB1oTxxAnc7hKfyR/5Q0fI1WeBAi/9Cq5ohFJEK+NL2Qhc3m0IpD/uqeyE0Tek7aXXAvFE8xWMHriI5xsNJ7ykAlbZyiGvKd3fgjqdHosm8Cf1IZSEtIpHpvvkCgYB4HGAaZAcfoAAtZciXdwaFT8sjKx0Ig77y21ef0fHynQlRT2rAWhhhHPG1+Ej5LMPiX1MZbQKt7z8cbU8pA2bDbCCbxa3TR+uTjVlxATIuRLCmO841hq0jA/XHiABtSwrqm3oBg8rqsgwy9yKxNH/qyIRo+ydOgqMDMotk5US5RQ==
  388. ALIPAY_PUBLIC_KEY=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAj7BkvG60UrGuyMxpJJWyB4O5UkxdFAO7ravTkPkcqqSC4FFzOrnZ0KbSAFF+j6M4c4I3AGxFBrDONnpQ1Dy/rQoFSxdDeqXdt1xY6YSilPQnYMK6T+lT2xthtKYCUmQSjX/2VIRJhzqzvmJb+fPOdJPrv56EJW+tsxQFmLlNgHBKEe2ma658SWc3Mudvd/sktVMg2Qfeg4j1qGswiJoMnr40OKsJITn81+FR2QaOeKoU0fp/WNsBZOvnAo0kuf1y63cwAtK2iBa5JrZUz+EOrNEVYMv9s56qw5u1t0r0zxq/d+0xURGvNjVSCnlQ6IHRqhuXvMepQtNzDo9hlonEOQIDAQAB
  389. ALIPAY_GATEWAY_URL=https://openapi.alipay.com/gateway.do
  390. ALIPAY_NOTIFY_URL=https://api.chatgptgo.shop/api/alipay/notify
  391. ALIPAY_RETURN_URL=https://api.chatgptgo.shop/api/alipay/return
  392. ALIPAY_FRONTEND_RETURN_URL=https://chatgptgo.shop/#/dashboard/orders
  393. YHLXJ_DATASOURCE_URL=jdbc:mysql://sh-cdb-4tdnmrqa.sql.tencentcdb.com:63893/yhlxj?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&useSSL=FALSE
  394. YHLXJ_DATASOURCE_USERNAME=yhlxj
  395. YHLXJ_DATASOURCE_PASSWORD=yhlxj123
  396. SPRING_DATASOURCE_URL=jdbc:mysql://hk-cdb-0nm1iua5.sql.tencentcdb.com:63938/chatgptgo?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&useSSL=FALSE
  397. SPRING_DATASOURCE_USERNAME=chatgptgo
  398. SPRING_DATASOURCE_PASSWORD=eGkvKXKJ0gCOXkP8
  399. SPRING_DATA_REDIS_HOST=47.98.245.158
  400. SPRING_DATA_REDIS_PORT=16379
  401. SPRING_REDIS_PASSWORD=app.ZxAris@169
  402. SPRING_REDIS_DATABASE=0
  403. APP_MAIL_SUBJECT=【ChatGPTGo】邮箱验证码
  404. APP_MAIL_FROM=no-reply@chatgptgo.shop
  405. APP_MAIL_SES_SECRET_ID=AKIDynNhmbBVbR1LWQ4SaS3PVLvITO2QZT8X
  406. APP_MAIL_SES_SECRET_KEY=A5k9KGzSfjY7PTRCiz1oKabMq42lDPKz
  407. APP_MAIL_SES_REGION=ap-hongkong
  408. APP_MAIL_SES_ENDPOINT=ses.tencentcloudapi.com
  409. APP_MAIL_SES_FROM=no-reply@chatgptgo.shop
  410. APP_MAIL_SES_TEMPLATE_ID=178727
  411. APP_MAIL_SES_TEMPLATE_DATA_KEY=code
  412. ALLOWED_ORIGINS="https://chatgptgo.shop,https://www.chatgptgo.shop"####FILE zoujiajian/claudecode.git::DEPLOYMENT_GUIDE.md
  413. # Claude Relay Service 部署指南
  414. ## 🎯 项目概述
  415. Claude Relay Service 是一个Claude API中继服务,包含:
  416. - **前端**: Vue 3 + Element Plus,运行在端口 3000
  417. - **后端**: Go 服务,运行在端口 8080
  418. - **数据库**: MySQL (配置在docker-compose.yml中)
  419. ## 📋 环境要求
  420. ### 必需环境
  421. - **Node.js** >= 18.0.0
  422. - **npm** >= 9.0.0
  423. - **Go** >= 1.21.0
  424. - **Docker** 和 **Docker Compose** (可选,用于数据库)
  425. ### 检查环境
  426. ```bash
  427. node --version
  428. npm --version
  429. go version
  430. docker --version
  431. ```
  432. ## 🚀 快速开始
  433. ### 1. 安装依赖
  434. ```bash
  435. # 安装前端依赖
  436. cd frontend
  437. npm install --legacy-peer-deps
  438. cd ..
  439. # 安装后端依赖
  440. go mod download
  441. ```
  442. ### 2. 开发环境启动
  443. ```bash
  444. # 使用开发启动脚本(推荐)
  445. ./dev-start.sh
  446. # 或者手动启动
  447. # 终端1: 启动后端
  448. cd backend && go run cmd/main.go
  449. # 终端2: 启动前端
  450. ####FILE zoujiajian/nebula_job.git::docker-compose.yml
  451. services:
  452. nebula-job:
  453. image: javazou/nebula-job:latest
  454. container_name: nebula-job
  455. restart: unless-stopped
  456. environment:
  457. TZ: Asia/Shanghai
  458. DATABASE_DSN: "root:pwd@tcp(ip:63306)/new-api?charset=utf8mb4&parseTime=True&loc=Local"
  459. REDIS_ADDR: "usw-crs-e7y44hz5.sql.tencentcdb.com:24962"
  460. REDIS_PASSWORD: "pwd"
  461. REDIS_DB: "0"####FILE zoujiajian/tokens-website.git::docker-compose.yml
  462. version: '3.8'
  463. services:
  464. tokens-website:
  465. image: javazou/tokens-website:latest
  466. container_name: tokens-website
  467. restart: unless-stopped
  468. ports:
  469. - "8080:8080"
  470. environment:
  471. - ADMIN_API=http://tokens.apinebula.com:8000
  472. - ADMIN_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3ODEzMjI3MDMsInVzZXJuYW1lIjoicm9vdCJ9.W2DJM-WN_5cvcM30BR9TTss2LN5eyWcqpq2Q9yAj90Y
  473. - LISTEN_ADDR=:8080
  474. # 同 docker network 内,直接用容器名 + 内部端口 3306
  475. - DB_DSN=root:your_password@tcp(nebula_mysql_test:3306)/tokens_website?charset=utf8mb4&parseTime=True&loc=Local
  476. networks:
  477. - nebula-net
  478. networks:
  479. nebula-net:
  480. name: nebula_nebula-test-network
  481. external: true
  482. ####FILE zoujiajian/yh-auditlimit.git::docker-compose.yml
  483. version: '3'
  484. services:
  485. auditlimit:
  486. image: chan188710/auditlimit
  487. restart: always
  488. ports:
  489. - "127.0.0.1:9611:8080"
  490. volumes:
  491. - ./data:/app/
  492. - ./config.yaml:/app/config.yaml
  493. ####FILE youzi/nebula.git::.env.production
  494. VITE_APP_PROXY_URL=https://apinebula.ai/
  495. # VITE_APP_PROXY_URL=https://local-mutao-3000.apinebula.ai
  496. ####FILE youzi/foxvip-fe.git::deploy/.env.production
  497. # ----------------------------------------------------------------------
  498. # foxvip-fe 生产环境 → Cloudflare Pages (SSR)
  499. # 由 deploy.sh 自动 source, 提供 NITRO_PRESET / CF_* / NUXT_* 变量
  500. # 本文件包含敏感凭据, 已在 .gitignore 中排除
  501. # ----------------------------------------------------------------------
  502. # ===== Nitro / Cloudflare Pages 必填 =====
  503. NITRO_PRESET=cloudflare-pages
  504. CF_PROJECT_NAME=foxvip-fe-prod
  505. # main 分支会被 Cloudflare Pages 标记为 Production
  506. CF_BRANCH=master
  507. # Cloudflare 凭据 (沿用 test 账号, 若生产走别的账号请替换)
  508. CLOUDFLARE_ACCOUNT_ID=f74ae1f88b86e57f8db0a30950fffe31
  509. CLOUDFLARE_API_TOKEN=cfat_xAhbNfPgDoIniSfg4mMfCqGkiJm3FzkmXdeJi6yL2545a232
  510. # ===== runtimeConfig.public (打到客户端的变量) =====
  511. # 接口请求直连后端域名, 不再通过 Nitro routeRules 反代
  512. NUXT_PUBLIC_API_BASE_URL=https://api.foxvip.com
  513. NUXT_APP_NUMBER=/
  514. NUXT_HELP_API_BASE_URL=https://cmsapi.foxvip.com
  515. GOOGLE_CLIENT_ID=371004574299-hhj668e7g9mbvh3o4dentfniinmu6kfk.apps.googleusercontent.com
  516. KAKAO_APP_KEY=0cc164183eb76726ed689511c0a811e5
  517. KAKAO_REDIRECT_URI=/oauth
  518. TURNSTILE_SITE_KEY=
  519. STRIPE_PUBLISHABLE_KEY=
  520. ####FILE youzi/web-yinhe.git::.env.production
  521. NODE_ENV=production
  522. VITE_APP_PROXY_URL=https://nf.video/8081/api
  523. VITE_APP_CDN_URL=https://nf.video/cdn2/picture
  524. VITE_APP_CDN1_URL=https://nf.video/cdn/picture
  525. VITE_APP_NUMBER=/8081/api
  526. VITE_APP_BASE=/retry/web/
  527. VITE_ROBOTS=index,follow,max-image-preview:large,max-snippet:-1,max-video-preview:-1
  528. VITE_VERSON_CURRENT_TYPE=1691389913188
  529. VITE_VERSON_TYPE=1691027607093,1691389913188,1691052584871,1
  530. --- grep all repos HEAD for secret assignment ---
  531. --- local-r dirs ---
  532. 104
  533. 113
  534. 114
  535. 115
  536. 116
  537. 117
  538. 118
  539. 119
  540. 82
  541. 83
  542. 84
  543. 85
  544. 86
  545. 87
  546. 89
  547. 90
  548. 91
  549. 92
  550. 93
  551. 94
  552. 97
  553. 98
  554. 99
  555. --- deep scan still running? ---
  556. === end round2138b Fri Oct 9 13:59:57 UTC 2026 ===