部署 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 不用管。
本帖已被设为精华帖!
本帖由系统于 1年前 自动加精
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 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年前