前言

2021 年 03 月 27 日重新更新此篇文章,至于为什么,大概因为昨天晚上 vercel 网络出现了波动,导致我的 cdn 无法进行回源,最终导致博客打不开。因此决定将博客同时部署到服务器做 cdn 的回源途径。多一份部署多一份保障🤭

快速开始

全程图文预警

上一次部署使用的方式是宿主机安装 nginx 开启静态服务器的方式,这次为了方便,决定使用docker+docker-compose的方式进行安装 nginx。

本次教程使用的服务器环境为阿里轻量云+CentOS 7.6

安装 git(如果有则不需要安装)

1
2
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel -y
yum install -y git

安装完成后通过git --version命令即可查看 git 当前版本,即代表成功。

image-20210327101301179

创建裸露仓库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 创建用户
useradd git

// 设置密码
passwd git

// 切换用户
su git

// 进入git用户的家目录
cd /home/git/

// 项目存在的真实目录(当然你可以创建在其他地方)
mkdir -p projects/hexo_blog

// 创建文件夹
mkdir repos && cd repos

// 创建一个裸露的仓库
git init --bare hexo_blog.git

image-20210327101624787

写入钩子

1
2
3
cd hexo_blog.git/hooks
// 创建 hook 钩子函数,输入了内容如下
vi post-receive

输入以下的命令

1
2
#!/bin/sh
git --work-tree=/home/git/projects/hexo_blog --git-dir=/home/git/repos/hexo_blog.git checkout -f

写入后添加可执行权限

1
2
3
4
5
6
// 为刚才的文件添加可执行的权限
chmod +x post-receive
// 退出到 root 登录
exit
// 添加权限
chown -R git:git /home/git/repos/hexo_blog.git

测试能否正常 clone

在自己电脑上找一个空的文件夹输入如下命令:

1
git clone git@server_ip:/home/git/repos/hexo_blog.git

image-20210327102246035

正常情况下会出现上图的情况,即代表成功了。

建立 SSH 关系,实现免密

  1. 新建一个 ssh 证书,专门用于 git 推送使用。(你也可以直接使用你的 id_rsa(如果存在))

    1
    ssh-keygen -t rsa -C "这里换上你的邮箱"

    按提示操作即可。注意如果你曾经有证书,记得重命名,不然会覆盖你以前的证书。

    image-20210327102824405

  2. 手动设置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // 切换到git用户
    su git
    //进入家目录,如果没有.ssh目录,那么需要创建。如果存在直接进入即可
    cd ~
    //创建.ssh目录
    mkdir .ssh
    // 赋予权限
    chmod 700 .ssh/
    // 进入.ssh目录
    cd .ssh
    // 编辑一个名为authorized_keys的文件,并写入公钥(git_rsa.pub)内容
    vi authorized_keys
    // 添加完成后赋予权限
    chmod 600 authorized_keys

    image-20210327103047351

  3. 测试

    如果你生成的证书没有按照默认流程(图片示例),那么需要你将你的证书移动到C:\Users\dream\.ssh目录,然后在config文件新增如下:

    1
    2
    3
    4
    # 服务器认证
    Host 你的服务ip
    HostName 你的服务ip
    IdentityFile ~\\.ssh\\私钥名称

    image-20210327103710656

    如果你按照默认流程了,那么不需要此操作。

    都配置完毕后输入ssh git@服务器ip如果能够免密登录即代表成功了,如果不能请用脑子在仔细看一遍这一部分的教程。

    image-20210327103901579

禁用 git 用户的 shell 权限

我测试安装完后自带了git-shell,通过which git-shell命令查看是否能显示出路径,如果不能则需要手动添加。

image-20210327104350613

1
2
3
4
5
6
7
// 如果不是root用户请切换至root用户
su root
// 查看 git-shell 是否在登录方式里面
cat /etc/shells
// 查看是否安装
which git-shell
// 添加上2步显示出来的路劲,通常在 /usr/bin/git-shell

修改 /etc/passwd 中的权限

1
vi /etc/passwd
1
2
3
4
5
// 将原来的
git:x:1001:1001::/home/git:/bin/bash

// 修改为
git:x:1001:1001::/home/git:/bin/git-shell

hexo 配置

在配置文件添加上你的 git,每个人的配置可能不同,图片仅供参考。

image-20210327104911059

示例:

1
2
3
4
5
6
7
deploy:
- type: baidu_url_submitter # 百度
- type: baidu_xz_url_submitter # 百度熊掌号
- type: git
repository:
server: git@server_ip:/home/git/repos/hexo_blog.git
branch: master

配置完成后运行一次hexo d命令,看是否能成功推送。(使用此命令推送需要本地 id_rsa 私钥对用的公钥在服务器上,如果你按照我的流程重命名了,那么不会成功的!)

手动测试

  1. 进入public目录

  2. 初始化仓库

  3. 命令三连

    1
    2
    3
    git add .
    git commit -m 'update'
    git push --force --all git@server_ip:/home/git/repos/hexo_blog.git

    image-20210327105822053

  4. 此时服务器中已经存在了文件

    image-20210327110317070

虽然现在很麻烦,但是后面我会介绍通过持续集成实现自动化构建并上传。那时你只需要 push 上你的源代码即可。

安装 Docker

  1. 安装 docker

    1
    2
    curl -fsSL get.docker.com -o get-docker.sh
    sudo sh get-docker.sh --mirror Aliyun

    image-20210327095433092

  2. 启动 docker 服务

    1
    2
    sudo systemctl enable docker
    sudo systemctl start docker
  3. 推荐操作

    1
    2
    sudo groupadd docker
    sudo usermod -aG docker $USER

    image-20210327095647687

  4. 使用阿里云镜像加速(非大陆机器可忽略)

    1. 登录阿里容器镜像服务

    2. 查看加速地址

      image-20210227190110321

    3. 设置加速服务

      • 创建目录

        1
        sudo mkdir -p /etc/docker
      • 创建文件并写入内容

        1
        2
        3
        4
        5
        sudo tee /etc/docker/daemon.json <<-'EOF'
        {
        "registry-mirrors": ["https://lz2nib3q.mirror.aliyuncs.com"]
        }
        EOF
      • 重新加载及重启 Docker 服务

        1
        2
        sudo systemctl daemon-reload
        sudo systemctl restart docker
    4. 查看镜像地址

      1
      dokcer info

      image-20210327100102166

安装 docker-compose

由于国内机器直接下载 GitHub 的资源速度很慢。因此使用手动下载的方式。

  1. 进入GitHub进行下载docker-compose-Linux-x86_64

  2. 将文件上传到 /usr/local/bin/ 目录,并改名为 docker-compose

    image-20210327100914341

  3. 赋予权限

    1
    sudo chmod +x /usr/local/bin/docker-compose
  4. 测试

    1
    docker-compose -v

    image-20210327100958402

配置 nginx

既然我们安装了 docker,那么我们的配置将会很简单。

  1. 下载蓝奏云文件,密码(ak1m)

  2. 将文件解压,并按照你自己的信息进行编辑

    • ssl 目录

      存放你的网站证书,可以到腾讯云、阿里云、freessl 等平台进行申请。

    • nginx 目录

      此目录存在 nginx 的相关配置,请按照注释修改相关配置

  3. 服务器上传这些文件(不是压缩包)

    1
    2
    cd ~
    mkdir blog

    image-20210327113346229

  4. 运行docker-compose up -d命令启动服务。然后使用docker-compose ps命令查看服务是否正确运行。

    image-20210327113622914

  5. dns 解析。

    image-20210327113645222

通过 coding 自动部署

通过 coding 部署需要将我们的私钥放到环境变量里,但是 coding 的环境变量不会自动解析换行符,因此我们需要手动解析一下(也就是将换行变成\n)。然后将其填入 coding 的环境变量。

简陋的在线转换地址:gitee Pages

image-20210327145311021

在执行上传命令之前添加如下命令即可。

1
2
3
4
5
mkdir -p ~/.ssh/
echo "${HEXO_DEPLOY_PRIVATE_KEY}" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
cat ~/.ssh/id_rsa
ssh-keyscan 你的服务器ip地址 >> ~/.ssh/known_hosts

通过 GitHub Actions 自动部署

GitHub 的密钥支持换行符,不需要进行转化,直接粘贴即可。新加一个名称为 HEXO_DEPLOY_PRIVATE_KEYSecrets

在进行上传操作时执行如下步骤:

1
2
3
4
5
6
7
8
- name: Setup Deploy Private Key
env:
HEXO_DEPLOY_PRIVATE_KEY: ${{ secrets.HEXO_DEPLOY_PRIVATE_KEY }}
run: |
mkdir -p ~/.ssh/
echo "$HEXO_DEPLOY_PRIVATE_KEY" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan 服务器ip >> ~/.ssh/known_hosts