如何在Virtualmin上通过Git部署Laravel项目(含权限配置)
分步解决Virtualmin下Git部署Laravel的问题
我来一步步帮你搞定这个Git部署Laravel的问题——毕竟Virtualmin的用户权限体系确实容易踩坑,结合你的场景,咱们从权限修复、钩子优化到Laravel配置全流程梳理:
第一步:修复post-receive钩子的基础问题
你当前的钩子脚本有格式和逻辑上的小问题,先调整脚本内容:
- 登录服务器,打开钩子文件:
nano /home/fantasy/public_html/git/fantasy-website.git/hooks/post-receive - 替换为以下规范写法(避免路径歧义,增加容错逻辑):
#!/bin/bash # 定义核心路径变量 WORK_DIR="/home/fantasy/public_html/website" GIT_DIR="/home/fantasy/public_html/git/fantasy-website.git" # 确保部署目录存在,避免首次推送报错 if [ ! -d "$WORK_DIR" ]; then mkdir -p "$WORK_DIR" chown fantasy:fantasy "$WORK_DIR" fi # 执行Git代码 checkout git --work-tree="$WORK_DIR" --git-dir="$GIT_DIR" checkout -f # 给Laravel必要目录设置可写权限(Web服务器需要访问) chmod -R 775 "$WORK_DIR/storage" "$WORK_DIR/bootstrap/cache" chown -R fantasy:www-data "$WORK_DIR/storage" "$WORK_DIR/bootstrap/cache" - 保存退出后,重新赋予执行权限,同时确保钩子文件归属正确:
chmod +x /home/fantasy/public_html/git/fantasy-website.git/hooks/post-receive chown fantasy:fantasy /home/fantasy/public_html/git/fantasy-website.git/hooks/post-receive
第二步:确认Git仓库和目标目录的权限归属
Virtualmin的用户权限是隔离的,必须确保所有相关目录都属于fantasy用户:
- 检查Git仓库目录权限:
输出应显示所有者为ls -ld /home/fantasy/public_html/git/fantasy-website.gitfantasy fantasy,如果不是,执行:chown -R fantasy:fantasy /home/fantasy/public_html/git/fantasy-website.git - 检查部署目录权限:
同样确保所有者为ls -ld /home/fantasy/public_html/websitefantasy fantasy,如果目录未创建,执行:mkdir -p /home/fantasy/public_html/website chown fantasy:fantasy /home/fantasy/public_html/website chmod 755 /home/fantasy/public_html/website
第三步:配置Virtualmin网站根目录指向Laravel的public文件夹
你希望index.php对外可访问,需要把Virtualmin的网站根目录设置为Laravel项目的public目录:
- 登录Virtualmin面板,找到
fantasy用户对应的网站 - 进入
Server Configuration > Website Options - 在
Document root字段,修改为:/home/fantasy/public_html/website/public - 点击
Save保存,Virtualmin会自动重启Apache生效
第四步:完善Laravel部署的核心步骤(可选但必要)
只checkout代码还不够,Laravel需要依赖安装和配置缓存才能正常运行,你可以把这些步骤加入post-receive钩子:
- 回到钩子文件,添加以下内容(确保服务器已安装Composer):
# 安装/更新Composer依赖(生产环境跳过dev包) cd "$WORK_DIR" composer install --no-dev --optimize-autoloader # 首次部署复制环境配置文件 if [ ! -f "$WORK_DIR/.env" ]; then cp "$WORK_DIR/.env.example" "$WORK_DIR/.env" # 生成Laravel应用密钥 php artisan key:generate fi # 缓存配置、路由和视图,提升性能 php artisan config:cache php artisan route:cache php artisan view:cache - 保存退出后,再次确认钩子有执行权限
第五步:测试部署流程
现在从本地重新推送代码,验证整个流程:
- 在本地项目目录执行:
git push origin main - 登录服务器,检查
/home/fantasy/public_html/website目录是否有最新代码 - 访问你的域名,确认Laravel网站是否正常加载
常见问题排查
- 如果钩子不执行:手动运行钩子看报错信息:
根据报错排查(比如缺少Composer、路径权限不足)cd /home/fantasy/public_html/git/fantasy-website.git/hooks ./post-receive - 如果Laravel显示权限错误:再次确认
storage和bootstrap/cache目录的所有者是fantasy:www-data,权限为775 - 如果网站403错误:检查Virtualmin的Document Root是否正确,以及
public目录权限为755
内容的提问来源于stack exchange,提问作者Amir
相关产品推荐
相关产品推荐

