部署 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 面板所在的服务器:

部署 Laravel 到 BT 宝塔面板,并集成阿里云 Codeup 自动部署

流水线的部署脚本:

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 和 Schedule artisan schedule:run不同在于队列需要保持运行,以随时处理任务,而 Schedule 是定时运行,是一次性的,每次运行都是最新代码,所以 deploy.sh 不用管。
本帖已被设为精华帖!
本帖由系统于 9个月前 自动加精
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 12

点赞, 另外如果不是滚动更新的话, 可以将artisan down维护模式加进来吗

1年前 评论
xuchunyang (楼主) 1年前
Jianne

可以试下 deployer

1年前 评论

有用,谢谢。收藏了。目前用的是码云的 webhook,通知到宝塔完成自动更新。

1年前 评论

cd /www/wwwroot/www.la10.com && git pull && composer install

1年前 评论

留名 哪天来试试

1年前 评论

我最近准备尝试做成docker镜像,然后通过宝塔来部署。宝塔那边也在重构docker模块,估计后续可能支持docker集群

1年前 评论
91it (作者) 1年前
xuchunyang (楼主) 1年前

1panel 也很好

1年前 评论

我们自己搭建的Git仓库,使用webhook自动部署到服务器

1年前 评论
xuchunyang (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!