Directus:无头 CMS 平台

June 24, 2026 · View on GitHub

简介

Directus 是一个开源的无头 CMS,为任何 SQL 数据库提供实时 REST 和 GraphQL API 包装。它提供无代码管理应用来管理内容,同时让开发者完全控制数据层。本教程涵盖设置、数据建模、API 使用和自定义。

架构

组件技术用途
APINode.js (Express)REST 和 GraphQL 端点
Admin AppVue.js无代码管理 UI
数据库PostgreSQL/MySQL/SQLite/MS SQL数据存储
实时WebSocket实时更新
存储本地/S3/Azure/GCS文件管理

安装

Docker Compose

version: "3"
services:
  directus:
    image: directus/directus:latest
    ports:
      - "8055:8055"
    volumes:
      - directus_uploads:/directus/uploads
      - directus_extensions:/directus/extensions
    environment:
      KEY: "random-key-here"
      SECRET: "random-secret-here"
      DB_CLIENT: "pg"
      DB_HOST: "database"
      DB_PORT: "5432"
      DB_DATABASE: "directus"
      DB_USER: "directus"
      DB_PASSWORD: "secure_password"
      ADMIN_EMAIL: "admin@example.com"
      ADMIN_PASSWORD: "admin_password"
    depends_on:
      - database
  database:
    image: postgres:15
    environment:
      POSTGRES_DB: directus
      POSTGRES_USER: directus
      POSTGRES_PASSWORD: secure_password
    volumes:
      - db_data:/var/lib/postgresql/data
volumes:
  directus_uploads:
  directus_extensions:
  db_data:

NPX

npx directus bootstrap
npx directus start

核心概念

数据模型

概念描述SQL 等价物
Collection数据实体
Field集合的属性
Item单条记录
Relation集合间的连接外键

系统集合

集合用途
directus_users用户账户
directus_roles用户角色
directus_permissions访问控制规则
directus_files上传的文件
directus_folders文件组织
directus_presets保存的筛选/视图预设
directus_activity审计日志
directus_revisions项目版本历史
directus_settings系统配置

数据建模

创建集合

  1. 导航到 Settings > Data Model。
  2. 点击"Create Collection"。
  3. 输入集合名称(例如 articles)。
  4. 配置可选字段(status、sort 等)。
  5. 保存。

字段类型

类型描述示例
Input单行文本标题、名称
Textarea多行文本描述
WYSIWYG富文本编辑器正文内容
MarkdownMarkdown 编辑器技术内容
Boolean真/假开关已发布、精选
Integer整数计数、排序
Decimal小数价格、评分
DateTime日期和时间创建日期
Date仅日期生日
Time仅时间预约时间
Dropdown单选类别、状态
Tags多标签标签、关键词
Image图片文件引用特色图片
File文件引用附件
JSON任意 JSON 数据配置
UUID自动生成 UUID外部引用
Auto Increment顺序编号订单号

创建字段

  1. 导航到集合。
  2. 点击"Create Field"。
  3. 选择字段类型。
  4. 配置名称、界面和验证。
  5. 设置关系(如适用)。
  6. 保存。

关系

类型描述示例
Many-to-One多个项目引用一个文章有一个作者
One-to-Many一个项目有多个作者有多篇文章
Many-to-Many多个项目链接多个文章有多个标签
One-to-One一个项目链接一个用户有一个个人资料

创建关系

  1. 添加类型为"Related to Collection"的新字段。
  2. 选择目标集合。
  3. 选择关系类型。
  4. 配置外键字段。
  5. 保存。

API 访问

REST API

端点方法描述
/items/{collection}GET列出项目
/items/{collection}/{id}GET获取单个项目
/items/{collection}POST创建项目
/items/{collection}/{id}PATCH更新项目
/items/{collection}/{id}DELETE删除项目

认证

# 登录
curl -X POST https://directus.example.com/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email": "user@example.com", "password": "password"}'

# 使用 token
curl -H "Authorization: Bearer ACCESS_TOKEN" \
  https://directus.example.com/items/articles

筛选

# 按状态筛选
GET /items/articles?filter[status][_eq]=published

# 按日期范围筛选
GET /items/articles?filter[date_published][_gte]=2024-01-01

# 多个条件
GET /items/articles?filter[status][_eq]=published&filter[author][_eq]=5

筛选操作符

操作符描述示例
_eq等于?filter[status][_eq]=published
_neq不等于?filter[status][_neq]=draft
_gt大于?filter[price][_gt]=100
_gte大于等于?filter[price][_gte]=50
_lt小于?filter[price][_lt]=200
_lte小于等于?filter[price][_lte]=150
_in在列表中?filter[status][_in]=published,featured
_contains包含文本?filter[title][_contains]=tutorial
_between在值之间?filter[price][_between]=50,100
_null为空?filter[deleted_at][_null]=true

排序和分页

# 按日期降序排序
GET /items/articles?sort=-date_created

# 分页
GET /items/articles?page=1&limit=20

# 字段选择
GET /items/articles?fields=id,title,author.name

GraphQL

query {
  articles(
    filter: { status: { _eq: "published" } }
    sort: ["-date_created"]
    limit: 10
  ) {
    id
    title
    body
    author {
      name
      avatar {
        id
      }
    }
    tags {
      tags_id {
        name
      }
    }
  }
}

权限

基于角色的访问控制

级别描述
System Access可以访问管理应用
Admin完全访问一切
Public未认证的 API 访问
Custom Roles细粒度的每集合权限

权限配置

权限选项
CreateNone、Full、Custom
ReadNone、Full、Custom
UpdateNone、Full、Custom
DeleteNone、Full、Custom

自定义权限

使用自定义权限限制对特定项目的访问。

{
  "id": {
    "_eq": "$CURRENT_USER"
  }
}

此筛选器允许用户仅读取自己的项目。

Flows(自动化)

Flow 组件

组件描述
Trigger启动 flow 的事件
Operation要执行的操作
Conditionif/then 逻辑

触发器类型

类型描述
Event Hook在 CRUD 操作时触发
Schedule基于 cron 的调度
Webhook外部 HTTP 触发
Manual用户发起

操作类型

类型描述
Create Item添加新记录
Read Item获取记录
Update Item修改记录
Delete Item删除记录
Send Email发送通知
Webhook Request调用外部 API
Run Script执行自定义代码
Transform Data映射/转换数据

示例 Flow:自动发布

触发器:文章创建(status = "review")
  |
  v
条件:作者是否受信任?
  |
  是 -> 更新项目:设置 status = "published"
  否 -> 发送邮件:通知编辑审查

文件和媒体

文件上传

方法描述
Admin UI在 Files 模块中拖拽
APIPOST 到 /files 使用 multipart 表单
Relation附加到项目字段

文件配置

设置描述
Storage adapter本地、S3、Azure、GCS
Max file size上传限制
Allowed typesMIME 类型限制
Transform上传时自动调整大小

图片转换

# 调整图片大小
GET /assets/{id}?width=300&height=200&fit=cover

# 格式转换
GET /assets/{id}?format=webp

# 质量调整
GET /assets/{id}?quality=80

扩展

扩展类型

类型描述语言
Interface自定义字段 UIVue.js
Display自定义字段显示Vue.js
Layout自定义集合视图Vue.js
Module自定义管理部分Vue.js
HookAPI 事件处理器JavaScript
Endpoint自定义 API 路由JavaScript
Theme管理应用主题CSS

创建 Hook 扩展

// extensions/hooks/auto-slug/index.js
module.exports = function registerHook({ action }) {
  action('items.create', async ({ payload, collection }) => {
    if (collection === 'articles' && payload.title && !payload.slug) {
      payload.slug = payload.title
        .toLowerCase()
        .replace(/[^a-z0-9]+/g, '-')
        .replace(/(^-|-$)/g, '');
    }
  });
};

创建 Endpoint 扩展

// extensions/endpoints/custom-api/index.js
module.exports = function registerEndpoint({ router }) {
  router.get('/stats', async (req, res) => {
    const articles = await req.database('articles').count('* as total');
    const users = await req.database('directus_users').count('* as total');
    res.json({
      articles: articles[0].total,
      users: users[0].total
    });
  });
};

Webhooks 和实时

Webhooks

在 Settings > Webhooks 中配置 webhooks。

设置描述
URL要通知的端点
MethodHTTP 方法
Headers自定义头
Trigger监听哪些事件
Collection哪个集合

实时订阅

import { createDirectus, realtime } from '@directus/sdk';

const client = createDirectus('https://directus.example.com')
  .with(realtime());

// 订阅变更
const subscription = client.subscribe('articles', {
  event: 'create',
  query: { fields: ['id', 'title', 'status'] }
});

for await (const item of subscription) {
  console.log('New article:', item.data[0]);
}

快照和迁移

架构快照

# 导出架构
npx directus schema snapshot ./snapshot.yaml

# 应用架构
npx directus schema apply ./snapshot.yaml

备份

备份组件

组件方法
数据库pg_dump、mysqldump
上传文件rsync 或 rclone
扩展文件复制
.env文件复制

总结

Directus 提供了一个灵活的无头 CMS,为任何 SQL 数据库提供 REST 和 GraphQL API 包装。通过集合和字段建模数据,配置细粒度权限,使用 Flows 构建自动化工作流程。管理应用提供无代码界面用于内容管理,而开发者获得完全的 API 访问来构建应用程序。