在博客的“关于”页面展示 GitHub 的提交热力图和常用语言统计,是程序员博主的“标配”。本文将介绍如何实现这一功能,并针对服务器网络环境的不同,提供两套解决方案。
方案一:服务器网络优异(直连模式)
适用场景:
- 服务器位于海外,或者对 GitHub 连接非常顺畅。
- 希望数据是实时的(每次刷新页面都是最新数据)。
- 希望通过 API 接口动态获取。
实现步骤
准备工作:
1.申请 GitHub Personal Access Token (勾选 repo 和 user 权限)。
2.部署服务:使用 Docker 部署 github-readme-stats,可以跟你的wordpress放在同一个配置文件内。
# docker-compose.yml
services:
gh-stats:
image: node:18-alpine
container_name: gh_stats
restart: always
environment:
- PAT_1=你的GitHubToken
- COUNT_PRIVATE=true # 开启私有仓库统计
- PORT=9000
command: sh -c "apk add git && git clone https://github.com/anuraghazra/github-readme-stats.git . && npm install && node express.js"
ports:
- "9000:9000"3.反向代理:配置 Caddy 或 Nginx,将 https://你的域名/api/gh/ 转发到容器的 9000 端口。
4.在博客个人页直接调用:HTML 图片链接直接指向自己的 API:HTML<img src="/api/gh/api?username=你的ID&count_private=true...">
方案二:服务器网络受限(静态快照模式)
适用场景:
- 国内服务器,直连 GitHub 经常超时/失败。
- 安全性要求高:不希望 Token 暴露给第三方,也不希望服务长期运行。
- 追求极致加载速度:静态 SVG 图片加载速度远快于 API 动态生成。
核心思路
“按需启动 -> 瞬时抓取 -> 生成静态文件 -> 关闭服务”。
平时容器处于关闭状态,仅在维护期间(开启 VPN 时)手动触发脚本更新图片,将图片保存到 WordPress 媒体库目录,供前端直接调用。
1. 目录结构规划
为了不干扰主博客运行,我们将工具单独存放:
/home/naseele/blog/WP/gh-auto/
├── gh_stats/ # 源码目录 (含 Dockerfile)
├── docker-compose.yml # 独立的容器配置
└── run_update.sh # 一键更新脚本2. 关键文件配置
A. Dockerfile (修复官方镜像缺失问题)
在 gh_stats 目录下新建:
FROM node:18-alpine
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
ENV PORT=9000
CMD ["node", "express.js"] # 直接运行 express 服务器B. docker-compose.yml (独立配置)
services:
gh-stats-generator:
build: ./gh_stats
container_name: gh_stats_tool
restart: "no" # 禁止自动重启,平时关机
network_mode: host # 【关键】共享宿主机网络(以便蹭VPN)
environment:
- PAT_1=你的GitHub_Token
- COUNT_PRIVATE=true
- PORT=9000C. run_update.sh (一键更新脚本)
#!/bin/bash
# 自动获取脚本所在路径
BASE_DIR=$(dirname "$(readlink -f "$0")")
# 图片保存到 WordPress 上传目录
TARGET_DIR="/home/naseele/blog/WP/wordpress/wp-content/uploads/static"
mkdir -p $TARGET_DIR
echo "🚀 启动生成器容器..."
cd $BASE_DIR && docker compose up -d
sleep 8 # 等待 Node.js 启动
echo "📸 抓取数据并保存为 SVG..."
# 访问 localhost:9000 下载图片
curl -s "http://localhost:9000/api?username=你的ID&...&count_private=true" > $TARGET_DIR/gh-stats.svg
curl -s "http://localhost:9000/api/top-langs/?username=你的ID&...&count_private=true" > $TARGET_DIR/top-langs.svg
if [ -s "$TARGET_DIR/gh-stats.svg" ]; then
echo "✅ 更新成功!修复权限..."
# 【关键】将文件所有者改为 www-data,防止 WordPress 无法管理
chown 33:33 $TARGET_DIR/*.svg
echo "💤 任务完成,停止容器..."
docker compose stop
else
echo "❌ 失败,请检查网络/VPN。"
fi
3. 日常维护流程
- 在服务器开启 VPN。
- 运行
sudo ./run_update.sh。 - 脚本会自动完成“启动服务-生成图片-修复权限-关闭服务”全流程。
- 关闭 VPN。

Comments NOTHING