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自动更新流程

在服务端部署实现自动更新,我们需要做到:

  1. 本地推送代码时,服务端能够接收到推送信息
    • 利用Git hook机制实现
  2. 接收到推送信息时,远程服务器可以拉取Git最新代码
    • 服务器clone仓库,并且具有远程仓库的访问权限(访问远程仓库可以通过用户名密码登录和Token令牌两种访问方式)
      • 用户名密码登录:一般情况下,用户名密码访问Git权限具有时效性,可以通过Git配置设置为不过期
      • Token令牌:根据生成令牌时授予的访问权限,在clone后,该仓库一直具体对应权限信息,不需要登陆,不会过期
        • 令牌登陆时,clone仓库携带令牌信息,可以通过git命令获取到对应令牌,所以请确保服务器信息不会泄露,在生成令牌时,授予最小可用权限即可
  3. 远程服务器编译生成静态博客文件
    • 这里也可以直接在本地编译,推送时推送原始内容和编译后的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为例:
GitHub web hook

  • 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 pullhugo命令即可

依赖:

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
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/51341.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Lambda和Stream让代码简洁的七大原则

1. Lambda优于匿名内部类 函数接口&#xff1a;JDK 8中&#xff0c;只存在一个抽象方法的接口称为函数接口&#xff0c;使用FunctionalInterface注解标识。示例&#xff1a;FunctionalInterface public interface Comparator<T> {int compare(T o1, T o2); }Lambda表达式…

深入解读:几种常见视频大模型原理对比分析

在人工智能的快速发展中&#xff0c;视频分析技术逐渐成为研究的热点。伴随着深度学习的崛起&#xff0c;各种视频大模型应运而生&#xff0c;广泛应用于视频理解、动作识别、视频生成等领域。本文将对几种常见的视频大模型进行原理对比分析&#xff0c;帮助读者更好地理解它们…

JDK、JRE、JVM的区别

总结&#xff1a; JDK为开发人员提供了完整的开发和运行Java程序所需的工具和库&#xff0c;包括JRE、编译器&#xff08;javac&#xff09;、调试器&#xff08;jdb&#xff09;、Java类库&#xff08;如java标准库&#xff09;、基本开发工具&#xff1b; JRE为普通用户或需…

作业7.26~28

全双工&#xff1a; 通信双方 既可以发送&#xff0c;也可以接收数据 1. 利用多线程 或者 多进程&#xff0c; 实现TCP服务器 和 客户端的全双工通信 思路&#xff1a; 服务器和客户端&#xff0c; 在建立通信以后&#xff0c;可以创建线程&#xff0c;在线程编写另一个功能代…

实用网站推荐

​ 学习 前端 精简CSS格式 Font Awesome 图标库 BootCDN 加速服务 合集 AI工具集 动漫、音乐 娱乐 嗷呜动漫 奈飞同步 视频下载 B站视频解析下载 文件操作 ioDraw制作图 Convertio — 文件转换器 PDF处理 ​LOGO

python-小李帮老师改错(赛氪OJ)

[题目描述] 老师给小理发了一封电子邮件&#xff0c;任务如下。 写一个程序&#xff0c;给你 n 个数&#xff0c;输出 X。Xnum1p1​​num2p2​​⋯numnpn​​。 num1​&#xff0c;num2​&#xff0c;⋯⋯&#xff0c;numn​ 都是整数&#x…

图像处理 -- ISP的VA(Variation Accumulation)作用与实现原理

ISP的Variation Accumulation功能的作用与实现原理 ISP&#xff08;图像信号处理器&#xff09;的Variation Accumulation&#xff08;变异累积&#xff09;功能主要用于提高图像质量&#xff0c;尤其是在低光照条件下。其基本作用是通过对多帧图像的累积处理&#xff0c;降低…

sql注入和防止sql注入的方法

SQL注入&#xff08;SQL Injection&#xff09;是一种网络安全漏洞&#xff0c;允许攻击者在应用程序的SQL查询中插入恶意代码。这种攻击通常发生在应用程序没有正确验证或清理用户输入数据的情况下&#xff0c;导致攻击者能够操纵数据库查询&#xff0c;获取、修改或删除敏感信…

【脱敏】平台数据脱敏技术解决方案(word)

1 概述 1.1 数据脱敏定义 1.2 数据脱敏原则 1.2.1基本原则 1.2.2技术原则 1.2.3管理原则 1.3 数据脱敏常用方法 3.1.1泛化技术 3.1.2抑制技术 3.1.3扰乱技术 3.1.4有损技术 1.4 数据脱敏全生命周期 2 制定数据脱敏规程 3 发现敏感数据 4 定义脱敏规则 5 执…

02 Go语言开发REST API接口_20240728 课程笔记

概述 如果您没有Golang的基础&#xff0c;应该学习如下前置课程。 Golang零基础入门Golang面向对象编程Go Web 基础 基础不好的同学每节课的代码最好配合视频进行阅读和学习&#xff0c;如果基础比较扎实&#xff0c;则阅读本教程巩固一下相关知识点即可&#xff0c;遇到不会…

探索Python监控之眼:watchdog库深度解析

文章目录 探索Python监控之眼&#xff1a;watchdog库深度解析1. 引言&#xff1a;为何选择watchdog&#xff1f;2. watchdog简介3. 安装watchdog库4. 基本函数与使用方法4.1 初始化监控器4.2 监控文件的创建4.3 监控文件的删除4.4 监控目录的创建4.5 监控目录的删除 5. 场景应用…

一文读懂JS事件循环、事件冒泡与事件委托

引言 JavaScript 是一种广泛使用的编程语言&#xff0c;特别是在前端开发领域。为了理解 JavaScript 中的异步行为和事件处理机制&#xff0c;我们需要深入了解事件循环、事件冒泡和事件委托等概念。本文将详细解释这些概念及其在实际编程中的应用。 1. JavaScript 事件循环 …

IoTDB 入门教程 实战篇②——MQTT集成

文章目录 一、前文二、配置参数三、开放端口四、MQTT客户端连接五、推送数据六、查询数据八、参考 一、前文 IoTDB入门教程——导读 IoTDB时序数据库内置MQTT服务器&#xff0c;允许远程设备将消息直接发送到IoTDB内置的MQTT服务器&#xff0c;并可以直接存入IoTDB时序数据库。…

gitee的远程连接与公钥SSH的连接

目录 1. 登录注册gitee1.1 登录注册1.2 创建仓库 2. 远程连接3. 公钥连接4. 参考链接 1. 登录注册gitee 1.1 登录注册 gitee官网 进入后进行登录注册 1.2 创建仓库 2. 远程连接 在你想要上传文件的文件夹中进行git初始化&#xff08;我在其他文章已经写过&#xff0c;链接…

新手小白,如何新建一个springboot的web项目?

第一步&#xff1a;打开软件&#xff0c;点击file&#xff0c;点击new 然后选择module&#xff0c;在右侧选择springboot 第二步&#xff1a;选择配置和JDK以及java版本 ①选择maven类型 ②选择JDK1.8版本 ③选择java8版本 ④选择jar包类型 http://t.csdnimg.cn/XeplRhttp:…

ICMPv6与DHCPv6之网络工程师软考中级

ICMPv6概述 ICMPv6是IPv6的基础协议之一。 在IPv6报文头部中&#xff0c;Next Header字段值为58则对应为ICMPv6报文。 ICMPv6报文用于通告相关信息或错误。 ICMPv6报文被广泛应用于其它协议中&#xff0c;包括NDP、Path MTU发现机制等 ICMPv6控制着IPv6中的地址自动配置、地址…

tarojs项目启动篇

TaroJS 是一个开放式跨端开发解决方案&#xff0c;使用 React 语法规范来开发多端应用&#xff08;包括小程序、H5、React Native 等&#xff09;。它可以帮助开发者高效地构建出在不同端上运行一致的应用。以下是启动 TaroJS 项目&#xff08;本来就有的旧项目&#xff09;的步…

OTA远程升级语音芯片”在线更新语音内容的方式有哪几种?分别如何使用及有什么优势?

一&#xff1a;【在板更新】在PCBA上预留语音芯片烧录口,通过配套下载器更新语音芯片中的语音文件。 如何使用,有什么优势? 1.研发设计阶段、调试阶段可以使用下载器更换PCBA上面的语音文件&#xff0c;无需重新购买IC,大大缩短项目周期。 2.产品一样,但是需要出口到不同国…

request编码方式Content-Type以及params和data传参

编码x-www-form-urlencoded Content-Type: application/x-www-form-urlencoded 是一种HTTP头部信息&#xff0c;用于指定请求或响应正文的内容类型。 具体来说&#xff1a; Content-Type 是HTTP头部字段&#xff0c;它指示了随后发送或接收的实体正文的媒体类型。 applicati…

Mybatis框架基础知识

Mybatis 1.1什么是Mybatis 1.MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。 2.MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。 3.MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO…