解放双手!使用 1Panel 计划任务自动同步 GitHub 静态博客

解放双手!使用 1Panel 计划任务自动同步 GitHub 静态博客

最近在折腾静态主页,遇到个很烦人的问题:每次在本地改完代码推送到 GitHub 后,还得手动登录服务器,要么重新传文件,要么手动敲一遍 git pull。如果一天改好几次,这操作简直让人崩溃。

而且,如果你尝试直接在 1Panel 或宝塔面板里加一个简单的 git pull 定时任务,大概率会遇到 $HOME not set 或者权限不足的报错。

怎么才能优雅、稳定地让服务器自动拉取 GitHub 上的最新代码呢?

其实只需要利用 SSH 密钥建立信任,再配合一个写好环境变量的 Bash 脚本就能搞定。下面是我实测跑通的完整配置记录,照着抄作业就行。


第一阶段:让服务器与 GitHub 建立信任

想让服务器全自动拉取私有库或免密拉取代码,最好的方式就是配置 SSH 密钥。

1. 生成 SSH 密钥
首先登录你的服务器终端,输入以下命令生成一个 ed25519 算法的密钥:

1
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -N ""

💡 提示:这行命令会直接生成密钥,不会一直弹提示让你按回车。

2. 获取公钥内容
接着,查看刚刚生成的公钥并把它完整复制下来:

1
cat ~/.ssh/id_ed25519.pub

3. 在 GitHub 中添加密钥
打开 GitHub,进入个人的 Settings (设置) -> SSH and GPG keys。点击 New SSH key,随便取个好记的名字(比如你服务器的备注),Key type 保持默认的 Authentication Key,然后把刚才复制的公钥粘贴进去,点击保存。

GitHub 添加 SSH 密钥 1

GitHub 添加 SSH 密钥 2


第二阶段:面板建站与首次手动拉取

这里我以 1Panel 面板为例(宝塔面板的逻辑也完全一样)。

1. 创建站点
先在 1Panel 的“网站”菜单里,正常创建一个静态站点,把网站目录先准备好。

1Panel 创建网站截图 1

1Panel 创建网站截图 2

1Panel 创建网站截图 3

2. 获取仓库的 SSH 地址
回到 GitHub,在你需要同步的仓库页面,点击绿色的 Code 按钮,切换到 SSH 选项卡,复制那串地址(例如:git@github.com:用户名/仓库名.git)。

⚠️ 注意:一定要提前确认好你需要同步的是哪个分支(比如我这里用的是 static 分支)。

1Panel 创建网站截图 3

3. 首次手动克隆 (非常重要!)
在让脚本自动跑之前,我们需要手动拉取一次,初始化一下 .git 环境。回到服务器终端,cd 进入你刚才在面板里建好的那个网站目录的上一级目录,然后执行:

1
cd /opt/1panel/www/sites/<网站目录名>
1
git clone -b static <你的SSH地址> index

💡 提示:请把 <你的SSH地址><网站目录名> 替换成你自己的。这里的 -b static 就是指定只拉取 static 分支,请按你的实际情况修改。<你的SSH地址> 后的 index 仅1Panel是相同的


第三阶段:配置自动同步脚本

环境都初始化好了,最后一步就是让面板定时去执行更新。前往 1Panel 的 计划任务,新建一个任务:

  • 任务名称: 随便填(比如“GitHub 自动同步”)
  • 执行周期: 按需填写(比如每 10 分钟或每小时执行一次)
  • 执行用户: 选择 root

脚本内容(核心重点):

千万不要只写一句 git pull!为了避免面板执行脚本时找不到环境变量或报权限错误,我优化了下面这个脚本。把下面这段代码复制进去,记得把第 2 步的路径和第 5 步的分支名改成你自己的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/bin/bash

# 1. 补全环境变量 (解决面板计划任务常报的 $HOME not set 错误)
export HOME=/root
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# 2. 填入你刚才创建的正确网站路径 (注意:是要同步的那个文件夹的绝对路径)
SITE_DIR="/opt/1panel/www/sites/<网站目录名>/index"

# 3. 尝试进入目录
cd "$SITE_DIR" || { echo "❌ 失败:找不到该目录,请核对路径!"; exit 1; }

# 4. 核心安全检查:看看这个文件夹到底有没有克隆过 GitHub 仓库
if [ ! -d ".git" ]; then
echo "❌ 失败:在这个目录里没有找到 .git 隐藏文件夹!"
echo "请先在终端里进入该目录,手动执行一次 git clone 把你的仓库拉取下来。"
exit 1
fi

# 5. 开始更新同步
echo "▶ 开始同步 GitHub 代码..."

# 添加安全目录信任,防止 Git 报错
git config --global --add safe.directory "$SITE_DIR"
git fetch --all

# 强制重置本地代码,与线上保持绝对一致 (注意这里的 <origin/static> 和 <origin static> 也要换成你的分支名)
git reset --hard origin/static
git pull origin static

# 6. 修复权限并输出时间 (解决同步后可能出现的 403 权限问题)
chown -R 1000:1000 .
echo "✅ 更新完成:$(date)"

1Panel 计划任务配置完成/执行日志 1

1Panel 计划任务配置完成/执行日志 2

保存并手动执行一次测试。如果日志里弹出了“✅ 更新完成”及时间戳,并且你的网站已经更新了最新内容,那就大功告成了。以后再也不用管它,专心写代码就行!