升级Ruby 3.0.1后Capistrano部署无法删除旧版本报错如何解决
根本原因
报错是两个独立问题导致的:
- 权限错误:puma/sidekiq进程用非deploy用户(通常是root)启动,生成的bootsnap缓存文件所有者不是deploy用户,deploy用户没有权限删除这些文件
- 选项错误:你参考的旧方案适配的是低版本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配置
- 删掉你之前参考旧方案添加的配置,恢复默认cleanup任务逻辑
- 建议将
set :use_sudo, true改为false,避免不必要的sudo权限引入的问题 - 在
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
相关产品推荐
相关产品推荐

