02Blog · 折腾
给 VPS 装了个手机友好的 Codex 聊天室
一句话总结:Faryo(开源 Codex Web UI)装好后死活登录不上,真凶有两个叠加:① 会话 cookie 带
__Host- 前缀,按浏览器规范必须走 HTTPS,纯 HTTP 下直接拒收;② 曾加 proxy_cookie_flags ~ nosecure 试图绕过,反而让 cookie 彻底失效。上了 Let's Encrypt 正式证书后,一把过。需求
VPS 上跑着 Codex,终端里用得很爽,但出门在外只有手机。需求很明确:一个手机友好、省资源的 Web UI,能跟 VPS 上的 Codex 畅聊。
选了开源的 Faryo v1.12.0:轻量,专为 Codex 设计。架构很简单——
ai账号的 systemd user 服务:owner 监听 127.0.0.1:8765,gateway 监听 127.0.0.1:8780- nginx 反代到公网端口,UFW 放行
顺带澄清一个误会:Faryo 只是 VPS 上本地 Codex 的 Web UI,不是连接 OpenAI 服务器的工具;聊天记录存在 VPS 上、跟随账号走,手机和电脑登同一账号能看到同一份历史、互相接着聊。
故障:密码对了也登录不上
装完第一版,登录页能打开,账号密码也改成了自己的,但就是登录不上。最迷惑的是:用 curl 测试,登录返回 303(密码正确),但浏览器里就是进不去。
curl 只能证明密码正确,证明不了会话建立——而问题恰恰出在会话上。
根因分析:两个叠加的坑
坑一:__Host- 前缀 cookie 与 HTTP
Faryo 的会话 cookie 带 __Host- 前缀。根据浏览器规范,__Host- 前缀的 cookie 必须满足三个条件:Secure 标记、Path=/、且必须来自 HTTPS。纯 HTTP 下,浏览器会直接拒收这个 cookie——不管密码对错,会话永远建不起来。
坑二:画蛇添足的 nginx 配置
之前有人(就是我)加了 proxy_cookie_flags ~ nosecure,想把 Secure 标记去掉来绕过坑一。结果:__Host- 前缀要求 Secure,去掉 Secure 后 cookie 直接非法,彻底失效。越修越坏。
修复:上正式 HTTPS
正道只有一条:上 HTTPS。方案:
- 用自有子域名 + Let's Encrypt 正式证书(certbot.timer 自动续期)
- nginx 只监听 8090 ssl,删掉
proxy_cookie_flags那行 - 80 端口保留,只做 acme-challenge 续期通道
curl 端到端验证:登录 303 → 会话 cookie(Secure)被接受 → GET / 返回 200 Faryo 主页。旧的纯 HTTP 入口直接关闭。
经验
- curl 200/303 ≠ 浏览器能用:cookie、跨域、混合内容这些是 curl 看不见的
__Host-/__Secure-前缀不是装饰,是浏览器强制执行的契约- 绕过安全机制的「小聪明」配置,往往制造更大的坑
现在躺在沙发上掏出手机,就能让 VPS 上的 AI 接着写代码了。这大概就是折腾的意义。