はじめに
Supabase CLIを学びたいけれど、どこから始めればいいか迷っていませんか?
本記事では、RailsとSupabase CLIを比較しながら、効率的な学習方法を紹介します。
既存のRails知識を活かして、Supabase CLIの基本をスムーズに習得できるよう構成しています。
Railsとの類似点や相違点を明確にしながら、Supabase CLIの特徴と使い方を解説していきます。
Rails開発者の視点から、Supabase CLIをマスターしましょう!
目次
- Supabaseとは?
- Supabase CLIの概要
- 環境構築の詳細比較
- プロジェクトのセットアップ手順
- データベースの管理とマイグレーション
- 認証機能の実装方法
- APIの構築と管理
- リアルタイム機能の実装
- デプロイとホスティング戦略
- ユースケース別のプラットフォーム選択
- まとめと次のステップ
- 参考資料
Supabaseとは?
Supabaseは、オープンソースのFirebase代替として急速に人気を集めているバックエンドプラットフォームです。
PostgreSQLを基盤としており、データベース、認証、ストレージ、リアルタイム機能、Auto-generated APIなど、モダンなアプリケーションに必要な多くの機能を提供します。
特に、以下の点が強みです:
- オープンソース:コードが公開されており、カスタマイズや拡張が容易。
- PostgreSQLベース:強力なリレーショナルデータベースの利点を享受。
- リアルタイム機能:データの変更を即座にクライアントに反映。
- Auto-generated API:データベースのスキーマから自動的にRESTful APIを生成。
これらの機能をSupabase CLIを通じてローカル開発環境で管理・開発できるため、効率的なバックエンド構築が可能です。
Supabase CLIの概要
Supabase CLIは、Supabaseプロジェクトをローカル環境で管理・開発するための強力なコマンドラインツールです。主な機能は以下の通りです:
- プロジェクトの初期化と管理:新規プロジェクトの作成や設定の管理。
- データベースマイグレーションの作成と適用:SQLベースのマイグレーション管理。
- ローカル開発環境の起動:Supabaseサービスをローカルで実行。
- 認証やストレージ設定の管理:認証プロバイダーの設定やストレージバケットの管理。
- リアルタイム機能の設定:データベースのリアルタイム更新を有効化。
Railsでのrails
コマンドに相当する役割を果たし、開発者にとって日常的なタスクを効率化します。
環境構築の詳細比較
Ruby on Railsの環境構築
Railsの環境構築は以下のステップで行います:
-
Rubyのインストール:
-
rbenv
やrvm
を使用してRubyのバージョン管理を行います。 - 例:
rbenv install 3.3.5 rbenv global 3.3.5
-
-
Railsのインストール:
-
gem
コマンドを使用してRailsをインストール。 - 例:
gem install rails -v 7.2.1
-
-
データベースの設定:
- デフォルトではSQLiteが使用されますが、PostgreSQLやMySQLも選択可能です。
- PostgreSQLを使用する場合:
brew install postgresql brew services start postgresql
-
プロジェクトの作成:
- 新規プロジェクトを作成します。
- 例:
rails new myapp -d postgresql cd myapp rails db:create rails server
Supabase CLIの環境構築
Supabase CLIの環境構築手順は以下の通りです:
-
Node.jsのインストール:
- Supabase CLIはNode.jsベースなので、まずNode.jsをインストールします。
- 例:
brew install node
-
Supabase CLIのインストール:
-
npm
を使用してCLIをグローバルにインストール。 - 例:
npm install -g supabase
-
-
プロジェクトの初期化:
- 新規Supabaseプロジェクトを初期化します。
- 例:
supabase init
-
データベースの設定:
- 初期化時にPostgreSQLの設定を行い、必要な設定ファイルが生成されます。
環境構築の比較表
項目 | Ruby on Rails | Supabase CLI |
---|---|---|
言語 | Ruby | JavaScript (Node.js) |
インストール方法 | gem install rails |
npm install -g supabase |
初期化コマンド | rails new |
supabase init |
データベース | Active Recordで管理 | SupabaseのPostgreSQLと管理方法 |
認証機能 | DeviseなどのGemを使用 | Supabase Authを利用 |
リアルタイム | ActionCableを使用 | Supabase Realtimeを利用 |
プロジェクトのセットアップ手順
Railsでのプロジェクト作成
Railsプロジェクトを作成する基本的な手順は以下の通りです:
-
新規プロジェクトの作成:
rails new myapp -d postgresql cd myapp
-
データベースの作成:
rails db:create
-
サーバーの起動:
rails server
Supabase CLIでのプロジェクト初期化
Supabase CLIを使用してプロジェクトを初期化する手順は以下の通りです:
-
プロジェクトディレクトリの作成と移動:
mkdir my-supabase-app cd my-supabase-app
-
Supabaseプロジェクトの初期化:
supabase init
- これにより、
supabase/config.toml
などの設定ファイルが生成されます。
- これにより、
-
ローカル開発環境の起動:
supabase start
-
マイグレーションの適用:
supabase db push
セットアップの比較とベストプラクティス
-
ディレクトリ構造:
- RailsはMVCアーキテクチャに基づいたディレクトリ構造を自動生成します。
- Supabase CLIは設定ファイルやマイグレーションファイルを管理するディレクトリを生成します。
-
依存関係の管理:
- RailsはGemfileで依存関係を管理。
- Supabase CLIは
package.json
やSQLファイルで管理。
-
ベストプラクティス:
- 両者を組み合わせる場合、データベースの一貫性を保つためにマイグレーション管理を明確にすることが重要です。
データベースの管理とマイグレーション
RailsのActive Recordマイグレーション
Railsでは、Active Recordを使用してデータベースのスキーマを管理します。マイグレーションファイルを作成し、以下のコマンドで適用します。
-
マイグレーションファイルの生成:
rails generate model User name:string email:string
-
マイグレーションの適用:
rails db:migrate
-
モデルの使用例:
class User < ApplicationRecord validates :email, presence: true, uniqueness: true end
Supabase CLIのSQLマイグレーション
Supabaseでは、SQLファイルを使用してマイグレーションを管理します。具体的な手順は以下の通りです。
-
マイグレーションファイルの作成:
-
supabase/migrations
ディレクトリにタイムスタンプ付きのSQLファイルを作成します。 - 例:
supabase/migrations/20231007_create_users.sql
CREATE TABLE users ( id SERIAL PRIMARY KEY, name TEXT NOT NULL, email TEXT UNIQUE NOT NULL );
-
-
マイグレーションの適用:
supabase db push
-
SQLファイルのバージョン管理:
- マイグレーションファイルはGitなどのバージョン管理システムで管理し、チーム全体で共有します。
マイグレーションの比較と推奨方法
項目 | Ruby on Rails | Supabase CLI |
---|---|---|
マイグレーション作成 | rails generate model |
SQLファイルを手動で作成 |
マイグレーション適用 | rails db:migrate |
supabase db push |
ORM | Active Record | SQLベース(ORMはSupabase自体に含まれない) |
バージョン管理 | 自動的にタイムスタンプ付きで管理 | 手動でファイル名にタイムスタンプを付与 |
ベストプラクティス | モデルとマイグレーションを一緒に管理 | SQLファイルを明確に分けて管理 |
推奨方法:
- RailsとSupabaseを併用する場合、データベーススキーマの管理を一元化するために、どちらか一方のマイグレーションツールに統一することが望ましいです。
- 一般的にはRailsのActive Recordを使用することで、Railsのモデルとの整合性を保ちやすくなります。
認証機能の実装方法
RailsでのDevise導入
Railsでは、認証機能を実装するためにDevise
などのGemを使用します。以下はDeviseの導入手順です。
-
Gemの追加:
# Gemfile gem 'devise'
-
Bundleインストール:
bundle install
-
Deviseのインストール:
rails generate devise:install
-
Userモデルの生成:
rails generate devise User rails db:migrate
-
ルーティングの設定:
# config/routes.rb Rails.application.routes.draw do devise_for :users # 他のルート end
-
ビューのカスタマイズ(必要に応じて):
rails generate devise:views
Supabase Authの設定と使用
Supabaseは認証機能を標準で提供しており、設定も比較的簡単です。
以下はSupabase Authの基本的な設定方法です。
-
認証の有効化:
- Supabaseダッシュボードにログインし、プロジェクトを選択。
- 「Authentication」セクションで必要な認証プロバイダー(メール、OAuthなど)を有効化。
-
クライアント側での利用:
- SupabaseのJavaScript SDKを使用して認証フローを実装。
- 例:ユーザーのサインアップ
import { createClient } from '@supabase/supabase-js' const supabase = createClient('https://xyzcompany.supabase.co', 'public-anon-key') // サインアップ const { user, error } = await supabase.auth.signUp({ email: 'example@example.com', password: 'password123', }) if (error) console.error('Error signing up:', error) else console.log('User signed up:', user)
-
セッション管理:
- ユーザーのセッションを管理し、認証状態を保持します。
- 例:ログイン状態のチェック
const user = supabase.auth.user() if (user) { console.log('Logged in user:', user) } else { console.log('No user logged in') }
認証機能の比較とセキュリティ考慮
項目 | Ruby on Rails (Devise) | Supabase Auth |
---|---|---|
インストール | Gemの追加と設定 | ダッシュボードから有効化 |
カスタマイズ性 | 高(コントローラーやビューを自由に設定) | API経由で設定(フロントエンド中心) |
プロバイダー | Gemで追加可能 | 標準で複数のOAuthプロバイダーをサポート |
セキュリティ | Railsのセキュリティベストプラクティスに依存 | Supabaseがセキュリティを管理 |
パスワード管理 | 自動で暗号化(bcryptなど) | Supabaseが暗号化を管理 |
セキュリティ考慮:
-
Rails (Devise):
- 強力なパスワード暗号化(bcrypt)。
- セッション管理やCSRF保護など、Railsのセキュリティ機能を活用。
- カスタム認証ロジックの実装が可能。
-
Supabase Auth:
- Supabaseが認証のセキュリティを管理。
- JWTトークンを使用したセッション管理。
- OAuthプロバイダーとの連携が容易。
推奨事項:
- Railsとの統合:RailsアプリとSupabase Authを統合する場合、JWTトークンをRails側で検証し、セッション管理を行うためのミドルウェアを実装する必要があります。
- セキュリティアップデート:どちらのプラットフォームを使用する場合でも、定期的なセキュリティアップデートと監査を行いましょう。
APIの構築と管理
RailsでのRESTful API構築
Railsでは、RESTfulなAPIを簡単に構築できます。以下は基本的な手順です。
-
APIモードでのプロジェクト作成(オプション):
rails new myapp --api -d postgresql cd myapp
-
コントローラーの作成:
rails generate controller Users index show create update destroy
-
ルーティングの設定:
# config/routes.rb Rails.application.routes.draw do resources :users, only: [:index, :show, :create, :update, :destroy] end
-
コントローラーアクションの実装:
# app/controllers/users_controller.rb class UsersController < ApplicationController before_action :set_user, only: [:show, :update, :destroy] def index @users = User.all render json: @users end def show render json: @user end def create @user = User.new(user_params) if @user.save render json: @user, status: :created else render json: @user.errors, status: :unprocessable_entity end end def update if @user.update(user_params) render json: @user else render json: @user.errors, status: :unprocessable_entity end end def destroy @user.destroy head :no_content end private def set_user @user = User.find(params[:id]) rescue ActiveRecord::RecordNotFound render json: { error: 'User not found' }, status: :not_found end def user_params params.require(:user).permit(:name, :email) end end
-
シリアライザーの導入(オプション):
-
ActiveModel::Serializers
やfast_jsonapi
などを使用して、JSONのフォーマットをカスタマイズ。
-
SupabaseのAuto-generated API活用
Supabaseでは、データベースのテーブルに対して自動的にRESTful APIが生成されます。具体的な利用方法は以下の通りです。
-
テーブルの作成:
- SQLマイグレーションでテーブルを作成。
- 例:
supabase/migrations/20231007_create_users.sql
CREATE TABLE users ( id SERIAL PRIMARY KEY, name TEXT NOT NULL, email TEXT UNIQUE NOT NULL, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP );
-
マイグレーションの適用:
supabase db push
-
APIの利用:
- Supabaseは
https://your-project.supabase.co/rest/v1/users
のようなエンドポイントを自動生成。 - 例:ユーザーの取得
curl "https://your-project.supabase.co/rest/v1/users" \ -H "apikey: YOUR_API_KEY" \ -H "Authorization: Bearer YOUR_JWT_TOKEN"
- Supabaseは
-
クライアント側での利用:
- JavaScript SDKを使用してAPIと通信。
- 例:ユーザーの取得
const { data, error } = await supabase .from('users') .select('*') if (error) console.error('Error fetching users:', error) else console.log('Users:', data)
API構築の比較と最適な選択
項目 | Ruby on Rails | Supabase Auto-generated API |
---|---|---|
API生成 | 手動でコントローラーとルーティングを設定 | テーブルごとに自動生成されるREST API |
カスタマイズ性 | 高(コントローラー内でロジックを自由に実装) | 制限あり(必要に応じてEdge Functionsでカスタマイズ) |
認証と権限管理 | Gemやミドルウェアで実装 | Supabase AuthとRow Level Securityを利用 |
ドキュメンテーション | 手動でAPIドキュメントを作成(Swagger等) | 自動生成されるAPIドキュメント(OpenAPI対応) |
パフォーマンス | アプリケーションレベルで最適化可能 | Supabaseがインフラを最適化 |
最適な選択:
-
RailsのRESTful API:
- 高度なカスタマイズやビジネスロジックが必要な場合に適しています。
- 完全なコントロールが可能で、複雑な認証や権限管理を実装しやすい。
-
Supabase Auto-generated API:
- シンプルなCRUD操作が中心の場合に迅速にAPIを構築可能。
- 開発スピードを重視し、標準的な操作を迅速に実装したい場合に適しています。
推奨事項:
- プロジェクトの要件に応じて、どちらの方法を採用するかを決定します。複雑なロジックが必要な場合はRails、迅速な開発が求められる場合はSupabaseの自動生成APIを活用すると良いでしょう。
リアルタイム機能の実装
RailsのActionCableによるリアルタイム通信
Railsでは、ActionCableを使用してWebSocketベースのリアルタイム機能を実装できます。以下は基本的な設定手順です。
-
ActionCableの設定:
# app/channels/application_cable/connection.rb module ApplicationCable class Connection < ActionCable::Connection::Base identified_by :current_user def connect self.current_user = find_verified_user end private def find_verified_user if verified_user = env['warden'].user verified_user else reject_unauthorized_connection end end end end
-
チャネルの作成:
rails generate channel Chat
# app/channels/chat_channel.rb class ChatChannel < ApplicationCable::Channel def subscribed stream_from "chat_channel" end def unsubscribed # Cleanup end def send_message(data) ActionCable.server.broadcast("chat_channel", message: data['message']) end end
-
クライアント側の設定:
// app/javascript/channels/chat_channel.js import consumer from "./consumer" consumer.subscriptions.create("ChatChannel", { connected() { console.log("Connected to ChatChannel") }, disconnected() { console.log("Disconnected from ChatChannel") }, received(data) { console.log("Received:", data) // メッセージの表示など }, send_message(message) { this.perform('send_message', { message: message }) } })
-
メッセージ送信の実装:
- フォームからメッセージを送信し、チャネル経由でブロードキャスト。
Supabase Realtimeの活用
SupabaseはPostgreSQLのrealtime
機能を活用して、データベースの変更をリアルタイムでクライアントに通知します。以下は基本的な使用例です。
-
リアルタイムの有効化:
- Supabaseダッシュボードで
realtime
を有効化し、必要なテーブルに対してリアルタイムイベントを設定。
- Supabaseダッシュボードで
-
クライアント側でのサブスクリプション:
import { createClient } from '@supabase/supabase-js' const supabase = createClient('https://xyzcompany.supabase.co', 'public-anon-key') const subscription = supabase .from('users') .on('*', payload => { console.log('Change received!', payload) // データの更新処理 }) .subscribe() // サブスクリプションの解除 // supabase.removeSubscription(subscription)
-
イベントのハンドリング:
- データの挿入、更新、削除などのイベントに対してリアルタイムに反応。
リアルタイム機能の比較とパフォーマンス
項目 | Ruby on Rails (ActionCable) | Supabase Realtime |
---|---|---|
実装方法 | WebSocketベースでコントローラー内に実装 | PostgreSQLのrealtime 機能を利用 |
スケーラビリティ | サーバーリソースに依存 | Supabaseがスケーリングを管理 |
クライアントサポート | ActionCableのクライアントライブラリを使用 | JavaScript SDKなどで簡単に設定 |
パフォーマンス | 高トラフィック時にサーバー負荷が増加 | Supabaseのインフラに依存し、高スケーラブル |
開発の容易さ | 設定や実装に手間がかかる場合がある | 設定がシンプルで迅速に実装可能 |
パフォーマンスとスケーラビリティ:
-
Rails (ActionCable):
- 高トラフィック時にはサーバーのリソースがボトルネックとなる可能性。
- 複数のサーバー間でWebSocket接続を管理するには追加の設定が必要。
-
Supabase Realtime:
- Supabaseのインフラがスケーリングを自動で管理するため、高トラフィックにも対応可能。
- クライアント側の設定が簡単で、リアルタイム機能の実装が迅速。
推奨事項:
- Railsでの実装:高度なカスタマイズが必要な場合や、既存のRailsアプリケーションに統合する場合に適しています。
- Supabase Realtime:迅速な開発と高スケーラビリティが求められるプロジェクトに最適です。
デプロイとホスティング戦略
Railsアプリのデプロイ方法
Railsアプリのデプロイにはさまざまな方法があります。代表的な方法をいくつか紹介します。
-
Heroku:
- 簡単にデプロイでき、無料プランも利用可能。
-
手順:
git init heroku create git add . git commit -m "Initial commit" git push heroku main heroku run rails db:migrate
-
VPSや専用サーバー:
- より細かい設定やカスタマイズが可能。
- Capistranoなどのデプロイツールを使用。
-
手順概要:
- サーバーに必要なソフトウェア(Ruby、Bundler、データベース等)をインストール。
- Capistranoを設定し、デプロイスクリプトを作成。
- デプロイコマンドを実行。
-
コンテナ化:
- Dockerを使用してコンテナ化し、Kubernetesなどで管理。
-
手順概要:
- Dockerfileを作成。
- Dockerイメージをビルド。
- Kubernetesクラスターにデプロイ。
Supabaseのクラウドホスティング
Supabase自体がバックエンドサービスとしてクラウド上でホスティングされているため、基本的な設定はSupabase側で行います。
-
プロジェクトのデプロイ:
- Supabaseダッシュボードからプロジェクトを管理。
-
supabase start
でローカル開発環境を起動し、supabase db push
でデプロイを管理。
-
フロントエンドとの連携:
- フロントエンドアプリケーション(例えばNext.jsやReact)をVercelやNetlifyにデプロイし、SupabaseのAPIと連携。
-
例:
# Next.jsアプリをVercelにデプロイ vercel
-
CI/CDの設定:
- GitHub ActionsやGitLab CIを使用して、自動デプロイパイプラインを構築。
- 例:GitHub ActionsでSupabaseへのデプロイを自動化。
デプロイ戦略の比較と推奨事項
項目 | Ruby on Rails | Supabase Hosting |
---|---|---|
デプロイ方法 | Heroku、VPS、Dockerなど多様 | Supabaseがクラウドでホスティング |
スケーリング | 自己管理またはホスティングサービスに依存 | Supabaseが自動でスケーリングを管理 |
フロントエンド連携 | フロントエンドは別途デプロイが必要 | フロントエンドとSupabaseを別々に管理 |
維持管理 | 自己管理が必要(セキュリティ、アップデート) | Supabaseがインフラを管理 |
コスト | 使用するホスティングサービスに依存 | Supabaseの料金プランに依存 |
推奨事項:
-
Railsアプリのデプロイ:
- 小規模プロジェクト:Herokuが手軽でおすすめ。
- 大規模プロジェクト:VPSや専用サーバー、コンテナ化を検討。
-
Supabaseのホスティング:
- バックエンドサービスとしての利用:Supabaseが自動でインフラを管理するため、開発に集中できる。
- フロントエンドとの連携:VercelやNetlifyを使用してフロントエンドをデプロイし、Supabaseと連携。
ユースケース別のプラットフォーム選択
プロジェクトの要件や規模に応じて、Ruby on RailsとSupabase CLIのどちらを選択するかを検討することが重要です。以下に、具体的なユースケースを示します。
1. スタートアップやMVP開発
- 推奨プラットフォーム:Supabase CLI
-
理由:
- 迅速なバックエンド構築が可能。
- リアルタイム機能や認証が標準で提供されている。
- インフラ管理に時間を取られず、プロダクト開発に集中できる。
2. 既存のRailsアプリケーションの拡張
- 推奨プラットフォーム:Ruby on Rails
-
理由:
- 既存のコードベースやエコシステムを活用できる。
- 高度なカスタマイズやビジネスロジックの実装が容易。
- Active Recordによるデータベース管理が一貫性を保つ。
3. リアルタイム機能が重要なアプリケーション
- 推奨プラットフォーム:Supabase CLI
-
理由:
- Supabase Realtimeが高スケーラビリティでリアルタイムデータを提供。
- クライアント側の設定がシンプルで迅速。
4. 高いカスタマイズ性と制御が必要なプロジェクト
- 推奨プラットフォーム:Ruby on Rails
-
理由:
- フレームワーク全体を制御できるため、複雑な要件にも対応可能。
- 多様なGemやプラグインを活用して機能を拡張。
5. サーバーレスアーキテクチャの採用
- 推奨プラットフォーム:Supabase CLI
-
理由:
- Supabaseが提供するBaaS(Backend as a Service)として、サーバーレス環境に適している。
- インフラ管理が不要で、自動スケーリングが可能。
まとめ
本記事では、Ruby on RailsとSupabase CLIの詳細な比較を行いました。
環境構築、プロジェクトセットアップ、データベース管理、認証機能、API構築、リアルタイム機能、デプロイ方法など、各側面での違いと利点を解説しました。
Rails開発者がSupabase CLIを効率的に学び、プロジェクトに適したプラットフォームを選択するための指針を提供しています。
両プラットフォームの特性を理解し、プロジェクトの要件に応じて適切に選択することで、効率的な開発が可能となります。
次のステップとして、実際のプロジェクトでの適用や、より深い技術の探求を推奨します。
駄文でしたが読んでいただきありがとうございます。