Deployer让部署变得更加的简单

平时,如果我们开发好一个laravel项目之后,纯手工部署代码的话,需要经历以下步骤:

  • 安装好服务器环境
  • 下载项目代码
  • 下载 Composer 依赖
  • 下载 Nodejs 依赖
  • 创建 .env 文件
  • 执行数据库迁移
  • 构建前端代码

如果后续要更新版本,代码变更的时候,实在是一个令人感觉不好的操作,我们可能需要做以下的工作

  • ssh 登录到服务器;
  • 使用 git 命令更新代码仓库;
  • 如果有 composer 依赖变更,需要执行 composer install;
  • 如果 .env 文件有变更,需要通过 scp 或者 vim 修改;
  • 如果有数据库变更,需要执行 php artisan migrate;
  • 如果有队列相关的代码变更,需要执行 php artisan queue:restart;
  • 如果有 Nodejs 依赖变更,需要执行 yarn;
  • 如果有前端代码变更,需要执行 yarn build

如果我们使用纯手工的方式部署会有以下问题:

  • 容易遗漏步骤或者误操作;
  • 在部署过程中站点可能不可用;
  • 如果有多台服务器需要部署则会加剧上述两个问题。

为了解决这个问题,我们可以使用Deployer 这个部署工具,Deployer 可以让我们用 PHP 代码的方式描述部署步骤并执行,对于php开发者来说真的是一个福音咯

我之前练手用的电商系统,就是用deployer部署的,支持单机跟多机部署,可戳shop

什么是Deployer

Deployer 是一个基于 SSH 协议的无侵入 web 项目部署工具,因为它不需要你在目标服务器上装什么服务之类的东西即可使用,它只需要在你的开发机,或者你的笔记本,就是发起部署动作的一方安装即可。

它的原理就是通过 SSH 到你的机器去创建目录,移动文件,执行指定的动作来完成项目的部署

跟我们shell脚本其实是一样的,只不过,我们不需要去服务器上面进行操作,而且在本地恋用熟悉的php进行编写部署脚本后,通过ssh协议,登录到指定服务器进行一系列操作,所以说还是很友好的。

Deployer 的安装与配置

Deployer的安装

Deployer的安装与配置都是在本地进行操作

$ composer global require deployer/deployer

安装完成后我们试试看是否安装成功:

$ dep

Deployer的配置

$ dep init

接下来的操作,选择yes就行了

dep init 命令用来创建一个部署脚本,会询问我们项目类型,我们是 Laravel 项目所以输入 1 然后回车;接下来询问 Repository 也就是我们代码仓库的地址

快速入门可参考官网Deployer

初始化后,会自动生成 deployer.php 文件。 deployer.php 文件包含了基本的部署配置和任务,且有明确的注释,你可以根据注释在适当的地方添加配置以及任务。

可参考我的部署脚本可戳shop

服务器权限的配置

在本地编写部署脚本是最简单写的,最难的就是用户权限的控制问题,刚开始使用的时候经常会遇到permission denied的问题,
以下参考自安正超的配置:

出于安全考虑,我们一般不会使用 root 用户的 SSH 登录,而是使用其它用户,比如 Ubuntu 默认的 ubuntu 用户。
我们 Deployer 是用来部署 web 应用的,所以我们也专门创建一个用户来做这件事情比较好:

$ sudo adduser deployer
# 密码什么的,按提示操作即可

我们的 web 项目通常需要一些上传,或者缓存写入这样的操作,所以 deployer 还需要有权限对目录进行修改,比如 Laravel 的 storage 目录需要可写权限,这里以 nginx 默认的用户组 www-data 举例,如果你修改过用户或者组名请对应修改下面的命令里的 www 用户组:

$ sudo usermod -aG www-data deployer

我们通常需要将deployer 用户权限分别设置为创建文件 644 与目录 755,这样一来,deployer 用户可以读写,但是组与其它用户只能读:

$ su deployer # 切换到 deployer 用户
$ echo "umask 022" >> ~/.bashrc
$ exit # 退出

我们需要将 depoloyer 用户加到 sudoers 中:

$ vim /etc/sudoers
# 在最后加入
deployer ALL=(ALL) NOPASSWD: ALL
# 保存并退出

接下来要对我们的 web 根目录授权,假设我们的 web 服务的根目录在 /var/www/ 下,那么需要将这个目录的用户设置为 deployer ,组设置为 www 用户 www-data:

$ sudo chown deployer:www-data /var/www/html # 最后这里不要加斜线哦
为了让 deployer 用户在 /var/www/html 下创建的文件与目录集成根目录的权限设定(用户:deployer,组:www-data),我们还需要一步操作:$ sudo chmod g+s /var/www/html

OK,Deployer 的用户操作就结束了,接着你需要检查以下配置:

  • 确认 php 的可执行文件在全局 PATH 中,或者你手动添加到 deployer 用户目录的 .bash_profile PATH 中也可,使用命令确认(登录用户 deployer 后执行):php -v,如果报错的话,一般建议是将 php 的 bin 文件软链接到 /usr/local/bin/(推荐) 或者 /usr/bin/ 下。
  • 同样检查你的 Deployer 任务清单所需要用到的其它命令,比如 npm,nginx,composer 都在 deployer 用户下可以使用,否则在部署的时候会出错。

项目 git 仓库允许服务器访问

因为部署脚本需要从git服务器中获取代码,因此我们的部署服务器需要有权限可以拉取代码
如果代码不是公开的仓库,我们通常需要添加 SSH 公钥才可以从代码库 clone 代码,所以接着来创建公钥:

先切换当前登录用户到 deployer:


$ su - deployer

然后创建 SSH 密钥:


$ ssh-keygen -t rsa -b 4096 -C "deployer"
# 这里的 -C 是指定备注
# 一路回车下去即可

然后我们将生成的公钥拷贝出来:

$ cat ~/.ssh/id_rsa.pub # 显示公钥

请完整的复制 cat 出来的结果,然后去你的代码库添加 SSH 公钥。

OK, 现在你的服务器就可以从代码库 clone 代码了,你可以在服务器上 git clone 一下你的代码库测试,如果不成功,请检查你的公钥是否正确完全的复制与粘贴正确,不正确的话再次重复复制粘贴即可。

服务器免密码登录 deployer

在部署shop,因为使用的是阿里云服务器,因此带上了,购买时生成的密钥文件,只要在本地登录的时候带上那个密钥文件就可以免密码登录,命令如下:


$ ssh root@{你的服务器公网 IP} -i ~/.ssh/laravel-shop-aliyun.pem #你的密钥文件路径

如果我们没有生成该文件,我们可以手动使用以下的方法来:

在本地(或者开发机)执行部署任务时我们不想每次输入密码,所以我们需要将 deployer 用户设置 SSH 免密码登录:

在本机生成 deployer 专用密钥,然后拷贝公钥:

$ ssh-keygen -t rsa -b 4096 -f  ~/.ssh/deployerkey

然后将公钥保存到目标服务器(注意,这一步还是在本机操作):

$ ssh-copy-id -i  ~/.ssh/deployerkey.pub deployer@{服务器ip} # 请填写服务器 IP# 应该会让你输入 deployer 在服务器上的登录密码,输入后回车即可

然后你应该就可以直接以 deployer 用户免密码登录到服务器了,测试方式:

$ ssh deployer@{服务器ip} -i ~/.ssh/deployerkey
# 应该就能直接进到服务器上了,然后 exit 退出

OK,这一步搞定了 deployer 免密码登录,接下来我们聊项目的部署。

其实,跟我们上一部差不多,只不过阿里云服务器帮我们省略了

关于 Deployer 部署结构

Deployer 部署完成后,在服务器上的结构会是这样子:


drwxr-sr-x 5 deployer www-data 4096 Jun 14 09:53 ./
drwxr-sr-x 6 deployer www-data 4096 Jun 11 14:25 ../
drwxr-sr-x 2 deployer www-data 4096 Jun 14 09:53 .dep/
lrwxrwxrwx 1 deployer www-data   10 Jun 14 09:52 current -> releases/7/
drwxr-sr-x 4 deployer www-data 4096 Jun 14 09:53 releases/
drwxr-sr-x 3 deployer www-data 4096 Jun 10 14:16 shared/
  • current - 它是指向一个具体的版本的软链接,你的 nginx 配置中 root 应该指向它,比如 laravel 项目的话 root 就指向:/var/www/demo-app/current/public

  • releases - 部署的历史版本文件夹,里面可能有很多个最近部署的版本,可以根据你的配置来设置保留多少个版本,建议 5 个。保留版本可以让我们在上线出问题时使用 dep rollback 快速回滚项目到上一个版本。

  • shared - 共享文件夹,它的作用就是存储我们项目中版本间共享的文件,比如 Laravel 项目的 .env 文件,storage 目录,或者你项目的上传文件夹,它会以软链接的形式链接到当前版本中。

因此,在nginx配置的时候,我们可以采用:,例如项目laravel-shop

$ vim /etc/nginx/sites-available/laravel-shop.conf

将站点根目录修改为 /var/www/laravel-shop-deployer/current/public

Deployer让部署变得更加的简单相关推荐

  1. Deployer php自动部署,Deployer 自动部署

    本文主要介绍 Deployer -- 一个具有模块化.代码回滚.并行任务等功能的 PHP 部署工具. Deployer 用法非常简单易用,可以快速上手,且支持多个 PHP 框架. 安装 Deploye ...

  2. Gitlab部署和汉化以及简单运维

    Gitlab部署和汉化以及简单运维 时间 2016-04-14 01:03:43 Xuanwo's Blog 原文  https://xuanwo.org/2016/04/13/gitlab-inst ...

  3. 使用 MDT2008 轻量部署进行 Windows XP SP2 简单部署

    使用 MDT2008 轻量部署进行 Windows XP SP2 简单部署 [url]http://www.yangzhip.net.cn/article.asp?id=12[/url] 转载于:ht ...

  4. mysql简单部署_安装部署Mysql实例(最简单快速噢)

    题外话 作为Mysql DBA,我们平时必须要熟练的一个最最基础的技能,即安装部署Mysql实例,所以本文分享一个快速安装部署Mysql实例的方法. 一.环境介质准备 Mysql安装包准备 服务器准备 ...

  5. C# 创建、部署和调用WebService的简单示例

    C# 创建.部署和调用WebService的简单示例 webservice 可以用于分布式应用程序之间的交互,和不同程序之间的交互. 概念性的东西就不说太多,下面开始创建一个简单的webservice ...

  6. 保密文件服务器,文件服务器部署方案之二:简单共享

    文件服务器部署方案之二:简单共享 万华数据 二. 简单共享 文件共享是办公环境中最常见的网络架构,小到几个人的工作组,大到数千人的文件交换中心,都可能使用这种模式交换数据. 对于使用加密文件的文件服务 ...

  7. 安卓手机反应慢又卡怎么办_手机变卡怎么办?简单一招叫教你解决!

    原标题:手机变卡怎么办?简单一招叫教你解决! 有很多人的手机永久了都会变得卡顿,有什么方法可以减少手机卡顿的问题呢,小编就来教你几招,让你可以在关键时刻轻松应对. 不常用的软件不仅会占用内存,还会拖慢 ...

  8. C# 创建、部署和调用WebService的简单示例 webservice 可以用于分布式应用程序之间的交互,和不同程序之间的交互。 概念性的东西就不说太多,下面开始创建一个简单的webservi

    C# 创建.部署和调用WebService的简单示例 webservice 可以用于分布式应用程序之间的交互,和不同程序之间的交互. 概念性的东西就不说太多,下面开始创建一个简单的webservice ...

  9. 使用C#代码部署SharePoint 2013开发包简单总结(一)

    这篇文章将总结下如何将自己开发的列表.Web部件.事件接收器等元素部署到SharePoint的服务器.因水平有限,我的做法未必是最佳实践,会有些错误理解和疏漏,欢迎各位高手批评指正--但一定要能给出更 ...

最新文章

  1. [示例]创建Student类,输入学生信息并存入字典,将3个存有学生信息的字典存入数组,并计算...
  2. Elasticsearch2.x Cluster Health
  3. Git 修改分支的名称(亲测)
  4. 使用nodejs构建Docker image最佳实践
  5. 大数据数据量估算_如何估算数据科学项目的数据收集成本
  6. 华为怎么用手机看时间到读秒_华为手机灭屏也可以看时间?其实设置方法很简单,不会有些可惜了...
  7. layui设置radio
  8. 修改pip默认安装位置
  9. 利用ENVI绘制土地利用图
  10. mysql左表有右表没有_查询左表存在而右表不存在的记录
  11. 计算机视觉与音乐,探索计算机视觉与音频的交叉:基于视觉的音乐相关研究Review...
  12. Springboot无法启动:At least one base package must be specified
  13. 美大联盟中国小将3年年薪翻60倍 从第7前锋到赢新合同
  14. U盘用哪种格式化比较好?教你一步,详细区分U盘格式
  15. DataGrip连接hive建表时报cannot recognize input near ‘show‘ ‘indexes‘ ‘on‘ in ddl statement错误
  16. elementUI-收起与展开
  17. 单片机复位后为什么要对sp重新赋值_单片机常用名词解释与常用逻辑电路
  18. 什么是核函数?如何理解?
  19. 如何寻找软件外包公司?
  20. 中关村创业论坛第108期:涂子沛谢耘谈中美大数据

热门文章

  1. 华为云人脸识别服务 FRS 之初体验
  2. 过年了教你自己动手写一个小游戏给表弟玩-猜数字小游戏
  3. selenium之判断是否定位正确
  4. C++(30)—奇偶数判断
  5. art-template整理
  6. PD-GAN: Probabilistic Diverse GAN for Image Inpainting
  7. 山茶油的功效与食用方法
  8. USB3.0无法识别U盘解决办法
  9. java 接收 char字符型
  10. JAVA+Appium 自动化实现手机屏幕滑动点击操作