当前位置: 首页 > news >正文

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
}

相关文章:

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代理是网络中常见的一种工具&#xff0c;可以帮助我们提升网络安全性和隐私保护&#xff0c;优化网络访问速度。本文将详细介绍什么是HTTP代理及其适用的场景。 HTTP代理是介于客户端&#xff08;如浏览器&#xff09;和服务器之间的中间服务器。它接收客户端的HTTP请求&a…...

电动汽车充电技术及运营知识问答pdf

电动汽车充电技术及运营知识问答 作者:马银山编著 出版社:北京&#xff1a;中国电力出版社 ISBN:9787512320406 资源大小:16.99MB 目录&#xff1a; http://literalink.top/resource/detail/7181601144102195200 第一章 电动汽车基本知识 1 1-1什么是电动汽车&#xff1f; 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 啥意思&#xff1f;3. git log 最主要功能是什么&#xff1f;4. git log <commit1>..<commit2> 什么意思5. 查看最近n次commit6. References 1. 查询 git log 的文档 git help log --web市面上针对 git …...

Win10出现错误代码0x80004005 一键修复指南

对于 Windows 10 用户来说&#xff0c;错误代码 0x80004005 就是这样一种迷雾&#xff0c;它可能在不经意间出现&#xff0c;阻碍我们顺畅地使用电脑。这个错误通常与组件或元素的缺失有关&#xff0c;它可能源自注册表的错误、系统文件的损坏&#xff0c;或者是软件的不兼容。…...

C++ 基础(类和对象下)

目录 一. 再探构造函数 1.1. 初始化列表&#xff08;尽量使用列表初始化&#xff09; 二. static成员 2.1static成员初始化 三.友元 3.1友元&#xff1a;提供了⼀种 突破类访问限定符封装的方式. 四.内部类 4.1如果⼀个类定义在另⼀个类的内部&#xff0c;这个内部类就叫…...

java RestClientBuilder es 集群 鉴权

在Java中使用RestClientBuilder连接到Elasticsearch集群并进行鉴权&#xff0c;可以通过设置HttpHosts、RequestConfig以及添加相应的Header来实现。 以下是一个示例代码&#xff1a; import org.apache.http.Header; import org.apache.http.HttpHost; import org.apache.htt…...

【OpenCV】中saturate_cast<uchar>的含义和用法是什么?

saturate_cast<uchar>主要是为了防止颜色溢出操作&#xff08;0~255&#xff09; if(data<0) data0; elseif(data>255) data255;...

【数据结构】哈希表二叉搜索树详解

&#x1f48e; 欢迎大家互三&#xff1a;2的n次方_ &#x1f48e;所属专栏&#xff1a;数据结构与算法学习 &#x1f341;1. 二叉搜索树 二叉搜索树也称为二叉查找树或二叉排序树&#xff0c;是一种特殊的二叉树结构&#xff0c;它的特点是&#xff1a; 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库中的一个函数&#xff0c;用于对图像进行归一化处理。归一化是一种线性变换&#xff0c;可以将图像像素值的范围缩放到指定的区间。这种操作在图像处理中非常有用&#xff0c;特别是在需要将图像数据用于某些…...

LINUX操作系统安全

一、概述内容 操作系统负责计算机系统的资产管理&#xff0c;支撑和控制各种应用程序运行&#xff0c;为用户提供管理计算机系统管理接口。操作系统也是构成网络信息系统的核心关键组件&#xff0c;其安全可靠性决定了计算机系统的安全性和可靠性。 操作系统安全是指满足安全…...

vue3.0学习笔记(三)——计算属性、监听器、ref属性、组件通信

1. computed 函数 定义计算属性&#xff1a; computed 函数&#xff0c;是用来定义计算属性的&#xff0c;计算属性不能修改。 计算属性应该是只读的&#xff0c;特殊情况可以配置 get set 核心步骤&#xff1a; 导入 computed 函数 执行函数 在回调参数中 return 基于响应…...

Elasticsearch面试三道题

针对Elasticsearch的面试题&#xff0c;从简单到困难&#xff0c;我可以给出以下三道题目&#xff1a; 1. Elasticsearch的基本概念与优势 问题&#xff1a;请简要介绍Elasticsearch是什么&#xff0c;并说明它相比传统数据库的优势有哪些&#xff1f; 答案&#xff1a; El…...

大厂面经:大疆嵌入式面试题及参考答案(4万字长文:持续更新)

目录 Linux 系统调用的过程,中间发生了什么? 表格总结 Linux 中断流程,谈谈你对中断上下文的理解 中断流程 中断上下文理解 Linux schedule() 函数的原理和调用的时机 schedule() 函数原理 调用时机 页表实现机制,分页的缺点? 页表机制 分页的缺点 介绍操作系…...

数据结构【有头双向链表】

目录 实现双向链表 双向链表数据 创建双向链表 初始化双向链表创建&#xff08;哨兵位&#xff09; 尾插 打印双向链表 头插 布尔类型 尾删 头删 查询 指定位置后插入 指定位置删除数据 销毁 顺序表和链表的分析 代码 list.h list.c test.c 注意&#xff1a…...

docker 安装jenkins详细步骤教程

Jenkins 是一个开源的持续集成(CI)和持续部署(CD)工具,用于自动化软件开发过程中的构建、测试和部署。 特点和功能: 持续集成:Jenkins 可以自动触发构建过程,检查代码变更并进行构建、测试和部署,以确保团队的代码始终保持可集成状态。 插件生态系统:Jenkins 拥有丰富…...

C++模板函数

C模板函数 函数模板简单的函数模板模板类型推导返回输入的类型&#xff0c;模板返回的类型由输入的决定返回类型的模板参数返回值使用auto&#xff0c;编译器自动推导 默认模板实参模板参数重载函数模板 constexpr关键字 函数模板 简单的函数模板 typename 可以使用class代替…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...