質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Capistrano

Rubyで書かれたサーバオーケストレーションで、複数のサーバでスクリプトを実行する際に用いられます。主な使用用途はWebアプリケーションのデプロイメントです。 アプリケーションのバージョンアップ自動化、およびデータベースの変更などもできます。

Q&A

解決済

1回答

591閲覧

開発環境の構築とデプロイまでの流れ

PartyKids

総合スコア65

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Capistrano

Rubyで書かれたサーバオーケストレーションで、複数のサーバでスクリプトを実行する際に用いられます。主な使用用途はWebアプリケーションのデプロイメントです。 アプリケーションのバージョンアップ自動化、およびデータベースの変更などもできます。

0グッド

1クリップ

投稿2017/07/20 17:47

閲覧ありがとうございます!
先日までDockerでVPSのデプロイ方法を質問させて頂いたのですが、いくら勉強してもdockerでのデプロイ方法が理解できなかったので、一旦docker無しでデプロイを試してみました。

デプロイ環境

ローカル

  • Mac OS X Sierra

VPS

  • Centos 7
  • Rails 5.1
  • rbenv
  • Ruby 2.4.1
  • Puma
  • MySQL
  • Capistrano
  • Nginx

なんとかipアドレスを打てば、アプリケーションを表示することが出来きたので、次はdockerを使って開発環境の構築&デプロイまでの流れを勉強しようと挑戦しましたが、やっぱり理解出来なかったです。。。(なんでスクリプト言語やDBばかりのイメージをコンテナ化していて、osのイメージをコンテナ化しないの?。。。 コンテナ自体linux上で起動しているから、centosやubuntuが必要ない?。。。)
悩んでても仕方がないので、一旦資料が豊富なvagrant virtual boxで開発環境を構築してみました。

開発環境

  • Mac OS X Sierra

  • Vagrant1.9.7

  • Virtualbox 5.1.24

  • Centos 7

  • Rails 5.1

  • rbenv

  • Ruby 2.4.1

  • Puma

  • MySQL

  • Nginx


"Yay! You’re on Rails!"を表示できたので環境開発の構築は出来たと思います?

疑問1:stagingとproductionの使い方

VPSで本番環境を構築中にcap installするとstaging.rbとproduction.rbが作成され、production.rbは本番環境(VPS)の設定だな!っと考えたのですが、stagingが何をさしているのかが分かりませんでした。vagrantで開発環境を構築してるときに、この開発環境をstagingをさしているのでは?と感じたのですが。。。。
つまり、開発しているアプリケーションをいきなり本番(VPS)にアップするのは危険なので、VPS環境をvagrantで擬似的に作成し、開発中はcap staging deployでvagrantで確認し、okならばcap production deployでVPSにデプロイする使い分けでよろしいのでしょうか?
vagrantにマウント機能があるので、わざわざgitからpullする必要性がないような。。。。

疑問2:プライベートリポジトリの場合の環境変数の取扱

なんかおかしいなと思いながら、VPSサーバーにmysqlのユーザー名やパスワード、secret_key_baseを直貼りして、一旦アプリケーションをデプロイしてみました。デプロイ後に、ユーザー名やパスワードの取扱について調べたところ、環境変数を使う!と書かれていたのですが、gitで間違えてアップロードしてしまったや、gitignoreに入れ忘れたなど、前提が公開されるgitの場合ばかりでした。Bitbucketのプライベートリポジトリの場合には、環境変数の設定は不要なのですか?

初歩的な質問で申し訳ないのですが、よろしくお願い致します!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ステージング環境について

Web開発の実務において、一般的に以下の3つの環境が存在します。

  • 開発環境
  • テスト環境/試験環境/ステージング環境/プレビュー環境

(呼び方は人によって異なるが、指すものは同じ)

  • 本番環境

開発環境は、特に限定されませんが一般的にはローカルのPC(仮想マシン含む)です。
テスト環境(ステージング環境)、本番環境は外部に対して公開する環境です。
ただし、テスト環境は顧客など関係者のみに公開します。
アクセス制限の方法としてIPアドレスまたはBasic認証などで制限するといった方法がよく取られると思います。

ここで言うテスト環境とは、railsのrspecなどのテストではない点に注意。
「テスト」という言葉は、文脈により指すものが変わります。

テスト環境は、本番環境とまったく同じ構成のサーバで本番環境と同じように運用します。
(構成の違いによる不具合が起きる可能性もあるため)
受託開発を想定すると分かりやすいと思うのですが、
顧客に修正内容を確認してもらう場がテスト環境(=ステージング環境)です。
最終的に顧客からOKをもらったら、本番環境へ反映します。
開発者が勝手に本番環境へ反映するといった事は基本的にしません。

小さいシステムで考えると、テスト環境と本番環境はそれぞれ別のVPSを契約して、
同一設定にしたものと考えてもらって良いです。

プライベートリポジトリの場合の環境変数の取扱について

好きにすれば良いというのが答えです。
外部にパスワードや重要なデータが漏れる事のないように運用すれば、どのように取り扱っても問題ありません。
プライベートリポジトリで確実に外部から閲覧される事がないと保証されているなら、
パスワードは直書きで問題ないので、環境変数を使わなくても良いでしょう。
しかし、そういう過信というか事故があまりにも多いので環境変数を使うという手法が考えられたという事です。

投稿2017/07/21 00:51

mingos

総合スコア4025

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

PartyKids

2017/07/21 07:46

先日は助けて頂き、ありがとうございました! また、今回も助けて頂き、誠にありがとうございます! >顧客に修正内容を確認してもらう場がテスト環境 そういう事だったんですね!以前、ステージングという言葉を調べたのですが『本番環境とほぼ似せて動作確認をする環境』といった文言ばかりで、開発環境で仮想を使うのは本番環境に似せるためだよね?仮想を使った開発環境とステージングって何が違うの?っと、理解できなかったです。 私が勉強&趣味でやる分には、ステージング環境(本番以外のVPSを契約)が必要ないと思うのですが、その場合は本番環境に似せた仮想だけで代替可能なのですか? 質問する前は、capistranoを使って、stagingはVagrantの仮想サーバー、productionはVPSに振り分けて開発を勧めていけば良いのかな?という仮設を立てていたのですが、どうやらこの考え方はおかしいみたいです。。。 >確実に外部から閲覧される事がない これは、ただ単にプライベートリポジトリのパスワード等が流出しない事だけではなく、OSインジェクション等の攻撃も防ぐ事が含まれていますか? まだセキュリティとサーバー設計時のパーミッション設定について勉強不足のため、憶測なのですが。。。 多くの親切な方に、同じ質問(開発環境&デプロイの流れ)から丁寧な回答を得たのにもかかわらず、いまいち流れが理解できない私に問題がありますが、回答よろしくお願いいたします!
mingos

2017/07/21 08:38

趣味というか個人のサービスであれば、開発環境(ローカル)と、本番環境(VPS)だけで良いです。 railsの場合、developmentで問題なくてもproductionでエラーとなるケースもありますので、ローカルの仮想マシンでproductionモードで動作確認するという方法でもステージングの代わりとしても良いです。 ただ、一般論としては業務を前提とするのでVPSなりクラウドなりで外部サーバを用意するべきという話になります。 普通はこうするべきだよね、というのが一般論なので、勉強や趣味でやっている場合の話はここには含まれません。 その点は注意して情報を整理しないといけませんね。 > >確実に外部から閲覧される事がない > これは、ただ単にプライベートリポジトリのパスワード等が流出しない事だけではなく、OSインジェクション等の攻撃も防ぐ事が含まれていますか? あらゆる可能性を含みますが、実際にはそこまでの保証は出来ないだろうし、趣味・勉強でやっている段階では気にしなくても良いです。 そもそもリポジトリに重要な情報を入れなければいいだけなので。
PartyKids

2017/07/21 22:52

おはようございます! 返信ありがとうございます! >一般論としては業務を前提 以前にmingosさんに『開発環境』の定義を明確にした方が良いと仰っていたのは、私のような個人の趣味レベルの場合もあれば、業務レベルの場合もあるため、意味を明確にする必要性があったんですね!やっと意味が理解できました(飲み込みが遅くてすみません)。。 >ローカルの仮想マシンでproductionモードで動作確認する なるほど!ここで疑問なのですが、仮想サーバーを2つ(開発用とステージング用)用意して、開発を進めていけばよろしいのでしょうか?『vagrant rails 開発環境』っとググると、qiitaにたくさんの設定方法が見つかり助かるのですが、どれもブラウザでの確認は`rails s`とwebrickを起動しています(rails server puma or unicornとしていないです)。 ここから考えられるのは、 1.開発用の仮想サーバにはgemやDBなど最低限の内容でセットアップ(webサーバーやアプリケーション・サーバーの設定は無し)、ステージング用の仮想サーバーには、本番環境と同様の内容でセットアップ、普段は開発用サーバーで動作確認し、完成したらステージング用のサーバーで最終確認する? 2.qitta等のドキュメントは業務用で、クライアントが有するサーバーに依存するため、一旦デフォルトのwebrickで開発を進めている。私個人がやる分には、分ける必要性がないため、ローカルで開発した物を直にステージング用の仮想に入れて動作確認すれば良い? >実際にはそこまでの保証は出来ないだろうし そこなんですよね。。。 勉強すればするほど楽しい半面、いろんな攻撃手法も知り、中途半端な知識でデプロイするのが怖くなってきました。。。現にVPSのaccess logにssh攻撃に失敗したログが何個かありますし。。。 いつも助けて頂き本当に有難うございます! よろしくお願いいたします!
mingos

2017/07/21 23:58 編集

1. について ローカルで開発用とステージング用の2つの仮想サーバを用意します。 ステージング用のサーバでは、productionモードで動かします。 また、本番環境と同一設定なので80番、443番ポート以外は外部から見えないようにファイウォールの設定も含めて行います。 つまり、http://IPアドレス:3000/ というアクセスは出来ないようにするという事です。 80番/443番でアクセスするためには、ApacheまたはnginxなどのWebサーバを使います。 バーチャルホストとproxyの設定をして、railsのポートと接続します。 静的なファイル(css, image, js)は、Webサーバから配信するようにします。 rails sやwebrickは開発用ですので、本番環境では使いません。 本番環境ではunicornやpumaを使いますが、デーモンモードでバックラウンドで動くようにします。 ネットには入門記事ばっかりで、実際に本番環境で動かすための話はなかなか出てこない気がしますね。 最近はdockerが人気ですが、最初はdockerなしできちんと運用できる事が必要かなと思います。 誰もがdockerを必要としているわけでないので。 2.について > 私個人がやる分には、分ける必要性がないため、ローカルで開発した物を直にステージング用の仮想に入れて動作確認すれば良い? そうですね。直接ステージング用のサーバに入れて確認すれば良いです。
PartyKids

2017/07/22 01:38

返信ありがとうございます! >本番環境で動かすための話はなかなか出てこない そうなんですよね。。ネットで分からなかったので、本で調べても開発&本番がそれぞれ一冊の本になっていて、いざ開発から本番までの流れを掴もうとしても理解できませんでした。 >ステージング用のサーバでは、productionモード。本番環境と同一設定80番、443番ポート。proxyの設定 なるほど!アクセスポートの制限やVPS契約時に取得したIPアドレスをproxyで代用するなどVPSでしたことをそのまま仮想サーバーで行えばいいのですね! つまり、 ・ホスト側はpumaやunicorn等、デプロイするためのすべてのファイルを保持して開発を進めていく ・開発環境時の仮想ではwebrick起動のため、pumaの設定など、ホスト側が有する一部の機能を使わない ・逆にステージング環境の仮想では、デプロイを前提とするため、ホストが持つ全てのファイルを駆使する っといった使い分けが必要なのですね? >静的なファイル(css, image, js)は、Webサーバから配信 Capistranoを使ってVPSにデプロイしたいと思っているので、Capistranoを使って仮想サーバーに配置出来るように設定すればいいのですか?これをしてしまうと、本番と仮想の2つのproduction設定が混在してしまう?ためこのやりかた違うような。。。 よろしくお願いいたします!
mingos

2017/07/22 02:10 編集

>>静的なファイル(css, image, js)は、Webサーバから配信 >Capistranoを使ってVPSにデプロイしたいと思っているので、Capistranoを使って仮想サーバーに配置出来るように設定すればいいのですか?これをしてしまうと、本番と仮想の2つのproduction設定が混在してしまう?ためこのやりかた違うような。。。 Capistranoを使ってデプロイするのはOKです。 rake assets:precompileをした結果出力される、public/assets/以下のファイルをrailsではなく、Webサーバがブラウザへ出力するようにするという事です。 従って、Webサーバ(Apache or Nginx)の設定の話になります。 もし、これをやる場合は、rails側をこのように設定します。 config/environments/production.rb ・rails4 config.serve_static_assets = false ・rails5 config.public_file_server.enabled = false こうすると、public/assets以下のファイルがrailsでは出力しないので見えなくなります。 当然エラーとなるのですが、これでOKです。 それでWebサーバ側の設定でpublic/assetsを出力するようにしてエラーが出なくなるように設定できればうまく行ったことが分かります。 どうしてこういう事をするかというと、例えばUnicornで説明すると、 Unicornは通常ワーカーを3つくらいを起動しておきます。 多すぎてもサーバに負荷がかかってパフォーマンスが出ないので適切な数が必要です。 で、これは1プロセスにつき1アクセスしか同時に処理できません。 ワーカー3つならば、同時に3アクセスしか処理できず、他のアクセスは待機させるという事です。 rails側がブラウザでアクセスされる対象は、静的ファイル、コントローラのアクションです。 まったく変化しない静的ファイル(css, js, image)までrailsに配信させていると、アクセスの行列待ちがすぐ発生してしまい、表示が遅くなるというのは分かりますよね? 一方で、ApacheなどのWebサーバは設定次第ですが、静的ファイルへのアクセスを同時に処理するのが得意です。したがって、まったく内容が変化しない静的ファイルはWebサーバに任せ、動的に出力内容が変化する(or 毎回DBアクセスして情報を取ってくる)ようなコンテンツ=コントローラのアクションはrailsで配信する事でページの表示速度やサーバへの負荷を抑える事になります。
PartyKids

2017/07/22 05:36

返信ありがとうございます! 最後の方は、アプリケーション・サーバーとwebサーバーの役割の違いを仰っているんですね! 恥ずかしながら、mingosさんに『rake assets:precompile』教えていただくまで、アセットパイプラインについて何も知りませんでした。もっと言えば、rails側の開発環境と本番環境の挙動の違いの理解も乏しかったです。それが原因だと思うのですが、mingosさんに教えていただいた最初の部分があまり理解できないので(勉強不足&飲み込みが遅くて申し訳ないです。。。)、一度、教えていただいた情報を整理し、rails tutorialを仮想(開発&ステージング)で実行して、再度質問したいのですが、よろしいでしょうか? ご迷惑をおかけして申し訳ございません。 よろしくお願いいたします!
mingos

2017/07/22 06:46

はい、また何かあれば質問してもらって良いです。 分かる範囲であれば回答したいと思います。
PartyKids

2017/07/22 15:17

お手数をおかけして申し訳ございません。 今回も助けて頂き、本当にありがとうございました! 今後ともよろしくお願いいたします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問