Настройка среды приложения Ruby on Rails с помощью Capistrano в Phusion Passenger - PullRequest
19 голосов
/ 24 апреля 2011

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

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

Я попытался установить:

set :rails_env, "staging"

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

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

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

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

Ответы [ 4 ]

16 голосов
/ 16 августа 2011

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

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

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

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

2 голосов
/ 19 августа 2011

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

для рельсов 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

для рельсов 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 голосов
/ 19 августа 2011

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

Если вы ДЕЙСТВИТЕЛЬНО не можете этого сделать, вы можете рассмотреть возможность размещения УЖАСНОГО ХАКА, например, в верхней части преинициализатора 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 / принудительное_вложение.Для вашего сценического сервера вы можете установить «stage» в качестве среды.

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

0 голосов
/ 24 апреля 2011

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

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

}

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

...