Hexo博客部署vps教程

由于近期网站域名被墙无法访问,就干脆也整理一份教程出来,帮大家少走弯路,以下教程均在阿里云服务器docker中部署,无需docker部署的也可参考Heo作者的Hexo博客部署到VPS教程,也蛮详细的

一、部署方案

整个Hexo部署VPS流程:

  • 方案一:

    将 Hexo 项目上传到 VPS 上面后执行 hexo server,之后配置 Nginx 反向代理,让域名指向http://localhost:4000

  • 方案二:

    将 Hexo 在本地通过 hexo generate 生成静态文件,在通过 hexo deploy部署到 VPS 上面,使用 Nginx 直接做 Web 服务器

  • 对比:

    相比两种方案,方案一每次写博客与更新博客时候的操作会很繁琐。所以我们使用方案二进行部署,这样既可以将静态文件 deploy 到 VPS 上,也可以上传到 Github 上用作备份,操作性和安全性上都要胜于前者,而对于方案二常用的又有git hookrsync两种自动部署解决方案,本文主要介绍 git hook 部署过程

自动部署方案 优点 缺点
git hook 集成在Git版本控制流程中,无需额外配置。 可以执行更复杂的自定义脚本,例如运行测试、代码质量检查等 依赖于Git版本控制,不适合非Git环境。 可能需要编写更多的自定义脚本来实现复杂的部署流程
rsync 可以在任何环境下工作,不限于版本控制系统。 可以同步整个目录或特定文件,简单易用。 可以使用ssh等安全方式进行同步,传输安全 不能直接集成到Git提交流程中,需要额外的触发机制。 可能不适合需要版本控制的场景,如代码部署。

Tips:如果你需要的是一个紧密集成到Git流程中的自动化部署解决方案,Git hooks可能更适合。如果你只是想简单地同步文件,rsync可能是更好的选择

二、Git Hooks 自动部署

部署原理:我们在本地编辑文本,然后使用 Git 远程部署到 VPS 的 Git 仓库。hexo d 命令实际上只 deploy 了本地的 public 文件夹,Git Hooks实际上就是当 Git 仓库收到最新的 push 时,将 Git 仓库接受到的内容复制到 VPS 上的网站目录内。相当于完成了手动将 public 文件夹复制到 VPS 的网站根目录里

1. 安装并配置Git

  • 安装Git并新增用户

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 1.安装git
    yum install git
    # 2.查看Git版本,若显示则说明安装成功
    git --version
    # 3.创建`git`用户
    adduser git
    # 4.为`git`用户新增密码(可选)
    passwd git

  • 给予新建用户权限

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 1.赋予权限并用vim编辑文件
    chmod 740 /etc/sudoers
    vim /etc/sudoers

    # 2.找到`sudoers`文件中的root下方添加`git ALL=(ALL) ALL`
    root ALL=(ALL) ALL
    + git ALL=(ALL) ALL

    # 3.保存后,修改回文件权限
    chmod 440 /etc/sudoers

  • 关闭git用户shell权限

    由于目前git用户可以通过ssh连接服务器进行各种操作,为了安全我们只需要让其能对仓库操作就可以了,不需要更大的权限,git-shell 可以让git用户每次一登录就自动退出

    1
    2
    3
    4
    5
    6
    # 1.用vim编辑文件
    vim /etc/passwd

    # 2.找到`passwd`文件中的`/bin/bash`替换成`/usr/bin/git-shel`
    git:x:1000:1000::/home/git:/usr/bin/git-shel

2. 初始化Git仓库

1
2
3
4
5
6
7
8
9
10
11
# 1.切换到git用户目录
cd /home/git
# 2.创建git仓库文件夹,以`blog.git`为例
mkdir blog.git
# 3.进入仓库目录
cd blog.git
# 4.使用--bare参数初始化为裸仓库,这样创建的仓库不包含工作区
git init --bare
# 5.创建目录并创建网站目录,以blog为例
cd /var/www/
mkdir blog

3. 配置SSH

  • 新增ssh连接密钥

    1
    2
    3
    4
    5
    6
    7
    8
    # 1.切换到git用户目录
    cd /home/git
    # 2.创建.ssh目录
    mkdir .ssh
    # 3.切换到ssh目录
    cd .ssh
    # 4.修改`authorized_keys`文件,将本地`id_rsa.pub`公钥内容加入
    vim authorized_keys
  • 修改用户组权限

    1
    2
    3
    4
    5
    6
    7
    # 1.修改用户组权限为`git:git`,命令:`chown -R 用户名.组名 /目录`
    chown -R git.git /home/git/blog.git/
    chown -R git.git /home/git/.ssh/
    chown -R git.git /var/www/blog/
    # 2.查看是否修改成功,确保以下目录的用户组权限为`git:git`
    ll /home/git/
    ll /var/www/

三、安装SafeLine

SafeLine,中文名 “雷池”,是一款简单好用, 效果突出的 Web 应用防火墙(WAF),可以保护 Web 服务不受黑客攻击。雷池通过过滤和监控 Web 应用与互联网之间的 HTTP 流量来保护 Web 服务。可以保护 Web 服务免受 SQL 注入XSS代码注入命令注入CRLF 注入ldap 注入xpath 注入RCEXXESSRF路径遍历后门暴力破解CC爬虫 等攻击,也可参考官方安装教程

1. 自动安装

1
2
# 以root权限执行在线安装,里面也可以自动安装上docker
bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/setup.sh)"

2. 替换docker镜像源

由于国内docker源可能无法下载镜像,可以替换/etc/docker/daemon.json中的镜像源,参考如下

1
2
3
4
5
6
7
8
9
{
"registry-mirrors":[
"https://cr.console.aliyun.com",
"https://mirror.ccs.tencentyun.com",
"https://docker.anyhub.us.kg",
"https://dockerhub.jobcher.com",
"https://dockerhub.icu"
]
}

3. 初始化管理员账户

1
2
3
4
5
6
7
# 首次登录初始化你的管理员账户
docker exec safeline-mgt resetadmin

# 以下为结果,需要记住password
[SafeLine] Initial username:admin
[SafeLine] Initial password:**********
[SafeLine] Done

4. 访问SafeLine

雷池安装成功以后,你可以打开浏览器访问 https://<safeline-ip>:9443/ 来使用雷池控制台,Tips:需要注意对9443的端口打开访问

5. 新增站点

image-20240906111745449

image-20240906112445226

四、安装Nginx

1. 安装镜像

1
2
3
4
# 1.拉取Nginx官方镜像
docker pull nginx
# 2.查看已下载的镜像
docker images

2. 创建挂载目录

以下都是为了方便docker中启动nginx时通过自定义的配置文件路径去加载

1
2
3
mkdir -p /home/nginx/conf
mkdir -p /home/nginx/html
mkdir -p /home/nginx/logs

3. 拷贝配置文件到宿主机

1
2
3
4
docker cp nginx:/etc/nginx/nginx.conf /home/nginx/conf/
docker cp nginx:/etc/nginx/conf.d/ /home/nginx/conf/conf.d
docker cp nginx:/usr/share/nginx/html/. /home/nginx/html/
docker cp nginx:/var/log/nginx/. /home/nginx/logs/

4. 删除临时Nginx容器

1
2
docker stop nginx
docker rm nginx

5. 重建Nginx容器

1
2
3
4
# 以自定配置路径的方式启动Nginx容器
docker run -p 80:80 -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/logs:/var/log/nginx -v /home/nginx/html:/usr/share/nginx/html -v /home/nginx/conf/conf.d:/etc/nginx/conf.d -v /etc/localtime:/etc/localtime --name nginx --restart=always -d nginx
# 查询是否启动成功
docker ps

6. 修改Nginx的配置

重点是以下的原Nginx的80端口需要换成8080,通过8080端口启动nginx,我这目前项目暂时只有一个就直接用8080放博客项目了,若有多个项目需要另外转发至对应端口

image-20240906120632568

7. 重启Nginx

1
2
3
4
5
6
# 1.查看运行的容器
docker ps
# 2.重载Nginx配置
docker exec <容器name> nginx -s reload
# 3.重启Nginx容器
docker restart nginx

五、配置Hexo

1
2
3
4
5
6
# 替换博客配置`_config.yml`的下方repo地址,`<IP>`替换为自己的IP
deploy:
- type: git
repo: git@<IP>:/~/blog.git
# repo: https://github.com/DreamCollector/dreamcollector.github.io.git
branch: master

六、部署架构

SafeLine其实应该单独部署一台新的服务器作为网关,这里考虑到成本就都放在了同一台服务器,若服务器还有其他项目可以考虑用Nginx转发到对应项目端口,并在SafeLine中新增站点即可