使用 Docker 搭建 Memos
XiaoMa 博士生

虚拟机 + 内网穿透

准备工作

  • 虚拟机:Ubuntu 22.04 LTS 系统
  • SakuraFrp 工具

Docker 安装

默认是一台没有装过 Docker 的机器。如果存在旧版本的 Docker 并且想要卸载,请执行以下命令(非必要):

1
sudo apt remove docker docker-engine docker.io containerd runc

设置存储库

更新 apt 包索引,并安装包以允许 apt 通过 HTTPS 使用存储库:

1
2
sudo apt update
sudo apt install ca-certificates curl gnupg lsb-release

添加 Docker 的官方 GPG 密钥:

1
2
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

使用以下命令设置存储库:

1
2
3
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

安装 Docker 引擎

更新 apt 包索引。安装最新版本的 Docker Engine、containerd 和 Docker Compose:

1
2
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

验证 Docker 运行情况

Active: active (running)running 时,说明 Docker 运行正常:

1
systemctl status docker.service
image-20230301120319501

当进行到这一步的时候,说明 Docker 服务已经成功安装。

Memos 服务部署

Memos 的仓库:https://github.com/usememos/memos

创建存储卷

切换到 root 用户,在根目录下创建一个目录用来存储 Memos 数据(也可以创建到用户目录里):

1
2
xiaoma@xiaoma-vm:~$ sudo -i
root@xiaoma-vm:~# mkdir memos

然后需要将创建的目录挂载到 Docker 的容器里。先查看 memos 的路径,下面启动 Memos 时需要指定此路径:

1
2
3
root@xiaoma-vm:~/memos# pwd
---
/root/memos

运行容器

启动 Memos 容器:

1
root@xiaoma-vm:~/memos# docker run -d --name memos -p 5230:5230 -v /root/memos/:/var/opt/memos neosmemo/memos:latest

这条命令的参数意思是:将容器内的 5230 端口映射到宿主机(指虚拟机)的 5230 端口上,同时将容器内 /var/opt/memos 路径下的内容挂载到宿主机(指虚拟机)的 /root/memos 路径下,路径映射的好处是防止容器被误删导致数据丢失。

查看容器运行状态:

1
root@xiaoma-vm:~/memos# docker ps -a

image-20230301122614653

看到容器状态为 Up(红框)时,说明已成功部署好 Memos 服务。在浏览器中访问 127.0.0.1:5230localhost:5230 就可以打开 Memos 的初始界面了。

image-20230301123134290

体验 Memos

输入用户名和密码,创建管理员账号。进入后可以体验完整服务。可在设置中改为中文。

image-20230301123714374

:Memos 的数据存储在本地 /root/memos 路径下名为 memos_prod.db 的文件(包括用户名密码等),每次升级前请做好备份。

内网穿透

由于目前我们只能通过内网(127.0.0.1:5230localhost:5230 或虚拟机 IP:192.168.43.190:5230)访问该服务,如果我们没有公网 IP 又该如何实现可以 Memos 的公网访问呢?这就引出了一个技术——内网穿透。什么是内网穿透?简单的说,内网穿透就是使用一台具有公网 IP 地址的电脑(服务器)作为“中间人”来与没有公网 IP 的设备建立连接,实现数据连通。此处选择别人提供的内网穿透服务。

本方案使用 Windows 平台。

注册 SakuraFrp 账号

注册入口:https://openid.13a.com/register

image-20230301140251895

用户中心

点击 Sakura Frp 跳转链接。

image-20230301140437689

实名认证

根据提示进行操作。支付宝扫码支付 1 元钱,然后人脸识别验证。免费用户可创建两条隧道,创建隧道需要下载客户端。

image-20230301140728555

Sakura Frp 启动器

  1. 下载位置如图所示:
image-20230301141146154
  1. 安装成功后运行,需要访问密钥登录。在官网首页点击【查看访问密钥】复制。
image-20230301141411952
  1. 点击客户端 + 创建隧道。
image-20230301141639831
  • 本地 IP 填写虚拟机的 IP 192.168.43.190。

  • 端口填 5230。

  • 隧道名称随便写三个字母就可以。

  • 备注(可空)。

  • 隧道类型为 TCP。远程端口默认 0。

  • 选择穿透节点时,先延迟测试,选择一条延迟低的。

    • 国内节点需要开启 HTTPS(如下图)。国外节点不需要但访问慢。
image-20230301142240777 image-20230301142431797
  1. 打开隧道开关,查看日志,找到公网 IP。
image-20230301142751534 image-20230301145031393
  1. 在浏览器中输入公网地址或 IP(红框内容),可以成功访问到内网的页面。
image-20230301145155605

服务器

准备工作

  • 一台轻量服务器。
  • XShell 工具(其他能够远程 SSH 的工具也可以)。

购置服务器

登录阿里云,选择购买轻量应用服务器。地址:轻量应用服务器_web服务器_个人建站_弹性计算-阿里云 (aliyun.com)

image-20230301150422834
  • 实例类型:服务器示例
  • 地区和可用区:亚太 → 新加坡(香港 24 元/月的已售罄)
  • 镜像:系统镜像 → Ubuntu 20.04
  • 套餐配置:24 元/月
  • 数据盘:0GB
  • 购买时长/数量:按需

配置服务器

进入所购买的服务器界面:

  • 左菜单栏中选择 远程连接。采用第 2 种方法,设置密钥,使用 XShell 连接。(XShell 用法见:Xshell 连接 VM 虚拟机)。
  • 左菜单栏中选择 防火墙,添加规则,打开 5230 端口。
image-20230301152153738

在 XShell 中对服务器进行配置,与上述在虚拟机 Ubuntu 22.04 LTS 系统中的操作一致。最后在浏览器中输入 IP:5230 就可以访问 Memos 了。

1
2
# 查看服务器 IP
curl ip.sb

备份与迁移

正如前面所说:

:Memos 的数据存储在本地 /root/memos 路径下名为 memos_prod.db 的文件(包括用户名密码等),每次升级前请做好备份。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sudo -i            //切到管理员命令(如果已经是 # 则不需要切)
docker ps -a //查看 docker 运行情况
docker stop memos //停止 memos 服务(容器)
docker rm -f memos //删除 memos 容器

cp -r ~/memos ~/memosarchive //备份数据,切记
rm -rf ~/memos/memos_prod.db //删除数据

tar -czvf memosarchive.tar.gz memosarchive //打包
scp -p 22 -r memosarchive.tar.gz root@192.248.190.156:/root //迁移到新地址
tar -zxvf memosarchive.tar.gz //解包
mv memosarchive memos //把 memosarchive 重命名为 memos

//切到根目录下,开启 memos 服务(容器)
docker run -d --name memos -p 5230:5230 -v /root/memos/:/var/opt/memos neosmemo/memos:latest
docker ps -a //查看 docker 运行情况

参考

  1. Memos 一个开源且免费的自托管知识库 - 少数派 (sspai.com)
  2. 分享我日常使用的两种内网穿透方案 - 少数派 (sspai.com)
  3. 【好玩儿的Docker项目】10分钟搭建一个碎片化知识卡片管理工具——Memos (laoda.de)
  4. 【有用的小知识】Docker容器如何更新?如何迁移应用?如何卸载? (laoda.de)