从一条Docker命令开始:搭建私有笔记,把数据主动权拿回来

​本文来自我的个人博客:从一条Docker命令开始:搭建私有笔记,把数据主动权拿回来 - 叹惋博客

不知道你有没有这样的经历:脑子里突然闪过一个不错的想法,打开手机备忘录记下来(嗯,我有段时间就很喜欢去手机备忘录),结果换到电脑上就找不到了(我只会用文件传输助手复制粘贴呵呵);或者写了半天的笔记存到某云笔记里,心里总隐约担心哪天服务关了、数据丢了。

今天这篇文章,带你用 Docker 在自己的服务器上部署一个叫 Memos 的开源笔记工具——数据完全掌握在自己手里,没有广告,没有追踪,永久免费

Memos 在 GitHub 上已经获得了60k+ Star,Docker 镜像轻量到只有 20MB 左右。它到底好在哪?后面会慢慢说。

一、Memos 是什么?能用来干什么?

简单说,Memos 是一个开源的、可以自己部署的碎片化知识管理工具。它主打“打开就写、数据在自己手里”。

你可以用它来:

1.记录每天的待办事项和工作计划

2.随手写下突然冒出来的灵感和想法

3.写读书笔记、观影感受

4.替代微信的“文件传输助手”或手机自带备忘录

5.打造一个属于自己的轻量化“卡片笔记”系统

它的几个核心特点:

1.极轻量——单个 Go 二进制文件,Docker 镜像大约只有 20MB。运行时的内存占用大约 50 到 80MB。哪怕是你手里吃灰的树莓派都能跑得动。

2.数据自主——所有笔记都存在你服务器上的数据库里(默认 SQLite),零遥测、无追踪。

3.颜值高——UI 设计简约大气,交互体验流畅。

4.支持中文,也支持多用户。

5.部署极其简单——一条 Docker 命令就能搞定。

顺便说一句,Memos 默认使用 SQLite 数据库——就是一个单文件,所有的用户、笔记、附件信息都存里面。以后想迁移数据,直接复制这个文件就行,不需要折腾导入导出。

二、准备工作

开始之前,你需要有一台 Linux 服务器,我用的是雨云服务器(本文以 Ubuntu 24.04 为例)。

硬件方面,Memos 的要求非常低:1核1G即可

端口方面,Memos 默认使用 5230 端口。你需要确保服务器防火墙放行这个端口,或者后续用 Nginx 反代到其他端口也行。

一个小提醒:如果你的服务器在国内,从 Docker Hub 拉取镜像可能会比较慢。后面我会提到怎么解决这个问题。

三、安装 Docker

如果你的服务器上还没有安装 Docker,需要先装一下。Ubuntu 系统可以用官方一键安装脚本:

(有时候安装的比较慢,不要急哈哈,耐心等一等)

curl -fsSL https://get.docker.com | sh

安装完成后,把当前用户加入 docker 组,避免每次都要输 sudo:

sudo usermod -aG docker $USER

然后退出当前终端重新登录,或者执行下面的命令让权限立即生效:

newgrp docker

验证一下 Docker 是否安装成功:

docker --version
docker compose version

能看到版本号就说明装好了。

四、部署 Memos

方式一:直接用 docker run 命令(最简单,推荐新手)

这是最快的方式,一条命令搞定。

首先创建一个目录用来存放 Memos 的数据(这一步非常重要,如果不做数据挂载,容器删了笔记就没了):

mkdir -p ~/.memos

然后执行启动命令:

docker run -d \
  --name memos \
  --restart unless-stopped \
  -p 5230:5230 \
  -v ~/.memos:/var/opt/memos \
  neosmemo/memos:stable

这条命令的几个参数解释一下

参数 含义
-d 后台运行容器
--name memos 给容器起个名字叫 memos,方便管理
--restart unless-stopped 服务器重启后自动启动 Memos
-p 5230:5230 把容器内的 5230 端口映射到服务器的 5230 端口
-v ~/.memos:/var/opt/memos 把数据挂载到本地目录,数据持久化

如果你在国内拉取镜像很慢,可以用镜像加速地址替换 neosmemo/memos:stable

docker run -d \
  --name memos \
  --restart unless-stopped \
  -p 5230:5230 \
  -v ~/.memos:/var/opt/memos \
  docker.xuanyuan.me/neosmemo/memos:stable

命令执行后,查看一下容器是否正常运行:

docker ps

应该能看到名为 memos 的容器状态是 Up

也可以看启动日志确认:

docker logs memos

如果看到类似这样的输出,就说明启动成功了。

方式二:用 docker-compose(适合喜欢整洁配置的朋友)

如果你更习惯用配置文件来管理服务,可以写一个 docker-compose.yml

创建项目目录和配置文件:

mkdir -p ~/memos
cd ~/memos

新建 docker-compose.yml 文件,写入以下内容:

version: "3.0"
services:
  memos:
    image: neosmemo/memos:stable
    container_name: memos
    restart: unless-stopped
    volumes:
      - ~/.memos:/var/opt/memos
    ports:
      - 5230:5230

然后启动:

docker compose up -d

效果和上面用 docker run 是一样的。以后要停止或重启,只需要在 ~/memos 目录下执行:

docker compose down    # 停止
docker compose up -d   # 重新启动

五、初始化 Memos

部署完成后,打开浏览器,访问:

http://你的服务器IP:5230

第一次打开会看到注册页面。第一次注册的账号会自动成为系统管理员

填好用户名、密码,点击注册。

注意:管理员账号请一定记好密码,目前 Memos 没有提供自助重置密码的功能。

注册完成后,界面默认是英文的(我没想通为啥注册界面是中文,注册完进去又变回英文了)。切换成中文:

六、开始使用

写第一条笔记

在页面右侧的输入框里直接打字就行。Memos 支持 Markdown 语法,比如:

# 我的第一条笔记

今天成功部署了 Memos!以后所有零碎的想法都可以记在这里了。

- 支持 **加粗** 和 *斜体*
- 支持 `代码`
- 支持 #标签 自动识别

输入完成后,点击保存或按快捷键就能发布。

常用功能

标签:在笔记内容中以 # 开头输入,比如 #想法#读书笔记,系统会自动识别成标签,以后可以按标签筛选。

日历视图:左侧有日历,可以按日期查看当天的所有备忘。

公开/私有:每条笔记都可以设置可见范围——公开、仅自己、或指定成员。

关闭用户注册(个人使用建议)

如果你只是想自己用,不想让别人注册账号,可以在设置里关掉注册功能:

这样其他人就打不开注册页面了。

七、进阶配置:Nginx 反向代理 + HTTPS 证书(可选)

通过 IP+端口访问始终不太方便,而且 HTTP 明文传输在公网环境下存在安全隐患。配一个域名和 SSL 证书体验会好很多。

7.1 安装 Nginx

sudo apt install -y nginx
sudo systemctl enable nginx
sudo systemctl start nginx

7.2 编写站点配置

假设你的域名是 memos.example.com,在 /etc/nginx/sites-available/memos 创建配置文件:

sudo nano /etc/nginx/sites-available/memos

把下面这段内容贴进去。记得把memos.example.com换成你自己的域名

server {
    listen 80;
    server_name memos.example.com;

    location / {
        proxy_pass http://127.0.0.1:5230;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

粘贴完后后按Ctrl+X,按Y,再按Enter退出。

启用配置:

sudo ln -s /etc/nginx/sites-available/memos /etc/nginx/sites-enabled/
sudo nginx -t   
sudo systemctl reload nginx

7.3 申请 SSL 证书(Certbot)

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d memos.example.com

按照提示输入邮箱并同意协议,Certbot 会自动申请证书并修改 Nginx 配置。证书有效期 90 天,Certbot 会通过 systemd timer 自动续期。

八、数据备份与恢复

8.1 备份策略

Memos 的所有数据都在 ~/.memos 目录下。

sudo docker stop memos

mkdir -p ~/backups

sudo tar -czf ~/backups/memos_$(date +%Y%m%d_%H%M%S).tar.gz -C ~ .memos

sudo docker start memos

# 验证备份文件存在
ls -lh ~/backups/

8.2 恢复数据

docker stop memos

cp ~/backups/memos_20260101.db ~/.memos/memos_prod.db

docker start memos

注意:恢复时的 Memos 版本最好与备份时的版本一致,否则可能存在数据库 schema 迁移问题。建议升级前先做备份,升级后如果出问题还能回滚。

九、使用单点登录

第一步:在 GitHub 上创建 OAuth 应用

1.进入设置页面:登录 GitHub 后,点击右上角的头像,在菜单中进入 Settings (设置)。

2.找到开发者设置:在 Settings 页面的左侧边栏最下方,找到并点击 Developer settings

3.创建新 OAuth App:在 Developer settings 页面中,选择左侧的 OAuth Apps,然后点击页面右侧的 New OAuth App 按钮。

4.填写应用信息:在注册新应用的页面,你需要填写以下信息:

<1>Application name:填写一个你容易识别的名字

<2>Homepage URL:填写你的 Memos 站点首页地址,如 https://memos.your-domain.com

<3>Authorization callback URL这是最关键的一步,必须精确填写。

格式为 你的Memos站点地址/auth/callback

例如,如果你的 Memos 地址是 https://memos.example.com

那么这里就应该 写 https://memos.example.com/auth/callback

5.注册应用:填写完成后,点击 Register application 按钮。

6.获取凭证:应用创建成功后,页面会跳转到该应用的管理界面。你会看到 Client IDClient Secret 两个关键信息。

  • Client ID 是公开的,可以直接复制使用。
  • Client Secret 是机密信息,请务必妥善保管,不要泄露给任何人。你需要点击 Generate a new client secret 按钮来生成它,并立即复制下来(离开页面后将无法再次查看)。

第二步:在 Memos 中配置 SSO 登录

1.进入系统设置:使用你的管理员账号登录 Memos,点击左下角 进入设置页面。

2.找到 SSO 设置:在设置页面中,找到并点击 单点登录

3.添加身份提供商:点击 创建添加 按钮,选择提供商模板为 GitHub

4.填写配置信息:根据你从 GitHub 获取的信息,填写以下字段:

  • clientId:粘贴你在上一步获取的 Client ID
  • clientSecret:粘贴你在上一步获取的 Client Secret
  • 确保 Scopes 字段至少包含 user:email,这是为了获取你的 GitHub 邮箱信息。

5.保存配置:填写完毕后,点击保存。

验证与测试

1.退出登录:保存配置后,先退出你的管理员账号。

2.检查登录页面:回到 Memos 的登录页面,你应该能看到一个新增的 “使用 GitHub 登录” 或类似的按钮。

3.测试登录:点击该按钮,它应该会跳转到 GitHub 的授权页面。授权后,如果一切顺利,你就会被重定向回 Memos 并成功登录。

十、容器运维常见操作

# 查看容器状态
docker ps -a --filter "name=memos"

# 查看实时日志(按 Ctrl+C 退出)
docker logs -f memos

# 进入容器内部(调试用)
docker exec -it memos /bin/sh

# 更新镜像版本
docker pull neosmemo/memos:stable
docker stop memos
docker rm memos
docker run -d --name memos --restart unless-stopped -p 5230:5230 -v ~/.memos:/var/opt/memos neosmemo/memos:stable

# 清理无用镜像
docker image prune -f

升级时有个细节要注意:如果跨大版本升级,Memos 可能会自动执行数据库迁移,这个过程取决于数据量大小,一般几秒到几十秒。期间容器可能短暂不可用,属于正常现象,不要强制重启。升级前强烈建议先备份数据

关于端口改动的说明:如果你的服务器 5230 端口已被占用,修改宿主机映射端口即可,例如改为 -p 5231:5230。但要注意,改了端口之后,所有外部访问都需要使用新端口,Nginx 代理配置中的 proxy_pass http://127.0.0.1:5230 也要同步修改。

十一、Memos 的丰富生态

Memos 虽然本身是个轻量级工具,但社区生态相当活跃:

Web Clipper:官方提供了 Chrome 和 Firefox 的浏览器剪藏插件,可以一键保存网页、选中的文本和图片到你的 Memos 实例

Moe Memos:第三方 iOS 和 Android 客户端,支持 Memos 0.27.0 到 0.29.1 版本,体验接近原生 App

微信小程序:社区有开发者做了微信小程序版本

Telegram Bot:可以通过 Telegram 机器人发送消息到 Memos

API 支持:Memos 提供了完整的 REST 和 gRPC API,方便二次开发和集成

十二、写在最后

从拉取镜像到完成初始化,快的朋友可能五分钟就走完了。这也是我当初选择 Memos 的原因——它足够简单,却又足够好用。

给自己搭一个专属的笔记系统,听起来好像挺有技术门槛,其实几条命令就能搞定。现在动手试一下,说不定明天开始,你的碎片想法就有了一个安稳的「家」。

部署过程中遇到任何问题(镜像拉取超时、端口被占、数据库报错等等),欢迎在评论区留言,我看到就会回复。

wc,你怎么复活了

暑假闲得慌 :grinning_face_with_smiling_eyes: