Настройка среды приложений 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.