Repository navigation
Expand file tree
/
Copy path.env.example
More file actions
193 lines (180 loc) · 9.85 KB
/
Copy path.env.example
File metadata and controls
193 lines (180 loc) · 9.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
# ── Windup 环境变量配置示例 ───────────────────────────────────────────
# 复制此文件为 .env 并填入实际值
# cp .env.example .env
# 分机部署:DB 服务器用 .env.db.example;应用服务器仍复制本文件,把
# POSTGRES_HOST / REDIS_URL 改成 DB 服务器地址。
# ── PostgreSQL 配置 ──
POSTGRES_USER=root
POSTGRES_PASSWORD=your-password-here
POSTGRES_DB=windup
POSTGRES_HOST=localhost
POSTGRES_PORT=7856
# 宿主机访问数据库的端口(Docker 映射用)
POSTGRES_EXTERNAL_PORT=7856
# 数据持久化目录(默认 ./data/postgres)
POSTGRES_DATA_DIR=./data/postgres
# ── Redis 配置 ──
REDIS_URL=redis://localhost:6379/0
# 数据持久化目录(默认 ./data/redis)
REDIS_DATA_DIR=./data/redis
# ── 搜索 API ──
SERPAPI_API_KEY=your-serpapi-key
# ── 七牛云存储 ──
QINIU_ACCESS_KEY=your-access-key
QINIU_SECRET_KEY=your-secret-key
QINIU_BUCKET_NAME=your-bucket
# Bucket 绑定的浏览器可访问 HTTPS Kodo/CDN 域名,不能填 *.s3.*.qiniucs.com API 端点
QINIU_BUCKET_DOMAIN=https://cdn.example.com
QINIU_PRIVATE_SPACE=false
# ── AI Provider ──
# 键名前缀必须是 AI_,由 framework/config/provider.py 的 env_prefix 决定。
AI_BASE_URL=https://api.qnaigc.com/v1
AI_API_KEY=your-ai-api-key
AI_MODEL=your-chat-model
# 各能力分开配型号:三条能力同时在用不同模型,共用一个字段会换一个连带换全部。
# 下面这几行的取值**就是代码里的默认值**,由 test_env_example_matches_code_defaults
# 钉住 —— 之前没人钉,于是 AI_VIDEO_MODEL 在这里停在 kling-v2-5-turbo,而代码默认早
# 换过两轮,照模板部署的人拿到的是第三个值。
AI_CHAT_FALLBACKS=
AI_IMAGE_MODEL=gpt-image-2
AI_VIDEO_MODEL=kling-v3-turbo-std
AI_IMAGE_FALLBACKS=gemini-3.1-flash-image-preview
# 视频兜底默认是空的。生产该配上**跨协议面**的型号:kling-v2-5-turbo / kling-v2-6 走
# OpenAI /videos 面,主力 kling-v3-turbo-std 走 FAL 队列面,一个面出问题另一个还能出片。
# 同一个面里换版本号换不来这种分散。
AI_VIDEO_FALLBACKS=
# veo3.1 只对逗号分隔的这些用户 id 开放(组内做高质量素材用,不面向客户)。
# 空 = 谁都不能用;它**永远不进兜底链**,只能由被授权的账号走到。
# 它按秒计费且比 kling 贵:本仓固定按 4s + 无声($0.20/秒)调用,
# 上游默认(8s + 有声)是这一档的 4 倍,那三项在代码里有硬断言兜着。
AI_VIDEO_VEO_USER_IDS=
# 不受 3D 资产额度限制的用户 id,逗号分隔。用途同上是组内做素材,但**必须是单独一个键**:
# 与 veo 合并的话,给某人开 veo 会连带解掉他的 3D 额度,而两笔钱量级完全不同
# (veo 按秒计费,3D 是每资产 30 积分且可无限累积)。
# 空 = 所有人都受额度限制(默认每人最多同时持有 2 个 3D 资产)。
AI_RENDER3D_UNLIMITED_USER_IDS=
# 图生 3D 的三个建模参数。留空 = 沿用代码里的构造默认,行为与接出来之前一致。
# GenerateType:Normal 20 / Geometry 15 / LowPoly 25 / Sketch 25 积分
AI_RENDER3D_GENERATE_TYPE=
# 面数。默认 150000;实测线上产物 45 万顶点、FBX 20.7MB,而出帧只渲成平面精灵,
# 面数用不上,却要用户在浏览器里全下下来。0 = 不覆盖。
AI_RENDER3D_FACE_COUNT=
# PBR 材质,开启 +10 积分。出帧走平面着色,用不上,默认关。
AI_RENDER3D_ENABLE_PBR=
# 留空即按型号查上游牌价(美元);配了它就整条链共用这一个价,跨型号时会算错。
AI_IMAGE_UNIT_COST=
AI_VIDEO_UNIT_COST_PER_SECOND=
AI_PRICE_VERSION=2026-08-16
# Gateway 路由试运行:primary 留空时复用 AI_BASE_URL / AI_API_KEY;
# fallback 三项都填才启用,用来验证 525 / SSL / 断连等 base_url 级故障切换。
# 同入口多个 key 用逗号分隔:429 换下一个 key,522/525 跳过该入口剩余 key。
AI_ROUTE_PRIMARY_NAME=qnaigc-primary
AI_ROUTE_PRIMARY_BASE_URL=
AI_ROUTE_PRIMARY_API_KEY=
AI_ROUTE_PRIMARY_API_KEYS=
AI_ROUTE_FALLBACK_NAME=
AI_ROUTE_FALLBACK_BASE_URL=
AI_ROUTE_FALLBACK_API_KEY=
AI_ROUTE_FALLBACK_API_KEYS=
# 示例:AI_ROUTE_FALLBACK_NAME=qnaigc-backup
# 示例:AI_ROUTE_FALLBACK_BASE_URL=https://backup.example.com/v1
# 示例:AI_ROUTE_FALLBACK_API_KEY=your-backup-ai-api-key
AI_GATEWAY_LEDGER_ENABLED=true
# 判官(看图问答)。必须填一个**能读图的聊天模型**,不是出图模型:它要回 JSON 不是回图。
AI_JUDGE_MODEL=gemini-2.5-flash
# ── 判官闸口 ──
# 开了才会调判官,每交付一个动作多一次付费调用。
QUALITY_GATE_ENABLED=false
# 判官说有问题就不交付。攒够 shadow 数据、定出判据之前别开:
# 误杀掉的是用户已付过钱的产物,退不回来。
QUALITY_GATE_ENFORCE=false
# ── 积分定价 ──
QUOTA_REGISTER_GIFT_AMOUNT=300
QUOTA_INVITE_REWARD_AMOUNT=200
QUOTA_INVITE_REWARD_DAILY_LIMIT=3
QUOTA_INVITE_CODE_TTL_DAYS=30
# 每次上游图片 / 视频模型调用的单价;图片任务费用再乘 num_images
QUOTA_GENERATE_IMAGE_COST=10
QUOTA_GENERATE_ACTION_COST=50
# ── 服务配置 ──
WINDUP_HOST=127.0.0.1
WINDUP_PORT=8000
# 前端构建期写入的后端地址。默认相对路径,由宿主机 nginx 反代给 backend;
# 只有在前端要指向外部后端时才改成完整 URL,那时后端需同步配 WINDUP_CORS_ORIGINS
VITE_API_BASE_URL=/api
# 跨域来源(逗号分隔,默认覆盖 localhost:5173/3000)
WINDUP_CORS_ORIGINS=
# 跨域正则匹配(默认关闭;如需 Vercel 预览域名,请限制到自己的项目名前缀)
WINDUP_CORS_ORIGIN_REGEX=
# 管理员邮箱白名单,逗号分隔;生产环境在私有 .env 中填写真实邮箱
WINDUP_ADMIN_EMAILS=admin@example.com
# ── 计费(易支付网关) ─────────────────────────────────────────────
# 商户 ID 与密钥。api_url 是网关的站点根地址(下单拼 /submit.php、查询拼 /api.php),
# 必须指向真实网关域名——留空会回落占位域名 pay.example.com,下单将不可用。
WINDUP_BILL_EPAY_PID=0
WINDUP_BILL_EPAY_PRIVATE_KEY=
WINDUP_BILL_EPAY_PUBLIC_KEY=
WINDUP_BILL_EPAY_API_URL=https://pay.example.com
# 异步/同步回调地址,指向部署后端的可公网访问域名
WINDUP_BILL_EPAY_NOTIFY_URL=
WINDUP_BILL_EPAY_RETURN_URL=
# ── MQ(Redis Stream 轻量消息队列) ──
# 本地/Compose 须同时起 web + worker,否则生成任务会一直 PENDING、邮件不会发出。
# docker compose up -d backend worker
# 或另开终端: cd backend && uv run python -m windup_app.worker
# Stream / 消费(默认值即注释,可不写)
WINDUP_MQ_STREAM_MAXLEN=10000
WINDUP_MQ_PEL_CLAIM_IDLE_MS=1800000
WINDUP_MQ_PEL_CLAIM_INTERVAL_SECONDS=30
WINDUP_MQ_MAX_PUBLISH_ATTEMPTS=10
WINDUP_MQ_MAX_CONSUME_ATTEMPTS=5
WINDUP_MQ_CONSUME_LEASE_SECONDS=1800
WINDUP_MQ_EMAIL_HANDLER_RETRIES=3
# worker 内 handler 并行度(单进程内 ThreadPoolExecutor)
# 图 / 动作分两条 Stream 独立出队。默认对齐现网,避免无环境变量时打满上游。
WINDUP_MQ_EMAIL_CONCURRENCY=8
WINDUP_MQ_GENERATION_IMAGE_CONCURRENCY=4
WINDUP_MQ_GENERATION_ACTION_CONCURRENCY=2
# poll 使用独立线程池,不与图/动作提交共享槽位
WINDUP_MQ_GENERATION_POLL_CONCURRENCY=2
# 每把视频 API key 同时在途 i2v job 上限(全站共用该 key,不按用户)。
# 多 key 时各算各的,新任务分到在途最少的那把;一把 429 只冷却自己。
WINDUP_I2V_INFLIGHT_MAX=2
# i2v 轮询走 ZSET 延迟队列,到期促进到 Stream;不用 Redis 过期事件
WINDUP_MQ_DELAYED_ZSET=windup:zset:delayed
WINDUP_MQ_DELAYED_CLAIM_LIMIT=50
WINDUP_MQ_DELAYED_TICK_SECONDS=1
# 上传 / 参考图下载 / 多图 gen_image 共用的 IO 线程池
WINDUP_IO_POOL_SIZE=32
# 生成任务排队 / 孤儿 RUNNING 超时(秒)
WINDUP_GENERATION_PENDING_MAX_AGE=86400
WINDUP_GENERATION_RUNNING_STALE_SECONDS=1800
# SSE 跨进程桥接:worker publish → web subscribe → EventBus
WINDUP_SSE_REDIS_CHANNEL=windup:pubsub:generation-task-events
# 抠图。默认双模型(u2netp + 全量 u2net ~176MB)。4C8G 请关全量,只用轻量版:
# WINDUP_MATTE_REFINE=0
# 浅肤色脸颊/小腿可能漏检。ORT CPU arena 已在代码里关闭,不必再配。
WINDUP_MATTE_REFINE=1
# 抠图 provider。u2net(默认)/ birefnet。
# birefnet 在同一帧上把主体内部非实心从 5541px 降到 106px,但**单帧峰值 6.85GB** ——
# 生产 worker 容器上限 5GiB、宿主 7.7GB,**服务器上不要开**,开了会 OOM。
# 它是给组员本机(16GB+)做高质量素材用的。取值拼错会回落 u2net 并留一条 WARNING。
WINDUP_MATTE_PROVIDER=u2net
# web / worker 各有一份连接池。生成已短 session,不必再按 handler 并发配满。
POSTGRES_POOL_SIZE=5
POSTGRES_MAX_OVERFLOW=10
# ── 三渲二(可选)─────────────────────────────────────────────────────
# 出模型与自动绑骨走腾讯云 ai3d,按量计费;不填则该路线在运行时报缺凭证,
# 其余功能不受影响。
TENCENT_SECRET_ID=
TENCENT_SECRET_KEY=
TENCENT_REGION=ap-guangzhou
# 出帧由用户浏览器承担(#714)。设成 0 回退到 worker 内 Playwright,
# 此时 WINDUP_WORKER_TARGET 必须同时改成 runtime-render3d——只关开关不换镜像
# 会一直跑到出帧那一步才报缺 node/playwright/three。
WINDUP_RENDER3D_CLIENT_BAKE=1
# 浏览器多久没交帧就判失败。比 i2v 的 30 分钟短:那边等的是上游算力,
# 这边等的是一个开着的页面,关了标签就永远不会有回报。
WINDUP_RENDER3D_CLIENT_BAKE_DEADLINE_S=900
# worker 镜像构建目标。runtime 不含浏览器(820MB);runtime-render3d 含(2.53GB)。
WINDUP_WORKER_TARGET=runtime