小屋 · 配置检查
把 .env.example 复制成 .env.local,填好后重启 dev server。
NEXT_PUBLIC_SUPABASE_URL / _ANON_KEY
Supabase → Project Settings → API。没有它 App 起不来。
SUPABASE_SERVICE_ROLE_KEY
cron 出题、发推送要用。绝不能带 NEXT_PUBLIC_ 前缀。
NEXT_PUBLIC_SITE_URL
https://lmtyyxiaowu.duckdns.org
R2_ACCOUNT_ID / R2_ACCESS_KEY_ID / R2_SECRET_ACCESS_KEY / R2_BUCKET
Cloudflare R2 的 API Token,权限选 Object Read & Write。
NEXT_PUBLIC_IMG_BASE
给 bucket 绑的自定义域。不填会退化成经由 /api/photo 代理,慢,仅供本地调试。
NEXT_PUBLIC_VAPID_PUBLIC_KEY / VAPID_PRIVATE_KEY
生成一对:npx web-push generate-vapid-keys
CRON_SECRET
一串长随机字符串,挡住外部对 /api/cron/* 的调用。
登录是用户名 + 密码,一共两个名额,全程不发邮件。账号在本地建:
npm run account npm run account -- 你的名字
它走 service role 直接建号(email_confirm 置真), 所以绕开了 Supabase 自带邮件服务「全项目每小时 2 封」那个限制。 顺手去 Authentication → Sign In / Providers → Email关掉 Allow new users to sign up,把网页上那个注册口也堵死。
把 supabase/migrations/ 下的四个 SQL 文件按序号贴进 Supabase SQL Editor 跑一遍:
0001_init.sql — 表结构0002_rls.sql — 行级安全与 RPC0003_seed_questions.sql — 100 道题0004_extras.sql — 双盲下仍能显示「等你」的函数等