起因

原先的博客运行在我的Windows笔记本上,因为平时不怎么用该笔记本,传输文件都用ToDesk,不是很方便。更重要的是,如果哪天它坏掉了,那我就得重新配置一次环境,还要重新配置一次Hexo。环境还是小事,Windows备份也麻烦,如果哪天磁盘坏了,写过的博客就整个不见了。

总之,想着不能让我的博客绑定在这个Windows笔记本上。痛定思痛😭,决定将其整个环境搬迁到Docker当中。

迁移过程

服务器的选择

因为:

  1. 需要配置Docker以及Node.js环境,我不想在自己笔记本上装太多东西。
  2. 需要让女友也能将博客上传。

所以我选择将Hexo博客运行在一个服务器上。搜索了一圈,发现阿里云天工开物计划可以白嫖服务器。配置还不错:

  1. 2核CPU
  2. 2G内存
  3. 50G硬盘
  4. 每月20G免费流量
  5. 自带公网IP

最重要的是免费,还是包年的。于是我打算把Hexo部署在上面。

领取的方法可见《如何白嫖阿里云服务器?》

打包Hexo博客

迁移的第一步就是把原先的博客整个打包,我把整个Hexo博客都存在了一个Blog文件夹下,所以只需要把这个文件夹压缩就好了。

除了写的博客以外,另一个需要迁移的就是Hexo的环境。主要就是gitNode.js这两个。前者没有什么需要迁移的,而后者要迁移的就是npm安装的包。

想要看到npm底下安装了什么,只需要运行

1
npm list

我就安装了这些:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
+-- hexo-abbrlink@2.2.1
+-- hexo-deployer-git@4.0.0
+-- hexo-generator-archive@2.0.0
+-- hexo-generator-category@2.0.0
+-- hexo-generator-index@3.0.0
+-- hexo-generator-search@2.4.3
+-- hexo-generator-tag@2.0.0
+-- hexo-lazyload-image@1.0.13
+-- hexo-math@5.0.0
+-- hexo-renderer-ejs@2.0.0
+-- hexo-renderer-kramed@0.1.4
+-- hexo-renderer-mathjax@0.6.0
+-- hexo-renderer-pug@3.0.0
+-- hexo-renderer-stylus@3.0.1
+-- hexo-server@3.0.0
+-- hexo-theme-landscape@1.0.0
`-- hexo@7.2.0

把这些信息整理好之后就可以开始正式迁移了

配置环境

安装Docker

只需要在服务器上先安装Docker,之后的环境就在Docker里面配置。Docker的安装,参考这个博客

简而言之就是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#安装前先卸载操作系统默认安装的docker,
sudo apt-get remove docker docker-engine docker.io containerd runc

#安装必要支持
sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release

# 阿里源(推荐使用阿里的gpg KEY)
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

#阿里apt源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

#更新源
sudo apt update

#安装最新版本的Docker
sudo apt install docker-ce docker-ce-cli containerd.io

这里是一些解释,可以直接跳过不看:

1
sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release

apt-transport-https:用于通过 HTTPS 协议来传输软件包的工具,确保软件包下载的安全性。

ca-certificates:包含证书颁发机构(CA)的证书,用于验证 HTTPS 连接的安全性。

curl:一个用于从服务器传输数据的命令行工具,常用于下载文件。

software-properties-common:提供了一些用于管理软件源和软件属性的通用工具。

gnupg:GNU Privacy Guard,用于处理 GPG(GNU Privacy Guard)密钥,用于验证软件包的签名。

lsb-release:用于获取系统的发行版信息,如 Ubuntu 的版本代号等。

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

GPG 密钥用于确保数据的安全性和完整性,以及验证数据的发送者身份。

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

这条命令的作用是为当前的 Ubuntu 系统配置阿里云的 Docker CE 软件源,以便通过 apt 命令方便地安装和更新 Docker 相关软件包

1
sudo apt install docker-ce docker-ce-cli containerd.io

安装 Docker 相关的软件包,包括 Docker Engine(docker-ce)、Docker 命令行工具(docker-ce-cli)和容器运行时(containerd.io)。通过执行这条指令,可以在系统中安装 Docker,以便进行容器化应用的部署和管理。

配置Hexo运行环境

因为是在Docker中运行Hexo,所以在Docker里配置Hexo环境。Docker入门可以参考这篇文章

虽然可以先启动一个镜像(可以看成迷你虚拟机),再在这个迷你虚拟机里配置环境。但是这样可重复性就比较差,所以我采用编写Dockerfile的形式来配置环境(可以把Dockerfile看成包含要在迷你虚拟机里执行的一系列指令的文本文件)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# Node.js作为基础镜像
FROM node:16.15.0

# 设置阿里云镜像源(Debian系统)
RUN sed -i 's|http://deb.debian.org/debian|http://mirrors.aliyun.com/debian|g' /etc/apt/sources.list && \
sed -i 's|http://security.debian.org/debian-security|http://mirrors.aliyun.com/debian-security|g' /etc/apt/sources.list

# 安装Git
RUN apt-get update && apt-get install -y git

# 创建工作目录
WORKDIR /app

# Hexo配置
# 全局安装Hexo CLI
RUN npm install -g hexo-cli
# 安装其他插件
RUN npm install hexo-deployer-git --save
RUN npm install hexo-abbrlink hexo-generator-search hexo-lazyload-image hexo-math hexo-renderer-kramed hexo-renderer-mathjax hexo-renderer-pug --save

# Python配置
# 安装Python
RUN apt-get update && apt-get install -y python3 python3-pip

# SSH配置
# 生成 SSH 密钥
RUN ssh-keygen -t rsa -b 4096 -C "3376263696@qq.com" -f /root/.ssh/id_rsa -N ""
# 将GitHub的SSH主机密钥添加到容器的known_hosts文件中
RUN ssh-keyscan github.com >> /root/.ssh/known\_hosts

# 暴露服务端口(本地预览用)
EXPOSE 4000

# 执行脚本开始部署,把./Volumn挂载到/app下
CMD ["bash","/app/Volumn/scripts/start.sh"]

这里主要执行了以下几步:

  • 把apt换到阿里云,默认源是国外的,阿里云服务器访问不了。
  • 安装git、Node.js
  • 安装Hexo需要用到的一系列插件
  • 安装Python以及pip(可选,因为我用脚本自动化发布博客)
  • 配置SSH,并信任GitHub网站(要不然没法git pull将博客发布到网站上)
  • 设置了镜像启动时运行脚本

然后就构建镜像

1
docker build -t hexo-blog .

意思是在当前文件夹下,用./Dockerfile来构建名为hexo-blog的镜像

构建完毕之后就可以启动镜像了

Docker启动!

拷贝SSH公钥

首先需要用以下方式启动制作好的镜像。

1
docker run -v ./Volumn:/app/Volumn -it hexo-blog bash

-v ./Volumn:/app/Volumn意思是将./Volumn文件夹(不包含Volumn文件夹)整个同步到容器(运行起来的镜像,相当于代码和进程之间的关系)的/app/Volumn下。之后对./Volumn中的任何修改都会同步到Docker容器中,反之亦然。我在./Volumn下面放了我打包过来的Blog文件夹,还有一些脚本,方便我上传博客。

另外,-it hexo-blog bash意思是交互式启动hexo-blog镜像,然后用bash命令代替之前写的CMD ["bash","/app/Volumn/scripts/start.sh"]。因为这里要进去拷贝镜像中的SSH公钥,放到github的setting中。这样才能用SSH的方式来执行git pull(也就是hexo d)。

注意这里是先把./Volumn同步到/app/Volumn,再执行命令(CMD里设置的命令)。并且./Volumn会覆盖原来/app/Volumn中的所有内容。之前不知道还踩坑了😭

通过以下命令就能得到SSH公钥

1
cat /root/.ssh/id_rsa.pub

然后把公钥放到github的setting中。

正式启动Docker

拷贝完之后用以下方式就可以启动博客

1
docker run -v ./Volumn:/app/Volumn -d hexo-blog

-d参数表示后台执行(Docker你自己去执行自己的吧!我不管你啦!)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
git config --global --add safe.directory /app/Volumn/Blog/.deploy_git

cd /app/Volumn

cd ./Blog
hexo clean
hexo generate
hexo deploy

# 执行脚本
cd ../
cd ./scripts
# 安装依赖
pip3 install -r requirements.txt
python3 ./main.py

我给我的博客设置了一些自动化,所以/app/Volumn/scripts/start.sh脚本最后启动了一个Python程序。定期到/app/Volumn/Articles中检查我有没有新的文章,并帮我自动发布。

SMB文件服务器配置

SMB的配置又是一件麻烦事情,本来以为是最简单的事情。因为Mac的Finder可以通过SMB将文件上传到服务器,我想上传到/app/Volumn/Articles中,这样就能让脚本帮我自动发布文章了。

服务器端配置

参考这篇文章

首先先要在服务器端安装 Samba

1
apt install samba

然后启动Samba并看其的运行状态:

1
2
systemctl start smb nmb //启动服务器
systemctl status smb nmb //查看服务器状态

然后需要去更改Samba的配置文件,添加你想要共享的文件夹

1
nano /etc/samba/smb.conf

在配置文件最下面添加

1
2
3
4
5
6
[common]
comment = Common share
path = /home/samba
browseable = yes
guest ok = no
writable = yes

[common]里的common代表共享出去的名字,起一个自己喜欢的就好,比如我写的就是[hexo]

comment是注释,不怎么需要管

path = /home/samba是你要共享的文件夹的路径。注意!这里要特别注意这个路径上所有文件夹的权限。比如我之前想共享/root文件夹下的一个文件夹,但是这个文件夹是只有root用户才能查看的。Samba就不能打开这个文件夹,就会报错。路径上的文件夹,起码要给其他用户rx的权限,这样Samba才能列出这个文件夹下有哪些文件夹。才能通过路径一步步找到你想共享的文件夹。最好就是共享普通用户的文件夹。并设置类似chmod 777或者chmod 755这样的权限。

1
2
3
browseable = yes				
guest ok = no
writable = yes

这几条指令意思是可读、不允许游客访问(一定要登录)、可修改

然后要记得创建path所指向的文件夹(或者预先存在也可以)

1
2
mkdir /home/samba    //建立文件夹
chmod 777 /home/samba //授权

这样就能建立一个共享文件夹啦。

然后需要添加一个用户,这里不给他通过其他方式登录-s /sbin/nologin,让其只作为其他人共享文件夹所需要输入的账户密码。

1
2
useradd -s /sbin/nologin sambauser  //创建账户
smbpasswd -a sambauser //添加账户,然后输入你的密码并确认密码

阿里云服务器需要的特别配置

因为139和445端口是网络攻击重灾区,所以阿里云的服务器默认封锁这两个端口,即使你想开也打不开。而SMB刚好需要这两个端口,所以需要去配置文件里改一个端口。还是在刚才的/etc/samba/smb.conf,在里面[global]下加入这一行smb ports=4455。让SMB服务监听4455端口,以后客户端就用这个端口来访问服务器。

1
2
3
4
5
6
7
8
9
10
[global]

## Browsing/Identification ###

# Change this to the workgroup/NT-domain name your Samba server will part of
workgroup = WORKGROUP

# server string is the equivalent of the NT Description field
server string = %h server (Samba, Ubuntu)
smb ports=4455

然后重启一下SMB服务

1
sudo systemctl restart smb

客户端配置

这里我用的是Mac,打开Finder,点击前往,连接服务器。然后输入smb://服务器ip地址:4455/common,这里common填写之前在配置文件添加的自己起的共享出去的名字。然后输入用户名密码,就可以连接成功了

结语

本来以为Docker是比较难配置的部分,没想到是SMB弄了我几个小时😡