概述

在部署好了hexo后,由于上传的静态页面与hexo源文件不同,源文件缺失的情况下,从GitHub上clone下来的网页文件无法重制hexo。

准备工作(常规部署hexo到public repo)

  1. 在GitHub官网建立一个名为Username.github.io的仓库
  2. 命令行激活仓库
    1
    2
    3
    4
    5
    git init
    touch README.md
    git add README.md
    git commit -m "first commit"
    git push -u https://github.com/Username/Username.github.io.git main
  3. 参考另一篇文章设置好hexo,打开目录内的_config.yml,找到deploy,参考如下填入
    1
    2
    3
    4
    deploy:
    type: git
    repo: https://Username:Password@github.com/Username/Username.github.io.git
    branch: main
  4. 测试一下是否能够成功部署
    1
    2
    3
    hexo new helloworld
    hexo g
    hexo d

    备份源文件(hexo文件夹备份至另一个private repo)

  5. 在GitHub官网建立一个backup的私有仓库(本人使用了另外一个GitHub账号建立)
  6. 如上激活仓库
  7. 命令行上传所有hexo文件夹的源文件,因为是pravite库,所以_config.yml中的账号密码不会暴露
    1
    2
    3
    git add 你的hexo文件夹路径下的所有文件
    git commit -m #上传源文件
    git push https://github.com/Username/backup.git main
  8. 到此已经做到了hexo d可部署,git push可备份。不是强迫症的已经可以安心使用了。不过就是还有一些小麻烦,每次写完都要git add来备份。所以我打算使用GitHub action,只进行 (git) add commit push的操作,在push到私有库后,云服务器自动安装node.js hexo环境并自动执行clone ,hexo g,hexo d等命令来实现自动化部署

折腾

开始我尝试了public库来备份,好处是blank.yml内的自动执行git clone不会报错,但问题在于隐私泄漏非常严重,GitHub的账号和密码都被暴露在外。我大部分时间也浪费在了修复这个问题上。但是都没有直接使用private库来的简单粗暴。唯一一个git clone无权限的问题也很好解决。

编辑.github/workflows/blank.yml

  1. 首先点击action-New workflow-Set up this workflow-Start commit-Commit new file,直接在默认分支里编辑。
  2. 我是两个账户两个仓库,我还得在backup私有库的 repo Settings 里 Manage Access 栏邀请 另一个账户来允许下载备份,因为我在私有库的blank.yml里填的是公有库的账户来git clone,至于为什么不直接用私有库的账号密码来clone,是因为其中一个账户的密码末尾的@导致push时链接无效。
  3. 修改blank.yml,参考用,不能复制粘贴
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    on:
    push:
    branches: [ master ]
    #只需要在push时触发这个action

    build:
    runs-on: macos-latest
    #运行环境为macOS

    steps:
    - name: install node.js
    uses: actions/setup-node@v1
    #安装Node.js环境

    - name: Run a multi-line script
    run: |
    npm install hexo-cli -g #安装hexo全局框架
    git clone https://Username:Password@github.com/Username/backup.git #获取刚刚上传的源文件
    cd backup/blog #到达hexo文件夹
    npm install #安装Node.js
    hexo generate #生成静态文件
    hexo deploy #完成上传

2021-1-18更新

  1. 在clone到新电脑后,hexo service等命令可能会遇到如下报错
    1
    2
    3
    ERROR Cannot find module 'hexo' from '/Users/cb/Desktop/github/cblog/blog'
    ERROR Local hexo loading failed in ~/Desktop/github/cblog/blog
    ERROR Try running: 'rm -rf node_modules && npm install --force'
    这是因为本地没有该hexo文件夹记录,解决办法就是在hexo文件夹中再次安装node.js
    1
    2
    cd 你的hexo博客文件夹
    npm install
    完成重新安装后,hexo s命令成功运行。hexo d和hexo g待测试。
  2. hexo d和hexo g均可正常生成静态文件并上传。接下来测试是否能成功运行push到backup仓库后的aciton。
  3. 在本地运行hexo d上传过页面后,仍然支持git push备份以及最主要的backup仓库运行action自动部署网页。

    总结

    只需要执行npm install重新安装Node.js , 就可以实现git push后的GitHub Aciton的备份并部署和hexo d常规部署方式

2021-1-24更新

  1. 由于hexo d是强制上传,若push前没有进行pull补全文章,可能会导致博客内容丢失。

2021-2-6更新

  1. 从默认主题转换为Butterfly主题,但是在_config.yml中更改theme名后,hexo s本地启动失败,报错一串英文,百度后npm安装如下插件可解决该问题。
    1
    npm install --save hexo-renderer-jade hexo-generator-feed hexo-generator-sitemap hexo-browsersync hexo-generator-archive
    在另一台电脑上需要重新执行该命令,将backup下载到本地后也会出现一样的hexo s启动失败的报错。
  2. 在Butterfly主题的博客页面中,上一篇,下一篇的默认背景图片在theme的_config.yml中没有找到对应的修改处,所以只能打开Safari开发者工具,而后发现其图片路径名所在的.js文件位于/Butterfly/scripts/filters/random_cover.js这里,删掉其获取默认背景图片的http路径即可,然后发现默认背景图片变成了/Butterfly/source/img/404.jpg这张,将纯色替换这张图片,博客看起来就清爽多了。。。
  3. hexo如何安装Butterfly主题

2021-2-23更新

  • 安装从DNSPOD白嫖的证书
  1. 编辑nginx.conf
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    server {
    listen 443 ssl;
    server_name localhost;

    ssl_certificate cert.pem;
    ssl_certificate_key cert.key;

    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 5m;

    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    location / {
    root html.git/;
    index index.html index.htm;
    }
    }
  2. 下载.key和.crt证书文件,通过百度的在线转换器合成.pem文件,将.key和.pem放入nginx/conf文件夹
  • 实现自动化部署到云服务器
  1. 服务器搭建git仓库
    1
    2
    3
    4
    5
    6
    cd /usr/local/nginx #进入nginx目录(该教程默认为/usr/local/nginx)
    git clone --bare https://github.com/xxxx/xxxx.github.io.git html.git #从github.io复制一个可供Hexo上传的仓库,命名为html.git。
    echo "git --work-tree=/usr/local/nginx/html.git --git-dir=/usr/local/nginx/html.git checkout -f" > ./html.git/hooks/post-receive #就是把push到仓库的文件(还在objects中的源代码)转储至html.git内...,
    #(仅输入git checkout的命令还有恢复工作树文件的效果)
    chmod +x ./html.git/hooks/post-receive #给hooks下的文件添加执行权限

  2. 因为git要求仓库名后缀为.git,所以只能在nginx/conf/nginx.conf中修改root文件夹为html.git
  3. 修改/blog/_config.yml,添加push给服务器的git仓库
    1
    2
    3
    4
    5
    6
    7
    8
    deploy:
    - type: git
    repo: https://cb9919:cb19990614@github.com/cb9919/cb9919.github.io.git
    branch: main
    - type: git
    repo: root@你的服务器IP:/usr/local/nginx/html.git
    branch: main

  4. 首先在本地macOS电脑中使用ssh-keygen生成一对密钥公钥,并删除~/.ssh/known_hosts,然后打开终端 “ssh 你的服务器ip地址”,会询问是否记录主机 输入yes,会生成一个known_hosts,把密钥和known_hosts文件上传到hexo源代码文件夹根目录下,将.pub后缀的公钥内容写入(重定向)到服务器中的~/.ssh/authorized_keys,再ssh链接测试一下能否不用输入密码,若不用输入密码即算成功。可进行接下来的操作。但是注意接下来只适用于GitHub action选择了macOS环境的情况。
    修改/.github/workflow/blank.yml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    - name: Run a multi-line script
    run: |
    npm install hexo-cli -g # 安装环境
    git clone https://xxxxx:xxxxx@github.com/xxxxx/xxxxx.git # 克隆hexo源文件夹
    cp cblog/id_rsa ~/.ssh/ # 替换密钥
    chmod 700 ~/.ssh/id_rsa # 使权限正确
    cp cblog/id_rsa.pub ~/.ssh/
    rm ~/.ssh/known_hosts #删除以覆盖
    cp cblog/known_hosts ~/.ssh/ #添加主机记录,不然还需要输入yes才能继续
    cd cblog/blog
    npm install
    hexo generate
    hexo deploy

2021-5-2更新

  • 添加备案号
    在blog/themes/Butterfly/layout/includes/footer.pug的theme.footer.copyright下添加
    1
    2
    3
    4
    <br />
    <a href="http://beian.miit.gov.cn/" style="color:black" target="_blank">浙ICP备xxxxxxxxxx号</a>
    <br />
    <a href="https://beian.miit.gov.cn" style="color:black" target="_blank">信息产业部备案管理系统</a>
  • _config.yml中deploy栏下git type的部署方式更换ssh默认的22为2021
    1
    2
    3
    - type: git
    repo: ssh://hostname@xxx.xx.xxx.xxx:2021/usr/local/nginx/html.git
    branch: main
    原:服务器如果默认ssh22端口会有很多登陆请求
    1
    2
    3
    - type: git
    repo: hostname@xxx.xx.xxx.xxx:/usr/local/nginx/html.git
    branch: main

2021-8-22更新

  • github关闭了push的账号密码验证方式
    所以换用密钥,将id_rsa.pub填入GitHub的setting
  • 修改hexo的config
    1
    2
    3
    4
    deploy:
    - type: git
    repo: ssh://git@github.com:22/cb9919/cb9919.github.io.git
    branch: main

2021-12-15更新

  • 添加了一台新服务器,但是用之前的known_hosts无法通过验证,需要将连接过这台新服务器的Mac电脑中的known_hosts覆盖原文件
  • 同时也需要将id_rsa.pub的后缀改为新服务器的名称 <–不需要,请看2022-5-8更新

2022-1-14更新

ssl证书自动续签

2022-5-8更新

若ci一直报错hostkey验证错误,编辑/etc/ssh/sshd_config,将StrictModes改为no

1
StrictModes no

2023-6-29更新

补充部署到自己的云服务器的方法(实测有效)

  1. 以上的方法是将本地(GitHub CI)的公钥.pub写入服务器的authoried_key。
  2. 现在详述一下优化后的过程: 先在云服务器里运行以下代码(这将部署端的.pub记录到部署端的authorized_keys),然后将云服务器(部署端)的id_rsa密钥下载到本地(GitHub CI)里运行,简单来说就是只用了一对云服务器自己的密钥公钥。
    1
    2
    cat ~/.ssh/id_rsa.pub | ssh user@server 'cat >> ~/.ssh/authorized_keys' 
    ssh user@server #测试一下是否能直接不输密码连接自己
  3. 仍需要一份known_hosts来过第一次连接时的提示。。。
  4. 注意echo “git –work-tree=/usr/local/nginx/html.git –git-dir=/usr/local/nginx/html.git checkout -f” > ./html.git/hooks/post-receive时,路径名都要跟着改