Vivi 日常运营的所有"剧本"集合:用户报问题先查啥、紧急回滚怎么操作、加角色怎么走、Lark 推送怎么写、需求怎么提才能落地。这一页是运营 / PM / 客服 / 值班工程师的应急手册。
URL:https://vivi-app-e7m.pages.dev/admin
密码:对应 Fly.io secret ADMIN_SECRET —— 找 owner 索取,禁止放进任何公开文档 / 截图 / Slack。
修改密码:fly secrets set ADMIN_SECRET="新密码" -a vividreams(自动重启生效)
能做什么:查 Dashboard 统计 / 用户能量 / 钻石 / 订阅;改用户的 gems / energy / subscription;查 / 改 prompt overrides;导出对话样本。
| 端点 | 用途 |
|---|---|
GET /api/admin/dashboard | DAU / 总用户 / 7 日营收 |
GET /api/admin/user/{user_id} | 查用户能量 / 钻石 / 订阅 / 语言 |
POST /api/admin/set-gems | 给用户加扣💎 {"user_id": int, "gems": int} |
POST /api/admin/set-energy | 设置能量 |
POST /api/admin/set-subscription | 设置订阅状态 + 过期时间 |
GET /api/admin/prompts | 列出 prompt overrides |
PUT /api/admin/prompts/{char}/{story} | 覆写某个 story 的 system_prompt |
GET /api/admin/export-samples | 导出对话样本 |
用户报"消息发不出去 / AI 回复有问题 / 付了钱没到账"等问题时,不要先猜代码。按这个顺序查:
flyctl logs --app vividreams --no-tail | grep -E "ERROR|failed|exception" 看具体异常turso db shell vividreams 直接查 users / transactions / conversationssendMessage 验证 Telegram 链路本身通不通openrouter.py),查 LLM stream failed 日志energy 字段transactions 表 + telegram_payment_charge_id,没记录就是 webhook 没收到# 看历史 release
fly releases list -a vividreams
# 回到上一版
fly releases rollback <version> -a vividreams
# 验证
curl https://vividreams.fly.dev/health
Fly.io 回滚是部署级(image 替换),秒级生效。回滚不会回滚 DB schema —— 如果是 migration 引发的问题,回滚后还要手动还原表结构。
CF Pages dashboard → vivi-app 项目 → Deployments → 选上一个绿色部署 → "Promote to Production"。或者:
# git revert 上一次推送,再推
git revert <commit-sha>
git push origin main
curl https://vivi-app-e7m.pages.dev/index.html | grep "?v=" 验证版本号。# 取消 webhook,让 Telegram 不再推 update
curl https://api.telegram.org/bot<BOT_TOKEN>/setWebhook -d url=
# 修复后重新设置
curl https://api.telegram.org/bot<BOT_TOKEN>/setWebhook \
-d url=https://vividreams.fly.dev/webhook
Softieweb Neon DB(连接串在 Softieweb 仓库 .env.local 的 DATABASE_URL),媒体走 https://media.softie.ai CDN(图片 / 视频直链)。
.env.local 确认 DATABASE_URL 没变SELECT id, name, description, image, video, category, age,
personality, prompt, first_message, sparks_cost, sort_order
FROM characters
WHERE is_active = true AND is_private = false AND category = 'FEMALE'
AND name NOT IN (...)
ORDER BY sort_order ASC NULLS LAST LIMIT N;id 用首词小写 slug,重名加数字后缀),追加到 app/characters/data/characters.jsonfirst_message 偶尔属于另一个角色(DB 历史问题),对不上就自己写问候语;prompt 中的 NSFW 描述(如 "Sexual Features: ...")必须删掉,保留性格部分resolveImg() 在 http:// 前缀时直接返回 CDN URLwebapp/index.html 的 ?v=N(破坏 CDN 缓存)git add + git commit -m "feat(characters): add ..." + git push origin maincurl https://vivi-app-e7m.pages.dev/index.html | grep "?v=N" 验证这部分走 n8n + ComfyUI + RunPod,不在 Vivi 仓库:
scripts/submit_new_prompts.py 组装 payload → POST 到 Workflow 仓库的 n8n webhookscenes 字段透传给 n8n、生成完后把图地址回填到角色 story 配置Adsgram 是 Telegram Mini App 的官方广告投放渠道,按预算充值后投流。流程:
当前活跃 Campaign ID:62741(2026-04 最新投放,旧 ID 60508 已废弃)。日预算约 $10,定向中东 + 欧美。
所有推送必须用交互式卡片(msg_type: "interactive"),结构:
{
"msg_type": "interactive",
"card": {
"config": { "wide_screen_mode": true },
"header": {
"title": { "tag": "plain_text", "content": "标题(带 emoji 前缀)" },
"template": "indigo"
},
"elements": [
{ "tag": "markdown", "content": "**第一部分标题**\n\n正文..." },
{ "tag": "hr" },
{ "tag": "markdown", "content": "**第二部分标题**\n\n正文..." },
{ "tag": "note", "elements": [{ "tag": "plain_text", "content": "脚注信息" }] }
]
}
}
indigo — 技术 / 分享red — 告警 / 故障green — 成功 / 上线orange — 注意 / 待办blue — 信息 / 日报{ "tag": "hr" } 分隔,底部用 note 标注来源 + 日期239e82d1),不要 @all,不要 @具体业务方column_set 多列布局,不要用 ASCII 图或 Markdown 表格(Lark 不渲染)需求必须满足"工程师看完不需要追问就能动手"的标准。常见问题:只描述现状没说改成什么 / 给了选项没做决策 / 一条混了多个改动 / 缺关键参数 / 没验收标准。
## 需求标题(一句话)
现状:当前是怎样的(截图 / 录屏更好)
改为:要变成怎样(明确终态,不是"是否要改")
参数:涉及的具体数值 / 选项
优先级:P0 必须 / P1 重要 / P2 可以后做
不符合模板的需求收到后,先指出缺失项,要求补全后再排期。不要凭猜测开发。
| 场景 | 命令 |
|---|---|
| 看后端日志 | flyctl logs -a vividreams |
| SSH 进容器 | flyctl ssh console -a vividreams |
| 查 Turso 数据 | turso db shell vividreams |
| 看 Fly.io secrets 列表 | fly secrets list -a vividreams |
| 设置 Fly.io secret | fly secrets set KEY=value -a vividreams |
| 触发部署 | 推 main 分支即可(git push origin main) |
| 看 GHA 运行结果 | gh run list --limit 5 |
| 看失败日志 | gh run view <run-id> --log-failed |
| 验证生产前端 | curl -s https://vivi-app-e7m.pages.dev/ | grep "?v=" |
| 验证生产 API | curl https://vividreams.fly.dev/health |
所有 secret 不放在公开文档里。需要时找 owner 索取,或在内部记忆库(~/.claude/projects/-Users-gloom-Vivi/memory/)查:
reference_admin_secret.md 或找 ownerreference_lark_webhook.mdTELEGRAM_BOT_TOKEN,找 ownerOPENROUTER_API_KEYTURSO_AUTH_TOKENreference_telegram_scrape_account.md