はじめに
バックエンド、自作してますか。
認証、API、管理画面、ファイルストレージ。アプリを作るたびに同じものを実装するのは正直しんどい。かといってFirebaseに全部任せると、ベンダーロックインが気になる。既存のデータベースがあるプロジェクトだと、そもそも選択肢に入らない。
そんな時に見つけたのがDirectus。GitHub星33,000超えのオープンソースプロジェクトで、既存のSQLデータベースにREST/GraphQL APIと管理画面を「被せる」ことができます。Headless CMSとBaaS(Backend as a Service)の良いとこ取りという印象。今回はこのDirectusについて紹介していきます。
Directusとは
Directusは、SQLデータベースを管理するためのリアルタイムAPIとダッシュボードを提供するプラットフォームです。PostgreSQL、MySQL、SQLite、MariaDB、OracleDB、CockroachDB、MS-SQLと、主要なデータベースに対応しています。
個人的に気に入っているのは「データベースファースト」という設計思想。既存のDBスキーマをそのまま活かせるので、途中からの導入もスムーズ。テーブルを直接触ってもDirectusと同期されます。
ライセンスはBSL 1.1。年間売上500万ドル未満の組織なら実質無料で使えます。
特徴・メリット
Directusの強みをいくつか挙げてみます。
REST & GraphQL APIの自動生成
データベースのテーブルに対して、RESTとGraphQL両方のAPIが自動生成されます。ドキュメントも自動。エンドポイントを手作りする必要がありません。
GET /items/articles # 記事一覧
GET /items/articles/1 # 記事詳細
POST /items/articles # 記事作成
PATCH /items/articles/1 # 記事更新
DELETE /items/articles/1 # 記事削除
フィルタ、ソート、ページネーション、リレーションの展開まで標準装備。フロントエンド開発者からすると、APIの仕様を待たずに開発を進められるのがありがたい。
Vue.js製の管理画面(Data Studio)
ノーコードで使える管理画面が付属しています。直感的にデータモデルを設計でき、エンジニアじゃないメンバーでもコンテンツ編集が可能。
- ドラッグ&ドロップでフィールド追加
- リレーションの視覚的な設定
- 多言語コンテンツ対応
- ファイル管理(画像のリサイズ・変換も自動)
ホワイトラベル対応なので、クライアント向けにロゴや配色をカスタマイズすることもできます。
柔軟な認証・権限管理
- ローカル認証(メール/パスワード)
- SSO対応(OAuth 2.0、OpenID Connect)
- LDAP連携
- 2要素認証(2FA)
ロールベースのアクセス制御(RBAC)で、テーブル単位、フィールド単位、レコード単位の細かい権限設定が可能。「このロールはこのテーブルの公開済みレコードだけ参照可能」みたいな設定も簡単です。
Flowsによる自動化
ノーコードのワークフロービルダーが内蔵されています。
- 特定の条件でメール送信
- データ変更時にWebhook発火
- 定期的なバッチ処理
- 外部API連携
n8nやZapierを別途立てなくても、ある程度の自動化はDirectus内で完結します。
リアルタイム更新(WebSocket)
データの変更をリアルタイムでクライアントに配信できます。チャットやダッシュボードなど、リアルタイム性が求められるアプリにも対応可能。
インストール方法
Dockerで一発起動できます。
Docker(お試し用)
とりあえず動かしてみたいなら、これだけ。
docker run -p 8055:8055 directus/directus
http://localhost:8055にアクセスして、管理者アカウントを作成すればすぐ使えます。SQLiteがデフォルトで使われるので、永続化には注意。
Docker Compose(本番用)
本番で使うなら、PostgreSQLと組み合わせた構成が推奨です。
# docker-compose.yml
version: '3'
services:
directus:
image: directus/directus:latest
ports:
- "8055:8055"
environment:
SECRET: "your-secret-key-here"
DB_CLIENT: "pg"
DB_HOST: "db"
DB_PORT: "5432"
DB_DATABASE: "directus"
DB_USER: "directus"
DB_PASSWORD: "directus"
ADMIN_EMAIL: "admin@example.com"
ADMIN_PASSWORD: "password"
volumes:
- directus_uploads:/directus/uploads
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_DB: directus
POSTGRES_USER: directus
POSTGRES_PASSWORD: directus
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
directus_uploads:
postgres_data:
docker compose up -d
SECRETは本番では必ずランダムな文字列に変更してください。
Directus Cloud
セルフホストが面倒なら、公式のDirectus Cloudもあります。90秒でプロジェクトが立ち上がるので、検証やプロトタイプには便利。
基本的な使い方
データモデルの設計
- Settings → Data Model からコレクション(テーブル)を作成
- フィールド(カラム)を追加
- 型を選択(String、Integer、DateTime、Image、など)
- リレーションを設定(M2O、O2M、M2M)
UIで操作すると、裏でマイグレーションが自動実行されます。スキーマの変更履歴も管理されるので、チーム開発でも安心。
APIの利用
JavaScript/TypeScriptなら、公式SDKが便利。
npm install @directus/sdk
import { createDirectus, rest, readItems, authentication } from '@directus/sdk';
// クライアント作成
const client = createDirectus('http://localhost:8055')
.with(authentication())
.with(rest());
// ログイン
await client.login('admin@example.com', 'password');
// 記事一覧取得
const articles = await client.request(
readItems('articles', {
filter: {
status: { _eq: 'published' }
},
sort: ['-date_published'],
limit: 10
})
);
GraphQLを使いたければ、/graphqlエンドポイントにクエリを投げるだけ。
query {
articles(filter: { status: { _eq: "published" } }) {
id
title
content
author {
name
}
}
}
ファイルのアップロードと変換
import { uploadFiles } from '@directus/sdk';
const formData = new FormData();
formData.append('file', file);
const result = await client.request(uploadFiles(formData));
画像の場合、URLパラメータでリサイズや形式変換が可能。
/assets/{file-id}?width=800&height=600&format=webp&quality=80
サムネイル生成をバックエンドで実装する必要がなくなります。
実践的なユースケース
ケース1: Headless CMS
ブログやコーポレートサイトのバックエンドとして。Next.jsやNuxtからAPIでコンテンツを取得し、SSGで静的サイトを生成。編集者は管理画面からMarkdownを書くだけ。
ケース2: モバイルアプリのバックエンド
iOSやAndroidアプリのBaaSとして。認証、データ保存、ファイルアップロードがすべてDirectusで完結。プッシュ通知はFlowsからWebhook経由で。
ケース3: 既存システムのAPI化
レガシーなMySQLデータベースがある場合、Directusを接続すれば即座にREST/GraphQL APIが生える。古いシステムをリプレースせずに、モダンなフロントエンドから利用可能に。
ケース4: 社内ツールのバックエンド
在庫管理、顧客管理、プロジェクト管理。管理画面が最初から付いているので、UIを自作する手間が省けます。権限管理も細かく設定できるので、部署ごとにアクセス制御も可能。
ケース5: マルチテナントSaaS
プロジェクトごとにスキーマを分離できるので、B2B SaaSのバックエンドとしても使えます。各テナントの管理画面を個別に提供することも可能。
まとめ
Directusは、バックエンド開発の「面倒くさい部分」をごっそり肩代わりしてくれるツールだと思います。
- 既存のSQLデータベースにAPIと管理画面を追加
- REST/GraphQL両対応で、フロントを選ばない
- 認証、権限管理、ファイル管理が標準装備
- ノーコードで自動化も組める
- Dockerで5分でセットアップ完了
正直なところ、小〜中規模のプロジェクトなら、バックエンドをゼロから書く必要性はかなり減ったなと感じます。Firebaseは便利だけどベンダーロックインが気になる、Supabaseも良いけどPostgreSQL限定、という人にはDirectusが合うかもしれません。
特に「既存のデータベースがある」「セルフホストしたい」「管理画面も欲しい」という条件が揃っているなら、一択と言っていいレベル。30代になってインフラに時間を使いたくないと思うようになった人には、かなり刺さるツールだと思います。