Halo 博客迁移日记

Halo 博客迁移日记

前天晚上的时候,我的 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. 安装必要的包
sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2
  1. 设置稳定的仓库
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

INSTALL DOCKER ENGINE - COMMUNITY

sudo yum install docker-ce docker-ce-cli containerd.io

Start Docker

sudo systemctl start docker

Stop Docker

sudo systemctl stop docker

使用国内镜像

众所周知,如果要使用 Docker 的官方镜像源,那么下载一个 image 不知道要等到猴年马月,反正我是等不了的。为了节省我的时间,也为了节省在座各位的时间,还是聪明的使用一个国内镜像源吧。注意:本文使用的163的Docke镜像源。

  1. 打开或创建配置文件

    sudo vim /etc/docker/daemon.json
    
  2. 在配置文件中新增配置

    "registry-mirrors": [
        "https://hub-mirror.c.163.com"
      ]
    # 如果有了 registry-mirrors 这个key,直接新增https://hub-mirror.c.163.com 这个源就可以了
    
  3. 重启 Docker

    systemctl restart docker
    

后面使用Docker安装镜像就非常快了,敬请享用吧。

安装 Halo

至于安装 Halo ,当然也是按照 官方文档来安装的,同样的,为了节省大家的时间,本文直接说步骤。

由于是转移 Halo, 所以需要在服务器的用户目录下新建一个 .halo的文件夹。一般的命令是 mkdir ~/.halo

拉取 application.yml

这一步,由于是转移博客所以,这个文件是之前就有的,我是从旧的服务器上面 直接传到 新的服务器的 .halo目录下。

可以通过 ftp 工具转移,由于过于简单这里就不说了。我们来说说 SCP 命令。

scp root@服务器ip:/root/.halo/application.yml /root/.halo/application.yml

拉取最新 Halo 镜像

sudo docker pull ruibaby/halo

创建容器并运行

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,我还是贴一下命令:

# 停止容器
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 指南

通过这篇文章也说了如何迁移数据库

迁移数据库

在上面给出的文章中,我详细讲了 如何迁移 Docker 中的MySQL数据库,也就是下面的步骤:

# 导出数据库称为一个 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中的数据库连接。

使用MySQL数据库

上图中的配置其实和官网的差不太多,我们需要修改的只有url、username、password这三个属性,只要更具实际情况修改就可以了。

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

注意

如果你的MySQLhalo 都是使用Docker部署的,那么spring.database.url这个属性中的数据库 ip地址必须要是容器的内部ip。

我们可以通过下面的指令获取容器的ip:

docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-prod

迁移主题文件夹和上传文件

这一步比较简单,我们只需要将旧服务器~/.halo文件夹下除logs/文件夹以外的所有内容复制到新服务器的~/.halo文件夹。

配置 Nginx

之前写过一篇配置 Nginx 的文章,因为都是 Unix 系统,所以这篇文章在 本次迁移也是适用的。

我是如何在服务器上配置nginx的

配置 HTTPS

配置好了之后,就是需要配置 HTTPS 了。

我的 HTTPS 还是使用 Certbot配置的。

之前写了一篇文章, 使用Certbot升级Http到Https,但是这篇文章是在 Ubuntu 下安装,我今天使用的 Centos ,所以还是需要贴一下步骤的。

Enable the optional channel

yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional

Install Certbot

yum install certbot python2-certbot-nginx

配置nginx

sudo certbot --nginx

在这一步的时候,我遇到了报错:

certbot --nginx 报错

开始报错是因为没有停止 nginx,于是我执行了 nginx -s stop。但是还是报错,于是我 google 了。

不管是够报这个错,使用 certbot 都需要先停止 nginx

这个报错我在网上搜索到的结果是 urllib3安装不正确,所以我重新安装了 urllib3

pip uninstall urllib3
pip install urllib3

image-20200308231857883

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

image-20200308232136758

可以看到,上面执行了pip install --upgrade --force-reinstall 'requests==2.6.0' urllib3之后,提示安装成功了。

然后我执行了certbot --nginx命令,但是还是报错:

certbot --nginx

这个错误的原因是找不到 nginx 命令,一直我创建了 nginx 的软连接。

ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
ln -s /usr/local/nginx/conf/ /etc/nginx

最后一次,我直接执行certbot certonly --nginx命令,然后终于成功了。

certbot certonly --nginx

接下来就是在 nginx.conf上配置 HTTPS了,在上文中我们就有讲述了,这里就不说了。

结语

好了,至此,我的迁移 Halo 博客圆满完成了,现在已经迁移到了新的服务器。中途虽然遇到了一些问题,但幸运的是么有数据的丢失。

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://baozi.fun/archives/halo-blog-transfer

Buy me a cup of coffee ☕.