将Hexo部署到云服务器
前言
2021 年 03 月 27 日重新更新此篇文章,至于为什么,大概因为昨天晚上 vercel 网络出现了波动,导致我的 cdn 无法进行回源,最终导致博客打不开。因此决定将博客同时部署到服务器做 cdn 的回源途径。多一份部署多一份保障🤭
快速开始
全程图文预警
上一次部署使用的方式是宿主机安装 nginx 开启静态服务器的方式,这次为了方便,决定使用
docker
+docker-compose
的方式进行安装 nginx。
本次教程使用的服务器环境为阿里轻量云+CentOS 7.6
安装 git(如果有则不需要安装)
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel -y
yum install -y git
安装完成后通过git --version
命令即可查看 git 当前版本,即代表成功。
创建裸露仓库
// 创建用户
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
写入钩子
cd hexo_blog.git/hooks
// 创建 hook 钩子函数,输入了内容如下
vi post-receive
输入以下的命令
#!/bin/sh
git --work-tree=/home/git/projects/hexo_blog --git-dir=/home/git/repos/hexo_blog.git checkout -f
写入后添加可执行权限
// 为刚才的文件添加可执行的权限
chmod +x post-receive
// 退出到 root 登录
exit
// 添加权限
chown -R git:git /home/git/repos/hexo_blog.git
测试能否正常 clone
在自己电脑上找一个空的文件夹输入如下命令:
git clone git@server_ip:/home/git/repos/hexo_blog.git
正常情况下会出现上图的情况,即代表成功了。
建立 SSH 关系,实现免密
新建一个 ssh 证书,专门用于 git 推送使用。(你也可以直接使用你的 id_rsa(如果存在))
ssh-keygen -t rsa -C "这里换上你的邮箱"
按提示操作即可。注意如果你曾经有证书,记得重命名,不然会覆盖你以前的证书。
手动设置
// 切换到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
测试
如果你生成的证书没有按照默认流程(图片示例),那么需要你将你的证书移动到
C:\Users\dream\.ssh
目录,然后在config
文件新增如下:# 服务器认证 Host 你的服务ip HostName 你的服务ip IdentityFile ~\\.ssh\\私钥名称
如果你按照默认流程了,那么不需要此操作。
都配置完毕后输入
ssh git@服务器ip
如果能够免密登录即代表成功了,如果不能请用脑子在仔细看一遍这一部分的教程。
禁用 git 用户的 shell 权限
我测试安装完后自带了git-shell
,通过which git-shell
命令查看是否能显示出路径,如果不能则需要手动添加。
// 如果不是root用户请切换至root用户
su root
// 查看 git-shell 是否在登录方式里面
cat /etc/shells
// 查看是否安装
which git-shell
// 添加上2步显示出来的路劲,通常在 /usr/bin/git-shell
修改 /etc/passwd
中的权限
vi /etc/passwd
// 将原来的
git:x:1001:1001::/home/git:/bin/bash
// 修改为
git:x:1001:1001::/home/git:/bin/git-shell
hexo 配置
在配置文件添加上你的 git,每个人的配置可能不同,图片仅供参考。
示例:
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 私钥对用的公钥在服务器上,如果你按照我的流程重命名了,那么不会成功的!)
手动测试
进入
public
目录初始化仓库
命令三连
git add . git commit -m 'update' git push --force --all git@server_ip:/home/git/repos/hexo_blog.git
此时服务器中已经存在了文件
虽然现在很麻烦,但是后面我会介绍通过持续集成实现自动化构建并上传。那时你只需要 push 上你的源代码即可。
安装 Docker
安装 docker
curl -fsSL get.docker.com -o get-docker.sh sudo sh get-docker.sh --mirror Aliyun
启动 docker 服务
sudo systemctl enable docker sudo systemctl start docker
推荐操作
sudo groupadd docker sudo usermod -aG docker $USER
使用阿里云镜像加速(非大陆机器可忽略)
登录阿里容器镜像服务
查看加速地址
设置加速服务
创建目录
sudo mkdir -p /etc/docker
创建文件并写入内容
sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://lz2nib3q.mirror.aliyuncs.com"] } EOF
重新加载及重启 Docker 服务
sudo systemctl daemon-reload sudo systemctl restart docker
查看镜像地址
dokcer info
安装 docker-compose
由于国内机器直接下载 GitHub 的资源速度很慢。因此使用手动下载的方式。
进入GitHub进行下载
docker-compose-Linux-x86_64
将文件上传到
/usr/local/bin/
目录,并改名为docker-compose
赋予权限
sudo chmod +x /usr/local/bin/docker-compose
测试
docker-compose -v
配置 nginx
既然我们安装了 docker,那么我们的配置将会很简单。
下载蓝奏云文件,密码(ak1m)
将文件解压,并按照你自己的信息进行编辑
ssl 目录
存放你的网站证书,可以到腾讯云、阿里云、freessl 等平台进行申请。
nginx 目录
此目录存在 nginx 的相关配置,请按照注释修改相关配置
服务器上传这些文件(不是压缩包)
cd ~ mkdir blog
运行
docker-compose up -d
命令启动服务。然后使用docker-compose ps
命令查看服务是否正确运行。dns 解析。
通过 coding 自动部署
通过 coding 部署需要将我们的私钥放到环境变量里,但是 coding 的环境变量不会自动解析换行符,因此我们需要手动解析一下(也就是将换行变成\n
)。然后将其填入 coding 的环境变量。
简陋的在线转换地址:gitee Pages
在执行上传命令之前添加如下命令即可。
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_KEY
的Secrets
在进行上传操作时执行如下步骤:
- 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