解決したいこと
railsの環境ごとに正しいDBを参照するように設定をしたいです。
現状、以下に記載したとおりに環境構築を行い、staging環境と本番環境をubuntuに作成しました。
そして、capistranoを使用し、
bundle exec cap production deploy
bundle exec cap staging deploy
コマンドでのデプロイができるようになった状況です。
しかし、productionでデプロイした方のドメインからアクセスすると、staging環境のDBを参照してデータが表示されてしまいます。
DB以外にも、以下のような分岐をapplication.html.hamlに埋め込んで確認したところ、「ステージング環境のテキスト」が表示されます。
- if Rails.env.development? 開発環境のテキスト - elsif Rails.env.test? テスト環境のテキスト - elsif Rails.env.staging? ステージング環境のテキスト - elsif Rails.env.production? 本番環境のテキスト
このとき、production環境では本番用のDB(以下のproduction_db)を参照するように設定を行いたいです。
他にどのような設定が必要なのか?もしくは間違った設定をしている部分があれば、どのように修正すべきかご教授いただきたいです。
初歩的な疑問かもしれず大変恐縮ですが、皆様のお知恵をお貸しいただけますと幸いです。
以下に記載した分以外では追加したファイルはないはずですが、他に必要な情報等がありましたらお教えください。
環境
Ruby on Rails 5.2
Ruby 2.6.2
Capistrano 3
nginx
ubuntu16.04
staging、production用のドメインはそれぞれ取得してhttps化もLetsEncryptで済ませてnginxで設定している。
問題に至るまでの経緯
こちらのリンクの方のデプロイするまで1~2
を参考にcapistranoとunicorn nginx の設定を行っています。(ubuntuのため、一部違う部分がありますが)
その他に、capistranoでstaging環境構築
こちらも参考に以下のように設定ファイルを編集しました。(下記以外は基本的に上記のURLの設定と同じ)
stagingとproduction環境は同じファイルディレクトリを参照しています(var/www/myapp/current)
environment/staging.rb
config.action_mailer.default_url_options = { :host => 'http://staging.com' }(stagingのドメイン) ※他はproductionと一緒
deploy/staging.rb
set :stage, :staging set :rails_env, 'staging' server 'staging.com', user: 'aaa', port: '33333', roles: %w{web app db} set :ssh_options, { keys: [File.expand_path('秘密鍵のパス)')] }
deploy/production.rb
set :stage, :production set :rails_env, 'production' server 'production.com.', user: 'aaa', port: '33333', roles: %w{web app db} set :ssh_options, { keys: [File.expand_path('秘密鍵のパス)')] }
database.yml
staging: <<: *default database: staging_db username: <%= ENV['DATABASE_NAME'] %> password: <%= ENV['DATABASE_PASS'] %> production: <<: *default database: production_db username: <%= ENV['DATABASE_NAME'] %> password: <%= ENV['DATABASE_PASS'] %>
config/secrets.yml
staging: secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> production: secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
ubuntu内
www/myapp/shared/config/secrets.yml
production: secret_key_base: 0000~(ランダム数列) staging: secret_key_base: 0123~(ランダム数列)
gemfile
group :production, :staging do gem 'unicorn' end
追加補足
/etc/nginx/conf.d/lcoin.conf
#各種ログのディレクトリ設定 error_log /var/www/myapp/current/log/nginx.error.log; access_log /var/www/myapp/current/log/nginx.access.log; #処理を受け取る最大許容量 client_max_body_size 2G; upstream app_server { # 連携するunicornのソケットのパス server unix:/var/www/myapp/current/tmp/sockets/.unicorn.sock fail_timeout=0; } server { listen 443 ssl; server_name staging.com; ssl_certificate /etc/letsencrypt/live/staging.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/staging.com/privkey.pem; #次のリクエストが来るまでの待ち時間(秒 keepalive_timeout 45; #静的ファイルを読みに行くディレクトリ root /var/www/myapp/current/public; #キャッシュのディレクトリ try_files $uri/index.html $uri.html $uri @app; location @app { # HTTP headers proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-FORWARDED_PROTO https; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://app_server; } #エラーページを設置する場所 error_page 500 502 503 504 /500.html; location = /500.html { root /var/www/myapp/current/public; } } server { listen 443 ssl; server_name production.com; ssl_certificate /etc/letsencrypt/live/production.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/production.com/privkey.pem; #次のリクエストが来るまでの待ち時間(秒 keepalive_timeout 45; #静的ファイルを読みに行くディレクトリ root /var/www/myapp/current/public; #キャッシュのディレクトリ try_files $uri/index.html $uri.html $uri @app; location @app { # HTTP headers proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-FORWARDED_PROTO https; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://app_server; } #エラーページを設置する場所 error_page 500 502 503 504 /500.html; location = /500.html { root /var/www/myapp/current/public; } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/04 11:52
退会済みユーザー
2019/05/04 11:57
2019/05/05 07:04
退会済みユーザー
2019/05/05 07:25
2019/05/08 06:44