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

如何在Capistrano的deploy.rb中定义默认SSH用户而非stages文件?

在Capistrano中统一设置默认SSH用户(简化stages配置)

为什么你之前的方法部分任务不生效

你之前在:composer:install前覆盖host用户的方式,只对该任务及之后的任务生效——Capistrano在部署初期就已经初始化了大部分服务器连接配置,早期的任务(比如代码拉取、目录准备)会先于你的override_ssh_user任务执行,所以这些任务还是用默认的capistrano用户。

可行实现方案

方案1:用Capistrano内置:user变量 + 环境变量(推荐)

这种方式最简洁,利用Capistrano的内置全局变量,不需要修改stages文件:

  1. 在deploy.sh中传入环境变量

    # deploy.sh 内容
    # 直接在命令前指定环境变量,或者提前export
    CAP_SSH_USER="my_user" cap production deploy
    
  2. 在config/deploy.rb中全局设置默认用户

    # 全局设置SSH用户:优先用环境变量的值,没有的话用自定义默认值
    set :user, ENV['CAP_SSH_USER'] || 'my_default_user'
    

    这样你的stages文件(比如config/deploy/production.rb)只需要保留域名和角色:

    # config/deploy/production.rb
    server 'prod.example.com', roles: [:web, :app]
    server 'db.example.com', roles: [:db]
    

    Capistrano会自动把:user变量应用到所有服务器的SSH连接中,个别需要特殊用户的服务器,还可以在stages里单独指定(会覆盖全局设置):

    server 'special-server.example.com', roles: [:web], user: 'special_user'
    

方案2:加载配置后统一覆盖所有host用户

如果需要更灵活的控制,可以在Capistrano加载配置后,遍历所有host设置用户:

  1. deploy.sh中设置环境变量

    # deploy.sh 内容
    export CAP_SSH_USER="my_user"
    cap production deploy
    
  2. 在config/deploy.rb中添加钩子

    # 加载完配置后,给所有host设置默认SSH用户
    after :load_config, :set_global_ssh_user do
      on roles(:all) do |host|
        # 优先用环境变量, fallback到自定义默认值
        host.user = ENV['CAP_SSH_USER'] || 'fallback_user'
      end
    end
    

    同样,stages文件只需要保留域名和角色即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 15:32:39