8

由于我以 root 身份运行我的 rails 应用程序,因此它会在 tmp 目录中创建由 root 拥有的文件。因为这

cap production deploy:cleanup

无法删除旧版本,因为它不是以 root 身份运行的。

我查看了 capistrano v3 代码,但没有看到以 root 身份运行清理命令的方法。是缺少此选项还是因为我在部署流程的另一个地方做错了什么而出现此问题。

我以 root 身份启动应用程序,因为我需要绑定到端口 80。

4

4 回答 4

13

您还可以做的是在清理旧版本之前触发任务:

namespace :deploy do

  before :cleanup, :cleanup_permissions

  desc 'Set permissions on old releases before cleanup'
  task :cleanup_permissions do
    on release_roles :all do |host|
      releases = capture(:ls, '-x', releases_path).split
      if releases.count >= fetch(:keep_releases)
        info "Cleaning permissions on old releases"
        directories = (releases - releases.last(1))
        if directories.any?
          directories.each do |release|
            within releases_path.join(release) do
                execute :sudo, :chown, '-R', 'deployuser', 'path/to/your/files/writtend/by/root'
            end
          end
        else
          info t(:no_old_releases, host: host.to_s, keep_releases: fetch(:keep_releases))
        end
      end
    end
  end

end

请注意,您需要授予部署用户执行此特定 sudo 命令的权限(使用sudoers定义文件。

于 2014-11-14T15:35:28.353 回答
3

我查看了 capistrano v3 代码,但没有看到以 root 身份运行清理命令的方法。是缺少此选项还是因为我在部署流程的另一个地方做错了什么而出现此问题。

Capistrano 没有秘诀,我们依赖于您正确设置部署用户的权限,如http://www.capistranorb.com/中所述

删除目录需要write父目录的权限,也就是说,给定以下目录结构:

/var/www/releases/
              \- 20131015180000
              \- 20131015181500
              \- 20131015183000

您需要对该目录具有权限/var/www/releases/,因为该目录中的文件和目录列表存储在该目录中。

来自类似的 StackSverflow 问题

在 UNIX 和 Linux 中,删除文件的能力不取决于该文件的访问位。它由包含文件的目录的访问位决定。

来自关于 Unix 文件权限的维基百科文章

写权限授予修改文件的能力。当为目录设置时,此权限授予修改目录中条目的能力。这包括创建文件、删除文件和重命名文件。

于 2013-10-23T16:14:51.297 回答
1

您可能想要做的一件事是在您的 linux 机器上创建一个名为appor的组,并将用户添加到同一个组中。然后,作为部署的一部分,其权限将确保 root 用户创建的任何新文件都是组可写的。webrootdeploychmodrelease_pathg+s

然后,您应该能够以deploy用户身份删除旧文件夹。

于 2014-03-07T19:10:52.027 回答
0

我遇到了类似的问题,因此,为了确认,通过 SSH 登录到我的 Web 服务器,然后尝试rm -rf [directory],由于相同的权限问题,它也失败了,甚至以管理员身份登录。运行chmod -R 755 [directory]/,然后rm -rf [directory]/确实有效。

为了修复它,在项目的 silverstripe.rake 文件中,我更改了运行的命令: execute :chown, "-R [user]:[group] /path/to/project"

至: execute :chmod, "-R 755 /path/to/project"

到目前为止,在运行时删除最旧版本没有更多问题cap [release name] deploy

于 2017-11-04T18:04:54.870 回答