RailsにMySQLを導入する際に、パスワードをdatabase.ymlに直接書くのはいかがなものかと思い、他の方法を調べた結果、dotenv-railsを使って認証情報を環境変数で管理できることがわかりました。
今回は作成済みのRailsアプリケーションにdotenv-railsを導入する手順を紹介します。
1. 開発環境
- macOS Monterey:12.3.1
- Ruby:3.1.0
- Ruby on Rails:6.1.5
- dotenv-rails:2.7.6
- MySQL:8.0.28
2. dotenv-railsとは
- 認証情報などを環境変数で管理するためのgem
- 起動時にプロジェクトのルートディレクトリにある
.envを読み込み、環境変数ENVに設定する - dotenv-rails公式レポジトリ
3. 手順
3-1. dotenv-railsのインストール
Gemfileに以下を追記します。
gem 'dotenv-rails'
dotenv-railsをインストールします。
$ bundle install
3-2. database.ymlの修正
database.ymlを以下のように修正します。
default: &default
adapter: mysql2
encoding: utf8mb4
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: <%= ENV['DATABASE_DEFAULT_USER'] %>
password: <%= ENV['DATABASE_DEFAULT_PASSWORD'] %>
host: <%= ENV['DATABASE_DEFAULT_HOST'] %>
socket: /tmp/mysql.sock
development:
<<: *default
database: <%= ENV['DATABASE_DEV_NAME'] %>
test:
<<: *default
database: <%= ENV['DATABASE_TEST_NAME'] %>
<<: *defaultで一番上のdefaultの設定が呼び出されています。
こうやって書いたのと同じ↓
development:
adapter: mysql2
encoding: utf8mb4
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: <%= ENV['DATABASE_DEFAULT_USER'] %>
password: <%= ENV['DATABASE_DEFAULT_PASSWORD'] %>
host: <%= ENV['DATABASE_DEFAULT_HOST'] %>
socket: /tmp/mysql.sock
database: <%= ENV['DATABASE_DEV_NAME'] %>
3-3. .envの作成
アプリケーションのルートディレクトリ配下に、.envを作成します。
$ touch .env
.envに以下を追記します。
DATABASE_DEFAULT_USER = '<ユーザー名>'
DATABASE_DEFAULT_PASSWORD = '<パスワード>'
DATABASE_DEFAULT_HOST = '<ホスト名>'
DATABASE_DEV_NAME = '<開発用のデータベース名>'
DATABASE_TEST_NAME = '<テスト用のデータベース名>'
3-4. .gitignoreの編集
.envをGitの管理対象から除外するために、.gitignoreに以下を追記します。
# /.envの追加
/.env
以上でdotenv-railsの導入は完了です。
【参考】