使用 rsync-deploy-action 同步 Hexo 博客到个人服务器
前几天写了个基于 rsync 进行文件同步的 Action -> rsync-deploy-action。目的有三个:
- 1、深入了解波 GitHub Actions,感受下 GitHub 的文档;
- 2、个人博客在我的腾讯云 CVM 服务器上是部署有一份的「域名:shan333.cn」,之前的博客同步方式是通过 Linux 的定时任务,觉得不太行,当前博客的更新并没有那么频繁,没必要每隔几个小时就
git pull一下,且服务器还挂着其他东西,性能还是有点损耗的,换成通过 rsync 进行主动推送的方式好点; - 3、熟悉波 SSH 协议和 rsync 协议。
今天撸一篇文章简单记录下这次折腾。
rsync-deploy-action 的创建
挑 rsync 协议,不挑 FTP 或 scp 的新建 GitHub Actions 的部分原因是 rsync 可以做增量备份。GitHub Action 有三种类别,即 Docker container、JavaScript 和 Composite run steps。这次手撸的 Action 归属于 GitHub 官方文档介绍的 Docker container action。rsync-deploy-action 已经发布到 GitHub 的 Marketplace。源仓库地址:https://github.com/yeshan333/rsync-deploy-action。
rsync 与其他文件传输工具(如 FTP 或 scp)不同,rsync 的最大特点是会检查发送方和接收方已有的文件,仅传输有变动的部分(默认规则是文件大小或修改时间有变动)。
rsync-deploy-action 基于 SSH 协议进行文件的远程同步,从元数据文件 action.yml 可以看到,Action 支持 8 个参数「6个必选,2个可选」。
name: 'rsync-deploy-action'
description: 'Synchronize files to the remote server using the SSH private key'
inputs:
ssh_login_username:
description: 'SSH login username'
required: true
remote_server_ip:
description: 'remote server ip'
required: true
ssh_port:
description: 'remote server SSH port'
required: true
default: "22"
ssh_private_key:
description: 'login user SSH private key'
required: true
source_path:
description: 'The source storage path of the synchronous files'
required: true
destination_path:
description: 'The destination storage path of the synchronous files'
required: true
ssh_args:
description: 'SSH args'
required: false
rsync_args:
description: 'rsync args'
required: false
outputs:
start_time:
description: 'Start time of synchronization'
end_time: # id of output
description: 'End time of synchronization'
runs:
using: 'docker'
image: 'Dockerfile'
args:
- ${{ inputs.ssh_login_username }}
- ${{ inputs.remote_server_ip }}
- ${{ inputs.ssh_port }}
- ${{ inputs.ssh_private_key }}
- ${{ inputs.source_path }}
- ${{ inputs.destination_path }}
- ${{ inputs.ssh_args }}
- ${{ inputs.rsync_args }}
branding:
icon: 'file'
color: 'green'
利用 rsync-deploy-action 的 Dockerfile 文件配合 Action 执行日志可以一窥 GitHub Actions 背后是如何执行的。 Action 的 with 参数的传递在一定程度上利用了 Dockerfile 的 ENTRYPOINT。
# Container image that runs your code
FROM alpine:latest
RUN apk update \
&& apk upgrade \
&& apk add --no-cache \
rsync \
openssh-client
# Copies your code file from your action repository to the filesystem path `/` of the container
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
# Code file to execute when the docker container starts up (`entrypoint.sh`)
ENTRYPOINT ["/entrypoint.sh"]
接下来介绍下利用 rsync-deploy-action 进行 Hexo 博客同步到个人腾讯云 CVM 服务器的过程。
Hexo 博客同步到云服务器
由于 rsync 是基于 SSH 协议的,rsync-deploy-action 需要使用到 SSH 私钥,所以需要先创建一个可以进行 SSH 远程登录的用户,不建议直接使用 root 用户。
SSH 密钥登录
1、先配置好远程腾讯云 CVM 服务器 SSH 允许密钥登录。编辑 SSH 配置文件 /etc/ssh/sshd_config。
vim /etc/ssh/sshd_config
- StrictModes yes 改成 StrictModes no (去掉注释后改成 no)
- 找到 #PubkeyAuthentication yes 改成 PubkeyAuthentication yes (去掉注释)
- 找到 #AuthorizedKeysFile .ssh/authorized_keys 改成 AuthorizedKeysFile .ssh/authorized_keys (去掉注释)
保存后,重启 sshd。
systemctl restart sshd
2、新建用户 github,用于远程 SSH 免密登录。
在远程服务器执行如下命令:
# root 用户下创建用户 github 并且指定 HOME 目录
useradd -d /home/github github
# 也可以使用 adduser github,adduser会自动创建 HOME 目录等
# 设置 github 用户密码,用于后续 SSH 登录公钥的上传
passwd github
3、在本地 PC 执行如下命令,创建用于登录的密钥对。
# 生成密钥对
ssh-keygen -t rsa -b 4096 -C "1329441308@qq.com"
# 将生成的公钥上传到云服务器,server_ip 为服务器 IP 地址,ssh_port 为 SSH 端口号
cat ~/.ssh/id_rsa.pub | ssh github@server_ip -p ssh_port "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
# ssh 密钥登录测试,server_ip 为服务器 IP 地址,ssh_port 为 SSH 端口号
ssh -p ssh_port -i ~/.ssh/id_rsa github@server_ip
以上操作完成没问题之后,即可使用 rsync-deploy-action 了,后面以个人 Hexo 博客的同步为例子,简单看下如何使用此 Action。
Hexo 博客同步
个人 Hexo 博客之前已经配置过 GitHub Action 的 workflows 进行博客的自动部署「博客源仓库:yeshan333/actions-for-hexo-blog」,所以再添加个 step 给 rsync-deploy-action 即可启用博客同步。step 声明如下:
name: Site CI
on:
pull_request:
branches: [master]
push:
branches: [master]
jobs:
build:
runs-on: ubuntu-latest
steps:
......
- name: Release to GitHub Pages
run: |
git config --global user.email "1329441308@qq.com"
git config --global user.name "yeshan333"
git clone git@github.com:yeshan333/yeshan333.github.io.git .deploy_git
chmod 755 -R .deploy_git
hexo clean
hexo generate
hexo deploy
- name: Push to tencentyun CVM
uses: yeshan333/rsync-deploy-action@v1.0.0
with:
ssh_login_username: ${{ secrets.SSH_LOGIN_USERNAME }}
remote_server_ip: ${{ secrets.REMOTE_SERVER_IP }}
ssh_port: ${{ secrets.SSH_PORT }}
ssh_private_key: ${{ secrets.SSH_PRIVATE_KEY }}
source_path: ./.deploy_git/*
destination_path: ~/shan333.cn
rsync_args: --exclude="./.deploy_git/.git/*"
workflow 中名为 Push to tencentyun CVM 的 step 会将 .deploy_git 下的所有文件上传到云服务器「存放到 ~/shan333.cn 目录下」,熟悉 Hexo 的朋友应该知道 hexo deploy 生成的文件会放在 .deploy_git 目录下,这里用到了 Hexo 的一个 Plugin -> hexo-deployer-git。其实也可以将 hexo generate 生成的 public 目录下的所有文件同步到云服务器。
rsync-deploy-action 使用到的参数解释「有部分数据也算是隐私数据,这里意思下用了 GitHub 的 repository secrets」:
- ssh_login_username:可以进行 SSH 密钥登录的用户名,即之前配置好的 github 用户。
- remote_server_ip:云服务器 IP
- ssh_private_key:SSH 登录用户的私钥,即之前的 ~/.ssh/id_rsa 文件的内容
- source_path:博客相关所有文件路径
- destination_path:同步到云服务器的目标路径
~/shan333.cn,即/home/github/shan333.cn - rsync_args:action 的可选参数,.git 目录是没必要同步上传的,排除掉
“大功告成”。rsync 协议的更多介绍可参考:WangDoc.com rsync。
More
个人的腾讯云 CVM 服务器之前为了方便维护安装了个运维面板BT.CN,Hexo 博客是用过 Nginx Serving 的,但 Nginx 是通过运维面板安装的,默认的 user 为 www「宝塔对 Nginx 的配置文件进行了拆分」,但同步后的博客是放在 github 用户的 HOME 目录下的 shan333.cn 目录中的,www 无权限执行博客的相关文件(403 Forbidden),所以需要操作波给 www 用户可执行权限,让 Nginx Worker 可以 serving 博客:
# root 用户下执行,github 目录下的所有文件 755 权限
chmod -R 755 /home/github
# 将 www 用户添加到 github user group
usermod www -G -a www
参考
- GitHub Actions-Creating actions
- GitHub Actions-Workflow syntax
- SSH 密钥登录-网道文档
- nginx-split-large-configuration-file
- Dockerfile ENTRYPOINT
本文由博客群发一文多发等运营工具平台 OpenWrite 发布
使用 rsync-deploy-action 同步 Hexo 博客到个人服务器的更多相关文章
- 使用github action发布hexo博客到云服务器
目录 搭建Hexo博客 安装主题hexo-theme-bamboo 修改博客名称等信息 添加github action发布 1. 在github中创建自己的博客仓库 2. 设置Secrets 3. 在 ...
- hexo博客实现多终端共享&webhook自动化部署
摘要:好不容易搭建了hexo,还不满足.想要实现在小程序上也能访问博客,又不想再写一个后台.每次更新文章到服务器之后,希望能自动同步到网站上面.如果你有这样的需求,那么希望这篇文章能帮助到你. 我的配 ...
- [原创]HEXO博客搭建日记
博客系统折腾了好久,使用过Wordpress,Ghost,Typecho,其中Typecho是我使用起来最舒心的一种,Markdown编辑+轻量化设计,功能不多不少刚好,着实让我这种强迫症患者舒服了好 ...
- 使用Travis CI自动部署Hexo博客
自从使用GitHub Pages和Hexo来发布博客之后,不得不说方便了许多,只需要几个简单的命令博客就发布了.但在不断的使用中发现每次的发布操作也挺耗时的. 我一般的操作是将平时整理好的md文件放到 ...
- 将Hexo博客部署到云主机
摘要: 在云主机上搭建一个git裸仓库,然后使用nginx作为网页服务器,就可以轻松将Hexo博客通过git部署到云主机上. 这是一个忧伤的故事 我的博客KiwenLau之前部署在Coding Pag ...
- Hexo 博客部署到 GitHub
本文简单记录了一下把 Hexo 部署到 GitHub 上的过程,也是搭建静态博客最常用的一种方式. 前面写了关于如何把 Hexo 安装在树莓派上的教程,但树莓派毕竟是连着自己的家的路由器,万一哪天网断 ...
- hexo干货系列:(四)将hexo博客同时托管到github和coding
前言 之前我们把hexo托管在github,但是毕竟github是国外的,访问速度上还是有点慢,所以想也部署一套在国内的托管平台,之前查资料听说gitcafe,但是听说gitcafe已经被coding ...
- 从wordpress换hexo博客后
之前用wordpress做blog, 为什么换为hexo呢? 第一 wordpress的文章都保存在服务器的数据库, 维护不是很直观. 而hexo是自己编写markdown文章,本地一份,而b ...
- 【基础篇】hexo博客搭建教程
[基础篇]搭建hexo博客(一) 作者:Huanhao bilibili:Mrhuanhao 前言 你是否想拥有属于自己的博客?你是否无奈与自己不会写网站而烦恼? 不要担心,本系列教程将会实现你白嫖的 ...
- 个人hexo博客(静态,无后台)搭建
博客搭建 1.工具安装 安装Node.js,其中包含Node.js和npm(包管理器) 利用npm安装cnpm(淘宝的npm,速度在国内更快) npm install -g cnpm --regist ...
随机推荐
- 仿EXCEL插件,智表ZCELL产品V1.9 版本发布,增加导入、导出EXCEL功能
详细请移步 智表(ZCELL)官网www.zcell.net 更新说明 这次更新主要应用户要求,主要增加了导入.导出EXCEL文件功能,并增加了获取单元格公式.显示值等功能,欢迎大家体验使用. 本次 ...
- ARM终端 KylinOS 容器镜像导入排障
背景信息 电脑:华为擎云L420 CPU:ARM架构,HUAWEI Kirin 9006C OS:Kylin桌面操作系统V10(SP1) Kernel:5.4.96 Docker: 27.5.1 已准 ...
- 【语义分割专栏】先导篇:常用数据集(VOC、Camvid、Cityscape、ADE20k、COCO)
目录 前言 mask模式 PASCAL-VOC2012 下载 数据集简介 数据加载(dataloader) CamVid 下载 数据集简介 数据加载(dataloader) Cityscape 下载 ...
- Vim-从放弃到入门
初识Vim Vim被称为神一样的编译器,人类历史上最好文本编辑器(^_^).学习成本很高,学习路线陡峭.下面列举一些入门的教程: 慕课网-玩转Vim 从放弃到爱不释手 新手必看 Vim实用技巧(第2版 ...
- B1031 查验身份证 (15 分)
描述 一个合法的身份证号码由17位地区.日期编号和顺序编号加1位校验码组成.校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5 ...
- AI生成应用:图片批量重命名工具 - 自动化整理您的图片库
图片批量重命名工具 - 自动化整理您的图片库 GitHub项目地址: https://github.com/dependon/renameImage 项目介绍 这是一个基于Python开发的图形界面工 ...
- 可视化理解共识协议Raft
一.分布式共识协议引入 什么是分布式共识协议呢?让我们从一个简单的例子开始. 看看我们只有一个节点的系统,在这个系统中,你可以将节点想象为一个数据库系统,这个系统存储了一个值X. 我们有一个客户端(绿 ...
- 2025 年实用、全面的 VS Code 插件推荐!
前言 VS Code是一款由微软开源免费.轻量级.功能强大的源代码编辑器.其轻量级体现在基础安装简洁,仅含核心编辑功能.功能强大则源于它支持丰富的语言环境插件拓展,这种模块化设计让VS Code在源代 ...
- 前后端分别判断两个数组 A数组有的元素B数据没有
前端: FilterData(a, b) { //循环判断数组a里的元素在b里面有没有,有的话就放入新建立的数组中 //a有 b没有 var result = new Array(); var c = ...
- k8s在线修改alertmanager.yaml
简单说明 有些情况下,我们可以进入集群查看某些secret的配置,这里如果想修改secret的配置时,没有secrets的源文件,可以采取如下的方案. 例如我们需要修改alertmanager.yam ...