はじめに
Ruby on Railsウェブフレームワークを使用する際、デフォルトではアプリケーションはSQLiteをデータベースとして使用します。SQLiteは軽量で携帯性があり、低メモリ環境で特に優れたパフォーマンスを発揮するため、多くの場合に適しています。ただし、より信頼性の高いデータの整合性とプログラム的な拡張性が必要な複雑なアプリケーションには、PostgreSQLデータベースがより堅牢で柔軟な選択肢となります。Ruby on Railsのセットアップを設定してPostgreSQLを使用するためには、追加の手順が必要です。
このチュートリアルでは、Ubuntu 20.04サーバーに接続されたRuby on Rails開発環境を設定します。PostgreSQLをインストールおよび設定し、その後、PostgreSQLをデータベースサーバーとして使用するRailsアプリケーションを作成してセットアップをテストします。
前提条件
このチュートリアルには以下が必要です:
-
Ubuntu 20.04サーバー(sudo特権を持つ非ルートユーザーとファイアウォールを含む)は、Ubuntu 20.04の初期サーバーセットアップガイドに従ってセットアップされている必要があります。
-
Ubuntu 20.04サーバーにRuby on Rails開発環境をインストールします。これを設定するには、Ubuntu 20.04でrbenvを使用してRuby on Railsをインストールする方法に従ってください。このチュートリアルでは、Rubyのバージョン3.1.2とRailsのバージョン7.0.4を使用します。最新バージョンに関する情報は、RubyとRailsの公式サイトを参照してください。
ステップ1 – PostgreSQLのインストール
WebアプリケーションのデータベースとしてPostgreSQLを使用するために、まずデータベースをサーバーにインストールします。
sudo
特権を使用して、APTパッケージインデックスを更新し、リポジトリが最新であることを確認します:
- sudo apt update
次に、PostgreSQLとその開発ライブラリをインストールします:
- sudo apt install postgresql postgresql-contrib libpq-dev
前のコマンドでは、postgresql
パッケージは主要な PostgreSQL プログラムを保持しており、postgresql-contrib
はその機能を拡張するいくつかの PostgreSQL の機能を追加します。 libpq-dev
は PostgreSQL ライブラリであり、クライアントがバックエンドサーバーにクエリを送信して応答を受け取ることができるようにします。これにより、アプリケーションがデータベースと通信できるようになります。
PostgreSQL とその依存関係がインストールされたら、次のステップは、Rails アプリケーションが後で使用するデータベースを作成するために使用するロールを作成することです。
ステップ 2 – 新しいデータベースロールの作成
PostgreSQL では、ロールは Linux のユーザーと同様に権限と認可を整理するために使用できます。このステップでは、PostgreSQL システム内でデータベースを作成および設定するために使用できる新しいスーパーユーザーロールを Linux のユーザー名に作成します。
PostgreSQL のスーパーユーザーロールを作成するには、次のコマンドを実行します。ハイライトされた単語を Ubuntu 20.04 のユーザー名に置き換えてください。
- sudo -u postgres createuser -s sammy -P
-P
フラグが指定されているため、新しいロールのパスワードを入力するように求められます。所望のパスワードを入力し、後のステップで構成ファイルで使用できるように記録してください。
createuser
コマンドを使用して、sammy
という名前のロールを作成します(またはお好きなユーザー名を使用してください)。-s
フラグはこのユーザーにスーパーユーザー権限を付与し、sudo -u
はPostgreSQLのインストール時に自動的に作成されるpostgres
アカウントからコマンドを実行するためのものです。
注意: Ubuntu上のPostgreSQLの認証モードはデフォルトでident
に設定されているため、Ubuntuユーザーはデフォルトで同じ名前のロールでのみPostgreSQLで操作することができます。詳細については、PostgreSQL公式ドキュメントの認証に関する情報を参照してください。
-P
フラグを使用せずに作成したロールのパスワードを設定したい場合は、次のコマンドでPostgreSQLコンソールに入ることができます:
- sudo -u postgres psql
以下の出力とともに、PostgreSQLコンソールのプロンプトが表示されます:
Outputpsql (12.12 (Ubuntu 12.12-0ubuntu0.20.04.1))
Type "help" for help.
postgres=#
PostgreSQLコンソールはpostgres=#
プロンプトで示されます。PostgreSQLのプロンプトで、以下のコマンドを入力して、新しいデータベースロールのパスワードを設定します。ハイライトされている名前を作成した名前に置き換えてください:
- \password sammy
PostgreSQLはパスワードを入力するようにプロンプトを表示します。希望するパスワードをプロンプトに入力し、確認してください。
これで、PostgreSQLコンソールから出るためのコマンドを入力します:
- \q
通常のプロンプトが再表示されます。
このステップでは、スーパーユーザー権限を持つ新しいPostgreSQLのロールを作成しました。これで、このロールを使用してデータベースを作成するRailsアプリを作成する準備が整いました。
ステップ3 – 新しいRailsアプリケーションの作成
PostgreSQLに設定された役割を使用する新しいRailsアプリケーションを作成できます。
まず、ホームディレクトリに移動してください:
- cd ~
次に、次のコマンドを使用して新しいRailsアプリケーションを作成します。 appname
をアプリの名前に置き換えてください:
- rails new appname -d=postgresql
-d=postgresql
オプションは、PostgreSQLをデータベースとして設定します。
このコマンドを実行すると、ホームディレクトリに appname
という名前の新しいフォルダが作成され、基本的なRailsアプリケーションの要素が含まれます。
次に、アプリケーションのディレクトリに移動します:
- cd appname
新しいRailsアプリケーションを作成し、プロジェクトのルートディレクトリに移動したので、Railsアプリケーション内からPostgreSQLデータベースを設定して作成できます。
ステップ4 – データベースの設定と作成
アプリケーションの development
と test
データベースを作成する際、Rails は Ubuntu のユーザー名に作成した PostgreSQL ロールを使用します。これらのデータベースを作成するためには、プロジェクトのデータベース設定ファイルを変更する必要があります。その後、データベースを作成します。
Rails アプリケーションの設定変更の一つは、前の手順で作成した PostgreSQL ロールのパスワードを追加することです。パスワードなどの機密情報を安全に保つために、設定ファイルに直接書くのではなく、環境変数にパスワードを保存することが推奨されています。
ログイン時にパスワードを環境変数に保存するために、以下のコマンドを実行してください。なお、APPNAME
をアプリ名、PostgreSQL_Role_Password
を前の手順で作成したパスワードに置き換えてください。
- echo 'export APPNAME_DATABASE_PASSWORD="PostgreSQL_Role_Password"' >> ~/.bashrc
このコマンドは export
コマンドを ~/.bashrc
ファイルに書き込み、ログイン時に環境変数が設定されるようにします。
現在のセッションに対して変数をエクスポートするには、source
コマンドを使用してください。
- source ~/.bashrc
環境変数にパスワードが保存されたので、設定ファイルを変更することができます。
お好みのテキストエディタでアプリケーションのデータベース設定ファイルを開いてください。このチュートリアルでは nano
を使用します。
- nano config/database.yml
default
セクションの中で、以下の行を探し、pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
と書かれた行に、下線部を追加し、認証情報と作成した環境変数を記入してください。例えば、以下のようになります:
...
default: &default
adapter: postgresql
encoding: unicode
# 接続プーリングの詳細については、Railsの設定ガイドを参照してください。
# http://guides.rubyonrails.org/configuring.html#database-pooling
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: sammy
password: <%= ENV['APPNAME_DATABASE_PASSWORD'] %>
development:
<<: *default
database: appname_development
...
この更新により、Railsアプリケーションは正しいロールとパスワードでデータベースを実行します。 CTRL
+ x
、Y
、ENTER
を押して保存して終了します。
Railsでデータベースを設定する詳細については、Railsのドキュメントを参照してください。
config/database.ymlを変更したので、rails
コマンドを使用してアプリケーションのデータベースを作成します。
- rails db:create
Railsがデータベースを作成すると、次の出力が表示されます:
OutputCreated database 'appname_development'
Created database 'appname_test'
出力の通り、このコマンドはPostgreSQLサーバーにdevelopment
とtest
のデータベースを作成しました。
これでRailsアプリに接続されたPostgreSQLデータベースがあります。アプリケーションが正常に動作していることを確認するために、設定をテストします。
ステップ5 – 設定のテスト
アプリケーションがPostgreSQLデータベースを使用できるかどうかをテストするために、ウェブアプリケーションを実行してブラウザに表示します。
rails server
コマンドを使用して、Railsアプリ内の組み込みウェブサーバーであるPumaでウェブアプリケーションを実行します。
- rails server --binding=127.0.0.1
--binding
は、アプリケーションを指定されたIPにバインドします。デフォルトでは、このフラグはRailsを0.0.0.0
にバインドします。これは、Railsがすべてのインターフェースにリッスンすることを意味しますので、localhost
を指定するために127.0.0.1
を使用するとより安全です。デフォルトでは、アプリケーションはポート3000
でリッスンします。
Railsアプリが実行されていると、コマンドプロンプトは消え、次のような出力に置き換わります:
Output=> Booting Puma
=> Rails 7.0.4 application starting in development
=> Run `bin/rails server --help` for more startup options
Puma starting in single mode...
* Puma Version 5.6.5 (ruby 3.1.2-p20) ("Birdie's Version")
* Min threads: 5
* Max threads: 5
* Environment: development
* Listening on tcp://127.0.0.1:3000
Use Ctrl-C to stop
アプリケーションが実行されているかどうかをテストするには、サーバー上の新しいターミナルウィンドウを開き、curl
コマンドを使用してリクエストを127.0.0.1:3000
に送信します:
- curl http://127.0.0.1:3000
HTMLで終わる多くの出力が返されます:
Output...
<strong>Rails version:</strong> 7.0.4<br />
<strong>Ruby version:</strong> 3.1.2 (x86_64-linux)
</p>
</section>
</div>
</body>
</html>
Railsアプリケーションがリモートサーバー上にあり、ウェブブラウザを介してアクセスしたい場合は、サーバーのパブリックIPアドレスにバインドすることができます。まず、ファイアウォールでポート3000
を開きます:
- sudo ufw allow 3000
次に、サーバーのパブリックIPアドレスを調べます。次のcurl
コマンドを実行することでこれを行います:
- curl http://icanhazip.com
これにより、パブリックIPアドレスが返されます。これを使用してrails server
コマンドを実行し、server_public_IP
をサーバーのパブリックIPに置き換えます:
- rails server --binding=server_public_IP
これで、ローカルのウェブブラウザからサーバーのパブリックIPアドレスのポート3000
でRailsアプリケーションにアクセスできるようになります。アクセスするURLは次のようになります:
http://server_public_IP:3000
このURLでは、Ruby on Railsのページが表示されます:
ホームページにアクセスできれば、アプリケーションは正しく設定され、PostgreSQLデータベースに接続されています。
設定をテストした後、ポート3000
を閉じる場合は、次のコマンドを使用してください。
- sudo ufw delete allow 3000
結論
このチュートリアルでは、Ubuntu 20.04サーバー上でデータベースとしてPostgreSQLを使用するように構成されたRuby on Railsウェブアプリケーションを作成しました。Rubyプログラミング言語について詳しく知りたい場合は、How To Code in Rubyシリーズをご覧ください。
アプリケーションに適したデータベースの選択に関する詳細は、SQLite、PostgreSQL、およびMySQLの違いと使用例についてのチュートリアルをご覧ください。データベースの使用方法についてさらに詳しく読みたい場合は、PostgreSQLのクエリについてのイントロダクション記事をご覧いただくか、DigitalOceanのManaged Databases製品をご覧ください。