mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-12 14:10:19 +08:00
Bound request, stream, queue, and shutdown resource lifetimes. Reduce scheduler and Redis hot-path work and isolate database maintenance. Include regression coverage, load probes, and concurrency audit results.
181 lines
11 KiB
Bash
181 lines
11 KiB
Bash
# ==================== 必须配置(启动前) ====================
|
||
# 以下配置项必须在项目启动前设置
|
||
|
||
# 应用端口(默认 8084)
|
||
APP_PORT=8084
|
||
|
||
# 对外访问地址,用于一键安装、CC Switch 导入、支付回调等需要生成公网 URL 的场景。
|
||
# 生产环境建议显式配置为不带内部端口的公网域名,例如 https://aether.example.com
|
||
# AETHER_PUBLIC_BASE_URL=https://aether.example.com
|
||
|
||
# Docker Compose 镜像(默认正式版 latest;提前测试可改 rc/beta;也可固定具体版本)
|
||
# 示例:
|
||
# APP_IMAGE=ghcr.io/fawney19/aether:latest
|
||
# APP_IMAGE=ghcr.io/fawney19/aether:rc
|
||
# APP_IMAGE=ghcr.io/fawney19/aether:beta
|
||
# APP_IMAGE=ghcr.io/fawney19/aether:0.7.0-rc.1
|
||
|
||
# API Key 前缀(默认 sk)
|
||
API_KEY_PREFIX=sk
|
||
|
||
# Rust 日志过滤(默认 aether_gateway=info)
|
||
# 示例: aether_gateway=debug,sqlx=warn
|
||
RUST_LOG=aether_gateway=info
|
||
|
||
# CORS 配置(跨域带 Cookie 时不要写 *,必须显式列出前端源)
|
||
# 示例: http://localhost:5173,https://app.example.com
|
||
# CORS_ORIGINS=http://localhost:5173
|
||
# CORS_ALLOW_CREDENTIALS=true
|
||
# 登录刷新 Cookie 对同源浏览器请求和可信反代自动适配 HTTP/HTTPS。
|
||
# HTTP 自动使用兼容的 SameSite=Lax(显式 Strict 保留);HTTPS 保留原有 SameSite 配置。
|
||
# 无法确认访问协议时保留安全默认值;HTTPS 反代请正确传递 X-Forwarded-Proto。
|
||
# AUTH_REFRESH_COOKIE_SECURE 可显式覆盖自动判断,公网部署仍建议使用 HTTPS。
|
||
# 如果前后端跨站并依赖登录刷新 Cookie,必须使用 HTTPS,并配合:
|
||
# AUTH_REFRESH_COOKIE_SAMESITE=None
|
||
# AUTH_REFRESH_COOKIE_SECURE=true
|
||
|
||
# 数据库配置(仅支持 PostgreSQL)
|
||
DB_HOST=localhost
|
||
DB_PORT=5432
|
||
DB_USER=postgres
|
||
DB_NAME=aether
|
||
DB_PASSWORD=
|
||
|
||
# Redis 配置
|
||
REDIS_HOST=localhost
|
||
REDIS_PORT=6379
|
||
REDIS_PASSWORD=
|
||
|
||
# JWT密钥(使用 ./generate_keys.sh 生成)
|
||
# 用于用户登录 token 签名,更换后所有用户需重新登录
|
||
JWT_SECRET_KEY=change-this-to-a-secure-random-string
|
||
|
||
# 独立加密密钥(用于加密 Provider API Key 等敏感数据)
|
||
# 注意:更换此密钥后需要在管理面板重新配置所有 Provider API Key
|
||
ENCRYPTION_KEY=change-this-to-another-secure-random-string
|
||
|
||
# S3 备份的独立加密密钥(推荐)。未配置时为兼容旧部署,会回退到 ENCRYPTION_KEY。
|
||
# 密钥轮换前必须保留旧值,离线恢复工具需要它解密历史备份。
|
||
# AETHER_BACKUP_ENCRYPTION_KEY=change-this-to-a-dedicated-secure-random-string
|
||
|
||
# 启动自举管理员(仅在当前库里还没有活动管理员时生效)
|
||
# 首次启动前必须设置 ADMIN_PASSWORD;install.sh 首次生成配置时会提示输入。
|
||
ADMIN_EMAIL=admin@example.com
|
||
ADMIN_USERNAME=admin123456
|
||
# ADMIN_PASSWORD=
|
||
|
||
# ==================== 可选配置(有默认值) ====================
|
||
|
||
# 可信反向代理 IP/CIDR,只有这些来源发送的 X-Real-IP / X-Forwarded-For 会被采用。
|
||
# 默认仅信任本机回环代理:127.0.0.0/8,::1/128。
|
||
# Docker/Nginx 位于独立容器时,请按实际容器网络设置,例如:172.16.0.0/12。
|
||
# AETHER_TRUSTED_PROXY_CIDRS=127.0.0.0/8,::1/128,172.16.0.0/12
|
||
|
||
# VS Code Codex 云端协同(仅在叠加 aether-vscodex/docker-compose.aether.yml 时需要)
|
||
# 内部 token 至少 24 字节,建议使用:openssl rand -base64 32
|
||
# AETHER_VSCODEX_INTERNAL_TOKEN=replace-with-a-long-random-secret
|
||
# AETHER_VSCODEX_PUBLIC_WS_URL=wss://aether.example.com/api/vscodex/ws
|
||
# AETHER_VSCODEX_ALLOWED_ORIGINS=https://aether.example.com
|
||
|
||
# 启动时的数据库准备策略:auto(默认)或 verify-only
|
||
# AETHER_GATEWAY_DATABASE_MODE=auto
|
||
|
||
# PostgreSQL 连接池配置(默认每核 4 条、总池至少 32 条且最多 100 条;多实例部署应显式分配每实例预算)
|
||
# AETHER_GATEWAY_DATA_POSTGRES_MIN_CONNECTIONS=12
|
||
# AETHER_GATEWAY_DATA_POSTGRES_MAX_CONNECTIONS=80
|
||
# 普通 PostgreSQL 连接默认语句超时 30 秒、锁等待超时 3 秒;0 显式关闭。
|
||
# 这是单条 SQL 的期限,不是整个事务总期限;迁移和历史 backfill 使用独立连接放宽。
|
||
# AETHER_GATEWAY_DATA_POSTGRES_STATEMENT_TIMEOUT_MS=30000
|
||
# AETHER_GATEWAY_DATA_POSTGRES_LOCK_TIMEOUT_MS=3000
|
||
# AETHER_GATEWAY_MAX_IN_FLIGHT_REQUESTS=2048
|
||
# 所有监听分片共用的入站 TCP 连接上限,包含握手、空闲 keep-alive 和升级后的 WebSocket。
|
||
# 未设置或 0 时按请求上限 + WebSocket 上限推导,最大 65536;显式配置也受 FD 余量限制。
|
||
# 已知 FD soft limit 时最多 max(1, (FD - 256) / 2),不是整个进程的 FD/内存保证。
|
||
# 满额的新连接在 HTTP 解析前关闭,不排队创建任务,也不会返回 HTTP 429/503。
|
||
# AETHER_GATEWAY_MAX_HTTP_CONNECTIONS=4096
|
||
# 停机先等待 HTTP 请求,再排空本地用量写入;以下期限单位为毫秒。
|
||
# 进程管理器的强杀期限应覆盖两阶段之和,再预留至少 10 秒收尾。
|
||
# AETHER_GATEWAY_HTTP_SHUTDOWN_TIMEOUT_MS=30000
|
||
# AETHER_GATEWAY_USAGE_SHUTDOWN_TIMEOUT_MS=30000
|
||
# 每客户端、每 origin 的上游空闲连接缓存;不限制活动请求或流持续时间。
|
||
# AETHER_GATEWAY_UPSTREAM_POOL_MAX_IDLE_PER_HOST=32
|
||
# AETHER_GATEWAY_UPSTREAM_POOL_IDLE_TIMEOUT_MS=15000
|
||
# AETHER_GATEWAY_REQUEST_BODY_BUFFER_BUDGET_MB=256
|
||
# 请求体按实际缓冲增长申请额度,解压同时计入输入和输出;额度不足返回 503。
|
||
# 请求体完整读取总超时默认 120000 毫秒;非零值限制在 1000-600000,显式 0 关闭。
|
||
# AETHER_GATEWAY_REQUEST_BODY_READ_TIMEOUT_MS=120000
|
||
# 上游流首包后空闲超时默认 300000 毫秒;执行配置 read_ms 优先,显式 0 关闭。
|
||
# AETHER_GATEWAY_UPSTREAM_STREAM_IDLE_TIMEOUT_MS=300000
|
||
# 流式响应诊断捕获共享预算默认 128 MiB,包含 provider/client 分配;不足时截断审计副本。
|
||
# 显式 0 关闭此类捕获;不限制协议解析、终态编码和 usage 队列的总内存。
|
||
# AETHER_GATEWAY_STREAM_CAPTURE_MEMORY_BUDGET_BYTES=134217728
|
||
# usage 诊断正文共享预算,按 JSON 堆内存估算,默认 128 MiB。
|
||
# 覆盖终态队列 seed、Redis 解码事件、数据库写入 DTO 及正文副本;额度随正文释放。
|
||
# 不足或显式 0 时先保留计费事实再舍弃正文;已有清空/禁用状态保留,其余标为截断。
|
||
# 不包含原始 Redis 批次、解码临时分配、序列化和压缩结果、协议观察缓冲或进程总内存。
|
||
# AETHER_USAGE_EVENT_CAPTURE_MEMORY_BUDGET_BYTES=134217728
|
||
# 新 usage 队列消息的完整 JSON payload 上限,默认 1 MiB;显式 0 非法。
|
||
# 超限先保留计费事实并舍弃诊断字段;仍超限或无法保留计费语义则拒绝入队,终态尝试受限落库,失败即明确失败。
|
||
# 不限制存量 Redis 消息、整个读取批次、DLQ 或进程总内存。
|
||
# usage_runtime_queue_payload_* 降级/拒绝计数包含入队和重试预校验的编码尝试,不代表唯一事件数。
|
||
# AETHER_GATEWAY_USAGE_QUEUE_PAYLOAD_MAX_BYTES=1048576
|
||
# usage worker 读取/重领共用的逻辑 payload 预留:全进程默认 128 MiB,单批目标 8 MiB。
|
||
# 按当前消息上限推导 COUNT,默认最多 8 条;预留覆盖整批处理和确认,额度不足等待。
|
||
# 当前消息上限不能超过总预留额度;单批目标不足一条时仍读一条。0 或非法值回退默认。
|
||
# 历史/其他生产者的大消息继续处理并计数,不是 RESP、实际堆内存或 DLQ 的硬上限。
|
||
# AETHER_USAGE_QUEUE_READ_PAYLOAD_BUDGET_BYTES=134217728
|
||
# AETHER_USAGE_QUEUE_READ_BATCH_PAYLOAD_BYTES=8388608
|
||
# DLQ 原文和最坏 JSON 编码独立预留默认 64 MiB,后台编码及写入最多同时 4 个任务。
|
||
# 入场前一次预留,额度占满或单条超预算立即失败并保留 pending 原消息,后续重领。
|
||
# 编码失败不阻塞同批其余正常消息;批次仍报告失败,只有成功项会被确认。
|
||
# JSON 按字符串最多 6 倍转义保守估算;不截原账务字段,不包含 Redis 命令/连接副本或 RSS。
|
||
# 0/非法值回退默认;bytes 最大约 4 GiB,jobs 最大 128。超大存量可能需调高额度后恢复。
|
||
# AETHER_USAGE_DLQ_ENCODING_BUDGET_BYTES=67108864
|
||
# AETHER_USAGE_DLQ_ENCODING_MAX_JOBS=4
|
||
# 内置 Redis 死信转移要求 Redis 7+ 及 EVAL/TYPE/XPENDING/XADD/XACK/XDEL 权限。
|
||
# stream 与 DLQ 不能同名;Cluster 还要求两键同 slot,现有默认键未自动迁移。
|
||
# 单请求解压后 Payload 上限(MiB),默认 256;显式 0 仍受 256 MiB 硬上限保护。
|
||
# AETHER_MAX_REQUEST_BODY_MB=256
|
||
# AETHER_GATEWAY_SECURITY_CACHE_TTL_MS=1000
|
||
# AETHER_MAX_REDACTED_SYNC_RESPONSE_BODY_MB=64
|
||
# AETHER_MAX_INTERNAL_BUFFERED_BODY_MB=64
|
||
# AETHER_TUNNEL_NODE_STATUS_QUEUE_CAPACITY=1024
|
||
# Tunnel relay 使用的独立 HMAC 密钥。启用 HTTP tunnel relay 或多网关 owner 转发时必须配置,
|
||
# 所有网关实例必须使用同一个至少 32 字节的随机值;不要复用 JWT 或数据加密密钥。
|
||
# AETHER_TUNNEL_RELAY_AUTH_SECRET=
|
||
# 旧版 /api/internal/gateway/* 控制面默认关闭。确需独立服务调用时,配置至少 32 字节的
|
||
# 独立 HMAC 密钥;不要复用 JWT、数据加密或 tunnel relay 密钥。多节点必须使用相同值和共享 Redis。
|
||
# AETHER_INTERNAL_GATEWAY_AUTH_SECRET=
|
||
# 远程 relay 地址必须使用 HTTPS;HTTP 仅允许 localhost 或回环 IP。
|
||
# AETHER_TUNNEL_RELAY_BASE_URL=https://gateway-a.example.com
|
||
# 跨网关 relay 解析到受控私有地址时才显式开启;默认关闭以防止被篡改的 attachment
|
||
# 记录诱导网关向内网转发 relay 凭据。该开关不放宽普通 provider 的目标地址策略。
|
||
# AETHER_TUNNEL_RELAY_ALLOW_PRIVATE_TARGETS=false
|
||
# 更推荐按 relay 主机名精确放行私网部署(逗号分隔,大小写不敏感);不支持通配符/后缀。
|
||
# AETHER_TUNNEL_RELAY_PRIVATE_HOST_ALLOWLIST=gateway-a.internal,gateway-b.internal
|
||
# Bark 自建服务默认仅允许公网 HTTPS。确需明文 HTTP 或内网目标时分别显式开启:
|
||
# AETHER_BARK_ALLOW_HTTP=false
|
||
# AETHER_BARK_ALLOW_PRIVATE_TARGETS=false
|
||
|
||
# 普通 Provider 反代(包括 Provider OAuth)不按 DNS 地址过滤上游,兼容任意
|
||
# Fake-IP 域名及内网 DNS。仅信任管理员配置的上游;没有严格 DNS 过滤开关。
|
||
# URL 协议、字面 IP、TLS 证书,以及隧道中继和登录 OAuth 的校验仍保留。
|
||
|
||
# 可选 Provider OAuth 客户端。Gemini CLI 和 Antigravity 默认使用内置 native-app
|
||
# 客户端凭据;自定义 client ID 时必须同时配置对应的 client secret。
|
||
# 显式配置的 client secret 优先于默认值。
|
||
# AETHER_GEMINI_CLI_OAUTH_CLIENT_ID=
|
||
# AETHER_GEMINI_CLI_OAUTH_CLIENT_SECRET=
|
||
# AETHER_ANTIGRAVITY_OAUTH_CLIENT_ID=
|
||
# AETHER_ANTIGRAVITY_OAUTH_CLIENT_SECRET=
|
||
|
||
# PostgreSQL 容器调优:docker-compose.yml 已内置通用默认值,通常不用配置。
|
||
# 只有在 Postgres 独占大内存、或压测显示 DB 缓存/排序/维护任务成为瓶颈时再覆盖。
|
||
# 内置默认:shared_buffers=1GB, effective_cache_size=3GB, shm_size=512mb,
|
||
# work_mem=16MB, maintenance_work_mem=256MB。
|
||
# POSTGRES_SHARED_BUFFERS=8GB
|
||
# POSTGRES_EFFECTIVE_CACHE_SIZE=24GB
|
||
# POSTGRES_SHM_SIZE=2gb
|
||
# POSTGRES_WORK_MEM=16MB
|
||
# POSTGRES_MAINTENANCE_WORK_MEM=1GB
|