为什么是 SQLite,不是 PostgreSQL
所有服务跑在一台机器上,better-sqlite3 同进程零延迟读写。
开 WAL 后并发够用,备份就是 cp auth.db /backup/。
部署不用额外起 Postgres 容器。
四种授权方式:授权码、密码、刷新令牌、客户端凭证。
访问令牌走 JWT,吊销走 RFC 7009,发现走 RFC 8414。
identifier 任意填账号或邮箱,邮箱仅做身份校验。
支持密码、邮件验证码两条登录路径。
应用可单独配白名单,未授权用户被 403 兜住。
账号 + IP 双维度锁定,15 分钟自动解锁。
登录、授权、拒绝、锁定全部入审计表。
支持事件类型 / 用户 / 时间多维过滤,前端 10 行分页。
PC 站参考 Apple Music。移动端是独立 Vue 工程,
Bottom Tab + 迷你播放器 + 全屏 + 底部弹层。
所有数据绑定 Pengfei 账号,跨端同步。
新用户首次 SSO 登录时本地 user 表自动 provisioning。
需要登录的功能点击后 → 毛玻璃弹窗 → "使用 Pengfei 账号登录"。
token 失效自动回弹弹窗,不用刷页面。
顶部面板:累计字数、章节数、最新进展。
每章 markdown 存盘,可以直接读、直接改。
每章自动抽取伏笔、摘要、人物动线,
点开就能看哪条线还没回收。
cron 跑续写 / 审稿 / 规则检查 / 复盘,
每个任务一个独立提示词文件,单独开关。
毛玻璃弹窗 → OAuth 跳一次,
token 失效自动弹回,不用刷页面。
它们不抢戏,但少了任何一个都跑不起来。
不是技术清单 —— 是每个技术解决了什么具体问题。
所有服务跑在一台机器上,better-sqlite3 同进程零延迟读写。
开 WAL 后并发够用,备份就是 cp auth.db /backup/。
部署不用额外起 Postgres 容器。
Keycloak 太重,要 JDK、要单独进程、要专门的 admin 控制台。 自己写四种 grant 用了约 500 行 Express, 加 RFC 7009 吊销、RFC 8414 发现,全过 OIDC userinfo。
音乐站状态复杂(播放器、队列、收藏跨页同步),用 Vue 3 + Pinia。
认证中心是表单流,用 Vanilla + history.pushState 写了个 200 行 SPA 路由,
没必要拉 React。
Access token 30 分钟,refresh token 30 天,自动旋转拒重放。
登录失败 IP 维度(10/15min)+ 账号维度(5 次)双重锁定,
全部进 audit_log 可查可过滤。
每个子域一份 nginx config,certbot --webroot 自动跑 cron 续期。
证书到期日跟着 systemd timer 走,no-reply@pengfei.ink 主动通知。
Cloudflare 只做 DNS,不走代理。
所有验证码、通知邮件从 no-reply@pengfei.ink 发出。
DKIM + SPF + DMARC 三件套配齐,进 Gmail 收件箱不进垃圾箱。
Roundcube 给我一个 webmail 用。