サーバーで多段階展開を行おうとしていますが、ステージング構成と運用構成を実行するのに問題があります。
サーバー: Ubuntu 11.10 (GNU/Linux 3.0.0-19-server x86_64)
これが私がこれまでに行ったことです:
ローカル マシンに form_tester という名前の新しいプロジェクトを作成しました。ローカルで sqlite3 を使用した単純なデータベースを使用しています。ステージングとプロダクションの両方で mysql2 を使用したいと考えています。
サーバー上のステージングおよび本番用のディレクトリをセットアップします。
/home/username/form_tester/staging /home/username/form_tester/production
サーバー上にステージング用と本番用の 2 つのデータベースを作成しました。また、テーブルを生成できるため、適切な権限を持つユーザーがアクセスできるように構成しました。
ftstaging ftproduction
ステージングと本番用の config/database.yml ファイルを構成しました。
staging: adapter: mysql2 encoding: utf8 reconnect: false database: ftstaging pool: 5 username: dbuser password: pass host: server.com production: adapter: mysql2 encoding: utf8 reconnect: false database: ftproduction pool: 5 username: dbusr password: pass host: server.com
ステージングと本番用の両方の Gemfile を構成しました。
ソース「https://rubygems.org」
gem 'rails', '3.2.8' gem 'jquery-rails' gem 'capistrano' group :development do gem 'sqlite3' end group :staging do gem 'activerecord-mysql2-adapter' gem 'mysql2' end group :production do gem 'activerecord-mysql2-adapter' gem 'mysql2' end # Gems used only for assets and not required # in production environments by default. group :assets do gem 'sass-rails', '~> 3.2.3' gem 'coffee-rails', '~> 3.2.1' gem 'uglifier', '>= 1.0.3' end
Capify を実行して、デプロイメント ファイルを取得しました。deploy.rb ファイルからすべてを削除しました。キャップファイルを放っておいた。
deploy ディレクトリを作成し、2 つのファイルを作成しました。
config/deploy/production.rb config/deploy/staging.rb
構成に関する次の詳細を追加しました。
config/deploy/production.rb の場合:
server "server.com", :app, :web, :db, :primary => true
set :deploy_to, "/home/username/form_tester/production"
set :rails_env, "production"
config/deploy/staging.rb の場合:
server "server.com", :app, :web, :db, :primary => true
set :deploy_to, "/home/username/form_tester/staging"
set :rails_env, "staging"
config/deploy.rb の場合:
set :stages, ['production', 'staging']
set :default_stage, 'staging'
require 'capistrano/ext/multistage'
# Set application name
set :application, 'form_tester'
set :domain, 'server.com'
set :user, 'username'
# Use Git source control
set :scm, :git
set :repository, "ssh://#{user}@#{domain}/home/#{user}/git/#{application}.git"
set :branch, 'master'
set :deploy_via, :remote_cache
set :scm_verbose, true
default_run_options[:pty] = true
set :use_sudo, false
namespace :deploy do
task :start do ; end
task :stop do ; end
desc "Restart application"
task :restart, :roles => :app, :except => { :no_release => true } do
run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"
end
end
9. git --bare init を使用してサーバー上の git リポジトリを初期化し、現在のユーザー名のディレクトリに適切にアクセスできることを確認しました。
10.開発マシンで git リポジトリを初期化し、ファイルをssh://username@server.com/home/username/git/form_tester.gitのサーバー リポジトリにプッシュしました。
11.ローカル マシンからサーバー上のステージングへの展開を開始します。次のすべてのコマンドをエラーなしで実行します。
/home/username/form_tester/staging の下にディレクトリ ツリーを構築するには
$ cap deploy:setup
$ cap deploy:check
$ cap deploy:update
*ssh'ed into my server*
$ rake schema:db:load
$ rake db:seed
$ rails console
> app.get('/')
I get a '200' returned
> exit
まだ私のサーバーにsshされています
12. /var/www/staging からアプリケーションのパブリック ディレクトリへのシンボリック リンクを作成しました。
/home/username/form_tester/staging/current/public.
$ sudo ln -s /home/username/form_tester/staging/current/public /var/www/staging
13. /etc/apache2/sites-available/default ファイルを変更して、ステージング アプリのサブ URI を追加しました。
$ sudo vi /etc/apache2/sites-available/default
…
RailsBaseURI /staging
<Directory /var/www/staging>
Options -MultiViews
</Directory>
…
14.この時点で (ローカルで) cap deploy:restart を実行すると、エラーがないため、サーバーが再起動されたように見えます。(サーバーにログイン) Sudo service apache2 restart も試しましたが、サーバーも正常に再起動します。
15.この時点で、server.com/staging という URL を取得しましたが、アプリが表示されません。
その他のファイル:
config/application.rb:
require File.expand_path('../boot', __FILE__)
require 'rails/all'
if defined?(Bundler)
Bundler.require(*Rails.groups(:assets => %w(development test)))
end
module FormTester
class Application < Rails::Application
config.encoding = "utf-8"
config.filter_parameters += [:password]
config.active_support.escape_html_entities_in_json = true
config.active_record.whitelist_attributes = true
config.assets.enabled = true
config.assets.version = '1.0'
end
end
config/environments/staging.rb と production.rb
FormTester::Application.configure do
config.cache_classes = true
config.consider_all_requests_local = false
config.action_controller.perform_caching = true
config.serve_static_assets = false
config.assets.compress = true
config.assets.compile = false
config.assets.digest = true
config.i18n.fallbacks = true
config.active_support.deprecation = :notify
end
/var/log/apache2/error.log
ここには Phusion パッセンジャーを除いて ruby 関連のものは何も表示されていないようですが、エラーではありません。
[Thu Nov 01 01:16:11 2012] [notice] caught SIGTERM, shutting down
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php5/20090626/gd.so' - /usr/lib/php5/20090626/gd.so: cannot open shared object file: No such file or directory in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php5/20090626/mcrypt.so' - /usr/lib/php5/20090626/mcrypt.so: cannot open shared object file: No such file or directory in Unknown on line 0
[Thu Nov 01 01:16:12 2012] [notice] Apache/2.2.20 (Ubuntu) DAV/2 SVN/1.6.12 PHP/5.3.6-13ubuntu3.7 with Suhosin-Patch Phusion_Passenger/3.0.17 configured -- resuming normal operations
[Thu Nov 01 01:16:20 2012] [error] [client 68.6.38.254] File does not exist: /var/www/favicon.ico
[Thu Nov 01 01:16:22 2012] [error] [client 68.6.38.254] File does not exist: /var/www/favicon.ico
[Thu Nov 01 01:23:07 2012] [error] [client 68.6.38.254] File does not exist: /var/www/favicon.ico
所見:
rake schema:db:load を実行すると、データベース用に適切にテーブルが構築されているように見えますが、実際には development.sqlite3 ファイル用に構築されています。
Rails コンソールを開いて Rails.env を実行すると、環境として「staging」が表示されます。
これはおそらく#1に関連しています.rake db:seedは、サーバー上のmysqlで「ftstaging」と呼ばれるデータベースを実行してもいっぱいにならないようです。
cap deploy は cap deploy:update と何も変わらないようです。
最終結果は、server.com/staging に「申し訳ありませんが、問題が発生しました」というページが表示されます。
私の中には何も表示されていないようです
rake about を実行すると、まだ開発モードにあることがわかります。
About your application's environment Ruby version 1.9.3 (x86_64-linux) RubyGems version 1.8.24 Rack version 1.4 Rails version 3.2.8 JavaScript Runtime Node.js (V8) Active Record version 3.2.8 Action Pack version 3.2.8 Active Resource version 3.2.8 Action Mailer version 3.2.8 Active Support version 3.2.8 Middleware ActionDispatch::Static, Rack::Lock, #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x00000002796948>, Rack::Runtime, Rack::MethodOverride, ActionDispatch::RequestId, Rails::Rack::Logger, ActionDispatch::ShowExceptions, ActionDispatch::DebugExceptions, ActionDispatch::RemoteIp, ActionDispatch::Reloader, ActionDispatch::Callbacks, ActiveRecord::ConnectionAdapters::ConnectionManagement, ActiveRecord::QueryCache, ActionDispatch::Cookies, ActionDispatch::Session::CookieStore, ActionDispatch::Flash, ActionDispatch::ParamsParser, ActionDispatch::Head, Rack::ConditionalGet, Rack::ETag, ActionDispatch::BestStandardsSupport Application root /home/username/form_tester/staging/releases/20121101080752 Environment development Database adapter sqlite3 Database schema version 20121030011807
次のチュートリアルを試してみましたが、ほとんど運がありませんでした。
- https://github.com/capistrano/capistrano/wiki/2.x-Multistage-Extension
- http://trevmex.com/post/367574671/steps-for-setting-up-a-capistrano-multistage-deployment
- http://cjohansen.no/en/apache/multi_staging_environment_for_rails_using_capistrano_and_mod_rails
- http://guides.beanstalkapp.com/deployments/deploy-with-capistrano.html#prepare-project
質問:
展開プロセスを内外で理解している人がいると確信していますが、何が欠けていますか? 何を確認すればよいですか?ここで示したことから、他に何ができるでしょうか?
この時点で、どんな助けも大歓迎です。私はこの問題に 2 日間取り組んできましたが、何が間違っているのか、他に何を試せばよいのかわかりません。私は約 3 週間前に Rails を使い始めたばかりですが、私のフラストレーションのほとんどは、デプロイのプロセスの明確な説明を見つけることができなかったことによるものです。この問題を明確にし、その見返りとして、他の人がアイデアから多段階展開を簡単に行えるように支援したいと考えています.
別の注意として、なぜ誰かがこの投稿に「反対票を投じる」のでしょうか? それを裏付ける情報とともに正当な質問をしています。よくない質問なら理由を教えてください。ありがとう
11/1/12 - 更新:
アプリを「ステージング」環境に入れる方法を見つけましたが、まだ server.com/staging に読み込まれません。
「Rails.env = ActiveSupport::StringInquirer.new('staging')」を config/application.rb ファイルに追加しましたが、これが環境を強制する理由がわかりません。これは正しい方法ですか?
次に、デプロイし、サーバーにユーザー名として SSH 接続し、rake db:migrate と rake db:seed を実行しました。データベースにデータが入力されていることがわかります。
他に何が起こっているのでしょうか?環境/staging.rb ファイルに何か問題がありますか?
/etc/apache2/httpd.conf
ServerName server.com
LoadModule passenger_module /usr/local/rvm/gems/ruby-1.9.3-p194/gems/passenger-3.0.17/ext/apache2/mod_passenger.so
PassengerRoot /usr/local/rvm/gems/ruby-1.9.3-p194/gems/passenger-3.0.17
PassengerRuby /usr/local/rvm/wrappers/ruby-1.9.3-p194/ruby