记一次 Hexo 博客自动部署脚本排障之旅:从 Git 依赖污染到 rsync 权限陷阱
作为一名开发者,我用 Hexo 搭建了个人博客(xiaohuihui.cc),并编写了自动部署脚本,期望实现「Git 拉取代码 → Hexo 生成静态文件 → 同步到发布目录」的自动化流程。但脚本运行过程中接连踩坑,从 Git 依赖目录污染 到 rsync 权限错误,再到 宝塔 WebHook 执行环境异常,最终通过层层排查和优化,实现了脚本在宝塔 WebHook 中稳定运行。本文将完整复盘整个排障过程,并提供最终可直接使用的稳定版脚本。
一、需求背景我的博客部署脚本核心需求:
拉取 Gitee 仓库最新博客源码;
执行缓存清理 + 静态文件生成,避免重复安装依赖;
将生成的 public 目录同步到服务器发布目录;
无需将生成的静态文件回推到 Git 仓库;
适配宝塔 WebHook 执行环境,确保自动触发时稳定运行。
最初的脚本看似逻辑完整,但实际运行时出现多个核心报错:Hexo 命令执行失败、rsync 同步报错(code 23)、宝塔 WebHook 执行显示「最终失败」但命令行正常。
二、问题排查与修复过程问题 1:Hexo clean 失败 —— Git 仓库误提交 n ...
Hexo 静态博客框架的使用指南
一、环境准备12345678# 安装 Node.js (需 >= 12.0)https://nodejs.org# 安装 Githttps://git-scm.com# 安装 Hexo CLInpm install -g hexo-cli
二、项目初始化12345678910111213# 创建项目hexo init myblogcd myblog# 安装依赖npm install# 目录结构:# ├── _config.yml # 全局配置# ├── source # 文章/资源# ├── themes # 主题目录# ├── public # 生成的静态文件# └── scaffolds # 模板文件
三、核心配置 (_config.yml)123456789101112131415161718# 基础配置title: 我的博客subtitle: 技术记录与分享description: "技术博客 | 编程笔记"author: YourNamelanguage: zh-CNti ...
FrankenPHP 是否是 PHP 的未来?
引言:PHP 的现状与挑战PHP 作为一门已有近 30 年历史的服务器端编程语言,至今仍是 Web 开发的中流砥柱。根据 W3Techs 的数据,截至 2024 年,约 77% 的网站仍在使用 PHP,其中 WordPress、Laravel、Symfony 等框架和 CMS 系统占据主导地位。然而,PHP 也面临着诸多挑战:
性能瓶颈:传统 PHP-FPM 架构在高并发场景下表现不佳。
现代化需求:Go、Node.js、Rust 等新兴语言在性能、并发和开发体验上更具优势。
生态碎片化:Composer 虽解决了依赖管理问题,但 PHP 的异步编程生态仍不成熟。
在这样的背景下,FrankenPHP 横空出世,它号称能大幅提升 PHP 性能,并支持现代 Web 开发模式。那么,FrankenPHP 究竟是 PHP 的未来,还是又一个昙花一现的技术?本文将深入探讨其架构、性能、适用场景,并分析它是否真的能改变 PHP 的未来。
1. 什么是 FrankenPHP?FrankenPHP 是一个高性能 PHP 运行时,由 Dunglas(Symfony 核心贡献者)开发,基于 Cad ...
测试 Hexo 7.3.0 兼容性
这是图片啦啦啦
php使用图鉴识别图片、二维码等
图鉴,是基于人工智能的高可用图片识别平台,可以识别二维码、验证码、缺图验证码等。
图鉴函数方法:1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162<?phpdeclare(strict_types=1);class ImgCaptcha{ /** * 图鉴 http://www.ttshitu.com/ * * @param string $image 图片地址 * @param string $typeid 识别类型 * * @return string */ public static function ttShiTu(string $image = '', string $typeid = '3'): string { $api_url = ...
php实现使用github授权登录
github 官网文档https://docs.github.com/cn/developers/apps/building-oauth-apps/authorizing-oauth-apps#web-application-flow
原理
客户端发起请求 redirect 到 OAuth 接入方并附带上 client_id
用户在 redirect 之后的网站上输入用户名和密码
登陆成功之后,OAuth 接入方会返回给服务端一个 code。
服务端拿到 code 之后,拿着 client_secret 和 code 向 OAuth 接入方申请获得 Token
服务端拿到 Token 之后,进入授权窗口
授权成功,跳转到客户端网站。
创建好 github 账号后点击设置
之后进入前期工作github 页面开通步骤一
步骤二
步骤三
步骤四添加好必填项
注册应用后会生成 client_id, 然后需要创建密码
1234#页面首页地址(登录成功后跳转到的地址):http://huicmf.frp.toushizhiku.com:18080/app/user#授权回调地址(代码中处理函 ...
tp6+使用cli(cmd)命令行模式访问控制器
因为 thinkphp6 简称 tp6,默认不支持直接 cli 命令行模式访问控制器,于是利用官方的 command 实现了访问控制器.
实现效果如下 :
php think action 模块/控制器/方法
1、新建 command,Action:
在 app\command 创建文件:Action.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596<?phpdeclare (strict_types=1);namespace app\command;use think\console\Command;use think\console\Input;use think\console\input\Argument;use thin ...
使用workerman接收websocket消息,并在thinkphp6控制器里处理取得的数据
一、创建 workerman 服务,并启动
用以接收 websocket 消息
1、安装 workerman 服务1composer require workerman/workerman
2、根目录下创建文件:server.php方法 1:使用回调函数12345678910111213141516171819202122232425262728293031323334<?phprequire_once __DIR__.'/vendor/autoload.php';use Workerman\Worker;use Workerman\Connection\AsyncTcpConnection;$worker = new Worker();$worker->onWorkerStart = function ($worker) { $con = new AsyncTcpConnection('ws://127.0.0.1:7600/wcf/socket_receiver'); // websocket握手成功后 ...
宝塔面板进程守护管理器(Supervisor)踩坑日记
tags: [守护进程,supervisor]
categories: 学无止境
copyright_author_href: https://www.xiaohuihui.cc
copyright_url:copyright_author:
cover:
宝塔面板,正常使用过程中,突然守护进程异常报错,无论重启还是停止均无法执行。
这里记录一下,以便后期参考使用
找到错误日志:
排查看到:
Failed to start supervisord.service:Unit is not loaded properly: Is a directory.
提示 **supervisord.service **单元是一个目录。
找到对应位置:
/usr/lib/systemd/system 并搜索:supervisord.service
可以看到 搜索到的是一个目录而非文件。
修复方案:一、找到:软件商店》守护进程》点击修复。之后正常
二、
找到 unit 目录 /usr/lib/systemd/sys ...
通过 Python|PHP 生成mysql数据字典
使用PHP和python生成数据字典,直接上代码,并保存到markdown里面
php123456789101112131415161718192021222324252627282930313233343536373839404142434445<?php $database_name = '改成your database name';$output_file = $database_name . '.md'; // Markdown 文件名// 修改配置$conn = new mysqli('127.0.0.1', 'root', '123456', $database_name, 3306);if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error);}$output = ''; // 用于存储 ...






