943 字
5 分钟

Gitea Webhook 自动部署:零依赖实现 Astro 博客多端同步发布

之前我每次写完文章都要重复这些流程:SSH 登录服务器 -> 手动拉取代码 -> 等待 pnpm install 安装依赖 -> 执行 pnpm build 构建博客 -> 手动复制构建产物到 Nginx 目录。

在家里和公司两地办公的时候,这种重复性的机械劳动让人崩溃。


解决方案#

项目地址https://github.com/moewah/gitea-astro-webhook

在多个地方(家里、公司)推送代码后,服务器上的 Webhook 服务会自动触发构建流程,拉取最新代码、安装依赖、构建博客,全程无需人工干预。

核心特点:

  • 零依赖: 仅使用 Node.js 原生模块,无需 npm install
  • 异步构建: 立即响应 Gitea,不超时
  • systemd 管理: 开机自启,崩溃自动重启

部署步骤#

在部署之前,这里我先假设已经在服务器部署了 Gitea 个人代码托管服务,并在此服务器中有一个 Astro 等静态博客,下面的操作指引帮助你实现从家里及公司的电脑中随时随地的发布管理文章。

1. 克隆项目到服务器#

Terminal window
# SSH 登录服务器
ssh root@your-server
cd /opt
git clone https://github.com/moewah/gitea-astro-webhook.git

2. 配置环境变量#

Terminal window
# 进入服务器项目目录
cd /opt/gitea-astro-webhook
# 复制配置文件
cp .env.example .env
# 编辑配置
nano .env

配置示例

Terminal window
# Webhook 服务端口
PORT=28080
# Gitea Webhook 密钥
WEBHOOK_SECRET=your-webhook-secret-here
# 博客项目路径
BLOG_PATH=/home/wwwroot/blog
# Git 仓库地址(SSH 格式)
GIT_REPO=ssh://git@git.example.com:222/username/blog.git
# 监听的 Git 分支
GIT_BRANCH=main
# 日志级别:info | error
LOG_LEVEL=info

生成密钥

Terminal window
openssl rand -hex 32

将生成的密钥粘贴到 WEBHOOK_SECRET

3. 配置 systemd 服务#

Terminal window
# 修改服务文件中的路径
nano gitea-astro-webhook.service

将以下三个路径改为实际路径:

  • WorkingDirectory=/opt/gitea-astro-webhook
  • ExecStart=/usr/bin/node /opt/gitea-astro-webhook/webhook.js
  • EnvironmentFile=/opt/gitea-astro-webhook/.env
Terminal window
# 安装服务
sudo cp gitea-astro-webhook.service /etc/systemd/system/
# 重新加载 systemd
sudo systemctl daemon-reload
# 启动服务
sudo systemctl start gitea-astro-webhook
# 设置开机自启
sudo systemctl enable gitea-astro-webhook
# 查看服务状态
sudo systemctl status gitea-astro-webhook

4. 配置 Nginx 反向代理#

Terminal window
# 编辑你的 Nginx 配置文件
nano /etc/nginx/conf.d/blog.example.com.conf

添加以下配置:

location /webhook {
proxy_pass http://127.0.0.1:28080/webhook;
# 传递必要的请求头
proxy_pass_request_headers on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 传递 Gitea 签名头
proxy_set_header X-Gitea-Signature $http_x_gitea_signature;
proxy_set_header X-Gitea-Event $http_x_gitea_event;
# 增加超时时间
proxy_connect_timeout 600s;
proxy_send_timeout 600s;
proxy_read_timeout 600s;
# 禁用缓冲
proxy_buffering off;
}
Terminal window
# 测试并重启 Nginx
sudo nginx -t
sudo systemctl restart nginx

5. 测试服务#

Terminal window
# 健康检查
curl http://localhost:28080/health
# 通过 Nginx 测试 Webhook 端点
curl https://blog.example.com/webhook
# 查看日志
sudo journalctl -u gitea-astro-webhook -f

6. 配置 Gitea Webhook#

在 Gitea 中:

  1. 打开仓库 → 设置Webhooks
  2. 添加 Webhook:
    • URLhttps://blog.example.com/webhook
    • Content Typeapplication/json
    • Secret:粘贴 .env 中的 WEBHOOK_SECRET
    • Events:Push Events
    • Branch: main

验证部署#

在本地电脑推送测试代码:

如果是 Astro,注意测试时上传的文章 Frontmatter 属性要符合规范要求,Astro 对这一块校验很严格。

Terminal window
cd /path/to/your/blog
echo "test $(date)" > test.md
git add test.md
git commit -m "test: 测试自动部署"
git push origin main

在服务器查看日志:

Terminal window
sudo journalctl -u gitea-astro-webhook -f

故障排查#

  1. 签名验证失败:检查 Gitea 和 .env 中的 WEBHOOK_SECRET 是否完全一致。
  2. Git 拉取失败:测试 SSH 连接 ssh -T -p 222 git@git.example.com
  3. 服务无法启动:检查 Node.js 版本(需要 >= 18.0.0),手动启动测试 node webhook.js

扩展阅读#

也许刚开始接触 Git 命令有点懵 —— 这一大堆命令要记到什么时候?但其实,你只需要掌握几个基础操作就完全够用了。我整理了一份 超实用的👉 《Git 常用命令速查与使用详解》

一旦你上手了,就会真香 —— Git 真的超级顺手,commit、push、pull 这几个命令敲多了,根本不用过脑子就完成了。

而且,最骚的来了:当你把这个流程调通之后,你完全可以自己写个 SKILL 交给 OpenClaw 来帮你自动发布内容。想想就很美对吧?

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
Gitea Webhook 自动部署:零依赖实现 Astro 博客多端同步发布
https://blog.moewah.com/posts/gitea-webhook-astro-blog-auto-deploy-zero-dependency/
作者
GoWah
发布于
2026-02-15
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
GoWah
Hello, I'm GoWah.
分类
标签
站点统计
文章
163
分类
9
标签
353
总字数
282,390
运行时长
0
最后活动
0 天前

目录