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

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

ただいまの
回答率

89.13%

Rails のデプロイについて教えてください。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 593

koume

score 162

Rails5.1.3でWebアプリケーションの勉強をしながら、実際に公開することを目指して制作しています。
デプロイし、Webアプリケーションを公開したいのですがデプロイについてものすごく混乱しているので教えてください。

単純に自分で作ったWebアプリケーションを公開したいのです。

1,VPS(さくらのVPS)を利用する前提でお願いします。

・Capistranoを導入する必要はあるのでしょうか?

さくらのVPSを利用する場合はCapistranoなどは必要ないというのであればいいのですが
そのあたりの関係性がわかりません。

VPSにApache,Passenger,Centos,MySQL,Ruby,Rails,Node.js等を構築しファイル転送ツール(CyberDuck)で
Railsアプリケーションをサーバーに転送すれば動くものと思っていましたが、調べれば調べるほど
いろんな情報があり訳がわからなくなっています。この内容で構築するとして他にしなければいけないことを
教えていただけないでしょうか?

また、Capistrano がデプロイするためのツールだというのはわかりますが、あとでアプリに機能を追加したり
削除したりなどコードを変更するときにはCapistranoが必要になるのか?それともCyberDuckで転送しなおせば
コードの変更ができるのでCapistranoは必要ないとか、ファイルを転送しなおした場合データベースの中が
リセットされてしまうのではないか?など不安です。

どなたかご教示お願いします。

追記
サブディレクトリー運用かどうかのところですが、

新規にドメインをwonder128.comで取得しました。

config/environments/production.rb

config.chibi = {
    staff: { host: 'wonder128.com', path: 'staff' },
    admin: { host: 'wonder128.com', path: 'admin' },
    customer: { host: 'wonder128.com', path: 'mypage' },
    visitor: { host: 'wonder128.com', path: '' },
    restrict_ip_addresses: false
  }


のように利用者別トップページのホスト名とURLパスを設定しています。
このような場合、httpd.conf にはどれを記述すればいいのでしょうか?
staff,admin,customerはログイン機能があり、visitorにはログイン機能はありません。
誰でもアクセスできるのはvisitor: { host: 'wonder128.com', path: '' }のページに
設定したいのです。(一般のユーザーがアクセスするページ)
staff,admin,customerにはhttps://wonder128.com/staff,  /admin,  /customerでアクセスし
ログインするというイメージです。

DNCにwonder128.comと設定すれば、全てのページにpathでアクセスできるものと考えていました。

的外れな質問なのかもしれませんが少し混乱していますので
お手数をお掛けしますが教えていただけないでしょうか?宜しくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

Capistrano は必須ではありませんよ。
まずは Capistrano なしで設置してみては。

いくつかハマリポイントがありますが,Rails アプリが出来上がっているなら,VPS 上で動作させるのはそれほど難しくありません。

以下,さくら VPS,CentOS,Apache という前提で。

現在,VPS で Apache が動き,Ruby と Passenger のインストールが完了し,必要な gem も揃い,Rails のファイル群がどこかのディレクトリーに設置され,rails console なども動く状態までいっているのですね?

であればあと一歩(というか二、三歩)です。

Passenger のインストールの最終段階で,「これを http.conf に書いとけや」っていうのが提示されましたよね。
それをそのとおりに記述し,Apache で configtest やって書き方が間違ってないか確認し,Apache の再起動をしておきます。

で,サブディレクトリー運用かどうかで話が違ってくるのですが,そこはどうでしょうか。

独自ドメインが無いとすると,www12335.sakura.ne.jp みたいなドメインですよね。で,

http://www12335.sakura.ne.jp/

で運用したいのか

http://www12335.sakura.ne.jp/myapp/

で運用したいのかによってちょっと設定が違います。後者だと一つのサーバーで複数のアプリが動かせます。

私はサブディレクトリーでしかやったことがないので,それで説明します。

上記の通り myapp というサブディレクトリーで運用することとします。

まず,httpd.conf に

RackBaseURI /myapp

って書いときます。httpd.conf を書き換えたあとは必ず configtest し,Apache の再起動をします。

そして,/etc/www/html/myapp から Rails アプリの public ディレクトリーにシンボリックリンクを張ります。(よく間違えて Rails アプリのルートにリンクしちゃうので気をつけて)

アセットの precompile をやらないとですね。これは

$ sudo rails assets:precompile RAILS_ENV=production RAILS_RELATIVE_URL_ROOT=/myapp

とします。RAILS_RELATIVE_URL_ROOT を正しく設定しないとサブディレクトリーではうまくいきません。

これで OK。

Rails のファイル群を,apache というユーザーから見えるようにしておくことを忘れないで。ファイルのユーザーを apache にすればいいでしょう。Rails アプリのルートで

$ sudo chown apache:apache -R .

でできます。

とくに,SQLite3 なんかでデータベースファイルのユーザーが違っていて動かないことがよくあります。

ファイルを変更したりアセットの precompile をやったりしたあとは Rails アプリを再起動しないと適用されません。

Apache を再起動すれば Rails アプリも再起動されるのですが,Rails アプリの tmp ディレクトリーに restart.txt という名前のファイルを作成・更新するだけで,次回アクセス時に自動的に再起動されます。
「作成・更新」というのは,初めてのときは作成するだけ,次回からはタイムスタンプが変われば OK です。中身は空でかまいません。
もっとも簡単にやるには,Rails アプリのルートディレクトリーで

$ sudo touch tmp/restart.txt

とやります。(ファイルがすでに存在してればタイムスタンプが更新されます)

ところで,ログインが必要なサイトを作るなら HTTPS 化は必須です。
そのため独自ドメインを取得します。
あとは Let’s Encrypt でやれば手軽だしタダです。
/etc/httpd/conf/httpd.conf の記述を /etc/httpd/conf.d/ssl.conf に移します。


追記

ちょっと補足します。

Rails アプリ内でリンクのパスを「レールに乗った書き方」にしていないと,サブディレクトリー運用で失敗します。
つまり,例えばユーザー一覧へのリンクパスを

link_to "ユーザー一覧", users_path

と書いておけばいいのですが(今の場合,:users でも OK),これを

link_to "ユーザー一覧", "/users"

なんて書くとダメです。
開発中は http://localhost:3000/ とかで動作確認するので,気づきにくいんですよね。

それから,うまくいかないときは Rails アプリの log/production.log はもちろんですが,Apache のエラーログ(/var/log/httpd/error_log)も見ましょう。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/05 10:43

    回答のお礼が遅くなり失礼しました。サブディレクトリー運用かどうかのところで少し混乱しています。
    質問内容を追記させていただきましたのでお手数ですが教えていただけないでしょうか?
    宜しくお願いします。

    キャンセル

  • 2018/03/05 12:28

    config.chibi が何なのか分かりませんが,要するにその Rails アプリのルートは
    https://wonder128.com/
    なんですね。であればサブディレクトリー云々は忘れてください。
    私が言っていたのは,
    https://wonder128.com/my_great_app/
    https://wonder128.com/my_great_app/staff
    https://wonder128.com/my_great_app/admin
    https://wonder128.com/my_great_app/customer
    みたいな URL でやるのかどうか,ということでした。(一つのサーバーで複数の Rails アプリを動かす場合のやり方の一つ)

    koume さんの意図に従うと,httpd.conf の DocumentRoot を Rails アプリの public ディレクトリーにしておけばよいようです。

    キャンセル

  • 2018/03/05 14:19

    回答ありがとうございます。1つのサーバーで1つのアプリしか動かさないので
    現状のまま進めてみます。今後とも宜しくおねがいします。

    キャンセル

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

  • ただいまの回答率 89.13%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる