..

为 Memos 绑定自定义域名并实现 https 访问


1. 在服务器上运行 Memos

1.1 安装 Docker

1.1.1 更新已安装的软件包列表:

sudo apt-get update

1.1.2 安装必要的一些系统工具:

sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

1.1.3 添加官方的 Docker GPG Key:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

1.1.4 设置存储库稳定版:

echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

1.1.5 更新软件包列表并安装 Docker Engine 社区版:

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

1.1.6 通过运行以下命令验证是否正确安装了 Docker Engine:

sudo docker run hello-world

1.1.7 如果上述命令能够全部执行成功,说明已经正确安装和配置好了 Docker 。

1.2 安装 Memos

具体请参考安装文档

其中,使用 docker run 部署 memos 仅需一个命令:

docker run -d --name memos -p 5230:5230 -v ~/.memos/:/var/opt/memos neosmemo/memos:latest
  • 5230(端口1):5230(端口2)端口1是暴露到主机的端口,端口2是在容器内监听的端口。如果需要使用其他主机端口可以自行修改 端口1
  • ~/.memos/:/var/opt/memos:同理, ~/.memos/ 是主机上的储存路径,/var/opt/memos 是在容器内的路径。数据库将存储在 ~/.memos/ 中,可以根据需要自行修改。

2. 绑定自定义域名并实现 https 访问

2.1 设置域名

2.1.1 设置域名的 DNS 记录

为需要绑定的域名 (aaa.example.com) 添加 A 记录解析到主机(IP 为 AAA.BBB.CCC.DDD):

Type: A
Name: aaa(如果没有子域名的话直接填 @ )
Content: AAA.BBB.CCC.DDD

为确保 DNS 记录解析成功,可以在终端中使用 nslookup aaa.example.com 来查询本机 DNS 返回的域名解析结果。

2.1.2 为需要绑定的域名申请自签名证书

2.1.2.1 安装 Certbot

sudo apt-get update
sudo apt-get install certbot

2.1.2.2 运行 Certbot 并按照提示完成验证和证书申请

sudo certbot certonly --standalone -d aaa.example.com

2.1.2.3 证书申请成功后的提示:

IMPORTANT NOTES:

- Congratulations! Your certificate and chain have been saved at:/etc/letsencrypt/live/aaa.example.com/fullchain.pem. Your key file has been saved at:/etc/letsencrypt/live/aaa.example.com/privkey.pem. Your cert will expire on YYYY-MM-DD. To obtain a new or tweaked version of this certificate in the future, simply run certbotagain. To non-interactively renew *all* of your certificates, run"`certbot renew`"
- Your account credentials have been saved in your Certbot configuration directory at /etc/letsencrypt. **You should make a secure backup of this folder now.** This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal.

2.1.2.4 记下此处证书的储存位置,后续需要用到。

2.2 设置 Nginx

2.2.1 安装 Nginx

如果你还没有安装 Nginx,可以使用以下命令进行安装:

sudo apt-get update
sudo apt-get install nginx

2.2.2 配置 Nginx

2.2.2.1 在安装完成后,需要打开 nginx 的配置文件进行配置。配置文件的路径是 /etc/nginx/nginx.conf。可以使用以下命令打开:

sudo nano /etc/nginx/nginx.conf

也可以用其他任何顺手的方式直接修改该文件。

2.2.2.2 在配置文件中找到 http 模块,并在其中添加以下代码:

server {
    listen 80;
    listen [::]:80;
    server_name aaa.example.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name aaa.example.com;
    ssl_certificate /etc/letsencrypt/live/aaa.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/aaa.example.com/privkey.pem;
    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;
    }
}

这段代码会将来自 80 端口的请求重定向到 443 端口,启用 https。其中 proxy_pass 指令指定了实际处理请求的后端服务器地址。

2.2.3 运行

完成配置后,需要重启 Nginx 才能使配置生效。可以使用以下命令进行重启:

sudo systemctl restart nginx

现在,当你访问浏览器中的 https://aaa.example.com 时,nginx 会将请求转发到本地的 5230 端口。

3. 其他

3.1 SSL 证书的更新

Certbot 续签时需要暂时解除 80 端口的占用,因此必须暂停 Nginx 服务,并在续签后重启。

同时完成暂停 Nginx —— 续签 —— 重启 Nginx:

certbot renew --pre-hook "service nginx stop" --post-hook "service nginx start"

可以使用 cron 定时任务来设置每天自动运行这个命令以完成自动续签。

3.1.1 如果还没有安装 cron 服务的话:

sudo apt-get update
sudo apt-get install cron

3.1.2 输入以下命令:

crontab -e

3.1.3 选择喜欢的编辑器,并在打开的文件中添加以下一行代码:

0 1 * * * certbot renew --pre-hook "service nginx stop" --post-hook "service nginx start" >> /var/log/letsencrypt/renew.log 2>&1

0 1 * * * 是一个 Cron 时间表达式,表示在 UTC 时间每天 01:00 执行。 具体解释如下:

第一个 0 表示 分钟,范围是0-59。

第二个 1 表示 小时,范围是0-23。

第三个 * 表示 日,范围是1-31 。

第四个 * 表示 月,范围是1-12。

第五个 * 表示 周几,范围是0-6 (或者 sun, mon, tue …)

因此,“0 1 * * *” 意味着 cron 将在每天的 01:00 执行。

3.1.4 保存并退出编辑器。现在,Certbot 续签命令每天都会在计划的时间运行一次,同时也将日志写入 /var/log/letsencrypt/renew.log 以便于跟踪证书续订情况。

3.2 Memos 的更新(docker)

参考此处解决方案。

使用最基础的 docker 命令即可完成不损失数据库的更新:

3.2.1 非必须:备份数据库文件(详见下文 “memos 数据库的备份”一节,也可以直接备份~/.memos/memos_prod.db

3.2.2 停止正在运行的容器:docker stop memos

3.2.3 删除容器:docker rm memos

3.2.4 删除镜像:docker rmi memos

3.2.5 获取最新镜像并运行新容器:

docker pull neosmemo/memos:latest
docker run -d --name memos -p 5230:5230 -v ~/.memos/:/var/opt/memos neosmemo/memos:latest

3.3 Memos 数据库的备份

参考此处解决方案。

Memos 的数据库默认储存在本机 ~/.memos/ 路径中,如果需要每日执行备份,可以设置定期执行以下文件:

#!/bin/bash
# 获取当前日期并格式化为 "年-月-日"
DATE=$(date +'%Y-%m-%d')

# 备份文件夹的根目录
ROOTBKPFOLDER="/BACKUPFOLDER/Memos"

# 当前备份文件夹的完整路径
ROOTBKP=$ROOTBKPFOLDER/$DATE

# 切换到备份文件夹的根目录
cd $ROOTBKPFOLDER

# 创建当天的备份文件夹
mkdir $DATE

# 将文件从docker容器复制到备份文件夹中
docker cp memos:/var/opt/memos/memos_prod.db $ROOTBKP
docker cp memos:/var/opt/memos/memos_prod.db-shm $ROOTBKP
docker cp memos:/var/opt/memos/memos_prod.db-wal $ROOTBKP

# 对备份文件进行清理
# 取得备份文件夹里按时间降序排列的前10个文件, 并删除掉
# ls -t | tail -n +10 | xargs -I {} rm -f ./{}/

  • memos 数据库文件将会备份到 /BACKUPFOLDER/Memos 路径下,并分别储存在当天日期 YYYY-MM-DD的子目录下,可按需修改。

  • 其中注释掉的部分 # ls -t | tail -n +10 | xargs -I {} rm -f ./{}:使用 ls 命令列出备份文件夹下的所有文件,按照创建时间从新到旧排序,只保留最新的 10 个文件,其他文件全部删除。可按自己需求选择性开启。

将这段代码储存为 backup_memos.sh 并上传到主机中,路径为/path/to/script/backup.sh,然后设置定期执行:

3.3.1 更改文件权限:

chmod 777 /path/to/script/backup.sh

3.3.2 如果还没有安装 cron 服务的话:

sudo apt-get update
sudo apt-get install cron

3.3.3 打开终端并使用以下命令编辑 crontab 文件:

crontab -e

3.3.4 在文件的末尾添加以下内容:

0 1 * * * /path/to/script/backup_memos.sh >/dev/null 2>&1

​ 上述代码将在每天 UTC 时间凌晨 01:00 运行 /path/to/script/backup.sh 脚本,并将标准输出和标准错误重定向到 /dev/null

3.3.5 保存更改并退出。现在,备份脚本每天都会在计划的时间运行一次。


back to ⬅️notes⬆️top