# nowen-note
**Repository Path**: udns/nowen-note
## Basic Information
- **Project Name**: nowen-note
- **Description**: 一款自托管的私有化笔记应用,采用现代前后端分离架构,支持 Docker 一键部署。内置 Tiptap 富文本编辑器,支持无限层级笔记本、全文搜索、标签管理等功能。
- **Primary Language**: TypeScript
- **License**: GPL-3.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2026-06-23
- **Last Updated**: 2026-06-23
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# nowen-note
> 自托管的私有知识库,对标群晖 Note Station。
>
> A self-hosted private knowledge base. [English README](./README.en.md) · [作者感言](./AUTHOR_STORY.md) · [在线体验](https://note.nowen.cn/)
[](./LICENSE)
[](https://nodejs.org/)
[](./Dockerfile)
## 功能概览
- **富文本 + Markdown 双引擎**:Tiptap 3 + CodeMirror 6,共享 AI、版本历史、评论等上层能力
- **AI 助手**:支持通义千问 / OpenAI / Gemini / DeepSeek / 豆包 / Ollama,覆盖写作辅助、生成标题、推荐标签、RAG 知识问答
- **知识管理**:无限层级笔记本、彩色标签、任务、思维导图、说说、FTS5 全文搜索
- **协作 & 历史**:分享支持 4 档权限(仅查看 / 可评论 / 可编辑 / 可编辑需登录)+ 访客留言 + 密码 / 有效期、版本回溯
- **文件管理**:图片缩略图(webp 三档自适应,密集图床场景流量降至 1/100)、「我的上传」分类(已引用 / 未引用细分)、孤儿清理
- **自动化**:沙箱插件系统、Webhook、审计日志、定时自动备份
- **多端**:Web / Electron(Win/macOS/Linux)/ Android(Capacitor)
- **开发者生态**:MCP Server、TypeScript SDK、CLI、[浏览器剪藏扩展](https://chromewebstore.google.com/detail/nowen-note-web-clipper/nglkodhfdbnfielchjpkjhenfaecafpg)、OpenAPI 3.0(见 [`packages/`](./packages))
## 技术栈
React 18 · TypeScript · Vite 5 · Tiptap 3 · Tailwind · Hono 4 · SQLite(FTS5) · JWT · Electron 33 · Capacitor 8
## 截图
### 桌面端
| AI 写作助手 | AI 服务商配置 |
| :---: | :---: |
|  |  |
### 移动端(Android / Capacitor)
| 侧边栏 | 笔记列表 | 编辑器 |
| :---: | :---: | :---: |
|  |  |  |
## 在线体验
不想本地部署?可以直接打开作者维护的官方体验站点:
- 地址:
- 账号:`demo`
- 密码:`demo123456`
> ⚠ 体验账号为只读演示用途,数据可能被定期重置,请勿存放任何敏感或重要内容。生产使用请按下方「快速开始」自托管部署。
## 快速开始
> 默认管理员:`admin` / `admin123`,首次登录后请立即修改密码。
### Docker(推荐)
```bash
git clone https://github.com/cropflre/nowen-note.git
cd nowen-note
docker-compose up -d
```
访问 `http://<你的IP>:3001`。
### 本地开发
需要 Node.js 20+。
```bash
git clone https://github.com/cropflre/nowen-note.git
cd nowen-note
npm run install:all
npm run dev:backend # 后端 :3001
npm run dev:frontend # 前端 :5173
```
访问 `http://localhost:5173`。
### 桌面端 / 移动端
```bash
npm run electron:dev # Electron 开发
npm run electron:build # 打包 Windows / macOS / Linux
```
Android 可直接从 [Releases](https://github.com/cropflre/nowen-note/releases) 下载 APK,或 `npx cap sync android && npx cap open android` 自行构建。
### 飞牛 fnOS(.fpk 一键安装)
从 [Releases](https://github.com/cropflre/nowen-note/releases) 下载最新 `nowen-note-x.y.z.fpk`,在飞牛 NAS 「应用中心 → 设置 → 手动安装应用」选中文件即可。安装后桌面出现「弄文笔记」图标,浏览器打开 `http://<飞牛IP>:3001`。
> 当前 .fpk 仅支持 x86_64 飞牛设备(`platform=x86`)。手动打包参见 [scripts/fpk/README.md](./scripts/fpk/README.md)。
## 配置
| 环境变量 | 默认值 | 说明 |
| --- | --- | --- |
| `PORT` | `3001` | 服务端口 |
| `DB_PATH` | `/app/data/nowen-note.db` | 数据库文件路径 |
| `OLLAMA_URL` | — | 本地 Ollama 地址(可选) |
数据持久化:容器需将 **`/app/data`** 映射到宿主机(不是 `/data`)。镜像已声明 `VOLUME ["/app/data"]`,主流 NAS 面板会自动预填该路径。
备份策略:自动备份默认写入 `/app/data/backups`,与数据在同一个卷。建议按 3-2-1 原则把 `/app/backups` 另挂到独立磁盘,并设置 `BACKUP_DIR=/app/backups`,详见 [`docker-compose.yml`](./docker-compose.yml) 内的注释。
## 文档
- 浏览器剪藏扩展(Chrome / Edge):[Chrome Web Store](https://chromewebstore.google.com/detail/nowen-note-web-clipper/nglkodhfdbnfielchjpkjhenfaecafpg)
- 部署指南(本地 / Docker / 桌面 / 移动 / 群晖 / 绿联 / 威联通 / 飞牛 / 极空间 / ARM64):[docs/deployment.md](./docs/deployment.md)
- 飞牛 .fpk 应用打包:[scripts/fpk/README.md](./scripts/fpk/README.md)
- ARM64 详解:[docs/deploy-arm64.md](./docs/deploy-arm64.md)
- 邮件备份配置:[docs/backup-email-smtp.md](./docs/backup-email-smtp.md)
- 编辑器模式切换:[docs/editor-mode-switch.md](./docs/editor-mode-switch.md)
- 隐私策略:[docs/PRIVACY.md](./docs/PRIVACY.md)
- OpenAPI:运行后访问 `/api/openapi.json`
## 常见问题
### macOS 首次打开报错 / 无法启动 / "ERR_DLOPEN_FAILED"
由于本应用未做 Apple 公证(notarization),系统会把 dmg 里下载来的 `.app`
打上 quarantine 隔离属性,导致内部的 `better-sqlite3` 原生模块加载失败、
后端启动卡住 30 秒后报"后端启动超时"。
终端执行一行命令解除隔离即可(路径换成你实际拖过去的位置):
```bash
sudo xattr -dr com.apple.quarantine "/Applications/Nowen Note.app"
# 或
sudo xattr -dr com.apple.quarantine ~/Downloads/Nowen\ Note.app
```
执行后双击重新打开即可。Apple Silicon 用户若用了 x64 版本,需要 Rosetta 2
(系统会自动提示安装)。
## 问题反馈
QQ 群:`1093473044`
## 支持作者
如果这个项目对你有帮助,欢迎扫码请作者喝杯咖啡 ☕
## 开源协议
[GPL-3.0](./LICENSE) — 派生作品对外分发时须同样以 GPL-3.0 开源并保留原作者版权声明。
## 更新日志
> 最近 5 个版本的更新内容,完整历史见 [CHANGELOG.md](./CHANGELOG.md)。
### v1.1.9 - 2026-05-28
### 🐛 修复
- **desktop**: prevent local mode reload loop (490f5a3)
### v1.1.8 - 2026-05-28
### 🐛 修复
- 调整访问控制默认开关 (b49534c)
### v1.1.7 - 2026-05-28
### ✨ 新增
- 优化桌面端云端本地模式与访问控制 (783cf6a)
- **release**: 选项 10 改为'补 upk 到现有 Release'模式(不打新 tag、不升版本) (7e4c626)
### 🐛 修复
- 修复桌面端切回本地离线模式时,本地后端被误判为远端导致黑屏/反复闪屏的问题。
- 修复后端实时删除广播编译错误 (22fcc3c)
- improve multi-device note sync (0beb31e)
- **upk**: 补回被上一个 commit 误删的 const found 行 (0e81338)
- **upk**: cp/rm 之前按 resolve(src) 去重,避免重复处理同一文件 (9e95e54)
- **upk**: 递归扫描 .upk 产物,覆盖 ugcli 实际输出路径 build_dir/pkgs/upk/ (49467ff)
- **upk**: 补 upk 模式支持版本复用 + 修 RepoTag 与 compose 不一致 + ugcli 权限自愈 (00de4d9)
### 📝 文档
- **readme**: 添加在线体验入口(note.nowen.cn) (b626b3e)
### 🔧 其他
- 完善发布流程与编辑器设置 (0ae451d)
- update release workflow and editor UI (53c2e4d)
> 🚨 **紧急安全修复**:1.1.6 用户请尽快升级。该版本修复"登录云端账号"迁移功能在
> 同一台后端上误操作导致的**附件物理文件丢失**问题。
### 🐛 修复
- **【数据保护】回收站清空 / 永久删除笔记不再误删被多笔记共享的附件物理文件**
- 受影响场景:1.1.6 在同一台服务器上点击"登录云端账号"产生双份笔记本后,
手动删除其中一份并清空回收站,会触发被另一份笔记引用的图片被 unlink。
- 修复后:批量删除附件文件前会做引用计数检查,仍有活引用的物理文件不会被删,
与单条 `DELETE /api/attachments/:id` 的行为对齐。
- **【迁移防呆】"登录云端账号"对话框现在会拒绝迁移到同一台服务器**
- 后端 `/api/version` 返回新增 `serverInstanceId` 字段(首次启动 lazy 写入
`system_settings`,跨重启稳定)。
- 前端 MigrationModal 在登录拿到云端 token 后立即比对两端 `serverInstanceId`,
相同则直接拦截、提示"无需迁移,请退出登录后用新账号登录即可"。
- 同账号场景(不同实例但本地与云端用户名一致)会弹二次确认,避免误操作。
- **【迁移一致性】附件 hash 去重命中时不再复用旧附件 id**
- 编辑器上传、内联 base64 抽取、公众号/URL 导入图片在 hash 命中时,会新建一条
绑定当前笔记的 `attachments` 元数据行,同时复用同一份磁盘物理文件。
- 迁移引擎层新增 `serverInstanceId` 预检查;即使绕过弹窗直接调用迁移函数,
也会在写入云端前阻断"本地端 == 云端"的同源迁移。
- **【附件健康检查】新增只读健康报告,帮助定位裂图 / 404**
- 管理员可在「设置 → 数据管理 → 系统 → 数据库」执行附件健康检查。
- 报告会列出 `attachments` 行存在但物理文件缺失、正文引用不存在附件 ID、
以及多行共享同一物理文件的情况。
- 孤儿清理逻辑同步补强:多条附件行共享同一个 `path` 时,只有最后一个引用消失
才会删除物理文件,避免清理工具自身误删活文件。
- **【附件修复向导】健康检查结果现在可直接执行基础修复**
- 对“DB 行存在但物理文件缺失”的附件,管理员可上传替代文件写回原 `path`;
若多条附件记录共享同一物理文件,会一起恢复。
- 对“正文引用不存在附件 ID”的悬空引用,管理员可批量从笔记正文中移除坏 URL,
避免前端继续请求 404。
- 修复类操作均要求管理员 sudo 二次验证;修复后会自动重新生成健康报告。
- **【多端同步】修复同账号 PC/Web 与手机端当前笔记不同步的问题**
- 实时更新不再按 `userId` 过滤同账号其它设备,只按 `connectionId` 排除当前连接回声。
- PC/Web 保存后会向同账号其它连接广播轻量列表更新,手机端停留在列表或当前笔记时都能立即看到变更。
- 当前笔记无本地未保存修改时会自动拉取并应用远端新版本;本地也有修改时进入冲突横幅。
- 正文保存遇到 `409 VERSION_CONFLICT` 不再盲目重放旧内容覆盖远端,而是保留本地草稿,提示用户选择“重新加载”或“覆盖远端”。
- 移动端前台恢复、联网恢复、WebSocket 重连时会主动补查当前笔记版本,补偿后台期间漏掉的实时消息。
### ⚠️ 影响范围与建议
- 仅 1.1.6 用户受影响。1.1.5 及更早版本没有"登录云端账号"功能,无此风险。
- **如果你已经丢失图片**:先检查 NAS 快照 / 备份;该场景下数据库行可能仍在,
但物理文件已被 unlink,应用层无法凭空恢复原图。升级后可先运行"附件健康检查",
再对缺失项上传从备份或其它来源找回的替代文件;找不回的悬空引用可在修复向导中移除。
### v1.1.6 - 2026-05-26
### ✨ 新增
- **release**: 将绿联 .upk 从一键全量(选项5)中移除,独立到选项10 (78bbdf6)
- **notes**: 支持客户端生成的 UUID 作为笔记 ID(离线创建) (c8d8961)
- **login**: 登录页支持桌面端跳过登录直接用本地 (21c9183)
- **migration**: 本地→云端账号一键迁移(D-2/D-3 + 回滚) (f61a6a9)
- **local-mode**: 本地模式离线读 + 同步引擎 + localStore (660489a)
- **desktop**: Electron 桌面端框架 + 内嵌后端启动 (762e6b0)
- **attachment-preview**: 视频/音频按扩展名兜底 + 抽屉打开时隐藏链接气泡 (33d6c61)
- **editor-mobile**: 移动端顶栏改 iOS 风双行结构 + 桌面面包屑末段截断修复 (235db1f)
- **frontend**: add video embed extension and rich-text video URL support (b8e3493)
- **editor**: auto-convert '- [ ] ' / '- [x] ' to task list (5c9a916)
- **login**: add demo mode banner with one-click credential fill (0a0c271)
- **auth**: 新增体验账号(isDemo) 机制 (8e0ab8a)
- **url-import**: 公众号文章一键导入笔记 (d6c7c17)
### 🐛 修复
- **release**: multi 模式 upk 打包前 buildx --load 各架构镜像 (7cceed0)
- **editor**: TiptapEditor 桌面端样式/行为微调 (7b72d7d)
- **mac-build**: 单架构构建 + .node 魔数 arch 校验,修复 Intel Mac ERR_DLOPEN_FAILED (54a9c90)
- **release**: defer UPK_IMAGE_REF assembly until VERSION is finalized (80390c9)
- **upk**: 改进多架构镜像查找逻辑,支持 DOCKERHUB_REPO 环境变量 (cc57a7f)
- **VideoExtension**: 修正 NodeView props 类型为 ReactNodeViewProps,修复 tsc 报错 (1083377)
- 绿联nas 构建包 (eb15be2)
- **clipper**: split footer build for markdown branch to preserve source link (45402e8)
- **update-notifier**: move useCallback before early return to fix hook order (63f2624)
### 📝 文档
- **readme**: 补 macOS 首次打开 ERR_DLOPEN_FAILED 的 xattr 解隔离指引 (bf108cd)
- **readme**: sync features and changelog with Unreleased (e301e93)
### 📦 构建
- **upk**: 新增绿联 NAS 应用包(.upk) 打包流程 (967d00d)
### 🔧 其他
- **clipper**: release v0.1.3 (5d70c08)
### v1.1.5 - 2026-05-21
### ✨ 新增
- **attachments**: 附件预览抽屉 + 本笔记附件目录面板 (df2e06f)
- **editor**: 搜索替换面板 / docx 自研解析与导入 / 字号弹层优化等 (3a37905)
- **about**: 新增'作者感言'板块及阅读弹窗 (82e872d)
### 📝 文档
- **readme**: add Author's Note link in header (6e5d863)