之前我每次写完文章都要重复这些流程: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 | errorLOG_LEVEL=info
显示更多
生成密钥:
Terminal window
openssl rand -hex 32
将生成的密钥粘贴到 WEBHOOK_SECRET。
3. 配置 systemd 服务
Terminal window
# 修改服务文件中的路径
nano gitea-astro-webhook.service
将以下三个路径改为实际路径:
WorkingDirectory=/opt/gitea-astro-webhookExecStart=/usr/bin/node /opt/gitea-astro-webhook/webhook.jsEnvironmentFile=/opt/gitea-astro-webhook/.env
Terminal window
# 安装服务sudo cp gitea-astro-webhook.service /etc/systemd/system/
# 重新加载 systemdsudo 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 中:
- 打开仓库 → 设置 → Webhooks
- 添加 Webhook:
- URL:
https://blog.example.com/webhook - Content Type:
application/json - Secret:粘贴
.env中的WEBHOOK_SECRET - Events:Push Events
- Branch:
main
- URL:
验证部署
在本地电脑推送测试代码:
如果是 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
故障排查
- 签名验证失败:检查 Gitea 和
.env中的WEBHOOK_SECRET是否完全一致。 - Git 拉取失败:测试 SSH 连接
ssh -T -p 222 git@git.example.com - 服务无法启动:检查 Node.js 版本(需要 >= 18.0.0),手动启动测试
node webhook.js
扩展阅读
也许刚开始接触 Git 命令有点懵 —— 这一大堆命令要记到什么时候?但其实,你只需要掌握几个基础操作就完全够用了。我整理了一份 超实用的👉 《Git 常用命令速查与使用详解》
一旦你上手了,就会真香 —— Git 真的超级顺手,commit、push、pull 这几个命令敲多了,根本不用过脑子就完成了。
而且,最骚的来了:当你把这个流程调通之后,你完全可以自己写个 SKILL 交给 OpenClaw 来帮你自动发布内容。想想就很美对吧?