杆子博客

杆子博客

博采众长 一诺千金!
当前位置: 首页 > 网络 > 正文

别存第三方笔记!零成本用Cloudflare搭建Memos-Worker私人知识库,永久免费

cover_image

不知道大家有没有这种困扰:平日里脑海源源不断迸发各类灵感,看到优质文章想要收藏留存、工作要点需要及时记下、学习途中整理知识框架,可记录的数据总是四散各处。

浏览器收藏夹越堆越杂乱,想要查找干货费时费力;重要备忘存于社交软件聊天记录,检索十分麻烦;手机自带备忘录功能简陋,无法实现富文本排版;市面上主流商用笔记工具更是处处受限:

  • ❌ 不清楚笔记文件存放位置,隐私没有保障
  • ❌ 高阶功能需要付费开通会员
  • ❌ 软件内置广告、推送资讯打扰专注记录
  • ❌ 笔记导出繁琐,迁移数据难度很高
  • ❌ 平台随时调整规则,多年积攒的资料容易受制于人

工作纪要、学习素材、项目构思、生活感悟都是属于自己珍贵的数字资产。越来越多注重数据主权的爱好者,开始搭建专属私有笔记系统,所有资料自己管控、随时随地浏览编辑。

今天就详细讲解一款依托 Cloudflare 无服务器生态打造的开源笔记工具 Memos-Worker,可以用极低门槛搭建永久可用的私有化知识库。


一、到底什么是 Memos-Worker

通俗来讲它属于轻量化开源知识管理工具,兼具私人记事本和专属动态空间,好比只供自己使用的私密朋友圈。

日常突发的思绪、干货文字、截图素材、专业知识点、转瞬即逝的灵感,全部能够录入系统。仅依靠浏览器,手机、电脑随时登入即可查看与编辑笔记。

市面上原版 Memos 常规搭建方式门槛偏高。传统部署模式需要购置云服务器、手动安装数据库、调试运行环境、处理证书配置,没有运维基础的新手很容易卡在环境搭建阶段。

而改版后的 Memos-Worker 专为无服务器环境优化,搭载 Cloudflare Workers 进行部署,借助其遍布全球的边缘节点网络,拥有多项硬核长处:

  • ✅ 完全不需要购置服务器,省去硬件开销与日常维护
  • ✅ 依托平台免费资源,日常使用近乎零花费
  • ✅ 程序体量轻巧,加载迅速、运行负担极低
  • ✅ 全网任意地区均可打开网页,随时随地存取笔记
  • ✅ 部署流程简单易懂,零基础新手也能够顺利上线

整套程序依托 Cloudflare 全套组件运行,包含 Workers、Pages、D1 数据库、R2 对象存储、KV 缓存空间。依靠平台免费配额即可正常运转,全权掌控属于你自己的私人笔记平台。


二、完整功能清单

  • ✍️ Markdown 编辑器:支持分栏编辑、实时预览;网页复制过来的富文本内容,可以智能转换成 Markdown 格式,编写技术文档、随笔草稿十分顺手。
  • 🎛️ 多样化笔记管理视图:单条记事支持置顶、收藏以及归档处理;配备宽屏布局、瀑布流卡片、按日期分组等浏览模式,可以依照当下使用习惯自由切换。
  • 📚 高效的知识整理机制:系统自动生成标签,内置全文检索、时间轴视图、日历看板、活跃度热力图,能够快速检索很早之前保存下的碎片化想法。
  • 🗂️ 多格式附件上传:支持剪贴板粘贴、拖拽上传图片;图片储存介质二选一,可存放至 Cloudflare R2 储存桶或者 Imgur,PDF、文档、压缩包等各类附件均可上传保存。
  • 🔗 可控式公开分享:每一条笔记和上传的附件都能够生成独立外链,分享链接能够设置有效期,适合临时将资料发送他人查看,无需对外开放整套知识库。
  • 🤖 Telegram 机器人联动:对接 TG 机器人之后,外出时直接发送文字、照片、短视频、各类文件,素材便能够一键同步至笔记库,外出偶遇灵感立刻留存。
  • 🎨 自定义页面外观:拥有浅色、深色两套主题;可自定义主题色、首页背景、毛玻璃磨砂特效;还能够自定义页面布局,关闭用不着的功能入口,定制专属操作界面。
  • 📃 树状结构化知识库:独立的 Docs 文档板块采用树形目录结构,适合搭建教程库、学习档案、团队资料库,用来收纳系统化、层级分明的正式知识。
  • 🚀 高速访问、低成本运维:依托 Cloudflare 遍布全球的边缘节点加速访问,网页加载速度快;个人或者小团体日常记录,免费套餐资源额度便足够使用,不需要运维服务器。

三、保姆级部署教程

第一步:创建专属 GitHub 仓库

这里存在两种创建方案,大家根据后续更新需求挑选:

  • 方案 A:Fork 上游源码(优先推荐)
    • 优势:你的仓库绑定原版项目,后续作者更新功能、修复漏洞,能够一键同步新版本。
    • 短板:仓库属性为公开;账号密码、密钥全部存放于环境变量当中,源码不会暴露私密参数,安全风险低。
    • 操作:点击项目主页右上角 Fork 按钮即可。
  • 方案 B:模板生成私有仓库
    • 优势:新建独立私有仓库,外人无法浏览你的源代码。
    • 短板:和上游源码断开关联,后续升级新版本只能手动执行 Git 命令合并代码,操作繁琐。
    • 操作:点击 Use this template → Create a new repository。

第二步:前往 Cloudflare 后台创建所需资源

登录控制面板,依次创建 D1 数据库、KV 命名空间、R2 文件桶,资源参数参考下表:

资源类型推荐命名绑定变量名称
D1 数据库notes-dbDB
KV 命名空间notes-kvNOTES_KV
R2 存储桶notes-r2-bucketNOTES_R2_BUCKET

1. 搭建 D1 数据库 (notes-db)

  1. 进入 Workers & Pages -> D1 -> Create database;
  2. 打开数据库控制台,复制项目内 schema.sql 的全部代码并运行,初始化数据表;
  3. 记录数据库 ID、数据库名称,填写入 wrangler.toml 文件的 [[d1_databases]] 部分。
CREATE TABLE tags (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  name TEXT NOT NULL UNIQUE
);

CREATE TABLE notes (
  id INTEGER PRIMARY KEY,
  content TEXT NOT NULL,
  files TEXT DEFAULT '[]',
  created_at INTEGER NOT NULL,
  updated_at INTEGER NOT NULL,
  is_pinned BOOLEAN DEFAULT 0,
  is_favorited INTEGER DEFAULT 0 NOT NULL,
  is_archived INTEGER DEFAULT 0 NOT NULL,
  pics TEXT,
  videos TEXT DEFAULT '[]'
);

CREATE TABLE note_tags (
  note_id INTEGER NOT NULL,
  tag_id INTEGER NOT NULL,
  PRIMARY KEY (note_id, tag_id),
  FOREIGN KEY (note_id) REFERENCES notes(id) ON DELETE CASCADE,
  FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE
);

CREATE TABLE nodes (
  id TEXT PRIMARY KEY,
  type TEXT NOT NULL,
  title TEXT NOT NULL,
  content TEXT,
  parent_id TEXT,
  created_at INTEGER NOT NULL,
  updated_at INTEGER NOT NULL,
  FOREIGN KEY (parent_id) REFERENCES nodes(id) ON DELETE CASCADE
);

-- Full-Text Search Virtual Table
CREATE VIRTUAL TABLE notes_fts USING fts5(
  content,
  files,
  content='notes',
  content_rowid='id'
);

-- Triggers to keep FTS in sync
CREATE TRIGGER notes_after_insert AFTER INSERT ON notes BEGIN
  INSERT INTO notes_fts(rowid, content, files) VALUES (new.id, new.content, new.files);
END;

CREATE TRIGGER notes_after_delete AFTER DELETE ON notes BEGIN
  INSERT INTO notes_fts(notes_fts, rowid, content, files) VALUES ('delete', old.id, old.content, old.files);
END;

CREATE TRIGGER notes_after_update AFTER UPDATE ON notes BEGIN
  INSERT INTO notes_fts(notes_fts, rowid, content, files) VALUES ('delete', old.id, old.content, old.files);
  INSERT INTO notes_fts(rowid, content, files) VALUES (new.id, new.content, new.files);
END;

2. 创建 KV 命名空间 (notes-kv)

进入 Workers & Pages -> KV -> Create a namespace。

重要:记下 id,将其填入 wrangler.toml 文件的 [[kv_namespaces]] 部分。

3. 创建 R2 存储桶 (notes-r2-bucket)

进入 R2 -> Create bucket。

重要:记下 bucket_name,将其填入 wrangler.toml 文件的 [[r2_buckets]] 部分。

第三步:部署 Worker 服务

  1. 打开 Workers & Pages,新建应用并选定 Continue with GitHub 类型;
  2. 关联刚刚准备完毕的 GitHub 仓库;
  3. 保存配置并启动部署。

第四步:配置环境变量

部署结束之后进入项目 设置 -> 环境变量,依次添加下面参数:

环境变量参数说明
USERNAME后台登录账号
PASSWORD后台登录密码
TELEGRAM_BOT_TOKEN(可选)TG 机器人密钥
TELEGRAM_WEBHOOK_SECRET(可选)随机复杂字符,用于接口校验
AUTHORIZED_TELEGRAM_IDS(可选)允许推送笔记的 TG 用户 ID

参数保存之后重新部署一次项目,环境配置正式生效。

第五步:开启 TG 机器人回调接口(可选)

配置机器人参数之后需要激活 Webhook 实现消息推送:

  1. 获取你的笔记站点域名;
  2. 浏览器访问下方链接,替换密钥以及域名信息:
    https://api.telegram.org/bot<TELEGRAM_BOT_TOKEN>/setWebhook?url=https://your-project.pages.dev/api/telegram_webhook/&secret_token=<TELEGRAM_WEBHOOK_SECRET>
    
  3. 替换链接中的 <TELEGRAM_BOT_TOKEN> 和 <TELEGRAM_WEBHOOK_SECRET> 为你自己的真实密钥值,按下回车。若看到 {"ok":true,"result":true,"description":"Webhook was set"} 的返回信息,即代表设置成功!现在可以给你的机器人发送消息了。

🔍 重建搜索索引 (推荐)

如果你是从旧版本(20260206 之前版本)更新的,并且想要实现搜索文件名的功能,你需要重建全文搜索 (FTS) 索引:

  1. 进入 Cloudflare Dashboard -> Workers & Pages -> D1;
  2. 选择你的数据库(例如 notes-db);
  3. 点击 Console 选项卡;
  4. 复制本项目中 src/migrate_fts.sql 文件的完整内容并粘贴到控制台,点击 Execute 执行。
-- 1. 删除旧的同步触发器
DROP TRIGGER IF EXISTS notes_after_insert;
DROP TRIGGER IF EXISTS notes_after_delete;
DROP TRIGGER IF EXISTS notes_after_update;

-- 2. 删除旧的全文搜索表
DROP TABLE IF EXISTS notes_fts;

-- 3. 创建包含 'files' 列的新全文搜索虚拟表
CREATE VIRTUAL TABLE notes_fts USING fts5(
  content,
  files,
  content='notes',
  content_rowid='id'
);

-- 4. 从 notes 表中同步现有数据到新的 notes_fts 表(使历史文件名支持搜索)
INSERT INTO notes_fts(rowid, content, files) SELECT id, content, files FROM notes;

-- 5. 重新创建同步触发器
CREATE TRIGGER notes_after_insert AFTER INSERT ON notes BEGIN
  INSERT INTO notes_fts(rowid, content, files) VALUES (new.id, new.content, new.files);
END;

CREATE TRIGGER notes_after_delete AFTER DELETE ON notes BEGIN
  INSERT INTO notes_fts(notes_fts, rowid, content, files) VALUES ('delete', old.id, old.content, old.files);
END;

CREATE TRIGGER notes_after_update AFTER UPDATE ON notes BEGIN
  INSERT INTO notes_fts(notes_fts, rowid, content, files) VALUES ('delete', old.id, old.content, old.files);
  INSERT INTO notes_fts(rowid, content, files) VALUES (new.id, new.content, new.files);
END;

相关截图

📌 视频教程:https://aixmb.com/762.html

打赏支持
支付宝打赏 支付宝打赏
微信打赏 微信打赏

「请 GANZI 喝杯咖啡作为鼓励」~

您可能还会对这些文章感兴趣!

导航
侧边栏