How to enter rails console on production via capistrano?

前端 未结 7 1496
借酒劲吻你
借酒劲吻你 2021-02-02 11:25

I want to enter the rails console on production server from my local machine via capistrano. I found some gists, e.g. https://gist.github.com/813291 and when I enter console via

相关标签:
7条回答
  • 2021-02-02 11:41

    In my experience, capistrano isn't built to work very well with interactive terminals.

    If you have to execute things in multiple terminals, I'd suggest iterm, which has a "send to all windows" function that works very well for me:

    http://www.iterm2.com/#/section/home

    0 讨论(0)
  • 2021-02-02 11:45

    I've added my own tasks for this kind of thing:

    namespace :rails do
      desc "Remote console"
      task :console, :roles => :app do
        run_interactively "bundle exec rails console #{rails_env}"
      end
    
      desc "Remote dbconsole"
      task :dbconsole, :roles => :app do
        run_interactively "bundle exec rails dbconsole #{rails_env}"
      end
    end
    
    def run_interactively(command)
      server ||= find_servers_for_task(current_task).first
      exec %Q(ssh #{user}@#{myproductionhost} -t '#{command}')
    end
    

    I now say cap rails:console and get a console.

    0 讨论(0)
  • 2021-02-02 11:45

    I have a somewhat difficult environment, which is influx ... So bash -lc isn't really an option right now. My solution is similar to @Rocco, but it's a bit more refined.

    # run a command in the `current` directory of `deploy_to`
    def run_interactively(command)
      # select a random server to run on
      server = find_servers_for_task(current_task).sample
      # cobble together a shell environment
      app_env = fetch("default_environment", {}).map{|k,v| "#{k}=\"#{v}\""}.join(' ')
      # Import the default environment, cd to the currently deployed app, run the command
      command = %Q(ssh -tt -i #{ssh_options[:keys]} #{user}@#{server} "env #{app_env} bash -c 'cd #{deploy_to}/current; #{command}'")
      puts command
      exec command
    end
    
    namespace :rails do
      desc "rails console on a sidekiq worker"
      task :console, role: :sidekiq_normal do
        run_interactively "bundle exec rails console #{rails_env}"
      end
    end
    
    0 讨论(0)
  • 2021-02-02 11:53

    I have fiddled with that approach as well, but then resorted to avoiding building my own interactive SSH shell client and just went with this snippet I found that simply uses good old SSH. This might not be suitable if you have some weird SSH gateway proxying going on, but for logging into a box and performing some operations, it works like a charm.

    0 讨论(0)
  • 2021-02-02 11:55

    A simple Capistrano 3 solution may be:

    namespace :rails do
      desc "Run the console on a remote server."
      task :console do
        on roles(:app) do |h|
          execute_interactively "RAILS_ENV=#{fetch(:rails_env)} bundle exec rails console", h.user
        end
      end
    
      def execute_interactively(command, user)
        info "Connecting with #{user}@#{host}"
        cmd = "ssh #{user}@#{host} -p 22 -t 'cd #{fetch(:deploy_to)}/current && #{command}'"
        exec cmd
      end
    end
    

    Then you can call it say, on staging, with: cap staging rails:console. Have fun!

    0 讨论(0)
  • 2021-02-02 11:56

    For Capistrano 3 you can add these lines in your config/deploy:

    namespace :rails do
      desc 'Open a rails console `cap [staging] rails:console [server_index default: 0]`'
      task :console do    
        server = roles(:app)[ARGV[2].to_i]
    
        puts "Opening a console on: #{server.hostname}...."
    
        cmd = "ssh #{server.user}@#{server.hostname} -t 'cd #{fetch(:deploy_to)}/current && RAILS_ENV=#{fetch(:rails_env)} bundle exec rails console'"
    
        puts cmd
    
        exec cmd
      end
    end
    

    To open the first server in the servers list:

    cap [staging] rails:console 
    

    To open the second server in the servers list:

    cap [staging] rails:console 1 
    

    Reference: Opening a Rails console with Capistrano 3

    exec is needed to replace the current process, otherwise you will not be able to interact with the rails console.

    0 讨论(0)
提交回复
热议问题