部署 Capistrano 部署用非 root 用户时的权限问题,求解!

piginzoo · 2012年03月08日 · 最后由 hiveer 回复于 2017年02月14日 · 4987 次阅读

为了安全,我肯定不能把 root 和密码写在 deploy.rb 中,这样就得每次运行 cap deploy 的时候输入 root 密码,麻烦。于是创建了个 deploy 用户,设置个不太怕泄露的密码,写在 deploy.rb 中,然后用 deploy ssh 到服务器上去跑 cap deploy。

怕权限问题,就把 git 的库目录的归属组设置成一个叫 gitgroup 组,然后把 deploy 用户,以及提交代码用的 git 用户都的主组都设成了 gitgroup。心满意足后,用 deploy ssh 后,跑 cap deply,依然苦逼地报 Operation not permitted。开 debug 跑 cap deply -d,发现原因是:

git clone 后,生成的文件的组权限是 r--,然后 cap 试图运行chmod -R g+w xxxx的时候,报错chmod: changing permissions of ........: Operation not permitted

我现在能想到的办法就是改 deploy 用户的 umask,让 cap 运行 git clone 复制过来的时候,就加上组权限为写。

你们遇到这种问题过么?或者,你们是如何使用 non-root 用户来构建发布环境的,说说大家的最佳实践吧。

  1. mac 本地会存你的 ssh key 的,所以不需要每次输密码,deploy 中也不用写。
  2. 不需要用 root 来部署吧,sudo 就可以了。
  3. git clone 时只读即可以,不需要输密码。

密码就每次部署的时候手动输入好了,如果实在闲麻烦,那就把 ~/.ssh/id_rsa.pub 里面的内容放到服务器用户下面的 ~/.ssh/authorized_keys 里面,就不需要输入密码了。


我现在所有的部署都是用普通用户搞的

sudo 和 ssh key 预存好,都是办法,可是还是得用 root 权限。这个应该没问题,回头我去试试。

不过我还是考虑要用普通用户,用普通用户就会遇到 cap 运行git clone...生成的新的文件和文件夹的权限是-rw-r--r--的问题,然后接下去它继续运行chmod -R g+w ....就会报错啦,我一直困惑这点,除非你改这个普通用户的 umask,让 cap git clone 出来的文件模式就是-rw-rw-r--。

BTW,cap 的过程我用 cap -d deploy 跑了一遍,看到的上面说的步骤。

谢谢 2 位!

#3 楼 @piginzoo 我们都是非 root 用户部署的诶。。。没什么问题啊。chmod 的也很正常。

#3 楼 @piginzoo 这个就看你的布署目录了,尽量布署在你这个用户的目录下,这样你 chmod 就不会有问题。

解决了,网上看到一段文章,说起这事,加上 set(:group_writable, false),不触发 chmod g+w 即可。chomod 只有当多用户部署的时候遇到,我们不会。

最终,我们拉代码和部署用的是 deploy 用户,各自开发者用的是自己的账户提交,但是他们都是属于 gitgroups 组的,最终完美解决权限,霍霍。

set :copy_exclude, [".git", "spec"]
set :user, 'deploy'
set :use_sudo, false
set :group_writable, false

Always deploy as the same user. If you’re part of a team where everyone can (and does) deploy, create a new user (e.g., “deploy”) and set it up so that your team can all log in as this user. Make sure this user also has read access to your source code repository.

Avoid sudo if at all possible. set(:use_sudo, false), and then make sure that the deploy user has sufficient permissions to start and stop the mongrels, write to the necessary directories, etc.

Disable the “group_writable” setting: set(:group_writable, false). This is only necessary when you have multiple users deploying.

#2 楼 @huacnlee 用 root 可以吗?我看官方文档上是这样说的

Capistrano is designed to deploy using a single, non-privileged SSH user, using a non-interactive SSH session.

不太理解这里的意思,望指点

#9 楼 @hiveer 理论上讲当然可以用 root 部署

Capistrano 是一个设计成通过单一用户,且无特权的账号,使用非交互性的 SSH 来部署。

#10 楼 @huacnlee 谢谢,这样的话是我理解有偏差,别人没说不能用 root,而只是说明了这个账号可以是无特权的。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号