web-dev-qa-db-ja.com

PhusionPassengerでCapistranoを使用してRuby on Railsアプリケーション環境を設定する

productionstagingの2つの環境があり、capistrano-extgemでCapistranoを使用しています。

Capistranoを使用してstagingにデプロイし、passengerを再起動する場合、デプロイされたアプリケーションをstagingで実行したいのですが、デフォルトで実行されますproduction

設定してみました:

set :Rails_env, "staging"

私のデプロイレシピでは、これは効果がありませんでした。

これはApacheで仮想ホストを設定することで実行できることは承知していますが、共有ホスティングを使用しているため、アクセスできません。私のホストはこのアドバイスを提供します:

以下をenvironment.rbに追加します:ENV ['Rails_ENV'] = 'staging'

しかし、これは私がCapistranoでプロセスを自動化するのに役立ちません。

19
dangerousdave

Capistranoフックを使用して、サーバー上にファイルを作成したり、たとえばからファイルをシンボリックリンクしたりできます。 shared/展開時。

Rails 2.3:

ウェブホストで、ファイルshared/preinitializer.rbを作成します。

ENV['Rails_ENV'] = 'staging'

次に、これをCapfile(または、Rails 2.x :)で新しいバージョンのcapistranoを使用している場合はconfig/deploy.rbに追加します。

after 'deploy:symlink', 'localize:copy_shared_configurations'
namespace :localize do
  desc 'copy shared configurations to current'
  task :copy_shared_configurations, :roles => [:app] do
    # I put database.yml here to keep deployed db credentials out of git
    %w[
      preinitializer.rb
    ].each do |f|
      run "ln -nsf #{shared_path}/#{f} #{current_path}/config/#{f}"
    end
  end
end

Rails 3

Rails 3の初期化シーケンスの変更により、config/preinitializer.rbがロードされるまでconfig/environment.rbはロードされません。したがって、Rails 3 、サーバー上でのみconfig/environment.rbを変更したい。上記のRails 2のような同様の設定で、ただしconfig/environment.rbのシンボリックリンクされたコピーを使用して、これを行うことができます。シンボリックリンクを試みる前に、既存のファイルを削除するステップを追加します。

別のオプションは、capistranoからサーバー上のenvironment.rbを上書きすることです。あなたのconfig/deploy.rb

after 'deploy:symlink', 'localize:munge_environment'
namespace :localize do
  desc 'munge environment.rb to set staging environment'
  task :munge_environment, :roles => [:app] do
    new_env = "ENV['Rails_ENV'] = 'staging'\n" + File.read(Rails.root.join('config', 'environment.rb'))
    put new_env, "#{current_path}/config/environment.rb"
  end
end
2
Jeremy Weathers

:Rails_env, "staging"環境を設定するときに行っていることは、移行のための環境を設定することです。つまり、capistranoを実行しているときにのみ設定される環境です。私があなたを正しく理解しているなら、あなたはアプリを実行するときに環境を変更したいと思っています。

あなたの質問に答えるために、私はあなたがどのようにあなたのアプリケーションを起動(開始)しているかを知る必要があります。

Phusion Passengerを使用している場合は、 PassengerのRails_ENVを編集する必要があります

共有環境にいることを考えると、おそらく.htaccessルートを使用することをお勧めします。

16
Cory

これを解決する正しい方法は、PassengerconfigでRails環境を設定することです。共有ホスティングプロバイダーにこれを設定してもらいます。Apacheでは、RailsEnvディレクティブを使用して実行します。

本当にそれができない場合は、このようなひどいハックをRails pre-initializer(config/preinitializer))の先頭に置くことを検討できます。

forced_environment = './config/force_environment'
if File.exists?(forced_environment)
  ENV['Rails_ENV'] = File.new(forced_environment).readline.chomp
end

... Railsをそのconfig/forced_environmentファイルの文字列にロードする前に環境を設定します。ステージサーバーの場合、環境として「stage」を設定できます。

これはひどい、ひどいハックです。あなたのマイレージは異なる場合があります。

2
Winfield