You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级Ruby 3.0.1后Capistrano部署无法删除旧版本报错如何解决

根本原因

报错是两个独立问题导致的:

  1. 权限错误:puma/sidekiq进程用非deploy用户(通常是root)启动,生成的bootsnap缓存文件所有者不是deploy用户,deploy用户没有权限删除这些文件
  2. 选项错误:你参考的旧方案适配的是低版本Capistrano,你当前使用的Capistrano版本不再支持方案中的-s参数,所以抛出选项异常

解决步骤

步骤1:清理服务器端遗留的错误缓存和进程

以root权限登录服务器执行以下命令:

  • 停止运行中的puma、sidekiq进程
systemctl stop puma
systemctl stop sidekiq
  • 删除所有权限异常的缓存文件和无法删除的旧版本目录
rm -rf /home/deploy/apps/myapp/releases/20210527195617
rm -rf /home/deploy/apps/myapp/shared/tmp/cache/bootsnap
  • 重置整个应用目录的权限归属
chown -R deploy:deploy /home/deploy/apps/myapp
chmod -R 755 /home/deploy/apps/myapp

步骤2:修复服务运行用户配置

检查puma和sidekiq的systemd服务配置文件(通常在/etc/systemd/system/目录下),确保User和Group字段都设置为deploy,不要使用root运行服务。修改完成后执行:

systemctl daemon-reload

步骤3:调整Capistrano配置

  1. 删掉你之前参考旧方案添加的配置,恢复默认cleanup任务逻辑
  2. 建议将set :use_sudo, true改为false,避免不必要的sudo权限引入的问题
  3. 在config/deploy.rb中新增权限修复任务,确保清理前tmp目录权限正确:
namespace :deploy do
  desc "Fix tmp directory permissions before cleanup"
  task :fix_tmp_perms do
    on roles(:app, :worker) do
      execute "chown -R #{fetch(:user)}:#{fetch(:user)} #{shared_path}/tmp"
      execute "chmod -R 755 #{shared_path}/tmp"
    end
  end

  before "deploy:cleanup", "deploy:fix_tmp_perms"
end

你配置中已经将tmp/cache加入了linked_dirs,后续新部署的版本都会将tmp/cache软链到共享目录,旧版本目录下不会再生成实际的缓存文件,删除时不会再触发权限问题。

步骤4:验证修复

重新执行部署流程,确认可以正常清理旧版本,部署完成后检查puma、sidekiq进程的运行用户为deploy:

ps aux | grep puma
ps aux | grep sidekiq

内容的提问来源于stack exchange,提问作者Antarr Byrd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 06:06:03