No description
  • TypeScript 94.7%
  • CSS 3.4%
  • Dockerfile 1.1%
  • JavaScript 0.8%
Find a file
2026-08-20 14:37:39 +08:00
docs feat: 优化 UI 2026-08-20 11:39:18 +08:00
drizzle feat: 实现项目 2026-08-18 09:31:13 +08:00
public feat: icon 2026-08-19 21:54:07 +08:00
scripts feat: 实现项目 2026-08-18 09:31:13 +08:00
src feat: 添加 Fraunces 字体并更新相关样式 2026-08-20 14:37:39 +08:00
.dockerignore feat: 实现项目 2026-08-18 09:31:13 +08:00
.env.example feat: 实现项目 2026-08-18 09:31:13 +08:00
.gitignore feat: 实现项目 2026-08-18 09:31:13 +08:00
docker-compose.yml fix: 修复初始化 2026-08-19 21:21:11 +08:00
Dockerfile fix: 修复初始化 2026-08-19 21:21:11 +08:00
eslint.config.mjs feat: 实现项目 2026-08-18 09:31:13 +08:00
next.config.ts feat: 实现项目 2026-08-18 09:31:13 +08:00
package-lock.json fix: 修复初始化 2026-08-19 21:21:11 +08:00
package.json feat: 实现项目 2026-08-18 09:31:13 +08:00
postcss.config.mjs feat: 实现项目 2026-08-18 09:31:13 +08:00
README.md feat: 实现项目 2026-08-18 09:31:13 +08:00
tsconfig.json feat: 实现项目 2026-08-18 09:31:13 +08:00
vitest.config.ts feat: 实现项目 2026-08-18 09:31:13 +08:00

nyne.dev.next

个人动态站:时间线笔记,不是传统博客。游客只读公开内容;登录后写笔记、传图、维护侧栏链接,并可将公开笔记同步到 Telegram 频道。

本地开发

需要 Node.js 20+。

cp .env.example .env
node scripts/hash-password.mjs 'your-password'

把打印出的 argon2id 哈希写入 .envAUTH_PASSWORD_HASH,并设置不少于 32 字符的 SESSION_SECRET

图片上传需要 S3 兼容存储相关变量Telegram 同步可留空,站点其余功能仍可用。

npm install
npm test
npm run dev

打开 http://localhost:3000。登录页:/login

Docker

单实例部署。SQLite 不能水平扩展。

docker compose up -d --build

数据文件在 named volume 的 /data/nyne.db。探活:GET /healthz

生产环境请用反向代理终止 TLS并把 X-Forwarded-Proto 传给应用Cookie 的 Secure 依赖它)。SITE_URL 必须是无尾斜杠的公网 HTTPS 地址,供 RSS 与 Telegram 链接使用。

若启用 Telegram webhook启动后会调用一次 setWebhook(指向 {SITE_URL}/api/telegram/webhook)。

备份

SQLite 在 WAL 模式下不要直接拷正在写入的 db 文件。停写或使用:

sqlite3 /data/nyne.db "VACUUM INTO '/backup/nyne-$(date +%F).db'"

对象存储的备份按厂商能力配置(版本控制 / 生命周期),应用内不做。

路由

路径 说明
/ 最新笔记
/t/:tag 按 tag
/d/:yyyy-mm-dd 按上海时区日期
/search?q= 搜索标题和正文
/n/:id 笔记详情
/n/new/n/:id/edit 编辑器(需登录)
/login 登录
/rss.xml 最近 20 条公开笔记全文