部署 Laravel 到 BT 宝塔面板,并集成阿里云 Codeup 自动部署
我们有几个网站是用 Forge 管理的,为了节约服务器和 Forge 成本,打算合并到已经装有 BT 宝塔面板的服务器中。我们的代码托管在阿里云 Codeup 上,用配套的流水线服务实现自动部署。
安装 PHP 8.2
从 BT 面板的软件商店安装 PHP 8.2,这个过程很快。
Git clone 代码
首先,用 BT 面板新建一个网站,然后登录服务器,清空 BT 面板自动生成的文件,方便 Git Clone 把整个网站代码下载到网站目录:
# 切换用户
# su -l www -s /bin/bash
# clone 项目代码到当前目录
$ git clone git@codeup.aliyun.com:example/laravel-bt.git .
- 切换用户:BT 面板的 Web 服务使用 www:www 用户和组,所以几乎所有的操作,都用 www 用户,而非 root(我有时候觉得 chmod -R 777 有些业余?!)
- 清空目录:因为需要把网站直接放到 BT 新建的目录中,先把目录清空,git clone 才能正常执行
- clone 权限:以 www 的身份新建 SSH 密码,然后添加到 Codeup,之后便有了仓库的只读权限了
安装 Laravel 网站
首先,用 Composer 安装依赖:
$ /www/server/php/82/bin/php /www/server/php/82/bin/composer install
- 不同版本 PHP 都有附带的 Composer(这是优点),但是 PHP 8 的 Composer 版本太老,尝试运行会报告大量兼容性警告,需要自行升级
composer self-update
- 命令行中的 PHP/Composer 版本不一致,一个 8.2 另一个 7.4,所以后面我全部使用完整路径
- 安装的过程中会提示一些函数被禁用,还有缺少依赖,如函数 putenv、proc_open,扩展 fileinfo,按照提示启用和安装即可
然后,设置好环境变量和数据库后,网站就能跑起来了:
# 编辑生产环境的环境变量
$ cp .env.example .env
$ vim .env
$ /www/server/php/82/bin/php artisan key:generate
# 迁移数据库
$ /www/server/php/82/bin/php artisan migrate
# 前端打包
$ npm ci && npm run build
添加队列进程
BT 软件商店中安装 Supervisor(进程守护管理器),然后添加队列任务:
/www/server/php/82/bin/php artisan queue:work
- 同样选择 www 用户
添加计划任务
su -l www -s /bin/bash -c "cd /www/wwwroot/laravel-bt.example.com && /www/server/php/82/bin/php artisan schedule:run"
- BT 计划任务的执行用户是 root,所以我们需要切换到 www 用户
设置 Codeup 流水线自动部署
云效 Codeup 是阿里云的代码托管平台,云效 Flow(流水线)是仓库自动化服务,都有免费额度,足够我们的用量。
添加一条流水线,推送之后,自动部署到 BT 面板所在的服务器:
流水线的部署脚本:
su -l www -s /bin/bash -c 'cd /www/wwwroot/laravel-bt.example.com && git pull && bash ./deploy.sh' && /etc/init.d/php-fpm-82 reload
- 依旧先切换到 www 用户
- 更新代码,部署命令比较多,我放到了单独的文件中,见下
- 最后重现载入 PHP FPM,类似 Forge 用的
service $FORGE_PHP_FPM reload
,区别在于我们用的是 Centos 7,而 Forge 用的是 Ubuntu
deploy.sh 的内容:
#!/usr/bin/env bash
PHP="/www/server/php/82/bin/php"
COMPOSER="/www/server/php/82/bin/composer"
$PHP $COMPOSER install --no-dev --optimize-autoloader --no-interaction
$PHP artisan migrate --force
# 重启队列,因为 artisan queue:work 常驻后台,如果不重启不会收到新代码
$PHP artisan queue:restart
npm ci && npm run build
- 按照 Laravel 文档推荐的方法按照 Composer 依赖,更加适合生产环境
- Queue
artisan queue:work
和 Scheduleartisan schedule:run
不同在于队列需要保持运行,以随时处理任务,而 Schedule 是定时运行,是一次性的,每次运行都是最新代码,所以 deploy.sh 不用管。
本帖已被设为精华帖!
本帖由系统于 9个月前 自动加精
点赞, 另外如果不是滚动更新的话, 可以将artisan down维护模式加进来吗
可以试下 deployer
有用,谢谢。收藏了。目前用的是码云的 webhook,通知到宝塔完成自动更新。
cd /www/wwwroot/www.la10.com && git pull && composer install
留名 哪天来试试
我最近准备尝试做成docker镜像,然后通过宝塔来部署。宝塔那边也在重构docker模块,估计后续可能支持docker集群
1panel 也很好
我们自己搭建的
Git
仓库,使用webhook
自动部署到服务器