又一篇 Deployer 的使用攻略

file

其实网上有相当多的关于 Deployer 的使用教程,在这个社区也有不少同学写过,不过发现很难找到一个完整能跑通的文章,所以希望今天写这篇是一个小白就能完整走通的教程吧,当然了,这是回忆加参考外文写出来的,难免也有失误,欢迎小白同学在下面反馈使用过程中遇到的问题为谢!

基础知识

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

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

我画了一张图来说明它的操作原理:

file
绘图工具:https://www.draw.io/

简单介绍一下,Deployer 安装在本地,它通过 SSH 协议登录到服务器 web server 上执行一系列我们预定的操作,其中包含从代码库 Git Server 拉取我们的项目代码部署到 web 服务器指定的目录完成部署。

一共分为以下几个部分:

  • 在本地使用 composer 安装 deployer
  • 在 Linux 服务器添加账户与配置权限
  • 项目 git 仓库允许服务器访问(clone 代码)
  • 部署我们的 web 项目

我们分开一个个讲,在后面的每一步请注意区分当前逻辑所在的环境:本地 / 目标服务器

Deployer 的安装与配置

此部分在本地操作

Deployer 是一个 composer 包,你可以选择以 phar 包的形式,或者以 composer 全局安装来使用它,这里只讲后者,毕竟这是推荐大家使用的方式,升级也会方便很多:

$  composer global require deployer/deployer -vvv

安装完成你应该可以使用以下命令来查看它的版本信息:

$ dep --version
# Deployer master

如果提示 dep 命令不存在的话,可能需要将 composer 的 bin 目录加到你的 PATH 环境变量里面,通常是家目录下的 .composer/vendor/bin/,你可以通过下面的命令来查看是否配置成功:

$ echo $PATH
/usr/local/sbin /usr/local/bin /Users/overtrue/.composer/vendor/bin 

Mac 环境下根据你使用 shell 的不同来配置环境变量,默认的 bash 的话直接编辑家目录下的 .bash_profile 文件即可:

$ vim ~/.bash_profile
# 将 composer bin 目录加到其中即可
# export PATH=/usr/local/bin:/Users/overtrue/.composer/vendor/bin:$PATH
# 然后保存退出

然后切一个新的终端窗口,应该就有 dep 命令了。

Deployer 的安装就到这里,接下来我们去目标服务器去折腾一下。

服务器端的配置

此部分在目标服务器上操作

虽然说是无侵入的部署工具,但是还是需要我们来做一些微小的配置的,因为出于安全考虑,我们一般不会开发 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 的用户操作就结束了,接着你需要检查以下配置:

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

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

此部分在目标服务器上操作

我们 deployer 的运行机制是从 git 或者其它你指定的代码库 clone 代码到目标服务器,所以如果你的代码不是公开的仓库,我们通常需要添加 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

此部分在本地(或者开发机)操作

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

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

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

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

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

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

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

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

Deployer 的使用

这些都在本地操作哦

假设我们的项目在本地 /www/demo-project 下,那么我们切换到该目录:

$ cd /www/demo-project

然后执行 Deployer 的初始化命令:

$ dep init

它会让你选择项目类型,比如 Laravel,symfony 等,如果你都不是,选择 common 类型即可。

这一步操作将会在当前目录生成一个 deploy.php 文件,这个文件就是部署清单,也就是告诉 Deployer 怎样去部署你的项目,关于这部分我们不需要过多的介绍,大家去参考 Deployer 官网的详细说明操作即可。

需要关心的几个配置是:

// 指定你的代码所在的服务器 SSH 地址,请不要使用 https 方式哦。
set('repository', 'git@mygitserver.com:overtrue/demo-project.git');

// 这里填写目标服务器的 IP 或者域名
host('your_server_ip') 
    ->user('deployer') // 这里填写 deployer 
      // 并指定公钥的位置
    ->identityFile('~/.ssh/deployerkey')
    // 指定项目部署到服务器上的哪个目录
    ->set('deploy_path', '/var/www/demo-app'); 

正确填写完配置清单以后,我们就可以部署我们的项目了,确认你的代码已经提交到代码仓库,因为执行部署的时候并不是将当前代码部署到服务器,而是从代码库拉最新的版本。

然后在当前目录执行:

$ dep deploy -vvv

就可以看到整个部署过程了,一般正常会是像下面这样子:

$ dep deploy -vvv
Deployer's output
✈︎ Deploying master on your_server_ip
✔ Executing task deploy:prepare
✔ Executing task deploy:lock
✔ Executing task deploy:release
➤ Executing task deploy:update_code
✔ Ok
✔ Executing task deploy:shared
✔ Executing task deploy:vendors
✔ Executing task deploy:writable
✔ Executing task artisan:storage:link
✔ Executing task artisan:view:clear
✔ Executing task artisan:cache:clear
✔ Executing task artisan:config:cache
✔ Executing task artisan:optimize
✔ Executing task deploy:symlink
✔ Executing task deploy:unlock
✔ Executing task cleanup
Successfully deployed!

如果失败的话就需要检查一下哪一步出错了,通常根据报错信息即可定位。

关于 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/

其中,.dep 为 Deployer 的一些版本信息,不用去研究,我们需要关心的是下面这几个:

  • current - 它是指向一个具体的版本的软链接,你的 nginx 配置中 root 应该指向它,比如 laravel 项目的话 root 就指向:/var/www/demo-app/current/public
  • releases - 部署的历史版本文件夹,里面可能有很多个最近部署的版本,可以根据你的配置来设置保留多少个版本,建议 5 个。保留版本可以让我们在上线出问题时使用 dep rollback 快速回滚项目到上一个版本。
  • shared - 共享文件夹,它的作用就是存储我们项目中版本间共享的文件,比如 Laravel 项目的 .env 文件,storage 目录,或者你项目的上传文件夹,它会以软链接的形式链接到当前版本中。

OK,那基本上这样子就完成了整体 Deployer 需要考虑的地方以及使用细节了,相信大部分同学的问题都出在权限问题上。所以上面在创建用户时,一定要仔细操作。

结论

Deployer 确实非常好用,一条命令完成部署,回滚等操作,但是它目前还不是很完美,大家有问题可以去 GitHub 官方仓库提 issue 或者搜索相关问题解决方案。

个人用它已经两年了,非常喜欢这样简单的部署方式,但是新手刚用的时候难免在服务器权限这块碰壁不少,我总结了以下几个建议:

  • 尽量使用系统提供的包管理工具来安装软件,比如 nginx, php 等,毕竟它是人家通过 N 年的实践总结出来的合理使用方式,包括配置文件的写法等都是科学的方式,另外一点就是当我们遇到问题的时候搜索到的结果也比较通用,当然你已经是系统高手了,那就不要看这条了。
  • 不要让你的项目结构设计的太复杂,简单统一为原则,这样你不必多次重复去折腾这些东西。
  • 最好关掉服务器 SSH 的密码登录,相关操作请自行 Google。
  • 多看文档,很多你遇到的问题其实都是你没仔细看使用文档造成的结果。
本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由 Summer 于 5年前 加精
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 109
Artisan

超哥关于服务器权限这部分说明,是其他 deployer 文章中很少提及的。棒

5年前 评论
Artisan

超哥关于服务器权限这部分说明,是其他 deployer 文章中很少提及的。棒

5年前 评论

刚好需要,很详细,很棒!!

5年前 评论

已经在项目中使用了 这个工具很好用

5年前 评论

首先感谢 超哥分享.部署过程中报错, laradock环境下.不过,看到服务器下已经有了文件.


In Client.php line 99:

  [Deployer\Exception\RuntimeException (1)]
  The command "command -v 'php'" failed.

  Exit Code: 1 (General error)

  Host Name: 139.196.213.134

  ================

执行部署出差,请问是怎么回事呢?
$ ssh-copy-id deployer@123.45.67.89 # 请填写服务器 IP这一步执行,copy的是 ~/.ssh/deployerkey.pub 它吗. 实践过程需要让你输入 远程deployer的密码,而且是2次. 使用默认生成的id_rsa ,并且注释deploy.php文件中的key就不需要. 有生成id_rsa是不是不需要重新生成deployerkey了?这里有些疑惑,请大神指点..

5年前 评论
maclxf 4年前

@ayauper 我确实写少了一部分,应该是:

$ ssh-copy-id -i ~/.ssh/deployerkey.pub deployer@123.45.67.89

The command "command -v 'php'" failed.

这个报错是因为你的 PHP 可执行文件不在 PATH 内啊,你的 PHP 是自己编译安装的吧?把它加到用户 .bash_profile 或者全局都可以,或者就是软链接到 /usr/bin/ 或者 /usr/local/bin/ 目录下就可以了。

5年前 评论
wkan

毕竟它是人家通过 N 年的事件已经设计好的使用方式

毕竟它是人家通过 N 年的时间已经设计好的使用方式

5年前 评论

超哥好棒 我要给你生猴子 :kissing_heart:

5年前 评论
月光

昨天刚给服务器弄通,今天就看到这个

5年前 评论

@wkan 感谢,已修正

5年前 评论
幽弥狂

超哥 这个图是怎么画的

5年前 评论
幽弥狂

@overtrue 谢谢超哥

5年前 评论
git push -u origin master
The authenticity of host 'gitee.com (116.211.167.14)' can't be established.
ECDSA key fingerprint is SHA256:FQGC9Kn/eye1W8icdBgrQp+KkGYoFgbVr17bmjey0Wc.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'gitee.com,116.211.167.14' (ECDSA) to the list of known hosts.
Access denied
exec request failed on channel 0
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

我git上添加 公钥了,怎么还报错,求解. 难道要添加项目公钥?

5年前 评论

  [Symfony\Component\Process\Exception\ProcessFailedException]
  The command "ssh -A -tt -i ~/.ssh/deployerkey deployer@139.196.213.134 '
  cd /data/wwwroot/Laravel && (/usr/bin/git clone -b master --depth 1 --re
  cursive -q git@gitee.com:kaodao_admin/larabbsweb.git /data/wwwroot/Larav
  el/releases/1 2>&1)'" failed.

  Exit Code: 128(Invalid exit argument)

  Working directory: /var/www/larabbs

  Output:
  ================

  Error Output:
  ================
``` 这是什么意思,, 求大神指点.
5年前 评论

@overtrue 我在deployer用户的.bashrc下加入 export PATH=/usr/local/php/bin:/home/deployer/.composer/vendor/bin:$PATH

 php -v
PHP 7.1.17 (cli) (built: May 21 2018 05:12:20) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.1.17, Copyright (c) 1999-2018, by Zend Technologies
5年前 评论

@ayauper gitee 的话在个人中心 ssh 公钥添加就可以 push 了啊,你要看看你的角色在项目里是不是不让 push 哦,我们这个过程没有 push 哦,部署的时候服务器是从 git server clone 代码。

5年前 评论

超哥去鹅肠了?

5年前 评论

@ayauper 嗯,也可以的

5年前 评论

@ayauper 在你的服务器以 deployer 用户登录,然后尝试 git clone 一下就知道了

5年前 评论

哪天写篇文章 我与鹅厂的不得不说的故事

5年前 评论

@Tao 可以可以

5年前 评论

已在用,不过有很多详细的地方还是要自己去看文档的, 比如部署成功后的任务,重启守护进行 里面的队列. 重置opcache缓存 , reload php-fpm, 还可以自定义成功后发送邮件==. 这里面有个坑就是就清空掉缓存,所以需要
task('artisan:cache:clear', function () {
return true;
});
覆盖掉, 文档上还提供加速部署等。 比原先用walle好多了。

5年前 评论

@overtrue 我是本地开发 更改后push上去. 服务器上 git clone 是ok的.

5年前 评论
GalaxyNo_1

最后阶段报错了,超哥

file

5年前 评论
GalaxyNo_1
5年前 评论

@Athena

切到 root 用户后

$ vim /etc/sudoers
# 在最后加入
deployer ALL=(ALL) NOPASSWD: ALL
5年前 评论
GalaxyNo_1

@overtrue 不知道为什么我加了,还是有这个问题

5年前 评论

sudo chfn -o umask=022 deployer

这个命令是什么意思 在centos 上不行

5年前 评论

@Athena 哦,我猜到了,deployer 的创建文件夹部分还是有 bug 的,参见:https://github.com/deployphp/deployer/pull...

5年前 评论

@wiladog 不行是什么情况,有报错吗

5年前 评论

@ayauper 我也遇到这个问题,然后在 deployer.php 前面加了 set_time_limit(0) 执行成功了了。

5年前 评论
冷无缺
  • sudo chfn -o umask=022 deployer这条命令会报错,错误是:chfn: Office: '=' is not allowed
  • 尝试着把=改为-运行成功,不知道是不是overtrue大大打错命令了。
5年前 评论

@冷无缺 试试:

$ sudo chfn -o "umask=022" deployer
5年前 评论
冷无缺

@overtrue chfn: Office: '=' is not allowed,还是一样的

5年前 评论

@冷无缺 额, 在 Ubuntu 上可以用,我再找找原因

5年前 评论
冷无缺

@overtrue 我的是centos,这么看来,我把=改为-是不对的。 :joy:

5年前 评论

@冷无缺 使用:

$ su deployer # 切换到 deployer 用户
$ echo "umask 022" >> ~/.bashrc
5年前 评论
冷无缺

@overtrue 好的,overtrue大大,我试试 :blush:

5年前 评论

@overtrue 大牛,我看这个是好像是无法创建目录,我是按照流程走下来的
file

5年前 评论

@overtrue 超哥,我是应该更新么?我明白是因为mkdir 没有sudo,但是现在情况,我应该怎么做?

5年前 评论

@景哥哥 打开家目录下的 .composer/vendor/deployer/deployer 改源码

5年前 评论

@overtrue 超哥,直接修改过源码后,仍然报错

file

我只圈了一处,其他的按照 https://github.com/deployphp/deployer/pull... 进行修改的。
仍然报一样的错误

5年前 评论

@景哥哥 你的配置文件贴一下,set('cleanup_use_sudo', true) 这个要设置哦

5年前 评论

@景哥哥 你这个可以检查 deployer 这个用户的权限是不是有问题,/var/www 是否 deployer 有权限,应该是后者导致的 /var/www deployer 没权限

5年前 评论

@overtrue 确实如此,改了服务器的文件的权限就可以了。这个工具真的是不错。

5年前 评论

大佬即是大佬!回头再对比了下自己写的那个,深刻感觉到了差距…… :joy:

5年前 评论

@ayauper 你这个ssh 错误修改什么文件了 单独执行deployer 用户 的git clone 正常, 但是启用发布脚本还是报这个错误

5年前 评论

超哥,部署完了,接下来是不是每次修改代码都需要 dep deploy -vvv ?

5年前 评论

@hedeqiang 这是肯定的吧。不可能人工智能跑你机器上来抓代码哦

5年前 评论
 [Symfony\Component\Process\Exception\ProcessFailedException]
  The command "ssh -A -tt -i ~/.ssh/deployerkey deployer@raybon.vip 'cd /usr/local/nginx/html/wechat && (/usr/bi
  n/git clone -b master --depth 1 --recursive -q git@github.com:pengleelove/wecaht-test.git /usr/local/nginx/htm
  l/wechat/releases/1 2>&1)'" failed.

  Exit Code: 1(General error)

  Working directory: /Users/plee/Sites/wechat

  Output:
  ================

  Error Output:
  ================

这错误跟踪是看着是语法错误了,错误的地方是git clone 这个命令附加的参数执行时候报错,不知道什么原因,这个是测试Demo, ssh 正常

5年前 评论

@raybon 以 deployer 身份登录到服务器,然后执行:cd /usr/local/nginx/html/wechat && (/usr/bi n/git clone -b master --depth 1 --recursive -q git@github.com:pengleelove/wecaht-test.git /usr/local/nginx/htm l/wechat/releases/1 2>&1) 就知道了

5年前 评论
萧宇宸

特别棒,再也不用FTP啦!感谢超神!

5年前 评论

超神,能给点线索嘛,遇到这个错误搞死我了,看在我买了两个付费课程的份上,指导一下
In Client.php line 99:

[Deployer\Exception\RuntimeException (1)]
The command "/usr/bin/php /var/www/html/releases/1/artisan migrate --force" failed.

Exit Code: 1 (General error)

Host Name: 35.195.99.143

================

In config.php line 112:

Call to undefined method Closure::__set_state()     
5年前 评论

@wilby laravel config/* 文件中不要用 Closure

5年前 评论

@overtrue 好的,多谢超哥

5年前 评论

@overtrue 是说项目根目录下的config目录下的配置文件,里面不要用闭包,是这个意思吗?超哥

5年前 评论

@overtrue 奇怪的是,我在本地跑一点问题都没有的

5年前 评论

和 go 的依赖管理工具 dep 冲突了, 命令行下名字相同

5年前 评论

@overtrue 超哥,我明白了,因为我使用了laravel-admin,config/administrator.php这个配置文件使用了,
'permission' => function () {
return Auth::check() && Auth::user()->can('manage_contents');
},
使用config:cache,会将其编译成闭包的形式,但是,超哥,该怎么解决这个问题呢?

5年前 评论

@wilby 这个你得问问作者了,我并不清楚这么设计的原因

5年前 评论
superwen

我进一步偷懒了,添加了一个本地task

desc('git push origin master');
task('git:push', function() {
    writeln('start git push task');
    run('git add .');
    run('git commit -m "auto commit by deploy to gitee"');
    run('git push origin master');
});

同时

set('default_stage', 'local');
localhost()
    ->stage('local')

每次deploy之前,执行

dep git:push
5年前 评论
Jennie

@overtrue 超哥你好,想请问下,下图的问题是应为镜像的原因吗?

file

一路下去,会出现下图的报错:

file
显示超时了,猜想是git clone 超时?还是?还望指点下,感谢:tada:

5年前 评论

@Everan 应该是你的服务器没有指定 composer 源,composer install 超时

5年前 评论
Jennie

@overtrue 感谢回复,我服务器一开始就用了社区的源:

file

5年前 评论
Toiu

@overtrue Laravel 部署时报错 SQLSTATE[HY000] [1045] Access denied for user 'forge'@'localhost' (using password: NO) , 我ssh到服务器查看环境变量文件.env为空, 求解~~

5年前 评论
Toiu

@Toiu 我又去翻了一下deployer的源码 里面的 recipe/laravle.php 中 shared_files数组中包含了 .env 可是为何我的migrate 命令没有读到其中的数据库配置呢,还是说问题出在我前面提到的服务器中 share/.env 为空那里

5年前 评论

我操作的环境

  • 我的阿里云: centos7
  • 本机:Windows git bash(做文章中的操作)

我按照文章在阿里云上尝试时,在本地 ssh-copy-id -i ~/.ssh/deployerkey.pub deployer@139.129.***.*** 执行这个命令,报出下面的错误;我手动将本机的 deployerkey.pub 内容复制到 /home/deployer/.ssh/authorized_keys 中,我使用 ssh deployer@139.129.***.*** 进行登录时,仍然需要输入密码,最后仍然报 deployer@139.129.***.***: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password). 的错误 @overtrue 大大,不知道该怎么解决,我谷歌木有找到具体的做法 :sob:

$ ssh-copy-id -i  ~/.ssh/deployerkey.pub deployer@139.129.***.***
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/c/Users/Administrator.WIN7-1712211059/.ssh/deployerkey.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
deployer@139.129.***.***'s password:
Permission denied, please try again.
deployer@139.129.***.***'s password:
Permission denied, please try again.
deployer@139.129.***.***'s password:
deployer@139.129.***.***: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
5年前 评论

@raybon 我也是这个问题 你解决了吗

5年前 评论

@overtrue
我用

ssh-keygen -t rsa -b 4096 -C "deployer" -f ~/.ssh/id_xx_deployer_key

GIT 仓库中添加了公钥在服务器可以直接git clone

但是通过dep deploy -vvv 就是提示 Permission denied! 没有权限操作此仓库

找不到原因,是不是ssh-agent / ssh-add 的原因

但是在~/.bash_profile 中增加

## login auto start ssh-agent & ssh-add
eval `ssh-agent -s`
ssh-add ~/.ssh/id_xx_deployer_key

通过dep deploy 部署 好像没有开启ssh-agent 和 执行ssh-add

有没有一种不用每次都要ssh-add 或者 能在deploy.php 中 增加ssh-add 呢

5年前 评论

你是不是需要配置一下 git 仓库指定用哪个 key ,毕竟你用的不是默认的

5年前 评论
mouyong

附上一篇实践步骤 Deployer 使用过程

5年前 评论
幽弥狂

超哥,我想弱弱的问一句,不用 composer 或者 npm 的项目是不是没法用 deployer

5年前 评论

用deploy 发布成功,但是服务器太码没有更新。刷新界面没有变化。

file

5年前 评论

@overtrue
谢谢了!我又遇到问题了,

file

我的适配文件如下:

file

5年前 评论

@Toiu @overtrue Toiu老哥和超哥 这个问题我也遇到了, 已经把 shared/.env 配置上了, current 中也有 .env 的软链接, 就是不知道为什么项目读取不到. 有解决方法吗!
以 migrate 为例

**************************************
*     Application In Production!     *
**************************************

 Do you really wish to run this command? (yes/no) [no]:
 > yes

In Connection.php line 664:

  SQLSTATE[HY000] [1045] Access denied for user 'forge'@'127.0.0.1' (using password: NO) (SQL: select * fro
  m information_schema.tables where table_schema = forge and table_name = migrations)

In PDOConnection.php line 50:

  SQLSTATE[HY000] [1045] Access denied for user 'forge'@'127.0.0.1' (using password: NO)

In PDOConnection.php line 46:

  SQLSTATE[HY000] [1045] Access denied for user 'forge'@'127.0.0.1' (using password: NO)
5年前 评论
Toiu

@Achais 后来我没搞太明白 就暂且放弃了

5年前 评论

@Toiu 发现问题了, 出在 php artisan config:cache
在 deploy.php 中 require 'recipe/laravel.php'; 时候定义了配置文件缓存, 我这里由于某些原因配置缓存没有成功, 所以复制下面这一段到 deploy.php 中注释其中一行就搞定了...

/**
 * Main task
 */
desc('Deploy your project');
task('deploy', [
    'deploy:info',
    'deploy:prepare',
    'deploy:lock',
    'deploy:release',
    'deploy:update_code',
    'deploy:shared',
    'deploy:vendors',
    'deploy:writable',
    'artisan:storage:link',
    'artisan:view:clear',
    // 'artisan:config:cache',
    'artisan:optimize',
    'deploy:symlink',
    'deploy:unlock',
    'cleanup',
]);
5年前 评论

不错,很详细。大神就是牛

5年前 评论

粗看看楼主的演示,还是用的内置的update_code调用被部署服务器上的git仓库拉代码实现的代码更新,其实对于小博客小项目之类的 ,这样问题也不大。

不过公司项目如果有CI/CD加持的话 一般是先构建好成品后再通过部署方式(比如rsync+ssh)部署到服务器。我自己用Gitlab的CI/CD比较多,而且他完美支持Docker镜像方式的持续集成,所以我打了一个Deployer的镜像,https://github.com/ihipop/deployer-toolkit DockerHub 内置一些必须的构建工具,当然包括deployer,自己构建了应用部署模板,通过CI构建好以后再用deployer的并行部署功能部署到多台服务器上。用起来也蛮爽的。适合有CI/CD流程的用户。 另外 gitlab.com 也支持免费的CI/CD 就是国内访问速度有点着急。

5年前 评论

@overtrue 如何在发布过程中 取消 deploy:vendors这一步呢

composer 的包都很稳定了,发布几本不会发生变化,

想通过取消composer 包的安装,节省发布时间

5年前 评论

@vopdoo
我现在的做法是


task('deploy:copy_vendors', function () {
    if (has('previous_release')) {
        run('cp -R {{previous_release}}/vendor {{release_path}}/vendor');
    }
    run('cd {{release_path}} && {{bin/composer}} {{composer_options}}');
});

不晓得有没有更好的方案。

5年前 评论
TalentMiao 3年前

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

这里将文件夹权限设定为 755,那么就表示该组(在这里是www-data)中的用户只能读不能写(因为通过deployer用户部署的,那么文件夹的所有者就是deployer),但是我们很多时候,运行fpm进程以及nginx的用户都不会是这里的deployer(一般都是www-data组内的www-data用户),这时候就会使得这两个进程只能读不能写,但是很多框架在运行时,都会生成缓存文件(thinkphp的runtime)、会话文件(比如通过文件储存session等)等等需要写操作,这时候就会报 Permission deny 错误,所以想请教下将文件夹设定为 755 是基于怎么样的考究?或者说有其他的操作可以避免这个问题?

4年前 评论

@翁航 deployer 会根据你的配置在部署时将 web 目录修改为你指定的用户和用户组,详情请查看 deployer 配置说明 。

4年前 评论

这和Envoy有啥不同?有啥优劣啊?

4年前 评论

'ssh' is not recognized as an internal or external command,
这个错误是啥原因啊,我电脑用的win10

4年前 评论

作者你好,请教下,deploy 部署后 uploads 文件里的图片都没了,怎么不更新 或者不覆盖这个目录啊?

3年前 评论

@overtrue 权限问题想请教下
假设 storage/logs/a.log 不存在;
假设 nginx 和 fpm 使用的用户是www-data,第一次访问时a.log生成,用户属于www-data:www-data, 权限是0644,
此时使用deployer登录服务器,执行artisan命令,也会写日志到a.log,此时会发现没有权限报错,请问这个如何比较优雅的解决?

3年前 评论

file 请教下,我第一次部署都是可以的,后面报这个错是什么原因啊?

3年前 评论

现在composer2 好像没有这个包了,只能在项目里安装了

3年前 评论

不知如何在win10 环境中使用就好了,,团队都是在win10开发的

3年前 评论

@overture
首先文中设置目录权限的地方 /var/www 总的web目录,然后后面就变成了 给 /var/www/html 权限,这个好像不对,容易误导。

其次,我已经sudouser 里增加了deployer ALL=(ALL) NOPASSWD: ALL,su - deployer 的时候不需要密码,但是ssh-copy-id -i ~/.ssh/deployerkey.pub deployer@123.45.67.89,这个还是需要密码,没办法我去服务器重置了一下deployer的密码才copy上去,不知道是哪里的问题。

3年前 评论

在部署得时候出现了一点点小问题,咋个解决,

file

2年前 评论
巴啦啦小仙女 2年前

file 部署时遇到点小问题 有人指点吗

2年前 评论
KuangBenDeWoNiu

webman项目怎么用额,我是先查找start的目录,然后执行stop,再在新目录里start,,,,,,,,,

1年前 评论

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