Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to enter rails console on production via capistrano?

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

cap production console 

I get the following result

192-168-0-100:foldername username $ cap console RAILS_ENV=production
  * executing `console'
  * executing "cd /var/www/myapp/current && rails console production"
    servers: ["www.example.de"]
    [www.example.de] executing command
    [www.example.de] rvm_path=$HOME/.rvm/ $HOME/.rvm/bin/rvm-shell '1.9.3' -c 'cd /var/www/myapp/current && rails console production'
/var/www/myapp/releases/20120305102218/app/controllers/users_controller.rb:3: warning: already initialized constant VERIFY_PEER
Loading production environment (Rails 3.2.1)
Switch to inspect mode.

and thats it... Now I can enter some text, but nothing happens...

Has anybody an idea how to get that work or another solution for my problem?

like image 510
monavari-lebrecht Avatar asked Mar 05 '12 15:03

monavari-lebrecht


4 Answers

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.

like image 143
Rocco Stanzione Avatar answered Sep 19 '22 20:09

Rocco Stanzione


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.

like image 45
Pablo Cantero Avatar answered Sep 18 '22 20:09

Pablo Cantero


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!

like image 36
Darme Avatar answered Sep 22 '22 20:09

Darme


For Capistrano > 3.5 and rbenv. Working in 2021

namespace :rails do
  desc "Open the rails console on one of the remote servers"
  task :console do |current_task|
    on roles(:app) do |server|
      server ||= find_servers_for_task(current_task).first
      exec %Q[ssh -l #{server.user||fetch(:user)} #{server.hostname} -p #{server.port || 22} -t 'export PATH="$HOME/.rbenv/bin:$PATH"; eval "$(rbenv init -)"; cd #{release_path}; bin/rails console -e production']
    end
  end
end
like image 40
Abel Avatar answered Sep 22 '22 20:09

Abel