directus について
Directusは、コンテンツサービスや社内ツール、データAPIを構築するチーム向けのオープンソースのヘッドレスCMS兼データプラットフォームです。既存のSQLスキーマを反映し、REST・GraphQL APIとビジュアル管理画面を生成します。
主な機能
- 01既存SQLデータベースのスキーマを反映
- 02REST・GraphQL APIの自動生成
- 03ビジュアル管理ダッシュボード
- 04ロール・ポリシーによるアクセス制御
- 05ファイルストレージと自動化フロー
活用シーン
- 01管理画面からウェブサイトのコンテンツを管理
- 02既存のデータベーステーブルをAPIとして公開
- 03運用データ用の社内ツールを構築
- 04イベント起点のフローで操作を自動化
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ terminalskills/ skills --skill directusインストール後、Claude Code で/directusを入力して読み込まれたか確認します。
同梱ファイル_scores.json
詳細
Directus
概要
Directus は、あらゆる SQL データベースを自動生成された REST および GraphQL API、ビジュアル管理ダッシュボード、ロールベースのアクセス制御、ファイルストレージ、自動化フローでラップする、オープンソースのヘッドレス CMS およびデータプラットフォームです。独自のスキーマを定義する Strapi とは異なり、Directus は既存のデータベースをそのまま反映します。管理 UI または SQL で列を追加すると、API が即座に更新されます。コンテンツ管理、社内ツール、データ API、バックエンド・アズ・ア・サービスに使用できます。
手順
ステップ 1:デプロイ
現在のリリースは Directus 12(12.4.x、2026 年 9 月。npm の directus には Node 22 以降が必要)です。本番環境では latest ではなく、バージョンタグを指定してください。ライセンスは MSCL-1.0(ソース公開型で、4 年後に GPL-3.0 に切り替わります)であり、現時点では MIT/GPL ではありません。v12 以降、一部の機能(SSO、カスタム権限ルール)にはライセンスキーが必要です。https://directus.com/license を参照してください。
# Docker (quickest start, SQLite)
docker run -d --name directus \
-p 8055:8055 \
-e SECRET="$DIRECTUS_SECRET" \
-e ADMIN_EMAIL="[email protected]" \
-e ADMIN_PASSWORD="$DIRECTUS_ADMIN_PASSWORD" \
-e DB_CLIENT="sqlite3" \
-e DB_FILENAME="/directus/database/data.db" \
-v directus_data:/directus/database \
-v directus_uploads:/directus/uploads \
directus/directus:12.4.1
# Production: Docker Compose with PostgreSQL (+ Redis cache), as in the official guide
# services: database (postgis/postgis:17-3.5), cache (redis:7), directus (directus/directus:12.4.1)
# directus env: SECRET, DB_CLIENT=pg, DB_HOST=database, DB_PORT=5432, DB_DATABASE, DB_USER, DB_PASSWORD,
# CACHE_ENABLED=true, CACHE_STORE=redis, REDIS=redis://cache:6379, ADMIN_EMAIL, ADMIN_PASSWORD, PUBLIC_URL
# volumes: ./uploads:/directus/uploads ./extensions:/directus/extensions
# Admin (Data Studio): http://localhost:8055
リバースプロキシの背後で使用する場合は、IP_TRUST_PROXY=true(v12 以降のデフォルトは false)と PUBLIC_URL を設定してください。監視については、/server/ping は公開されていますが、/server/health には v12 以降、認証が必要です。openssl rand -base64 32 で SECRET を生成してください。
ステップ 2:データモデリング
管理 UI または REST API を使用して、コレクション(テーブル)とフィールドを作成します。ユーザープロフィールの Token フィールドから静的トークンを取得するか、POST /auth/login でログインしてください。v11 以降、存在しないフィールドへのリクエストはエラーになります。
# Create a "posts" collection via API
curl -X POST http://localhost:8055/collections \
-H "Authorization: Bearer $DIRECTUS_ADMIN_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"collection": "posts",
"meta": { "icon": "article", "note": "Blog posts" },
"fields": [
{ "field": "id", "type": "uuid", "meta": { "special": ["uuid"] }, "schema": { "is_primary_key": true } },
{ "field": "title", "type": "string", "meta": { "required": true } },
{ "field": "slug", "type": "string", "meta": { "interface": "input" } },
{ "field": "content", "type": "text", "meta": { "interface": "input-rich-text-html" } },
{ "field": "status", "type": "string", "meta": { "interface": "select-dropdown", "options": { "choices": [{"text":"Draft","value":"draft"},{"text":"Published","value":"published"}] } } },
{ "field": "published_at", "type": "timestamp" }
]
}'
ステップ 3:自動生成 API
コレクションが作成されると、Directus は完全な CRUD API を自動生成します。
# REST — List all published posts
curl 'http://localhost:8055/items/posts?filter[status][_eq]=published&sort=-published_at&limit=10' \
-H "Authorization: Bearer $DIRECTUS_TOKEN"
# REST — Get single post with related author
curl 'http://localhost:8055/items/posts/4f1c2a9e-7b3d-4e58-9c61-2d0a8e5b7f10?fields=*,author.name,author.avatar' \
-H "Authorization: Bearer $DIRECTUS_TOKEN"
# REST — Create post
curl -X POST http://localhost:8055/items/posts \
-H "Authorization: Bearer $DIRECTUS_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"title": "Launch checklist", "content": "<p>Hello world</p>", "status": "draft"}'
# GraphQL — Same queries
curl -X POST http://localhost:8055/graphql \
-H "Authorization: Bearer $DIRECTUS_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"query": "{ posts(filter: {status: {_eq: \"published\"}}, sort: [\"-published_at\"], limit: 10) { id title content published_at author { name } } }"}'
ステップ 4:SDK の統合
// lib/directus.js — JavaScript SDK for frontend/backend integration
import { createDirectus, rest, readItems, createItem, authentication } from '@directus/sdk'
const client = createDirectus('http://localhost:8055')
.with(authentication())
.with(rest())
// await client.login({ email, password }) (object argument since SDK v11+; static token: client.setToken(token))
// Fetch published posts
const posts = await client.request(
readItems('posts', {
filter: { status: { _eq: 'published' } },
sort: ['-published_at'],
limit: 10,
fields: ['id', 'title', 'slug', 'content', 'published_at', { author: ['name', 'avatar'] }],
})
)
// Create a new post
const newPost = await client.request(
createItem('posts', {
title: 'Launch checklist',
content: '<p>Step one</p>',
status: 'draft',
})
)
ステップ 5:ロール、ポリシー、権限
Directus 11 以降、権限はロールではなくポリシーに属します。ポリシー(admin_access、app_access、enforce_tfa、ip_access を持つ)は、ロールまたはユーザーに直接割り当てられます。ロールはネストできます。権限は複数のポリシー間で加算されます。デフォルトでは、公開(未認証)ロールには何も許可されていません。
# 1. Role
curl -X POST http://localhost:8055/roles \
-H "Authorization: Bearer $DIRECTUS_ADMIN_TOKEN" -H 'Content-Type: application/json' \
-d '{"name": "Viewer"}'
# -> note data.id as ROLE_ID
# 2. Policy, attached to the role through the access table
curl -X POST http://localhost:8055/policies \
-H "Authorization: Bearer $DIRECTUS_ADMIN_TOKEN" -H 'Content-Type: application/json' \
-d '{"name": "Read published posts", "admin_access": false, "app_access": false,
"roles": ["3b6d0f2a-91c4-4a7e-8d52-6c1f0a9e4b27"]}'
# -> note data.id as POLICY_ID
# 3. Permission on the policy: read published posts only
curl -X POST http://localhost:8055/permissions \
-H "Authorization: Bearer $DIRECTUS_ADMIN_TOKEN" -H 'Content-Type: application/json' \
-d '{
"policy": "a8e41c70-5d2b-4f93-b0c6-17d9e2f3a845",
"collection": "posts",
"action": "read",
"permissions": { "status": { "_eq": "published" } },
"fields": ["id", "title", "content", "published_at"]
}'
最初の 2 つの呼び出しで返された ID に、2 つの UUID を置き換えてください。Data Studio では、Settings > Access Policies にあります。
ステップ 6:Flows(自動化)
Directus Flows は、イベント、Webhook、スケジュール、または手動ボタンでトリガーされるビジュアル自動化パイプラインです(Zapier のように標準搭載されています)。フローはトリガーと連鎖したオペレーション(メール送信、URL リクエスト、スクリプト実行、アイテム更新など)で構成されます。オペレーションは Settings > Flows で作成してください。以下の API 呼び出しで作成されるのはトリガーだけであり、オペレーションのないフローは何もしません。
curl -X POST http://localhost:8055/flows \
-H "Authorization: Bearer $DIRECTUS_ADMIN_TOKEN" -H 'Content-Type: application/json' \
-d '{
"name": "Notify on Publish",
"trigger": "event",
"options": { "type": "action", "scope": ["items.update"], "collections": ["posts"] },
"accountability": "all",
"status": "active"
}'
12.3 以降、空のクエリを指定した更新/削除オペレーションは、すべてのアイテムに作用しなくなりました。本当にすべてのアイテムを対象にする場合は、{"limit": -1} を明示的に渡してください。
例
例 1:マーケティングサイト向けのコンテンツ API を構築する
ユーザープロンプト:「マーケティングサイトのバックエンド CMS が必要です。ブログ記事、チームメンバー、導入事例、よくある質問を扱います。技術に詳しくない編集者が、ビジュアルダッシュボードからコンテンツを管理できるようにしたいです。」
エージェントは次の作業を行います。
- Docker と PostgreSQL を使用して Directus をデプロイします。
- posts、team_members、case_studies、faqs のコレクションを作成します。
- リレーショナルフィールド(posts → author、case studies → tags)を設定します。
- フロントエンドに読み取り専用アクセスを許可する公開ロールを設定します。
- Directus SDK を使用して Next.js/Astro フロントエンドを接続します。
例 2:運用データ向けの社内ツールを構築する
ユーザープロンプト:「運用チームは注文、仕入先、在庫をスプレッドシートで管理しています。すべてを管理できる管理パネル付きの、適切なバックエンドを構築してください。」
エージェントは次の作業を行います。
- 既存の PostgreSQL データベースを参照するように Directus をデプロイします。
- Directus が既存のテーブルを自動検出し、API と管理 UI を生成します。
- ロールを作成します:admin(フルアクセス)、manager(CRUD)、viewer(読み取り専用)。
- 通知用のフローを設定します(新しい注文 → Slack アラート)。
ガイドライン
- Directus はデータベースのスキーマを反映するものであり、所有するものではありません。Directus の管理画面または SQL から列を追加でき、どちらも同期されます。そのため、既存のデータベースでも安全に利用できます。
- コンテンツ主体のアプリには、バックエンド・アズ・ア・サービスとして Directus を使用してください。複雑なビジネスロジック(複数ステップのワークフロー、カスタム計算など)には、カスタムエンドポイントで拡張するか、別の API レイヤーを使用してください。
PUBLICロールは慎重に設定してください。未認証ユーザーがアクセスできる内容を定義します。公開ブログの場合は、公開済みの投稿のみ読み取りを許可してください。- ファイルはデフォルトでローカルストレージにアップロードされます。本番環境では、スケーラビリティを確保するために S3、Cloudflare R2、または Google Cloud Storage を設定してください。
- バージョン 11 からアップグレードする際に確認すべきバージョン 12 の破壊的変更:
IP_TRUST_PROXYのデフォルトが false に変更、/server/healthに認証が必要、?version=mainが?version=publishedに変更、クエリによる更新/削除で読み取り権限が適用(12.4)、インポートの上限が 50 MB、Docker イメージには pm2 がバンドルされ、実行時に npm/npx を使用しない。バージョン 10 から 11 へのアップグレードでは、権限がロールからポリシーに移動しました。全リスト:https://directus.com/docs/releases/breaking-changes - Directus は PostgreSQL、MySQL、MariaDB、MS SQL、SQLite、CockroachDB、OracleDB に対応しています(MySQL 5.7 はサポート対象外になりました)。本番環境には PostgreSQL を推奨します。