Date.today と Date.current の違い

Railsアプリで現在の日付を取得する時、Date.todayDate.currentどっちでも取得できるが、違いが気になったので調べてみました。

まず大事なこととして、Railsアプリケーションでは「システムまたは環境変数に設定されたタイムゾーン」と「application.rbに設定されたタイムゾーン」の2種類があるらしい。

Date.today

Date.todayは、環境変数タイムゾーンを使う。

Date.current

Date.currentは、application.rbのタイムゾーンを使う。

まとめ

環境変数を設定してDate.todayを使うよりも、application.rbにタイムゾーンの設定を書いてDate.currentを使った方が思いがけないミスが減りそうなので、Date.currentをなるべく使っていこうと思います。

参考

nginxとRailsを連携させる

pckhtn.hatenablog.com

こちら☝️の記事の続きになります。

やりたい事

nginxとpumaを連携させてRailsアプリを動かす。 動的ページはpumaから、静的ファイルはnginxから配信させる。

1. Pumaの設定

Rails(Puma)とNginxを連携させるために、Pumaの設定ファイルを修正します。

config/puma.rbを以下のようにします。

# 以下の部分をコメントアウトします。
# port  ENV.fetch("PORT") { 3000 } 


# 以下の3行を追加してください。
bind "unix://#{Rails.root}/tmp/sockets/puma.sock"
daemonize true
stdout_redirect "#{Rails.root}/log/stdout", "#{Rails.root}/log/stderr"

2. nginxの設定

私のサーバーでは、/etc/nginx/sites-available/配下に各サイトの設定ファイルがあるので、それに設定を記述していきます。

下記設定ファイルのbooks_appは各自のフォルダ名に変えてください。 また、追記するところ以外は省略しているところもあるのでこのままコピペする事はお勧めしません。 各自の設定ファイルに書いてあった内容はなるべく消さずに追加するところだけを選んで自分の設定ファイルに追加してください。

upstream books_app {
# 先ほどPumaの設定でbindの後に書いたものを追記してください。
    server unix:///opt/books_app/tmp/sockets/puma.sock fail_timeout=0;
}

server {
  listen xx;
   server_name xxxxx;
   access_log /home/demo/public_html/xxxxx/log/access.log;
   error_log /home/demo/public_html/xxxxx/log/error.log;
# rootとtry_filesの設定を追加してください↓
   root /opt/books_app/public;
   try_files $uri/index.html $uri @books_app;

# 下記locationの設定9行を追記してください
  location @books_app {  
    proxy_read_timeout 300;  
    proxy_connect_timeout 300;  
    proxy_redirect off;  
    proxy_set_header Host $host;  
    proxy_set_header X-Forwarded-Proto $scheme;  
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
    proxy_pass http://books_app;  
  }  
}

追記できたら、下記コマンドで設定ファイルのシンボリックリンクを作成します。

$ ln -s /etc/nginx/sites-available/books_app /etc/nginx/sites-enabled/books_app

3. サーバー起動

nginxの設定ファイルを再読込させます。

$ sudo nginx -s reload

nginxの再起動ができず、手こずったのですが、同じ状態になった方はこちらの記事↓が参考になるかもしれません。

他のプロセスがポートを占有してnginxを再起動できない - Qiita

Pumaを起動します。

$ bin/rails s -e production

# 停止する場合
$ kill `cat tmp/pids/server.pid`

これで準備完了です!各自のドメインにアクセスしてみてください。

http://各自のドメイン/

Railsアプリが表示されるはずです。お疲れ様でした😄

参考

production環境でRailsアプリを立ち上げる

ローカルで開発していたRailsアプリをリモートサーバーに置いて、本番環境(production)環境で立ち上げました。

結構つまずいたので手順をまとめてみようと思います。

環境 

1. Githubからリポジトリをクローンする

リモートサーバーにRailsアプリのクローンを作成します。

「/opt」の下で、下記コマンドを実行してください。参考1参考2

$ git clone https://github.com/YOUR-USERNAME/YOUR-REPOSITORY

Githubの公式ページにクローン作成の詳細が書かれているので、必要に応じて確認してください。

Githubにローカルで開発していたアプリをpushしていない場合は、先にpushしてください。

2. アセットのプリコンパイル

production環境では必ず、プリコンパイルを実行する必要があります。

$ bin/rails assets:precompile

3. 静的ファイルの配信サーバを設定

本番環境では、静的ファイルの配信はNginxなどのWebサーバにやってもらうのが一般的なため、デフォルトでは設定ファイルconfig/environments/production.rbにそのように書いてあります。

しかし今回は、Railsの用意している静的ファイルの配信機能を使うので、設定ファイルを修正する必要があります。

config/environments/production.rb

# コメントアウトする↓
# config.public_file_server.enabled = ENV["RAILS_SERVE_STATIC_FILES"].present? 

# 追加する↓
config.public_file_server.enabled = true 

4. production環境用のデータベースを作成する

development環境とtest環境のデータベースはSQLiteを使っていたのですが、production環境ではPostgresqlを使うように変更します。 OSにPostgreSQLをインストールしていない場合は、先にインストールしてください。

Gemfileに以下を追加します。

gem "pg"

インストールします。

$ bundle install

Postgresqlのユーザーを追加します。パスワードが求められるので、入力してください。

$ createuser -d -P ユーザー名

上記で入力したパスワードを、config/detabase.ymlで使えるように環境変数に入れる必要があります。 OSのファイル.bash_profileに以下を追加します。BOOKS_APP_DATEBASE_PASSWORDの所は各自変えてください。

~/.bash_profile

export BOOKS_APP_DATEBASE_PASSWORD=パスワード

記入したら以降のステップに進む前に設定ファイルを下記コマンドで再読み込みしてください。

$ source ~/.bash_profile

config/database.ymlを編集します。

default: &default
# postgresqlに変更します↓
  adapter: postgresql
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000
# 先ほどcreateuserコマンドで作成したユーザー名を入力してください↓
  username: ユーザー名
# 先ほど作った環境変数をセットします↓
  password: <%= ENV['BOOK_APP_DATABASE_PASSWORD'] %>

development:
  <<: *default
  database: books_app_development

test:
  <<: *default
  database: books_app_test

production:
  <<: *default
# database名を アプリ名_productionに変更してください↓
  database: books_app_production

準備が整いました。下記コマンドを実行して、データベースを作成してください。

$ RAILS_ENV=production bin/rails db:create db:migrate

5. config/master.keyを作成

production環境でアプリを動かすためにはconfig/master.keyファイルが必要です。 しかし、そのファイルはGitの追跡範囲外なので、Githubからクローンを作成した場合 master.keyファイルは含まれていないので作る必要があります。

リモートサーバーのRailsアプリにconfig/master.keyファイルを作成してローカルのconfig/master.keyファイルの内容をコピペしてください。

6. サーバーを起動

下記コマンドでサーバーを起動します。

$ bin/rails s -e production -b IPアドレス

これでページが表示されるはずです✨

http://IPアドレス:3000/

お疲れ様でした。何か間違いがあればお気軽にコメントください😄

続きの記事も書きましたので、よければご覧ください😊

pckhtn.hatenablog.com

参考