【rails】docker + rails + heroku メールでユーザー認証をしようとした時にhttp://localhost:3000/~からメールが届く


1.起きている問題やエラーメッセージ

備忘録として残しておきます。
チームメンバーと開発したポートフォリオの一つをherokuでデプロイしました。
アプリへサインインした際、ユーザー認証メールが届き、URLをクリックするとアプリのドメイン名に遷移させたいという話です。

docker+rails環境でアプリを作成し、本番環境にデプロイしました。
サインアップにgem deviseを使用しているため、サインアップすると ユーザー認証メールが届きますが、記載のURLをクリックすると、localhost形式のURLからメールが届いてしまい、ユーザー認証ができませんでした。

2. 関連していそうなソースコードの見直し

config/environments/production.rb
Rails.application.configure do


  # 本番環境用
  config.file_watcher = ActiveSupport::EventedFileUpdateChecker
  config.action_mailer.default_url_options = { host: 'サブドメイン名(アプリ名).herokuapp.com', protocol: 'https' }
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    address: 'smtp.gmail.com',
    port: 587,
    user_name: ENV['USER_EMAIL'],
    password: ENV['EMAIL_PASSWORD'],
    authentication: 'plain',
    enable_starttls_auto: true
  }

end

production.rbの設定に間違いはなさそうなのに、なぜかlocalhostへ遷移される状態になってしまっておりました。

3. 問題にぶつかる前に、アプリをどうやってデプロイしたのか

heroku container:login
heroku container:push web -a アプリ名
heroku addons:attach postgresql名 -a アプリ名
heroku run rake db:migrate -a アプリ名
heroku open -a アプリ名

https://qiita.com/NA_simple/items/57ad10717568fea2160b
こちらの記事を参考にデプロイを実行。
サインインをトライして到着したメールに記載のURLをクリックすると、
http://localhost:3000/users/confirmation?confirmation_token=....
に遷移されてユーザー認証ができませんでした。

実際に「メールアドレス確認」をクリックして認証を完了させようとすると、
http://localhost:3000/users/confirmation?confirmation_token=....
というURLに飛ばされてしまいました。
しかしそれでは実際にアプリが使えないので、
http://アプリドメイン名/users/confirmation?confirmation_token=....
になることを望んでいました。

4.解決方法

そもそもdockerfileの設定に間違いの原因がありました。

FROM ruby:2.6.5
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000
ENV LANG C.UTF-8
# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]

最後のCMD ["rails", "server", "-b", "0.0.0.0"]が原因でした。
デプロイする際、このコマンドは開発環境を実行するという意味になっており、開発環境をデプロイしてしまっている。ということがわかりました。何を意味するのかというと、production.rbをいくら編集しても、本番環境をデプロイしていないため何の意味もなさなかったということになります。

今回の場合はdevelopments.rbを編集してやり過ごすことにしました。

deveopment.rb
Rails.application.configure do

   # 本番環境用
  config.file_watcher = ActiveSupport::EventedFileUpdateChecker
  #編集前
  #config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
  #編集後
  config.action_mailer.default_url_options = { host: 'サブドメイン名(アプリ名).herokuapp.com', protocol: 'https' }

  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    address: 'smtp.gmail.com',
    port: 587,
    user_name: ENV['USER_EMAIL'],
    password: ENV['EMAIL_PASSWORD'],
    authentication: 'plain',
    enable_starttls_auto: true
  }

end

上記development.rb
config.action_mailer.default_url_optionsを本番用のものに編集し直しました。
その場凌ぎにはなりますが、メイラーを送信するデフォルトのドメインをlocalhostから本番環境のドメイン名に変更しました。
このように修正して再度デプロイをし直し、ユーザー認証メールのURLをクリックしたら無事に本番環境のドメインに遷移されてユーザー認証を成功させることができました。

デプロイはエラーが付きまとうので大変と感じる人も多いと思います。
私も久しぶりにデプロイし、今回のエラーにぶつかってしまいました。実際skypeを繋ぎながら記事を参考に試しましたがなかなかうまくいかず、現場のエンジニアの知り合いに知恵を貸していただいて解決しました。正直dockerもherokuもrailsも知識が足りておらず、まだまだ勉強不足だなと痛感しました。