可通过Git钩子实现宝塔面板网站自动部署:一、建裸仓库并配置post-receive钩子;二、统一目录权限与www用户环境;三、本地配置远程地址并推送测试;四、增强钩子错误捕获与日志记录;五、禁用钩子时可用宝塔计划任务定时拉取替代。

如果您在宝塔面板中已配置好网站项目,并希望代码通过 Git 推送后无需手动操作即可更新服务器文件,则可借助 Git 钩子(Git Hook)触发自动部署流程。以下是实现此功能的具体步骤:
一、在服务器上初始化裸仓库并配置 post-receive 钩子
裸仓库作为接收远程推送的中转站,不包含工作目录,适合部署场景;post-receive 钩子在推送完成时执行,用于触发后续部署动作。
1、使用 SSH 登录服务器,进入网站根目录的上级目录(例如 /www/wwwroot/)。
2、执行命令创建裸仓库:git init --bare myproject.git。
3、进入该裸仓库的 hooks 目录:cd myproject.git/hooks。
4、创建或编辑 post-receive 文件,添加如下内容:
#!/bin/bash
git --work-tree=/www/wwwroot/myproject --git-dir=/www/wwwroot/myproject.git checkout -f
5、赋予执行权限:chmod +x post-receive。
二、配置网站运行目录权限与用户环境
宝塔面板默认以 www 用户运行网站,而 Git 钩子脚本常以 root 或其他用户执行,若权限不一致会导致文件属主错误或写入失败,需统一部署目标目录的归属和权限。
1、执行命令将网站目录属主设为 www:chown -R www:www /www/wwwroot/myproject。
2、确保 www 用户对裸仓库目录具有读取权限:chmod -R 755 /www/wwwroot/myproject.git。
3、若钩子中调用 git 命令报 “command not found”,需确认 www 用户环境变量中包含 git 路径,可通过在钩子开头添加 export PATH="/usr/local/git/bin:$PATH"(路径依实际 git 安装位置调整)。
三、在本地仓库配置远程地址并推送测试
本地仓库需将服务器裸仓库设为远程源,推送时触发钩子执行部署逻辑。
1、在本地项目根目录执行:git remote add production user@server_ip:/www/wwwroot/myproject.git(user 替换为服务器用户名,server_ip 替换为实际 IP)。
2、提交一次变更:git add . && git commit -m "deploy test"。
3、执行推送:git push production master(分支名按实际调整)。
4、检查服务器 /www/wwwroot/myproject 目录下文件是否已同步更新。
四、增强部署可靠性:加入错误捕获与日志记录
原始钩子缺乏异常反馈机制,一旦出错难以定位;添加日志输出与退出状态判断可提升可维护性。
1、修改 post-receive 文件,替换为以下内容:
#!/bin/bash
REPO=/www/wwwroot/myproject.git
WORK_TREE=/www/wwwroot/myproject
LOG_FILE=/www/wwwroot/myproject-deploy.log
echo "[$(date)] Deploy started" >> $LOG_FILE
git --work-tree=$WORK_TREE --git-dir=$REPO checkout -f || { echo "[$(date)] Checkout failed" >> $LOG_FILE; exit 1; }
chown -R www:www $WORK_TREE >> $LOG_FILE 2>&1
echo "[$(date)] Deploy finished" >> $LOG_FILE
2、保存后再次执行 chmod +x post-receive。
3、推送后查看 /www/wwwroot/myproject-deploy.log 确认各步骤执行状态。
五、使用宝塔计划任务替代钩子(备用方案)
当服务器禁用 shell 钩子或权限策略严格限制时,可改用定时拉取方式模拟自动部署,依赖宝塔内置的计划任务功能。
1、在服务器上为网站目录初始化非裸 Git 仓库:cd /www/wwwroot/myproject && git init && git remote add origin user@server_ip:/www/wwwroot/myproject.git。
2、在宝塔面板中进入「计划任务」,创建新任务:Shell 脚本 类型,执行周期设为每分钟或每5分钟。
3、脚本内容填写:cd /www/wwwroot/myproject && git pull origin master 2>/dev/null。
4、勾选「执行前先检测 Web 服务是否运行」并保存任务。










