サーバーとデプロイメントのセットアップ:rvm、rails、puma、nginx、mina

背景



展開に関する最近の投稿により、私はこの記事を作成しました。 上記の記事では、rbenvに基づいてプロジェクトをデプロイする方法について説明しましたが、rvmとupstartの設定の状況について説明します。



タスクと要件



だから、与えられた:最も単純なRubyOnRailsアプリケーション。 プロジェクトを展開する場合、次のタスクを自分で設定しました。



Ubuntuを選ぶ理由

私はちょうどそれに慣れました(より正確には、その派生物-Linux Mint)。



ユニコーンや乗客ではなく、なぜピューマですか?

私はクーガーについて良いレビューを聞いた、そしてユニクロンはaいサイトを持っています。 私の意見では、乗客は唯一の義務の原則に違反しています。Webサーバーとアプリケーションサーバーが必要です。



なぜRVMなのか?

私はそれに慣れています-私はそれをローカルマシンにインストールしました、私もそれを実稼働で見たいです。



どうしてミナ?

それはカピストラーノよりも本当に簡単であると同時に高速です。 capistranoはタスクごとに個別のssh接続を作成するため、速度が達成されます。 Minaはシェルスクリプトを形成し、単一の接続内で実行します。



この場合、タスクは簡単に3つの段階に分けられます。

  1. アプリケーションが正常に起動することを確認します(これまでは自動化なし)。
  2. Railsアプリケーションがフルサービスとして機能するようにサーバーを構成します。
  3. これに基づいて、minaを使用して自動展開を構成します。




最初の打ち上げ



webappユーザーがサーバー上に作成され、その代わりにアプリケーションが動作します。 インストールされたrvm(この例ではwebappユーザーのみ)、必要なバージョンのruby、nginxなど。 Gemfileには次の行があります。

# ... gem 'puma', group: :production # ...
      
      





プリセットミナ



Gemfileに次の行を追加します。

 gem 'mina', group: :development
      
      





次に、コマンドを使用して構成ファイルを生成します。

 mina init
      
      





その後、作成したconfig / deploy.rbファイルを次の形式にします。

config / deploy.rb
 require 'mina/bundler' require 'mina/rails' require 'mina/git' set :domain, 'awesome_address' set :user, 'webapp' set :deploy_to, '/home/webapp/awesome' set :repository, 'https://github.com/awesome_user/awesome.git' set :branch, 'master' set :shared_paths, ['config/database.yml', 'config/secrets.yml', 'config/puma.rb', 'log'] task :setup => :environment do queue! %[mkdir -p "#{deploy_to}/#{shared_path}/log"] queue! %[chmod g+rx,u+rwx "#{deploy_to}/#{shared_path}/log"] queue! %[mkdir -p "#{deploy_to}/#{shared_path}/config"] queue! %[chmod g+rx,u+rwx "#{deploy_to}/#{shared_path}/config"] queue! %[mkdir -p "#{deploy_to}/#{shared_path}/puma"] queue! %[chmod g+rx,u+rwx "#{deploy_to}/#{shared_path}/puma"] queue! %[touch "#{deploy_to}/#{shared_path}/config/database.yml"] queue! %[touch "#{deploy_to}/#{shared_path}/config/secrets.yml"] queue! %[touch "#{deploy_to}/#{shared_path}/config/puma.rb"] queue %[echo "-----> Be sure to edit '#{deploy_to}/#{shared_path}/config/database.yml', 'secrets.yml' and puma.rb."] end desc "Deploys the current version to the server." task :deploy => :environment do deploy do # Put things that will set up an empty directory into a fully set-up # instance of your project. invoke :'git:clone' invoke :'deploy:link_shared_paths' invoke :'bundle:install' #invoke :'rails:db_migrate' #invoke :'rails:assets_precompile' #invoke :'deploy:cleanup' end end
      
      







このファイルでは、プロジェクトを展開するための日常的な操作を実行するコード行がコメント化されています。 ここでは、これらのアクションを手動で実行します。



また、指定されたmina構成ファイルをバージョン管理に追加しないことに注意してください。



次に、コマンドを実行します。

 mina setup
      
      





そして、サーバー上の必要なフォルダー構造と、正しいデータを入力する必要がある構成ファイルを取得します。 これらのファイルはバージョン管理に追加せず、サーバーに排他的に保存することを前提としています。 以下は、ピューマの最小構成の例です。

puma.rb
 environment "production" bind "unix:///home/webapp/awesome/shared/puma/puma.sock" pidfile "/home/webapp/awesome/shared/puma/puma.pid" state_path "/home/webapp/awesome/shared/puma/puma.state" activate_control_app
      
      







また、意図的にバージョン管理にpuma.rbファイルを保存しません。 サーバーのスタートアップ構成は、データベース設定と同様に個別にできると思います。



メモについては、アプリケーションでconfig / puma.sample.rbファイルを作成し、例を示します。



それでは、アプリケーションの「デプロイメント」を起動しましょう。

 mina deploy
      
      





このコマンドを実行すると、プロジェクトのコードを含むフォルダーへのシンボリックリンク/ home / webapp / awesome / currentがサーバーに表示されます。



Nginxのセットアップ

次の内容で/ etc / nginx / sites-available / awesomeファイルを作成します。

すごい
 upstream awesome { server unix:///home/webapp/awesome/shared/puma/puma.sock; } server { listen 80 default_server; listen [::]:80 default_server ipv6only=on; root /home/webapp/awesome/current/public; server_name localhost; location / { proxy_pass http://awesome; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location ~* ^/assets/ { # Per RFC2616 - 1 year maximum expiry expires 1y; add_header Cache-Control public; # Some browsers still send conditional-GET requests if there's a # Last-Modified header or an ETag header even if they haven't # reached the expiry date sent in the Expires header. add_header Last-Modified ""; add_header ETag ""; break; } }
      
      





次に、シンボリックリンクを作成します。

 cd /etc/nginx/sites-enabled/ ln -s ../sites-available/awesome awesome
      
      





そしてnginxを再起動します:

 service nginx restart
      
      





手動アプリケーション起動

次に、プロジェクトを準備して起動します。

準備する:

 cd /home/webapp/awesome/current bash --login rvm use ruby-2.2.1 bundle install --without development:test --path ./vendor/bundle --deployment RAILS_ENV=production bundle exec rake db:migrate RAILS_ENV=production bundle exec rake assets:precompile
      
      





以下を開始します。

 bundle exec puma -C config/puma.rb
      
      





ブラウザーでプロジェクトを開きます-すべてが機能するはずです。



サービスとしてのアプリケーション



アプリケーションがサービスとして動作し、システムの起動/再起動時に起動するには、init.dスクリプトまたはupstart構成を作成する必要があります。



結果のファイルがはるかに短く、読みやすくなるため、私はupstartを選択しました。



友人を正しく起動させ、rvmにするために、gemの実行可能ファイルのラッパー作成します

 rvm alias create awesome ruby-2.2.1@default
      
      





その後、upstart設定/etc/init/awesome.confを作成します。

awesome.conf
 description "Awesome puma service" # This starts upon bootup and stops on shutdown start on runlevel [2345] stop on runlevel [06] setuid webapp setgid webapp respawn respawn limit 3 30 script cd /home/webapp/awesome/current /home/webapp/.rvm/wrappers/awesome/bundle exec puma -C config/puma.rb end script
      
      





そして今、私たちはこれを行うことができます:

 start awesome stop awesome restart awesome status awesome
      
      







トータルオートメーション



展開はwebappユーザーの代わりに行われ、サービスを再起動するにはスーパーユーザー権限が必要なので、対応する行をsudoersに追加します。



コマンドを実行します:

 visudo
      
      





追加:

 webapp ALL=(ALL) NOPASSWD: /sbin/start awesome, /sbin/stop awesome, /sbin/restart awesome, /sbin/status awesome
      
      





保存します。



再びミナ

そのような場合、minaは独自のmina / rvmモジュールを使用することをお勧めしますが、rvmはrubyおよびgemsetバージョン(ラッパー)のエイリアスを作成する機能を提供します。



展開中にwrappera bundlerを起動するには、次の行を追加する必要があります。

 set :bundle_bin, '/home/webapp/.rvm/wrappers/awesome/bundle'
      
      





サーバーを再起動するタスクも追加します。

 desc "Restart the puma web server." task :restart do queue 'sudo restart awesome' end
      
      





これをすべて追加し、展開タスクで必要な行のコメントを解除すると、次の結果が得られます。

deploy.rb
 require 'mina/bundler' require 'mina/rails' require 'mina/git' set :domain, 'awesome_address' set :user, 'webapp' set :deploy_to, '/home/webapp/awesome' set :repository, 'https://github.com/awesome_user/awesome.git' set :branch, 'master' set :bundle_bin, '/home/webapp/.rvm/wrappers/awesome/bundle' set :shared_paths, ['config/database.yml', 'config/secrets.yml', 'config/puma.rb', 'log'] task :setup => :environment do queue! %[mkdir -p "#{deploy_to}/#{shared_path}/log"] queue! %[chmod g+rx,u+rwx "#{deploy_to}/#{shared_path}/log"] queue! %[mkdir -p "#{deploy_to}/#{shared_path}/config"] queue! %[chmod g+rx,u+rwx "#{deploy_to}/#{shared_path}/config"] queue! %[mkdir -p "#{deploy_to}/#{shared_path}/puma"] queue! %[chmod g+rx,u+rwx "#{deploy_to}/#{shared_path}/puma"] queue! %[touch "#{deploy_to}/#{shared_path}/config/database.yml"] queue! %[touch "#{deploy_to}/#{shared_path}/config/secrets.yml"] queue! %[touch "#{deploy_to}/#{shared_path}/config/puma.rb"] queue %[echo "-----> Be sure to edit '#{deploy_to}/#{shared_path}/config/database.yml', 'secrets.yml' and puma.rb."] end desc "Deploys the current version to the server." task :deploy => :environment do deploy do # Put things that will set up an empty directory into a fully set-up # instance of your project. invoke :'git:clone' invoke :'deploy:link_shared_paths' invoke :'bundle:install' invoke :'rails:db_migrate' invoke :'rails:assets_precompile' invoke :'deploy:cleanup' to :launch do invoke :'restart' end end end desc "Restart the puma web server." task :restart do queue 'sudo restart awesome' end
      
      







すべて準備完了です!

これで、プロジェクトの展開をもう一度開始して、結果を確認できます。

 mina deploy
      
      







代替案



代替手段はpuma-jungleです。

これらは、rbenv、rvm、およびその他のバージョンマネージャーで正常に動作するupstartおよびinit.dスクリプトテンプレートです。



rvmの場合、rubyとgemsetのバージョンが正しく決定されていることを確認する必要があります。使用されている場合は、これに.ruby-versionファイルと.ruby-gemsetファイルを使用できます。



それらをバージョン管理に入れることも、minaを使用してデプロイ中に作成することもできます。 また、mina / rvmライブラリを使用し、タスクを作成して、正しいバージョンのrubyおよびgemsetをインストールする必要があります。



すべて一緒にこのように見えるかもしれません:

deploy.rb
 # ... # Rvm ruby version and gemset rvm = { ruby_version: 'ruby-2.2.1', ruby_gemset: 'default' } task :environment do invoke :"rvm:use[#{rvm[:ruby_version]}@#{rvm[:ruby_gemset]}]" end # ... desc "Creates appropriate .ruby-version and .ruby-gemset files." task :'rvm:dot_files' do queue! %[echo "#{rvm[:ruby_version]}" > .ruby-version] queue! %[echo "#{rvm[:ruby_gemset]}" > .ruby-gemset] end task :setup => :environment do # ... end task :deploy => :environment do deploy do invoke :'git:clone' invoke :'rvm:dot_files' # ... end end # ...
      
      







終わり



これが私の出版の終わりです。 おもしろくて役立つことを願っています。



All Articles