Files
openteam/.env.example
T
Sakurasan e3ff0d3329 security: 会话可撤销与认证面加固
- users 加 token_version(schema v4):改密/登出递增,该用户全部已发 access/refresh 立即作废;refresh 改轮换式换发新 cookie
- 邀请码改精确匹配 + 注册成功后消费(一码一用),修复子串匹配让任意后缀放行、可无限薅体验金
- 生产校验拦下 .env.example 占位密钥;OT_ENV 枚举校验(拼错不再静默跳过断言);生产强制 COOKIE_SECURE;非 development 拒绝默认密码播种管理员
- WebAuthn 会话启用过期校验 + 4096 容量上限(未认证 login/begin 可无限撑爆内存),begin/complete 挂登录级限速
- /api/v1 挂 1MB 请求体上限;login 先限 IP 桶再解析 body;全局安全响应头 + CSP
- 连接池配置(PG 30/SQLite 8);SQLite DSN 自动追加 WAL + busy_timeout(驱动只认 _pragma,旧注释的 _journal_mode 写法不生效)
2026-10-29 02:56:46 +08:00

78 lines
3.4 KiB
Bash
Raw 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.
# openteam 服务配置示例 —— 复制为 .env 后修改
# 所有项均可用环境变量 OT_<KEY> 覆盖(点号转下划线,如 db.driver → OT_DB_DRIVER)
# 运行环境 development | production(仅这两个值;生产启动会做密钥断言,见下)
OT_ENV=development
OT_PORT=8080
# 数据库(开发默认 SQLite;生产切 postgres)
OT_DB_DRIVER=sqlite
OT_DB_DSN=data/openteam.db
# OT_DB_DRIVER=postgres
# OT_DB_DSN=host=localhost user=openteam password=openteam dbname=openteam port=5432 sslmode=disable
# JWT(生产必须更换为随机长字符串;OT_ENV=production 时本文件里的占位值会被启动校验拒绝)
OT_JWT_SECRET=change-me-to-a-long-random-string
OT_JWT_ACCESS_TTL=2h
OT_JWT_REFRESH_TTL=168h
# 生产必须为 true(refresh cookie 走 HTTPS;反代终止 TLS 时也要置 true)
OT_JWT_COOKIE_SECURE=false
# 注册策略:open(开放)| invite(邀请码)
OT_AUTH_REGISTRATION_MODE=open
# 渠道密钥加密主密钥(生产必须设置,32 字节以上)
OT_MASTER_KEY=change-me-master-key
# 默认上游渠道(首次启动自动创建 OpenAI 渠道)
OT_PROXY_UPSTREAM_KEY=
OT_PROXY_UPSTREAM_BASE_URL=https://api.openai.com
OT_PROXY_DEFAULT_MODEL=gpt-4o-mini
# 上游超时兜底值(渠道 timeout_ms 优先):
# 非流式 = 整段请求上限;流式 = 只约束首包,正文不限时长
OT_PROXY_TIMEOUT=300s
# /v1 请求体上限(MB):超限按客户端协议返回 413
OT_PROXY_MAX_BODY_MB=32
# 故障转移给"第二个及以后的渠道"留的时间预算(0=不限)。
# 首个渠道不受它约束——长回答本就要跑几分钟,但不能让坏渠道把客户端拖到 N×timeout。
OT_PROXY_FAILOVER_BUDGET=30s
# 流式空闲多久补一行 SSE 注释心跳(0=关闭)。挂在 nginx/Cloudflare 后面时,
# 上游长时间不出字(长思考)会被对端的空闲超时掐掉,心跳用来续住这条流。
OT_PROXY_STREAM_HEARTBEAT=15s
# 渠道健康检查
OT_PROXY_HEALTH_INTERVAL=60s
OT_PROXY_HEALTH_FAIL_THRESHOLD=2
# 调试:记录管理员的原始请求与响应到请求明细(默认关闭;流式记录全部事件)
OT_PROXY_LOG_RAW=false
# 限流(内存计数,Redis 后置):用户级每秒请求数上限(0=不限制)
OT_RATELIMIT_USER_RPS=20
# 认证端点限速(每分钟,0=不限制):登录是密码爆破面,注册是批量建号面
OT_RATELIMIT_LOGIN_IP_PER_MIN=30
OT_RATELIMIT_LOGIN_USER_PER_MIN=10
OT_RATELIMIT_REGISTER_IP_PER_MIN=5
# 跨域白名单(逗号分隔 origin)。留空 = 不输出任何 CORS 头:
# 网关自托管 web/dist 时前后端同源、vite dev 走 proxy,都不需要跨域。
# 只有把 web/ 单独部署到别的域名时才需要配。
OT_CORS_ALLOW_ORIGINS=
# 反向代理(CIDR 或 IP,逗号分隔)。配置后 gin 才信任 X-Forwarded-For 取客户端 IP,
# 上面的认证限速依赖它;直连部署留空(此时按连接源地址计数,伪造头无效)。
OT_SERVER_TRUSTED_PROXIES=
# Passkey(WebAuthn):RPID 为域名,RPOrigin 为前端来源(需 HTTPS 或 localhost)
OT_WEBAUTHN_RP_ID=localhost
OT_WEBAUTHN_RP_ORIGIN=http://localhost:5173
OT_WEBAUTHN_RP_NAME=openteam
# 初始管理员(仅首次创建生效)。非 development 环境未显式设置 OT_ADMIN_PASSWORD
# 时拒绝播种管理员;admin123 是公开默认值,生产启动校验也会拒绝它。
OT_ADMIN_USERNAME=admin
OT_ADMIN_EMAIL=admin@localhost
OT_ADMIN_PASSWORD=admin123