Настройка среды приложений Ruby on Rails с использованием Capistrano на Phusion Passenger

У меня есть 2 среды, производство и постановка, и я использую Capistrano с capistrano-ext gem.

Когда я развертываю развертывание с помощью Capistrano и перезапускаю пассажира, я бы хотел, чтобы развернутое приложение выполнялось в стадии разработки, однако оно работает по умолчанию

Я пробовал настройку:

set :rails_env, "staging"

в моем рецепте развертывания, но это не повлияло.

Я знаю, что это можно сделать, установив виртуальный хост в Apache, но я использую общий хостинг, поэтому не имею доступа. Мой хост предлагает этот совет:

добавить в environment.rb следующее: ENV ['RAILS_ENV'] = 'staging'

но это не помогает мне автоматизировать процесс с Capistrano.

Ответы

Ответ 1

Вы можете использовать капринальный крючок для создания файлов на сервере или ссылки на них с помощью, например, shared/ при развертывании.

Для Rails 2.3:

На веб-хосте создайте файл shared/preinitializer.rb:

ENV['RAILS_ENV'] = 'staging'

Затем добавьте это в свой Capfile (или, возможно, config/deploy.rb, если вы используете более новую версию capistrano с Rails 2.x:

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 и добавления шага удаления существующего файла, прежде чем пытаться символически ссылаться.

Другой вариант - перезаписать environment.rb на сервере из capistrano. В 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

Что вы делаете, когда вы устанавливаете среду :rails_env, "staging", задаете среду для миграции. Другими словами, это среда, которая задается только при запуске capistrano. Если я правильно вас понимаю, вы хотите изменить среду при запуске приложения, а не развертывать.

Чтобы ответить на ваш вопрос, мне нужно знать, как вы запускаете (начинаете) свое приложение.

Если вы используете Phusion Passenger, вы должны отредактировать RAILS_ENV для пассажира

Учитывая, что вы находитесь в общей среде, вы, вероятно, захотите пойти с маршрутом .htaccess.

Ответ 3

Правильный способ решить эту проблему - установить среду Rails в конфигурацию Passenger. Получите ваш хостинг-провайдер, чтобы настроить это для вас. В Apache это делается с помощью директивы RailsEnv.

Если вы ДЕЙСТВИТЕЛЬНО не можете этого сделать, вы можете подумать о том, чтобы поставить TERRIBLE HACK таким образом в верхней части вашего предварительного инициализатора Rails (config/preinitializer):

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

... который установит среду перед загрузкой Rails в строку в файле config/force_environment. Для вашего сценического сервера вы можете установить "stage" в качестве среды.

Это ужасный, ужасный хак. Ваш пробег может отличаться.

Ответ 4

Что вам нужно, это директива environment в вашей конфигурации nginx. Если вы используете Apache, там должна быть аналогичная директива. (должно быть легко для google)

server {
        listen                  80;
        passenger_enabled       on;
        rails_env               staging;
        server_name             foo.com;
        root                    /your/app/path;

}

Вы не можете переключать это с помощью только capistrano.