Déployer une application RoR 4 avec Capistrano 3 sur Dreamhost

Bonjour à tous.

Je suis nouveau sur ce forum. Je viens y poser ma question sous les conseils de Camille.

Cela fait quelques années que je n’ai pas fait de RoR et du coup je me suis pris quelques versions dans la tête. Je démarre un nouveau projet sous ROR 4 que je souhaite déployer avec Capistrano 3 sur un serveur mutualisé Dreamhost.

Après avoir installé Capistrano, configurer un dépot GIT sur Dreamhost, ma tentative de cap production deploy:setup --trace abouti à une erreur que je ne sais pas trop interpréter. Je suis un peu rouillé…

Voici la trace :

** Invoke production (first_time)
** Execute production
** Invoke load:defaults (first_time)
** Execute load:defaults
cap aborted!
Don't know how to build task 'deploy:setup'
/Library/Ruby/Gems/2.0.0/gems/rake-10.3.2/lib/rake/task_manager.rb:62:in `[]'
/Library/Ruby/Gems/2.0.0/gems/rake-10.3.2/lib/rake/application.rb:149:in `invoke_task'
/Library/Ruby/Gems/2.0.0/gems/rake-10.3.2/lib/rake/application.rb:106:in `block (2 levels) in top_level'
/Library/Ruby/Gems/2.0.0/gems/rake-10.3.2/lib/rake/application.rb:106:in `each'
/Library/Ruby/Gems/2.0.0/gems/rake-10.3.2/lib/rake/application.rb:106:in `block in top_level'
/Library/Ruby/Gems/2.0.0/gems/rake-10.3.2/lib/rake/application.rb:115:in `run_with_threads'
/Library/Ruby/Gems/2.0.0/gems/rake-10.3.2/lib/rake/application.rb:100:in `top_level'
/Library/Ruby/Gems/2.0.0/gems/rake-10.3.2/lib/rake/application.rb:78:in `block in run'
/Library/Ruby/Gems/2.0.0/gems/rake-10.3.2/lib/rake/application.rb:176:in `standard_exception_handling'
/Library/Ruby/Gems/2.0.0/gems/rake-10.3.2/lib/rake/application.rb:75:in `run'
/Library/Ruby/Gems/2.0.0/gems/capistrano-3.2.1/lib/capistrano/application.rb:15:in `run'
/Library/Ruby/Gems/2.0.0/gems/capistrano-3.2.1/bin/cap:3:in `<top (required)>'
/usr/bin/cap:23:in `load'
/usr/bin/cap:23:in `<main>'

Voici le fichier config/deploy/production.rb :

# Simple Role Syntax
# ==================
# Supports bulk-adding hosts to roles, the primary server in each group
# is considered to be the first unless any hosts have the primary
# property set.  Don't declare `role :all`, it's a meta role.

role :app, %w{[email protected]}
role :web, %w{[email protected]}
role :db,  %w{[email protected]}


# Extended Server Syntax
# ======================
# This can be used to drop a more detailed server definition into the
# server list. The second argument is a, or duck-types, Hash and is
# used to set extended properties on the server.

server 'hlin.dreamhost.com', user: 'hfisselier', roles: %w{web app}, my_property: :my_value


# Custom SSH Options
# ==================
# You may pass any option but keep in mind that net/ssh understands a
# limited set of options, consult[net/ssh documentation](http://net-ssh.github.io/net-ssh/classes/Net/SSH.html#method-c-start).
#
# Global options
# --------------
#  set :ssh_options, {
#    keys: %w(/home/rlisowski/.ssh/id_rsa),
#    forward_agent: false,
#    auth_methods: %w(password)
#  }
#
# And/or per server (overrides global)
# ------------------------------------
# server 'example.com',
#   user: 'user_name',
#   roles: %w{web app},
#   ssh_options: {
#     user: 'user_name', # overrides user setting above
#     keys: %w(/home/user_name/.ssh/id_rsa),
#     forward_agent: false,
#     auth_methods: %w(publickey password)
#     # password: 'please use keys'
#   }

Et le fichier config/deploy.rb :

# config valid only for Capistrano 3.1
lock '3.2.1'

set :application, 'snapdir'
set :repo_url, '[email protected]:/home/hfisselier/repo/snapdir.git'

# Default branch is :master
# ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }.call

# Default deploy_to directory is /var/www/my_app
# set :deploy_to, '/var/www/my_app'

# Default value for :scm is :git
# set :scm, :git

# Default value for :format is :pretty
# set :format, :pretty

# Default value for :log_level is :debug
# set :log_level, :debug

# Default value for :pty is false
# set :pty, true

# Default value for :linked_files is []
# set :linked_files, %w{config/database.yml}

# Default value for linked_dirs is []
# set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system}

# Default value for default_env is {}
# set :default_env, { path: "/opt/ruby/bin:$PATH" }

# Default value for keep_releases is 5
# set :keep_releases, 5

namespace :deploy do

  desc 'Restart application'
  task :restart do
    on roles(:app), in: :sequence, wait: 5 do
      # Your restart mechanism here, for example:
      # execute :touch, release_path.join('tmp/restart.txt')
    end
  end

  after :publishing, :restart

  after :restart, :clear_cache do
    on roles(:web), in: :groups, limit: 3, wait: 10 do
      # Here we can do anything such as:
      # within release_path do
      #   execute :rake, 'cache:clear'
      # end
    end
  end

end

Des idées? Des pistes?

1 « J'aime »

Tu peux nous donner le résultat de la commande suivante afin d’avoir plus d’info ?

cap production deploy:check

Capistrano 3 n’a pas de tâche deploy:setup.
De même que Camille un je propose un :

cap production deploy:check

1 « J'aime »

Effectivement cela semble bcp mieux. Je vais pouvoir avancer. Je suis resté avec mes vieux réflexes. Je continue de creuser mais je ne semble pas encore au bout de mes peines.

Merci pour votre aide…

1 « J'aime »

Tiens nous au courant quand tu as la solution. Bon courage :)

Effectivement, le souci était tout simplement que la commande cap deploy:setup n’existe plus.

Mais je ne suis pas rendu au bout de mes peines. J’essaie d’héberger mon application sur un serveur mutualisé de Dreamhost. Mais la version de Rails (et de Ruby) sont plutôt vieilles et je voulais me remettre au gout du jour.

Mais je galère. J’ai installé les nouveaux gems dans mon répertoire perso. J’ai installé le nouveau ruby mais il utilise encore l’ancien d’après les traces ci-dessous. J’ai également upgradé la version de bundler mais là encore il ne voit que l’ancienne version apparemment.

Voici la trace d’erreur de Passenger Pushion :

Web application could not be started
Bundler could not find compatible versions for gem "bundler":
  In Gemfile:
    rails (= 4.1.6) depends on
      bundler (< 2.0, >= 1.3.0)

  Current Bundler version:
    bundler (1.0.15)

 (Bundler::VersionConflict)
  /usr/lib/ruby/vendor_ruby/bundler/resolver.rb:129:in `resolve'
  /usr/lib/ruby/vendor_ruby/bundler/resolver.rb:127:in `catch'
  /usr/lib/ruby/vendor_ruby/bundler/resolver.rb:127:in `resolve'
  /usr/lib/ruby/vendor_ruby/bundler/definition.rb:151:in `resolve'
  /usr/lib/ruby/vendor_ruby/bundler/definition.rb:90:in `specs'
  /usr/lib/ruby/vendor_ruby/bundler/definition.rb:135:in `specs_for'
  /usr/lib/ruby/vendor_ruby/bundler/definition.rb:124:in `requested_specs'
  /usr/lib/ruby/vendor_ruby/bundler/environment.rb:23:in `requested_specs'
  /usr/lib/ruby/vendor_ruby/bundler/runtime.rb:11:in `setup'
  /usr/lib/ruby/vendor_ruby/bundler.rb:107:in `setup'
  /usr/lib/ruby/vendor_ruby/bundler/setup.rb:17
  /usr/lib/ruby/vendor_ruby/1.8/rubygems/custom_require.rb:36:in `gem_original_require'
  /usr/lib/ruby/vendor_ruby/1.8/rubygems/custom_require.rb:36:in `require'
  /dh/passenger/lib/phusion_passenger/loader_shared_helpers.rb:263:in `run_load_path_setup_code'
  /dh/passenger/lib/phusion_passenger/loader_shared_helpers.rb:366:in `running_bundler'
  /dh/passenger/lib/phusion_passenger/loader_shared_helpers.rb:261:in `run_load_path_setup_code'
  /dh/passenger/helper-scripts/rack-preloader.rb:100:in `preload_app'
  /dh/passenger/helper-scripts/rack-preloader.rb:158
Error ID
b58ce8d4
Application root
/home/hfisselier/snapdir/current
Environment (value of RAILS_ENV, RACK_ENV, WSGI_ENV, NODE_ENV and PASSENGER_APP_ENV)
production
Ruby interpreter command
/usr/bin/ruby1.8
User and groups
uid=936059(hfisselier) gid=243469(pg894452) groups=243469(pg894452)
Environment variables
GEM_HOME = /home/hfisselier/.gems
SHELL = /bin/bash
SSH_CLIENT = 10.3.67.155 48613 22
PASSENGER_DEBUG_DIR = /tmp/passenger.spawn-debug.XXXXdcqL15
USER = hfisselier
MAIL = /home/hfisselier/Maildir/
PATH = /home/hfisselier/ruby/bin:/home/hfisselier/.gems/bin:/usr/lib/ruby/gems/1.8/bin/:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games
LC_COLLATE = C
PWD = /home/hfisselier/snapdir/current
LANG = en_US.UTF-8
PS1 = [\h]$ 
SHLVL = 2
HOME = /home/hfisselier
LOGNAME = hfisselier
GEM_PATH = /home/hfisselier/.gems
SSH_CONNECTION = 10.3.67.155 48613 10.232.2.123 22
IN_PASSENGER = 1
PYTHONUNBUFFERED = 1
NODE_PATH = /dh/passenger/node_lib
RAILS_ENV = production
RACK_ENV = production
WSGI_ENV = production
NODE_ENV = production
PASSENGER_APP_ENV = production
UNIQUE_ID = VDk1JUt33RsAACQbXMoAAAAG
SCRIPT_URI = http://snapdir.ovh/
SERVER_PROTOCOL = HTTP/1.1
DH_USER = hfisselier
SCRIPT_URL = /
SERVER_SOFTWARE = Apache
DOCUMENT_ROOT = /home/hfisselier/snapdir/current/public
SERVER_ADMIN = [email protected]
QUERY_STRING = 
ds_id_27928001 = 
SERVER_NAME = snapdir.ovh
dsid = 27928001
REMOTE_PORT = 53977
REMOTE_ADDR = 84.99.36.2
SERVER_PORT = 80
REQUEST_METHOD = GET
SERVER_ADDR = 75.119.220.141
REQUEST_URI = /
Ulimits
Unknown
System metrics
------------- General -------------
Kernel version    : 3.2.61-grsec-modsign
Uptime            : 12d 9h 15m 8s
Load averages     : 91.63%, 47.84%, 32.25%
Fork rate         : unknown

------------- CPU -------------
Number of CPUs    :    8
Average CPU usage :    ?  --    ? user,    ? nice,    ? system,    ? idle
  CPU 1           :    ?  --    ? user,    ? nice,    ? system,    ? idle
  CPU 2           :    ?  --    ? user,    ? nice,    ? system,    ? idle
  CPU 3           :    ?  --    ? user,    ? nice,    ? system,    ? idle
  CPU 4           :    ?  --    ? user,    ? nice,    ? system,    ? idle
  CPU 5           :    ?  --    ? user,    ? nice,    ? system,    ? idle
  CPU 6           :    ?  --    ? user,    ? nice,    ? system,    ? idle
  CPU 7           :    ?  --    ? user,    ? nice,    ? system,    ? idle
  CPU 8           :    ?  --    ? user,    ? nice,    ? system,    ? idle
I/O pressure      :    ?
  CPU 1           :    ?
  CPU 2           :    ?
  CPU 3           :    ?
  CPU 4           :    ?
  CPU 5           :    ?
  CPU 6           :    ?
  CPU 7           :    ?
  CPU 8           :    ?
Interference from other VMs:    ?
  CPU 1                    :    ?
  CPU 2                    :    ?
  CPU 3                    :    ?
  CPU 4                    :    ?
  CPU 5                    :    ?
  CPU 6                    :    ?
  CPU 7                    :    ?
  CPU 8                    :    ?

------------- Memory -------------
RAM total         :  16045 MB
RAM used          :  12935 MB (81%)
RAM free          :   3109 MB
Swap total        :   3044 MB
Swap used         :   1587 MB (52%)
Swap free         :   1457 MB

General Ruby interpreter information
RUBY_VERSION = 1.8.7
RUBY_PLATFORM = x86_64-linux
RUBY_ENGINE = nil
RubyGems version = 1.8.15
RubyGems paths = ["/home/hfisselier/.gems"]

Vous voyez ce que je pourrai faire?

Après ajout d’un fichier .htaccess sous les conseils du support de Dreamhost j’ai pu utiliser la version de Ruby que j’avais compilé dans mon répertoire personnel du serveur partagé.

Mon déploiement semble maintenant opérationnel.

Par contre, je ne suis pas encore au bout de mes peines. J’ai vraiment perdu la main en RoR ou alors ce sont les changements RoR 3 puis 4…

Pour le moment, je prépare mon projet rails pour une mise en production. Le projet est vide. J’ai créé un contrôleur home avec le générateur sans rien changer d’autre.

J’ai un comportement bizarre en local. La page home/index s’affiche bien mais le navigateur semble rester en attente indéfiniment. En production cela se traduit par une Internal Server Error.

Des idées d’où cela peut venir? Merci d’avance.

Qu’est ce que tu as comme erreur dans les logs (log/production.log) quand tu as l’erreur 500 (Internal…) en production ?

Aucune trace à part des traces de mes migrations. C’est bien cela qui me gène. Sans erreur, je ne vois pas où chercher. Mais j’ai l’impression que c’est le même souci qu’en développement. La réponse n’est pas vraiment clôturée puisque le navigateur continue d’attendre alors que le résultat est affiché. Bizarre non?

Ca m’étonne vraiment que tu n’aies rien dans les logs alors que tu as une erreur 500…

Pourtant je t’assure. Et en dev, sur mon poste, comment tu expliques une requête qui ne s’achève pas?

Tu utilises quoi comme serveur web en local ?

euh… WebRick

=> Booting WEBrick
=> Rails 4.1.6 application starting in development on http://0.0.0.0:3000

Pas bon?

Si mais ça aurait pu donner des pistes sur ton problème suivant le serveur web que tu utilises.

Bon ce matin, plus de souci en local. Et pour la production sur DreamHost, le souci était que je n’avais pas setté la variable d’environnement pour la clé secrète. Avec une erreur explicite cela aurait été plus facile ;o)

Merci pour votre aide. Le déploiement fonctionne maintenant. Je vais pouvoir remplir mon app maintenant…

2 « J'aime »
Human Coders - Le centre de formation recommandé par les développeur·se·s pour les développeur·se·s