以使用Laravel的Envoy1.4.1为例:
Envoy是基于SSH远程配置实现的,原文见:高级Envoy部署
现简单翻译如下:(根据Envoy v1.4.1有修改@macro 改为 @story
)2018年5月23日 13:15:48
上一篇文章Envoy部署
Envoy部署进阶脚本
将展示如何更准确地从 GitHub 获取代码、使用 ACL 权限,怎样让我们的部署用户deployer
安全地使用sudo
、保留日志文件和更多边缘案例。
改进的脚本将处理环境文件、日志目录、允许部署用户重新加载 PHP-FPM 等等!以下是我们对 Envoy 配置所做的所有调整。
原脚本
@servers(['web' => 'deploy-ex'])
<?php
$repo = 'git@github.com:Servers-for-Hackers/deploy-ex.git';
$release_dir = '/var/www/releases';
$app_dir = '/var/www/app';
$release = 'release_' . date('Ymd_His');
?>
@story('deploy', ['on' => 'web'])
fetch_repo
run_composer
update_permissions
update_symlinks
@endstory
@task('fetch_repo')
[ -d {{ $release_dir }} ] || mkdir {{ $release_dir }};
cd {{ $release_dir }};
git clone {{ $repo }} {{ $release }};
@endtask
@task('run_composer')
cd {{ $release_dir }}/{{ $release }};
composer install --prefer-dist;
@endtask
@task('update_permissions')
cd {{ $release_dir }};
chgrp -R www-data {{ $release }};
chmod -R ug+rwx {{ $release }};
@endtask
@task('update_symlinks')
ln -nfs {{ $release_dir }}/{{ $release }} {{ $app_dir }};
chgrp -h www-data {{ $app_dir }};
@endtask
始终克隆主分支代码
更改
git clone {{ $repo }} {{ $release }};
为:
git clone -b master {{ $repo }} {{ $release }};
ACL跨组权限
在生产服务器中:
检查setfacl
存在:
which setfacl
# If doesn't exist:
sudo apt-get install -y acl
然后使用它:
# Inspect current ACL's
getfacl /var/www
# Set current and default ACL's for /var/www
sudo setfacl -Rm g:www-data:rwx,d:g:www-data:rwx /var/www
现在,我们的部署用户deployer
(它是组的一部分www-data
)可以读取,写入和执行文件中的目录,/var/www
,忽略当前组设置和权限。
visudo命令
允许组www-data
运行 sudo service php5-fpm [reload|restart]
而不需要密码:
打开
# Run as super user
sudo visudo
加入:
%www-data ALL=(ALL:ALL) NOPASSWD:/usr/sbin/service php5-fpm restart,/usr/sbin/service php5-fpm reload
或者我们可以创建和编辑文件 /etc/sudoers.d/wwwdata
并添加上一行。
最后,部署用户在部署后重新加载 PHP-FPM。将以下内容添加到该 update_symlinks
部分的底部:
sudo service php5-fpm reload
处理.env文件:
我们不希望我们的.env
文件在我们的代码库中。我们将把它放在我们的服务器上并且符号链接到它,所以它可用于我们应用程序的每个部署版本。
在生产服务器上:
# Create and edit the .env file as needed
vim /var/www/.env
然后在 Envoy 配置中,更新update_symlinks
部分:
cd {{ $release_dir }}/{{ $release }};
ln -nfs ../../.env .env;
chgrp -h www-data .env;
处理 Composer 的环境
确保在 Laravel 中定义的安装后命令composer.json
在正确的环境中运行。将以下内容添加到该run_composer
部分中:
composer install --prefer-dist --no-scripts;
php artisan clear-compiled --env=production;
php artisan optimize --env=production; #已不再推荐使用
保留日志文件
storage/logs
每次部署时,目录都会被覆盖。然而,我们希望我们的日志处于中心位置。我们可以使用符号链接来完成此操作。
在生产服务器上:
sudo mkdir /var/www/logs
sudo chown www-data:www-data /var/www/logs
然后在Envoy配置下update_symlinks,添加以下内容:
rm -r {{ $release_dir }}/{{ $release }}/storage/logs;
cd {{ $release_dir }}/{{ $release }}/storage;
ln -nfs ../../../logs logs;
chgrp -h www-data logs;
最终代码:
@servers(['web' => 'deploy-ex'])
<?php
$repo = 'git@github.com:Servers-for-Hackers/deploy-ex.git';
$release_dir = '/var/www/releases';
$app_dir = '/var/www/app';
$release = 'release_' . date('Ymd_His');
?>
@story('deploy', ['on' => 'web'])
fetch_repo
run_composer
update_permissions
update_symlinks
@endstory
@task('fetch_repo')
[ -d {{ $release_dir }} ] || mkdir {{ $release_dir }};
cd {{ $release_dir }};
git clone -b master {{ $repo }} {{ $release }};
@endtask
@task('run_composer')
cd {{ $release_dir }}/{{ $release }};
composer install --prefer-dist --no-scripts;
php artisan clear-compiled --env=production;
php artisan optimize --env=production;
@endtask
@task('update_permissions')
cd {{ $release_dir }};
chgrp -R www-data {{ $release }};
chmod -R ug+rwx {{ $release }};
@endtask
@task('update_symlinks')
ln -nfs {{ $release_dir }}/{{ $release }} {{ $app_dir }};
chgrp -h www-data {{ $app_dir }};
cd {{ $release_dir }}/{{ $release }};
ln -nfs ../../.env .env;
chgrp -h www-data .env;
rm -r {{ $release_dir }}/{{ $release }}/storage/logs;
cd {{ $release_dir }}/{{ $release }}/storage;
ln -nfs ../../../logs logs;
chgrp -h www-data logs;
sudo service php5-fpm reload;
@endtask
延伸阅读:Laravel Envoy 详解