Hugo 部署与自动更新(Git)
文章目录
- Nginx部署Hugo
- nginx.conf
- hugo.conf
- Hugo自动更新
- Hugo自动更新流程
- 添加访问令牌
- 添加web hook
- rust实现自动更新接口
Nginx部署Hugo
nginx.conf
user nginx;
worker_processes auto;error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;events {worker_connections 1024;
}http {include /etc/nginx/mime.types;default_type application/octet-stream;log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log /var/log/nginx/access.log main;sendfile on;#tcp_nopush on;keepalive_timeout 65;#gzip on;include /etc/nginx/conf.d/*.conf;# 设置客户端请求服务器最大长度限制client_max_body_size 0;
}
hugo.conf
在/etc/nginx/conf.d路径下新建hugo.conf文件
server {listen 80;listen [::]:80;server_name ${DOMAIN_NAME};client_max_body_size 1024m;index index.html index.html;root ${BLOG_PATH}/public;
}
根据配置修改域名和博客所在位置,重启Nginx完成部署
Hugo自动更新
一般情况下,我们在服务器上部署Hugo静态博客。在自己本地撰写博客,若是本次撰写完博客都要手动更新到远程服务器,繁琐且不符合计算机专业的特点,所以我们需要实现本地更新完后主动推送远程进行编译。
这里采用Git进行博客的版本管理,并通过Git的hook机制实现自动更新机制。
Hugo自动更新流程
在服务端部署实现自动更新,我们需要做到:
- 本地推送代码时,服务端能够接收到推送信息
- 利用Git hook机制实现
- 接收到推送信息时,远程服务器可以拉取Git最新代码
- 服务器clone仓库,并且具有远程仓库的访问权限(访问远程仓库可以通过用户名密码登录和Token令牌两种访问方式)
- 用户名密码登录:一般情况下,用户名密码访问Git权限具有时效性,可以通过Git配置设置为不过期
- Token令牌:根据生成令牌时授予的访问权限,在clone后,该仓库一直具体对应权限信息,不需要登陆,不会过期
- 令牌登陆时,clone仓库携带令牌信息,可以通过git命令获取到对应令牌,所以请确保服务器信息不会泄露,在生成令牌时,授予最小可用权限即可
- 服务器clone仓库,并且具有远程仓库的访问权限(访问远程仓库可以通过用户名密码登录和Token令牌两种访问方式)
- 远程服务器编译生成静态博客文件
- 这里也可以直接在本地编译,推送时推送原始内容和编译后的public静态资源文件夹到远程服务器
添加访问令牌
- GitHub:Settings -> Developer settings -> Personal access tokens -> Tokens(classic)
- Gitee:设置 -> 安全设置 -> 私人令牌
- Gitea:设置 -> 应用 -> 管理 Access Token
生成令牌后:通过以下命令clone代码
git clone http(s)://oauth2:${token}@${domain_name}/${repo_name}
请根据具体情况替换以上信息
添加web hook
web hook是一种基于HTTP的回调请求,当应用触发一定的行为时,会自动调用 hook 设置的API接口
Git通过在对应仓库中添加 Web Hook,当触发对应事件时(如,推送行为)会主动调用设置的api接口。
一般情况下,Git web hook 仅支持POST请求,部分Git网站可能支持GET请求,但是不建议使用GET请求调用 web hook,git web hook目前仅支持JSON(application/json), x-www-form-urlencoded(application/x-www-form-urlencoded)两种Type类型。
- GitHub:Settings -> Code and automation -> Webhooks -> Tokens(classic)
- Gitee:管理 -> 仓库挂件 -> WebHooks
- Gitea:设置 -> Web 钩子
以GitHub为例:

- Payload URL(目标URL):设置 web hook 触发时调用的远程 URL 接口
- Content Type:git web hook目前仅支持JSON(application/json), x-www-form-urlencoded(application/x-www-form-urlencoded)两种Type类型
- 推荐采用JSON格式,部分git web hook的x-www-form-urlencoded类型已不维护
- Secret:密钥验证内容,若无密钥则为空。不同平台的密钥验证方式不同,请参考对应平台的密钥说明文档
- GitHub:https://docs.github.com/en/webhooks/using-webhooks/validating-webhook-deliveries
- Gitee:https://gitee.com/help/articles/4290
- Gitea:自 Gitea 1.13.0 已弃用(https://docs.gitea.com/zh-cn/usage/webhooks)
- events:推送事件
通过以上内容,新建 web hook 后,当我们本地推送代码后,git 平台会自动调用我们配置的接口,通过在接口中实现更新服务端代码和自动编译操作完成自动更新机制
rust实现自动更新接口
web hook本质上是一个HTTP请求,所以我们只需要实现对应接口,在接口中调用 git pull 和 hugo命令即可
依赖:
cargo add actix-web
cargo add serde -F derive
main.rs:
use actix_web::{App, HttpServer, HttpResponse, Responder, post};
use serde::{Deserialize, Serialize};use std::process::Command;#[derive(Serialize, Deserialize)]
pub struct Response {pub code: u16
}fn hugo_build() {let output = Command::new("hugo").output().expect("Failed to execute command");// 输出命令的结果println!("hugo build");println!("输出: {}", String::from_utf8_lossy(&output.stdout));println!("错误: {}", String::from_utf8_lossy(&output.stderr));println!();
}fn git_pull() {let output = Command::new("git").arg("pull") // 添加参数.output().expect("Failed to execute command");// 输出命令的结果println!("git pull");println!("输出: {}", String::from_utf8_lossy(&output.stdout));println!("错误: {}", String::from_utf8_lossy(&output.stderr));println!();
}#[post("/update")]
async fn update() -> actix_web::Result<impl Responder> {git_pull();hugo_build();Ok(HttpResponse::Ok().json(Response {code: 200}))
}#[actix_web::main]
async fn main() -> std::io::Result<()> {HttpServer::new(move || {App::new().service(update)}).bind(("0.0.0.0", 10001))?.run().await
}
相关文章:
Hugo 部署与自动更新(Git)
文章目录 Nginx部署Hugonginx.confhugo.conf Hugo自动更新Hugo自动更新流程添加访问令牌添加web hookrust实现自动更新接口 Nginx部署Hugo nginx.conf user nginx; worker_processes auto;error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid;even…...
HTTP代理揭秘:这些场景你都用对了吗?
HTTP代理是网络中常见的一种工具,可以帮助我们提升网络安全性和隐私保护,优化网络访问速度。本文将详细介绍什么是HTTP代理及其适用的场景。 HTTP代理是介于客户端(如浏览器)和服务器之间的中间服务器。它接收客户端的HTTP请求&a…...
电动汽车充电技术及运营知识问答pdf
电动汽车充电技术及运营知识问答 作者:马银山编著 出版社:北京:中国电力出版社 ISBN:9787512320406 资源大小:16.99MB 目录: http://literalink.top/resource/detail/7181601144102195200 第一章 电动汽车基本知识 1 1-1什么是电动汽车? 11-…...
playbooks 分布式部署 LNMP
1、环境配置 ansible 服务器 192.168.10.10nginx 服务器 192.168.10.20mysql 服务器 192.168.10.21php 服务器 192.168.10.22 2、安装 ansble #192.168.10.10节点 yum install -y epel-release #先安装 epel 源 yum install -y ansible配置主机清单 …...
成为git砖家(8): 使用 git log 查询范围内的 commit
文章目录 1. 查询 git log 的文档2. 不带任何参数: git log 啥意思?3. git log 最主要功能是什么?4. git log <commit1>..<commit2> 什么意思5. 查看最近n次commit6. References 1. 查询 git log 的文档 git help log --web市面上针对 git …...
Win10出现错误代码0x80004005 一键修复指南
对于 Windows 10 用户来说,错误代码 0x80004005 就是这样一种迷雾,它可能在不经意间出现,阻碍我们顺畅地使用电脑。这个错误通常与组件或元素的缺失有关,它可能源自注册表的错误、系统文件的损坏,或者是软件的不兼容。…...
C++ 基础(类和对象下)
目录 一. 再探构造函数 1.1. 初始化列表(尽量使用列表初始化) 二. static成员 2.1static成员初始化 三.友元 3.1友元:提供了⼀种 突破类访问限定符封装的方式. 四.内部类 4.1如果⼀个类定义在另⼀个类的内部,这个内部类就叫…...
java RestClientBuilder es 集群 鉴权
在Java中使用RestClientBuilder连接到Elasticsearch集群并进行鉴权,可以通过设置HttpHosts、RequestConfig以及添加相应的Header来实现。 以下是一个示例代码: import org.apache.http.Header; import org.apache.http.HttpHost; import org.apache.htt…...
【OpenCV】中saturate_cast<uchar>的含义和用法是什么?
saturate_cast<uchar>主要是为了防止颜色溢出操作(0~255) if(data<0) data0; elseif(data>255) data255;...
【数据结构】哈希表二叉搜索树详解
💎 欢迎大家互三:2的n次方_ 💎所属专栏:数据结构与算法学习 🍁1. 二叉搜索树 二叉搜索树也称为二叉查找树或二叉排序树,是一种特殊的二叉树结构,它的特点是: 1. 若左树不为空&am…...
【SpringBoot】参数传递之@ModelAttribute
ModelAttribute标注的方法会在Controller类的每个映射URL的控制执行方法之前执行。 ModelAttribute public void findUserById(PathVariable("userId") Long userId,Model model){ model.addAttribute("user",userService.findUserById(userId)); } GetM…...
frp搭建ssh内网穿透
frp软件包下载 检查外网服务器架构 uname -i官网下载对应的版本 https://github.com/fatedier/frp/releases 使用wget或拷贝文件到外网服务器/opt目录下并解压 解压得到frp_0.59.0_linux_amd64文件夹 tar -zxvf frp_0.59.0_linux_amd64.tar.gzfrpc 这是 frp 的客户端可执…...
OpenCV库学习之cv2.normalize函数
OpenCV库学习之cv2.normalize函数 一、简介 cv2.normalize是OpenCV库中的一个函数,用于对图像进行归一化处理。归一化是一种线性变换,可以将图像像素值的范围缩放到指定的区间。这种操作在图像处理中非常有用,特别是在需要将图像数据用于某些…...
LINUX操作系统安全
一、概述内容 操作系统负责计算机系统的资产管理,支撑和控制各种应用程序运行,为用户提供管理计算机系统管理接口。操作系统也是构成网络信息系统的核心关键组件,其安全可靠性决定了计算机系统的安全性和可靠性。 操作系统安全是指满足安全…...
vue3.0学习笔记(三)——计算属性、监听器、ref属性、组件通信
1. computed 函数 定义计算属性: computed 函数,是用来定义计算属性的,计算属性不能修改。 计算属性应该是只读的,特殊情况可以配置 get set 核心步骤: 导入 computed 函数 执行函数 在回调参数中 return 基于响应…...
Elasticsearch面试三道题
针对Elasticsearch的面试题,从简单到困难,我可以给出以下三道题目: 1. Elasticsearch的基本概念与优势 问题:请简要介绍Elasticsearch是什么,并说明它相比传统数据库的优势有哪些? 答案: El…...
大厂面经:大疆嵌入式面试题及参考答案(4万字长文:持续更新)
目录 Linux 系统调用的过程,中间发生了什么? 表格总结 Linux 中断流程,谈谈你对中断上下文的理解 中断流程 中断上下文理解 Linux schedule() 函数的原理和调用的时机 schedule() 函数原理 调用时机 页表实现机制,分页的缺点? 页表机制 分页的缺点 介绍操作系…...
数据结构【有头双向链表】
目录 实现双向链表 双向链表数据 创建双向链表 初始化双向链表创建(哨兵位) 尾插 打印双向链表 头插 布尔类型 尾删 头删 查询 指定位置后插入 指定位置删除数据 销毁 顺序表和链表的分析 代码 list.h list.c test.c 注意:…...
docker 安装jenkins详细步骤教程
Jenkins 是一个开源的持续集成(CI)和持续部署(CD)工具,用于自动化软件开发过程中的构建、测试和部署。 特点和功能: 持续集成:Jenkins 可以自动触发构建过程,检查代码变更并进行构建、测试和部署,以确保团队的代码始终保持可集成状态。 插件生态系统:Jenkins 拥有丰富…...
C++模板函数
C模板函数 函数模板简单的函数模板模板类型推导返回输入的类型,模板返回的类型由输入的决定返回类型的模板参数返回值使用auto,编译器自动推导 默认模板实参模板参数重载函数模板 constexpr关键字 函数模板 简单的函数模板 typename 可以使用class代替…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
