博客搬家记
起因
原先的博客运行在我的Windows笔记本上,因为平时不怎么用该笔记本,传输文件都用ToDesk,不是很方便。更重要的是,如果哪天它坏掉了,那我就得重新配置一次环境,还要重新配置一次Hexo。环境还是小事,Windows备份也麻烦,如果哪天磁盘坏了,写过的博客就整个不见了。
总之,想着不能让我的博客绑定在这个Windows笔记本上。痛定思痛😭,决定将其整个环境搬迁到Docker当中。
迁移过程
服务器的选择
因为:
- 需要配置Docker以及Node.js环境,我不想在自己笔记本上装太多东西。
- 需要让女友也能将博客上传。
所以我选择将Hexo博客运行在一个服务器上。搜索了一圈,发现阿里云天工开物计划可以白嫖服务器。配置还不错:
- 2核CPU
- 2G内存
- 50G硬盘
- 每月20G免费流量
- 自带公网IP
最重要的是免费,还是包年的。于是我打算把Hexo部署在上面。
领取的方法可见《如何白嫖阿里云服务器?》
打包Hexo博客
迁移的第一步就是把原先的博客整个打包,我把整个Hexo博客都存在了一个Blog文件夹下,所以只需要把这个文件夹压缩就好了。
除了写的博客以外,另一个需要迁移的就是Hexo的环境。主要就是git
、Node.js
这两个。前者没有什么需要迁移的,而后者要迁移的就是npm
安装的包。
想要看到npm
底下安装了什么,只需要运行
1 | npm list |
我就安装了这些:
1 | +-- hexo-abbrlink@2.2.1 |
把这些信息整理好之后就可以开始正式迁移了
配置环境
安装Docker
只需要在服务器上先安装Docker,之后的环境就在Docker里面配置。Docker的安装,参考这个博客。
简而言之就是:
1 | #安装前先卸载操作系统默认安装的docker, |
这里是一些解释,可以直接跳过不看:
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.gpgGPG 密钥用于确保数据的安全性和完整性,以及验证数据的发送者身份。
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 | # Node.js作为基础镜像 |
这里主要执行了以下几步:
- 把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 |
|
我给我的博客设置了一些自动化,所以/app/Volumn/scripts/start.sh
脚本最后启动了一个Python程序。定期到/app/Volumn/Articles
中检查我有没有新的文章,并帮我自动发布。
SMB文件服务器配置
SMB的配置又是一件麻烦事情,本来以为是最简单的事情。因为Mac的Finder可以通过SMB将文件上传到服务器,我想上传到/app/Volumn/Articles
中,这样就能让脚本帮我自动发布文章了。
服务器端配置
参考这篇文章
首先先要在服务器端安装 Samba
1 | apt install samba |
然后启动Samba并看其的运行状态:
1 | systemctl start smb nmb //启动服务器 |
然后需要去更改Samba的配置文件,添加你想要共享的文件夹
1 | nano /etc/samba/smb.conf |
在配置文件最下面添加
1 | [common] |
[common]
里的common
代表共享出去的名字,起一个自己喜欢的就好,比如我写的就是[hexo]
comment
是注释,不怎么需要管
path = /home/samba
是你要共享的文件夹的路径。注意!这里要特别注意这个路径上所有文件夹的权限。比如我之前想共享/root
文件夹下的一个文件夹,但是这个文件夹是只有root用户才能查看的。Samba就不能打开这个文件夹,就会报错。路径上的文件夹,起码要给其他用户r
和x
的权限,这样Samba才能列出这个文件夹下有哪些文件夹。才能通过路径一步步找到你想共享的文件夹。最好就是共享普通用户的文件夹。并设置类似chmod 777
或者chmod 755
这样的权限。
1
2
3 browseable = yes
guest ok = no
writable = yes这几条指令意思是可读、不允许游客访问(一定要登录)、可修改
然后要记得创建path
所指向的文件夹(或者预先存在也可以)
1 | mkdir /home/samba //建立文件夹 |
这样就能建立一个共享文件夹啦。
然后需要添加一个用户,这里不给他通过其他方式登录-s /sbin/nologin
,让其只作为其他人共享文件夹所需要输入的账户密码。
1 | useradd -s /sbin/nologin sambauser //创建账户 |
阿里云服务器需要的特别配置
因为139和445端口是网络攻击重灾区,所以阿里云的服务器默认封锁这两个端口,即使你想开也打不开。而SMB刚好需要这两个端口,所以需要去配置文件里改一个端口。还是在刚才的/etc/samba/smb.conf
,在里面[global]
下加入这一行smb ports=4455
。让SMB服务监听4455端口,以后客户端就用这个端口来访问服务器。
1 | [global] |
然后重启一下SMB服务
1 | sudo systemctl restart smb |
客户端配置
这里我用的是Mac,打开Finder,点击前往,连接服务器。然后输入smb://服务器ip地址:4455/common
,这里common
填写之前在配置文件添加的自己起的共享出去的名字。然后输入用户名密码,就可以连接成功了
结语
本来以为Docker是比较难配置的部分,没想到是SMB弄了我几个小时😡