我有一个与这个未答复的问题极为相似的问题:laravel 5 maintenance page broken during composer update
我是Laravel的新手(使用5.2版),我正在尝试解决部署过程。从我收集的内容来看,我想要使用的工作流程(当然,我在开发服务器上进行了全面测试并进行了全面测试)是将生产站点置于维护模式,通过git部署更改,运行composer /工匠任务(composer update
,php artisan migrate
等)然后让生产站点退出维护模式。
我遇到的问题是,如果我在config/app.php
中有新的提供者,即使在维护模式下,实时网站也会显示错误消息(直到我运行composer update
)。
有没有办法让维护模式视图覆盖错误视图,以便我可以安静地执行我的更新,而不会让网站告诉全世界有错误?我关闭了错误报告,所以它至少没有显示具体细节,但如果在启用维护模式的同时在DL上提及任何错误,我都会喜欢它。
或者,我是否可以使用更好的部署工作流程来消除这个问题?
答案 0 :(得分:2)
为什么不将symlinks用于发布?以下是我在Envoy的Laravel应用程序中使用的部署过程示例。除了PHP变量表示法之外,如果您不使用Envoy,则可以直接替换纯粹的bash / shell脚本。本质上,让脚本自动化部署,使用符号链接可以使更新几乎是即时的。其他好处包括在需要回滚的不幸时间内存在的先前版本。
注意:以下脚本做了一些基本假设:
.env
文件位于$root_dir
(例如:/var/www/my-website/.env
)。 您的虚拟主机指向site/public
中的$root_dir
目录(例如:/var/www/my-website/site/public
)。但是,如果您无法更新虚拟主机,则可以在空行中将以下内容添加到下面的数字4中:
ln -nfs {{ $app_dir }}/public {{ $root_dir }}/public ;
sudo chgrp -h www-data {{ $root_dir }}/public;
您已添加SSH密钥以从Git repo中提取
以下是脚本的相关示例变量:
$repo = 'git@bitbucket.org:myusername/my-repo.git';
$root_dir = '/var/www/my-website';
$release_dir = '/var/www/my-website/releases';
$app_dir = '/var/www/my-website/site';
$release = 'release_' . date('YmdHis');
$branch = 'master';
以下是部署过程的要点:代码:
将更新后的代码提取到新版本目录中:
@task('fetch_repo')
[ -d {{ $release_dir }} ] || mkdir {{ $release_dir }};
cd {{ $release_dir }};
git clone {{ $repo }} -b {{ $branch }} {{ $release }};
@endtask
通过运行composer:
来安装依赖项@task('run_composer')
cd {{ $release_dir }}/{{ $release }};
composer install;
@endtask
(可选)如果我们使用像Elixir这样的资产预编译器,我们将需要获取npm依赖项,重置权限并运行gulp:
@task('npm_install')
cd {{ $release_dir }}/{{ $release }};
sudo npm install;
@endtask
@task('update_permissions')
cd {{ $release_dir }};
sudo chgrp -R www-data {{ $release }};
sudo chmod -R ug+rwx {{ $release }};
@endtask
@task('compile_assets')
cd {{ $release_dir }}/{{ $release }};
gulp --production;
@endtask
更新符号链接
@task('update_symlinks')
ln -nfs {{ $root_dir }}/.env {{ $release_dir }}/{{ $release }}/.env;
ln -nfs {{ $release_dir }}/{{ $release }} {{ $app_dir }};
sudo chgrp -h www-data {{ $app_dir }};
sudo service php5-fpm restart;
@endtask
(可选)修剪旧版本文件夹(30天以上),以便我们不会填满服务器。
@task('prune_old')
sudo find {{ $release_dir }} -maxdepth 1 -type d -mtime +30 -exec rm -rf {} \;
@endtask
注意:重新启动php5-fpm
服务会清除缓存,以确保遵循新的符号链接。
当我最初开始使用Laravel进行开发时,我发现找到部署脚本示例(如上所述)有点困难,所以希望这有助于减轻一些搜索。