这是一个基于 Next.js 的应用,通过每天签到来维持“活着”状态。后端使用 Prisma(默认 SQLite),使用 NextAuth 做认证,并支持通过 Passport 同步外部用户。
仓库结构(要点)
app/:Next.js app 路由与页面(前端与 API 路由数个位置)。prisma/schema.prisma:数据库模型(User、CheckIns)。src/lib/prisma.ts:Prisma 客户端与better-sqlite3适配器配置。src/auth.ts、src/auth.config.ts:认证相关配置与回调逻辑。.env.example:所需环境变量示例。
快速开始(本地开发)
前提:Node 24+(仓库启用了 Volta 指定 Node 版本),以及 npm 或 pnpm。
- 安装依赖:
npm install- 复制环境变量并编辑:
cp .env.example .env
# 然后编辑 .env,填入 EMAIL_*、AUTH_SECRET、SESSION_SECRET、PASSPORT_*、DATABASE_URL 等- 生成 Prisma 客户端并运行迁移(开发):
npx prisma generate
npx prisma migrate dev --name init- 启动开发服务器:
npm run dev访问 http://localhost:3000 查看页面。
环境变量要点(见 .env.example)
DATABASE_URL:默认指向 SQLite 文件file:./database.db。NEXTAUTH_URL/NEXT_PUBLIC_APP_URL:应用地址(用于 OAuth/回调)。AUTH_SECRET、SESSION_SECRET:用于签名的机密,必须在生产中随机生成。EMAIL_HOST、EMAIL_PORT、EMAIL_USER、EMAIL_PASS:用于发送邮件(通知/密码重置等)。PASSPORT_URL、PASSPORT_CLIENT_ID、PASSPORT_CLIENT_SECRET:如果使用 Passport 提供者进行登录,同步外部用户需要这些配置。
邮件通知(Email 通知)
- 项目内置通过
nodemailer发送邮件的功能,发送逻辑在src/lib/mailer.ts,包含每日签到提醒与超过阈值的紧急通知。 - 必要环境变量:
EMAIL_HOST、EMAIL_PORT、EMAIL_USER、EMAIL_PASS(见.env.example)。 - 常用 SMTP 配置示例:
EMAIL_HOST=smtp.qq.com
EMAIL_PORT=465
EMAIL_USER=your@qq.com
EMAIL_PASS=your_smtp_authorization_code- 端口与
secure建议:端口465对应 SSL(secure=true),端口587或25对应 STARTTLS(secure=false,但 nodemailer 会自动使用 TLS)。 - 测试邮件:开发时可以使用 Ethereal(https://ethereal.email/)或你的测试 SMTP 帐号,将对应的凭据填入环境变量,启动应用并检查控制台日志(
src/lib/mailer.ts在成功/失败时会打印信息)。 - 注意事项:
- 某些提供商(如 QQ、Gmail)需要单独生成 SMTP 授权码或开启 “应用专用密码”。
- 在生产环境中请妥善保护
EMAIL_PASS、EMAIL_USER等敏感信息(使用密钥管理服务或托管平台的环境变量)。
示例:你可以在本地填好 .env 后,通过应用的通知触发逻辑(或临时写个调用 sendCheckInReminder 的小脚本)来发送测试邮件,或者使用 Ethereal 查看邮件内容而不影响真实收件箱。
可以用下面命令生成一个随机的 SESSION_SECRET / AUTH_SECRET:
# OpenSSL
openssl rand -base64 32
# Node
node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"数据库注意事项
- 默认使用 SQLite(文件:
database.db),适合小规模或自托管演示。 - 生产环境推荐使用 PostgreSQL 或 MySQL;切换时更新
DATABASE_URL,并在prisma/schema.prisma的datasource中使用相应 provider,然后运行迁移并部署。
认证与用户同步
- 使用
NextAuth(见src/auth.ts)并包含自定义回调:当使用 Passport 登录时,会把外部用户同步(upsert)到本地 Prisma 数据库,且将本地id注入到 session/token 中。
运行迁移与部署时常用命令
- 生成客户端:
npx prisma generate - 本地开发迁移:
npx prisma migrate dev --name <msg> - 在生产上应用迁移:
npx prisma migrate deploy
常见问题与建议
- 在无持久化文件系统(如 Vercel Serverless)上使用 SQLite 会遇到持久化与并发问题,建议生产使用 PostgreSQL。
- 如果选择继续使用 SQLite,请确保运行环境能持久化
database.db(例如容器卷或 VM 磁盘)。
更多技术细节与部署示例见 DEPLOYMENT.md。


