背景
展開に関する最近の
投稿により、私はこの記事を作成しました。 上記の記事では、rbenvに基づいてプロジェクトをデプロイする方法について説明しましたが、rvmとupstartの設定の状況について説明します。
タスクと要件
だから、与えられた:最も単純なRubyOnRailsアプリケーション。 プロジェクトを展開する場合、次のタスクを自分で設定しました。
- OS Ubuntu LTS 14.04;
- Nginx Webサーバー
- プーマアプリケーションサーバー
- RVMを使用して、必要なバージョンのルビーをインストールします。
- VPSサーバーの起動時のアプリケーションの自動起動、アプリケーションをサービスとして管理する機能。
- minaを使用した展開プロセスの自動化。
Ubuntuを選ぶ理由私はちょうどそれに慣れました(より正確には、その派生物-Linux Mint)。
ユニコーンや乗客ではなく、なぜピューマですか?私はクーガーについて良いレビューを聞いた、そしてユニクロンはaいサイトを持っています。 私の意見では、乗客は唯一の義務の原則に違反しています。Webサーバーとアプリケーションサーバーが必要です。
なぜRVMなのか?私はそれに慣れています-私はそれをローカルマシンにインストールしました、私もそれを実稼働で見たいです。
どうしてミナ?それはカピストラーノよりも本当に簡単であると同時に高速です。 capistranoはタスクごとに個別のssh接続を作成するため、速度が達成されます。 Minaはシェルスクリプトを形成し、単一の接続内で実行します。
この場合、タスクは簡単に3つの段階に分けられます。
- アプリケーションが正常に起動することを確認します(これまでは自動化なし)。
- Railsアプリケーションがフルサービスとして機能するようにサーバーを構成します。
- これに基づいて、minaを使用して自動展開を構成します。
最初の打ち上げ
webappユーザーがサーバー上に作成され、その代わりにアプリケーションが動作します。 インストールされたrvm(この例ではwebappユーザーのみ)、必要なバージョンのruby、nginxなど。 Gemfileには次の行があります。
プリセットミナ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
このファイルでは、プロジェクトを展開するための日常的な操作を実行するコード行がコメント化されています。 ここでは、これらのアクションを手動で実行します。
また、指定された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/ {
次に、シンボリックリンクを作成します。
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
すべて準備完了です!これで、プロジェクトの展開をもう一度開始して、結果を確認できます。
mina deploy
代替案
代替手段は
puma-jungleです。
これらは、rbenv、rvm、およびその他のバージョンマネージャーで正常に動作するupstartおよびinit.dスクリプトテンプレートです。
rvmの場合、rubyとgemsetのバージョンが正しく決定されていることを確認する必要があります。使用されている場合は、これに.ruby-versionファイルと.ruby-gemsetファイルを使用できます。
それらをバージョン管理に入れることも、minaを使用してデプロイ中に作成することもできます。 また、mina / rvmライブラリを使用し、タスクを作成して、正しいバージョンのrubyおよびgemsetをインストールする必要があります。
すべて一緒にこのように見えるかもしれません:
終わり
これが私の出版の終わりです。 おもしろくて役立つことを願っています。