前天晚上的时候,我的 Halo 博客突然就崩溃了。。。当时就看服务器,发现服务器宕机了,CPU 达到 99%。然后我试着重启我的 Halo 博客,可是却是不行。。。。看着我的 1核1G 的服务器,满脸的忧伤。但是想想我的服务器也快到期了,正好也趁着这个月是服务器采购季,我一不做二不休,去买了一个华为云服务器。薅了一个 2核4G 的服务器3年,看这个配置比之前的好了接近一倍的我,老脸终于浮上了菊花般的笑容。
可是这笑容却没有持续多久,因为我还要转移我的博客😪。转眼一想,好吧,也不困难。
## 首先开始搭建环境
之前我的博客是直接通过`java -jar halo.jar`来运行的,这种方式很麻烦,每次需要自己上传到,还要手动运行。实在是麻烦啊,所以这次我就用了 docker 部署。那么第一步就是要安装 Docker
### 安装 Docker
首先说明一下的服务器环境:
- 系统:Centos 7
- 内存:4G
这次安装 Docker 是按照官网的步骤一步一步操作,能安装成功,我这边的环境是能够安装成功的。
这里先附上 Centos 安装 Docker 的官方地址:https://docs.docker.com/install/linux/docker-ce/centos/
为了节省再打开一次网页的时间,下面我就讲所有的步骤贴出来
#### SET UP THE REPOSITORY
1. 安装必要的包
```shell
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
```
2. 设置稳定的仓库
```shell
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
```
#### INSTALL DOCKER ENGINE - COMMUNITY
```shell
sudo yum install docker-ce docker-ce-cli containerd.io
```
#### Start Docker
```shell
sudo systemctl start docker
```
#### Stop Docker
```shell
sudo systemctl stop docker
```
### 使用国内镜像
众所周知,如果要使用 Docker 的官方镜像源,那么下载一个 `image` 不知道要等到猴年马月,反正我是等不了的。为了节省我的时间,也为了节省在座各位的时间,还是聪明的使用一个国内镜像源吧。注意:本文使用的163的Docke镜像源。
1. 打开或创建配置文件
```shell
sudo vim /etc/docker/daemon.json
```
2. 在配置文件中新增配置
```shell
"registry-mirrors": [
"https://hub-mirror.c.163.com"
]
# 如果有了 registry-mirrors 这个key,直接新增https://hub-mirror.c.163.com 这个源就可以了
```
3. 重启 Docker
```shell
systemctl restart docker
```
后面使用Docker安装镜像就非常快了,敬请享用吧。
### 安装 Halo
至于安装 Halo ,当然也是按照 [官方文档](https://halo.run/archives/install-with-docker)来安装的,同样的,为了节省大家的时间,本文直接说步骤。
**由于是转移 Halo, 所以需要在服务器的用户目录下新建一个 `.halo`的文件夹。一般的命令是 `mkdir ~/.halo`**
#### 拉取 application.yml
这一步,由于是转移博客所以,这个文件是之前就有的,我是从旧的服务器上面 直接传到 新的服务器的 `.halo`目录下。
可以通过 ftp 工具转移,由于过于简单这里就不说了。我们来说说 SCP 命令。
```shell
scp root@服务器ip:/root/.halo/application.yml /root/.halo/application.yml
```
#### 拉取最新 Halo 镜像
```shell
sudo docker pull ruibaby/halo
```
#### 创建容器并运行
```shell
docker run --rm -it -d --name halo -p 8080:8080 -v ~/.halo:/root/.halo ruibaby/halo
```
1. --rm:停止之后自动删除容器。
2. --name:容器名。
3. -p:占用端口,前者为宿主机端口,后者为 Halo 的运行端口,可在
`application.yaml` 配置。
4. -v:目录映射,一般不要修改。
至此,我们的 Halo 就已经安装好了,其实还有一步就是更新 Halo,我还是贴一下命令:
```shell
# 停止容器
sudo docker stop halo
# 拉取最新的 Halo 镜像
sudo docker pull ruibaby/halo
# 创建容器
docker run --rm -it -d --name halo -p 8080:8080 -v ~/.halo:/root/.halo ruibaby/halo
```
## 安装MySQL
Halo 博客推荐使用 H2 数据库,但是爱捣鼓的我,怎么能满足一个H2 呢?于是我果断的使用了 MySQL。
安装 MySQL 我已经有了一篇文章,各位直接看已经写了的这篇文章。
[Centos 环境中使用 Docker 安装 MySQL 指南](https://baozi.fun/archives/docker-install-mysql)
通过这篇文章也说了如何迁移数据库
### 迁移数据库
在上面给出的文章中,我详细讲了 如何迁移 Docker 中的MySQL数据库,也就是下面的步骤:
```shell
# 导出数据库称为一个 sql
docker exec -it mysql-dev mysqldump -uroot -p123456 halodb > /opt/sql_bak/halodb.sql
# 将需要执行的sql cp 到目标容器,也就是下面:mysql-dev
docker cp /opt/sql_bak/halodb.sql mysql-dev:/opt/halodb.sql
# 进入目标容器
docker exec -it mysql-dev /bin/bash
# 登陆mysql
mysql -uroot -p123456
# 创建数据库
create database halodb;
# 使用 halodb
use halodb;
# 执行 sql
source /opt/halodb.sql
```
### 修改application.yml
既然这里要使用MySQL,而上文配置的`application.yml`中的数据库连接却是使用的`H2`数据库,那么这里就需要修改`application.yml`中的数据库连接。

上图中的配置其实和官网的差不太多,我们需要修改的只有`url、username、password `这三个属性,只要更具实际情况修改就可以了。
```yaml
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
# MySQL 配置,如果你需要使用 H2Database,请注释掉该配置并取消注释上方 H2Database 的配置。
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://172.17.0.2:3306/halodb?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username: root
password: 123456
```
#### 注意
如果你的`MySQL`和`halo` 都是使用`Docker`部署的,那么`spring.database.url`这个属性中的数据库 `ip地址`必须要是容器的内部ip。
我们可以通过下面的指令获取容器的ip:
```shell
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-prod
```
## 迁移主题文件夹和上传文件
这一步比较简单,我们只需要将旧服务器`~/.halo`文件夹下除`logs/`文件夹以外的所有内容复制到新服务器的`~/.halo`文件夹。
## 配置 Nginx
之前写过一篇配置 Nginx 的文章,因为都是 Unix 系统,所以这篇文章在 本次迁移也是适用的。
[我是如何在服务器上配置nginx的](https://baozi.fun/archives/how-to-configure-nginx-on-server)
## 配置 HTTPS
配置好了之后,就是需要配置 HTTPS 了。
我的 HTTPS 还是使用 [Certbot](https://certbot.eff.org/)配置的。
之前写了一篇文章, [使用Certbot升级Http到Https](https://baozi.fun/archives/certbot-upgrade-http-2-https),但是这篇文章是在 Ubuntu 下安装,我今天使用的 Centos ,所以还是需要贴一下步骤的。
### Enable the optional channel
```shell
yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional
```
### Install Certbot
```shell
yum install certbot python2-certbot-nginx
```
### 配置nginx
```shell
sudo certbot --nginx
```
在这一步的时候,我遇到了报错:

开始报错是因为没有停止 nginx,于是我执行了 `nginx -s stop`。但是还是报错,于是我 google 了。
> 不管是够报这个错,使用 certbot 都需要先停止 nginx
这个报错我在网上搜索到的结果是 `urllib3`安装不正确,所以我重新安装了 `urllib3`
```shell
pip uninstall urllib3
pip install urllib3
```

上面提示成功后,我又重新执行了`certbot --nginx`,但是还是报错`ImportError:No modelua named urllib3.exceptions`,于是我又执行了`pip install --upgrade --force-reinstall 'requests==2.6.0' urllib3`。

可以看到,上面执行了`pip install --upgrade --force-reinstall 'requests==2.6.0' urllib3`之后,提示安装成功了。
然后我执行了`certbot --nginx`命令,但是还是报错:

这个错误的原因是找不到 nginx 命令,一直我创建了 nginx 的软连接。
```shell
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
ln -s /usr/local/nginx/conf/ /etc/nginx
```
最后一次,我直接执行`certbot certonly --nginx`命令,然后终于成功了。

接下来就是在 `nginx.conf`上配置 HTTPS了,在上文中我们就有讲述了,这里就不说了。
## 结语
好了,至此,我的迁移 Halo 博客圆满完成了,现在已经迁移到了新的服务器。中途虽然遇到了一些问题,但幸运的是么有数据的丢失。
Halo 博客迁移日记