起因:我需要一个「跨设备剪贴板」📋
日常中总有这样的场景:刷手机看到一篇好文章、一个有用的链接、一段代码片段,想先存下来回头在电脑上细看。
我之前的方案:微信「文件传输助手」或者大号发小号。简单粗暴,但用久了问题就来了:
| 痛点 | 具体表现 |
|---|---|
| 🔒 设备限制 | 电脑端微信只能登录一个账号,想用小号存东西得先退出大号 |
| 💨 数据易丢 | 换手机、清缓存、重装微信,聊天记录说没就没 |
| 🔍 检索困难 | 几百条消息里翻一个链接?大海捞针 |
| 📝 格式混乱 | 纯聊天记录,没有分类、没有标签,全靠记忆 |
我想要的其实很简单:一个自己掌控的「记录本」,手机电脑都能秒开,支持搜索和分类,数据永远不会丢。
搜了一圈,发现 flomo 挺火的,但它是商业产品,高级功能要付费,数据也存在别人服务器上。作为一个有服务器的人,当然要找开源自托管的方案——于是就遇到了 Memos。
Memos 是什么?🤔
Memos 是一款开源的自托管备忘录服务,可以理解为「开源版 flomo」或「私有化微博」。
💡 官方 Slogan:Your thoughts, your data, your control — no tracking, no ads, no subscription fees. (你的想法,你的数据,你的控制权——无追踪,无广告,无订阅费)
技术架构
| 组件 | 技术选型 |
|---|---|
| 后端 | Go(高性能、低资源占用) |
| 前端 | React + TypeScript |
| 数据库 | SQLite(默认)/ PostgreSQL / MySQL |
| 部署 | Docker 一行命令启动 |
核心特性
| 特性 | 说明 |
|---|---|
| 🪶 极致轻量 | 单容器部署,内存占用约 50MB,树莓派都能跑 |
| ✍️ Markdown | 原生支持,纯文本存储,数据迁移无压力 |
| 🏷️ 标签系统 | #标签 语法,支持多级标签,快速分类检索 |
| 📅 热力图 | GitHub 风格的活动日历,记录你的输出频率 |
| 🔗 开放 API | 完整的 RESTful + gRPC 接口,可对接微信机器人、Telegram Bot 等 |
| 👥 多用户 | 支持多账户,可设置内容为私有/工作区可见/完全公开 |
| 📱 响应式 | 手机、平板、电脑自适应,支持 PWA 安装 |
| 🌙 深色模式 | 护眼党福音 |
项目数据
- 📦 GitHub:usememos/memos
- ⭐ Stars:47,000+(活跃维护中)
- 📖 官方文档:usememos.com/docs
- 🎮 在线演示:demo.usememos.com(可能需要魔法)
部署方案:Docker Compose + PostgreSQL 🐳
Memos 默认使用 SQLite 作为数据库(零配置,开箱即用),但如果你对数据可靠性有更高要求,或者想要更好的备份恢复体验,推荐使用 PostgreSQL。
docker-compose.yml 配置(当前最新版本v0.25.3)
| |
参数详解
PostgreSQL 服务配置
| 参数 | 说明 | 示例值 |
|---|---|---|
image | PostgreSQL 镜像版本,推荐使用 15 或更高版本 | postgres:15 |
POSTGRES_DB | 数据库名称,Memos 会在这个库中创建表 | memos_db |
POSTGRES_USER | 数据库用户名,用于连接认证 | memos_user |
POSTGRES_PASSWORD | 数据库密码,请务必修改为强密码! | your_strong_password |
volumes | 数据持久化路径,使用命名卷更方便管理 | postgres_data:/var/lib/postgresql/data |
Memos 服务配置
| 环境变量 | 说明 | 可选值 |
|---|---|---|
MEMOS_MODE | 运行模式 | prod(生产)/ dev(开发)/ demo(演示) |
MEMOS_PORT | 监听端口 | 默认 5230,可自定义 |
MEMOS_DRIVER | 数据库驱动 | sqlite(默认)/ postgres / mysql |
MEMOS_DSN | 数据库连接字符串 | PostgreSQL 格式见下方说明 |
PostgreSQL DSN 格式:
| |
⚠️ 安全提示:
- 生产环境请使用强密码(16位以上,包含大小写字母、数字和特殊字符)
- 如果通过公网访问,建议配置
sslmode=require- 可以使用 Docker secrets 或环境变量文件来管理敏感信息
文件存储机制 📁
不同数据库驱动下,Memos 的文件存储方式不同:
SQLite 模式:上传的图片、附件存储在 /var/opt/memos 目录,必须挂载数据卷,否则容器重启后文件丢失!

PostgreSQL 模式:文件会以二进制形式存入数据库表中(我从备份的 SQL 里确认的)。官方不推荐存储大文件到数据库,但好处是备份数据库就等于备份了所有内容。

自定义存储:如果想把文件存到其他地方(本地路径、S3、外部存储),需要在 Web 管理界面中配置,不能通过环境变量设置。

启动服务
| |
启动成功后,访问 http://你的服务器IP:5230 即可看到 Memos 界面!🎉
首次访问会提示你创建管理员账户,设置好用户名和密码就可以开始记录你的想法了。
版本升级:两行命令搞定 🔄
| |
💡 提示:升级前建议瞅一眼官方文档,了解新版本的变更和注意事项~
Nginx 反向代理:给 Memos 加上 HTTPS 🔐
直接用 IP + 端口访问不够优雅,也不安全。配置 Nginx 反向代理,让 Memos 拥有自己的域名和 HTTPS 加密!
配置文件
创建 Nginx 配置文件(如 /etc/nginx/conf.d/memos.conf):
| |
配置参数说明
基础配置
| 指令 | 说明 |
|---|---|
listen 443 ssl | 监听 443 端口,启用 SSL |
http2 on | 启用 HTTP/2 协议,提升性能 |
server_name | 绑定的域名,需要替换为你自己的 |
代理头配置
| Header | 作用 |
|---|---|
Host | 保持原始请求的 Host 头 |
X-Real-IP | 传递客户端真实 IP |
X-Forwarded-For | 记录代理链路中的所有 IP |
X-Forwarded-Proto | 告知后端当前使用的协议(http/https) |
性能与超时配置
| 参数 | 说明 | 建议值 |
|---|---|---|
proxy_buffering off | 关闭响应缓冲,数据实时传输 | 适合小响应 |
proxy_request_buffering off | 关闭请求缓冲,适合上传文件 | 按需开启 |
proxy_connect_timeout | 与后端建立连接的超时 | 30s |
proxy_send_timeout | 发送请求到后端的超时 | 30s |
proxy_read_timeout | 等待后端响应的超时 | 300s(5分钟) |
生效配置
| |
配置完成后,访问 https://memos.yourdomain.com 即可通过 HTTPS 安全访问你的 Memos!🎉
数据备份:未雨绸缪才能高枕无忧 💾
数据是无价的!虽然 PostgreSQL 久经考验,但谁也不能保证硬盘不会突然罢工、手抖不会误删数据库、或者哪天心血来潮想换台服务器。定期备份,是每个运维人的基本修养(认真脸)。
下面这个脚本堪称「懒人福音」—— 自动从 docker-compose.yaml 读取数据库配置,执行 pg_dump 备份,还会自动清理过期文件,完全不用操心。
backup.sh 备份脚本
| |
脚本参数说明
| 环境变量 | 说明 | 默认值 |
|---|---|---|
BACKUP_DIR | 备份文件保存目录 | 脚本同目录下的 backups/ |
RETENTION_DAYS | 备份保留天数,超过后自动删除 | 7 天 |
COMPOSE_FILE | docker-compose.yaml 文件路径 | 脚本同目录 |
SERVICE_NAME | PostgreSQL 服务名称 | postgres |
BACKUP_PREFIX | 备份文件名前缀 | memos |
DEBUG | 是否启用调试日志 | false |
脚本特性:
- ✅ 自动从
docker-compose.yaml读取数据库配置 - ✅ 支持从
MEMOS_DSN连接字符串解析配置 - ✅ 使用 gzip 压缩备份,节省存储空间
- ✅ 自动清理过期备份
- ✅ 彩色日志输出,状态一目了然
- ✅ 完善的错误处理和依赖检查
数据恢复:关键时刻救命用 🔄
备份做了,万一真出事了怎么恢复?别慌,用这个脚本一键搞定!(希望你永远用不上它 🙏)
restore.sh 恢复脚本
| |
恢复脚本参数说明
| 环境变量 | 说明 | 默认值 |
|---|---|---|
COMPOSE_FILE | docker-compose.yaml 文件路径 | docker-compose.yaml |
SERVICE_NAME | PostgreSQL 服务名称 | postgres |
DB_NAME | 目标数据库名称 | memos_db |
DB_USER | 数据库用户名 | memos_user |
💡 提示:默认值要和你的
docker-compose.yml保持一致,不然恢复的时候会找不到数据库哦!
使用方法:
| |
⚠️ 注意:恢复操作会覆盖当前数据库中的所有数据,请确认后再操作!
定时自动备份:让服务器替你操心 ⏰
每天手动跑一次备份脚本?那也太不 geek 了!设置个 cron 定时任务,让服务器在你睡觉的时候默默干活~
配置 Crontab
| |
💡 提示:把
user-home替换成你的实际用户名,或者直接改成你喜欢的任意路径~
Cron 表达式说明
| |
常用时间设置示例:
| 表达式 | 含义 |
|---|---|
0 3 * * * | 每天凌晨3:00 |
0 */6 * * * | 每6小时 |
0 3 * * 0 | 每周日凌晨3:00 |
0 3 1 * * | 每月1号凌晨3:00 |
验证定时任务
| |
写在最后 📝
折腾了这么多,终于可以愉快地记笔记了!回顾一下我们做了什么:
| 步骤 | 搞定的事情 | 安心指数 |
|---|---|---|
| Docker 部署 | Memos + PostgreSQL 跑起来了 | ⭐⭐⭐ |
| Nginx 反代 | HTTPS 加密 + 自定义域名 | ⭐⭐⭐⭐ |
| 自动备份 | 定时备份 + 自动清理 | ⭐⭐⭐⭐⭐ |
| 恢复脚本 | 关键时刻一键救命 | ⭐⭐⭐⭐⭐ |
现在你可以放心地把那些灵感、链接、代码片段统统丢进 Memos 了——再也不用担心微信聊天记录丢失的噩梦!✨
如果你觉得 Memos 不错,别忘了去 GitHub 给它点个 Star ⭐(顺便也可以给本文点个赞?😏)
🐛 发现问题? 如果你在部署过程中遇到了文章中未提及的错误,或者发现哪里写得不对,欢迎在
评论区留言邮箱告诉我!我会及时补充和修正,帮助更多小伙伴少踩坑~
