Directus Docker Compose 部署指南
在 Ubuntu 22.04 服务器上用 Docker Compose 从零部署 Directus 12.5.0:Directus + PostgreSQL 17 + Redis 7 三服务编排、端口与网段复核、首次初始化日志解读、管理后台与 REST API 冒烟验证、数据持久化与等价 docker run 方式、CLI 管理与七条排障实录,全部命令与回显逐字实测(2026-10-19)。
Directus Docker Compose 部署指南
目标:在一台 Ubuntu 22.04 服务器上,用 Docker Compose 从零部署 Directus 12.5.0(PostgreSQL 17 作数据库、Redis 7 作缓存),覆盖端口/网段复核、编排文件编写、首次初始化、管理后台与 REST API 冒烟验证、数据持久化、等价 docker run 方式与日常运维排障,全部命令与回显逐字来自 2026-10-19 实测。产品定位与选型背景见 《Directus 12.5 介绍与选型指南》;环境变量的逐组实测说明见《Directus 12.5 配置参数详解》;API 的完整用法见《Directus 12.5 API 使用详解》。
一、环境信息
本次部署在下列真实服务器环境完成,后文所有命令与回显均出自该环境,可直接对照复现。
| 项目 | 值 |
|---|---|
| 服务器 IP | 192.168.146.128(网卡 ens33) |
| 操作系统 | Ubuntu 22.04.4 LTS(内核 6.8.0-138-generic) |
| Docker | 29.8.1(Compose v5.5.1) |
| Directus | directus/directus:12.5.0(镜像 1.2GB,digest sha256:7de5d689…d1331) |
| 数据库 | postgres:17-alpine(镜像 424MB) |
| 缓存 | redis:7-alpine(镜像 57.8MB) |
| 对外端口 | 8103 → Directus 8055 |
| 自定义网络 | directus-net,10.89.33.0/24 |
| 部署目录 | /opt/data/quzuo/directus-12-5 |
| 初始管理员 | admin@example.com / q1w2e3r4(演示口令,生产必须更换) |
| 请求工具 | curl 7.81.0 |
💡 技术拓展:Directus 支持 7 种 SQL 数据库(PostgreSQL、MySQL、MariaDB、SQLite、MS SQL Server、CockroachDB、OracleDB,均限 LTS 版本)。单机自托管常见三种选型——
数据库 特点 适用场景 PostgreSQL 官方示例与文档首选,JSON/几何/全文能力全 新建项目、功能完整度优先 MySQL / MariaDB 运维存量最大,团队最熟 已有 MySQL 运维体系 SQLite 单文件零依赖 本地试用、极小规模单机 本文实际采用 PostgreSQL 17:官方自托管文档与快速开始示例均以 PostgreSQL 演示,且 Directus 的几何字段等能力依赖 PostGIS 扩展(PostgreSQL 生态独有),功能覆盖最完整。
二、镜像选型说明
三个服务均采用官方镜像,版本在编排文件中写死具体 tag(不用 latest),保证可复现、可回滚:
| 镜像 | tag | 作用 | 选型说明 |
|---|---|---|---|
| directus/directus | 12.5.0 | Directus 应用本体(API + Data Studio 管理台) | 官方唯一维护镜像,与 GitHub Release v12.5.0 同源 |
| postgres | 17-alpine | SQL 数据库,存放业务表 + directus_ 系统表 | 17 为当前主流稳定大版本,alpine 变体体积小(424MB) |
| redis | 7-alpine | 缓存与自动失效通知 | 单实例即可显著降低重复查询压力;多实例水平扩展时为必需组件 |
镜像与官方发布物核对:docker image inspect 可见三个镜像的 RepoDigest 均来自 docker.io 官方命名空间(directus/directus、library/postgres、library/redis),未使用第三方改版镜像。
三、前置条件
3.1 端口复核
预分配宿主端口 8103(映射到 Directus 监听的 8055)。启动前先复核端口空闲:
ss -ltn | grep ':8103' || echo "8103 空闲"
实测回显:
8103 空闲
⚠️ 注意:ss 只能看到宿主进程监听,看不到既有 Docker 端口映射的占用,若机器上跑着其他容器栈,还要用 docker ps --format '{{.Names}}\t{{.Ports}}' 全量核对一遍,避免「ss 显示空闲但 daemon 报 port already allocated」。
3.2 网段复核与自定义网络
为避免 Docker 自动分配子网撞上宿主物理网段(192.168.0.0/16)或已占用网段,先列出当前全部网络的子网占用,再选空闲槽位:
docker network ls --format '{{.Name}}'
实测回显:
appwrite
bridge
browser
gateway
host
none
runtimes
for n in $(docker network ls --format '{{.Name}}'); do s=$(docker network inspect $n --format '{{range .IPAM.Config}}{{.Subnet}} {{end}}'); echo "$n: $s"; done
实测回显:
appwrite: 10.89.31.0/24
bridge: 10.0.0.0/24
browser: 10.89.34.0/24
gateway: 10.89.30.0/24
host:
none:
runtimes: 10.89.32.0/24
10.89.30~34 均已占用,取空闲槽位 10.89.33.0/24 写入编排文件(见 4.1)。本方案把网络定义放进 compose 文件由 Compose 创建;若习惯手工建网,等价命令为:
docker network create directus-net --subnet 10.89.33.0/24
创建网络(或启动栈)后,必须验证宿主出口路由没有被新网桥抢走:
ip route get 192.168.1.62
实测回显:
192.168.1.62 via 192.168.146.2 dev ens33 src 192.168.146.128 uid 0
回显仍走 dev ens33,宿主外网访问正常,网络规划安全。
3.3 获取镜像
Docker 守护进程已配置可直连拉取官方镜像,在部署目录执行一次拉取:
cd /opt/data/quzuo/directus-12-5 && docker compose pull
实测回显(镜像已在本机时的输出;首次部署会先逐层 Downloading/Extracting,最终同样输出各镜像的 Digest 与 Status 行):
[+] Running 1/1
✔ directus Pulled
Digest: sha256:7de5d6898b955dab1672619aed590035dcade4f8d7396d913e55543e114d1331
Status: Image is up to date for directus/directus:12.5.0
💡 说明:三个镜像都已在本地时,
compose pull输出Image is up to date并显示与 Docker Hub 一致的 digest,这正好可用于校验镜像未被篡改。
四、部署步骤
4.1 编写 docker-compose.yml
在部署目录创建 docker-compose.yml,三个服务(应用、数据库、缓存)共用一个自定义网络:
mkdir -p /opt/data/quzuo/directus-12-5/{database,uploads,extensions,redisdata}
cd /opt/data/quzuo/directus-12-5
写入以下内容(文件全量):
services:
directus:
image: directus/directus:12.5.0
container_name: directus-12-5-app
restart: unless-stopped
ports:
- "8103:8055"
environment:
KEY: "255d861b-5ea1-5996-9aa3-922530ec40b1"
SECRET: "6116487b-cda1-52c2-b5b5-c8022c45e263"
ADMIN_EMAIL: "admin@example.com"
ADMIN_PASSWORD: "q1w2e3r4"
DB_CLIENT: "pg"
DB_HOST: "db"
DB_PORT: "5432"
DB_DATABASE: "directus"
DB_USER: "directus"
DB_PASSWORD: "q1w2e3r4"
CACHE_ENABLED: "true"
CACHE_STORE: "redis"
CACHE_AUTO_PURGE: "true"
REDIS_HOST: "cache"
REDIS_PORT: "6379"
PUBLIC_URL: "http://192.168.146.128:8103"
CORS_ENABLED: "true"
CORS_ORIGIN: "true"
WEBSOCKETS_ENABLED: "true"
volumes:
- ./uploads:/directus/uploads
- ./extensions:/directus/extensions
depends_on:
db:
condition: service_healthy
cache:
condition: service_started
networks:
- directus-net
db:
image: postgres:17-alpine
container_name: directus-12-5-db
restart: unless-stopped
environment:
POSTGRES_USER: "directus"
POSTGRES_PASSWORD: "q1w2e3r4"
POSTGRES_DB: "directus"
volumes:
- ./database:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U directus -d directus"]
interval: 5s
timeout: 5s
retries: 10
networks:
- directus-net
cache:
image: redis:7-alpine
container_name: directus-12-5-cache
restart: unless-stopped
volumes:
- ./redisdata:/data
networks:
- directus-net
networks:
directus-net:
driver: bridge
ipam:
config:
- subnet: 10.89.33.0/24
配置逐项说明:
ports: "8103:8055":宿主 8103 映射到 Directus 默认监听端口 8055,浏览器与 API 一律走 8103;KEY/SECRET:项目唯一标识与令牌签名密钥,此处取官方文档示例值便于对照,生产环境必须各自换成随机值(SECRET 一旦更换,已签发的登录态全部失效);ADMIN_EMAIL/ADMIN_PASSWORD:首次初始化自动创建的管理员账号(Directus 不做浏览器安装向导,初始账号只认这两个变量);DB_*:数据库连接六件套;DB_HOST: db用服务名做主机名,走 Docker 内置 DNS 解析,不要写死 IP;CACHE_*/REDIS_*:启用 Redis 作为对象缓存并在数据变更时自动失效;PUBLIC_URL:对外完整 URL,参与邮件链接、文件 URL 等地址生成,不配会在启动日志出现告警;CORS_*:允许浏览器跨域调用 API;WEBSOCKETS_ENABLED:开启 Realtime 的 WebSocket 订阅端点;depends_on+healthcheck:db 就绪(pg_isready通过)后才启动 directus,避免应用先起连不上库反复重试;networks显式子网:编排文件级声明 10.89.33.0/24,不依赖 Docker 自动分配。
4.2 启动并查看状态
docker compose up -d
实测回显:
Container directus-12-5-cache Starting
Container directus-12-5-db Starting
Container directus-12-5-cache Started
Container directus-12-5-db Started
Container directus-12-5-db Waiting
Container directus-12-5-db Healthy
Container directus-12-5-app Starting
Container directus-12-5-app Started
回显中 db Healthy 在 app Starting 之前,说明 healthcheck 门禁生效。确认三服务状态:
docker compose ps
实测回显:
NAME IMAGE STATUS PORTS
directus-12-5-app directus/directus:12.5.0 Up 40 seconds 0.0.0.0:8103->8055/tcp, [::]:8103->8055/tcp
directus-12-5-cache redis:7-alpine Up 46 seconds 6379/tcp
directus-12-5-db postgres:17-alpine Up 45 seconds (healthy) 5432/tcp
关键点:db 与 cache 未映射宿主端口(PORTS 列只有内部端口),数据库与缓存不对外暴露,这是安全默认;只有 Directus 的 8055 经 8103 对外。
4.3 首次初始化日志解读
首次启动时 Directus 自动完成建库与初始化(无需任何浏览器向导),查看完整启动日志:
docker logs directus-12-5-app
实测回显(节选,迁移条目数十行,仅列首尾;grep -v 过滤后即为完整骨架):
[00:37:43.635] INFO: Initializing bootstrap...
[00:37:43.639] INFO: Installing Directus system tables...
[00:37:43.751] INFO: Running migrations...
[00:37:43.751] INFO: Applying Remove Collection Foreign Keys...
...(中间为逐条迁移,Applying Add Flows、Applying Add Shares 等,共数十条)...
[00:37:44.470] INFO: Setting up first admin role...
[00:37:44.498] INFO: Adding first admin user...
[00:37:44.598] INFO: Done
2026-10-19T00:37:44: PM2 log: App [directus:0] online
[00:37:50.253] WARN: PostGIS isn't installed. Geometry type support will be limited.
[00:37:50.320] INFO: GraphQL Subscriptions started at 0.0.0.0:8055/graphql
[00:37:50.321] INFO: WebSocket Server started at 0.0.0.0:8055/websocket
[00:37:50.321] INFO: Logs WebSocket Server started at ws://0.0.0.0:8055/websocket/logs
[00:37:50.334] INFO: Server started at http://0.0.0.0:8055
日志骨架含义:
Installing Directus system tables...+Running migrations...:首次启动在 PostgreSQL 里创建directus_前缀的系统表并跑全部迁移;Setting up first admin role... / Adding first admin user...:由ADMIN_EMAIL/ADMIN_PASSWORD自动创建管理员角色与账号,即本文的 admin@example.com;Server started at http://0.0.0.0:8055:应用就绪。
首次初始化实测总耗时约 7 秒(自 bootstrap 到 Server started)。
4.4 管理后台访问验证
先在服务器本机验证 HTTP 行为,再从局域网浏览器访问 http://192.168.146.128:8103:
curl -s -o /dev/null -w '%{http_code} %{redirect_url}\n' http://127.0.0.1:8103/
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8103/admin/
实测回显:
302 http://127.0.0.1:8103/admin
200
根路径 302 跳转到 /admin,管理台页面返回 200。浏览器打开 http://192.168.146.128:8103 会跳到登录页,用 admin@example.com / q1w2e3r4 即可登录 Data Studio。
4.5 REST API 冒烟验证
用 API 登录换 token,验证服务可用性(完整 API 用法见《Directus 12.5 API 使用详解》):
curl -s -X POST http://127.0.0.1:8103/auth/login \
-H 'Content-Type: application/json' \
-d '{"email":"admin@example.com","password":"q1w2e3r4"}' \
-w "\nHTTP %{http_code}\n"
实测回显(access_token 为 15 分钟有效期的登录态,此实验值发布时已过期,照抄如下):
{"data":{"expires":900000,"refresh_token":"6qo_4zwepIzra0C8FY-AVnz1iK_6E5wR5eKNkG2zjcbX-wORHnVkepTnR7mqMPgD","access_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjcxMDNiNjdiLWIzNzYtNGZmYi1hYzBkLTE0YzVjY2ZkMTdkYiIsInJvbGUiOiIzMzdkZmNkYy1jNTMyLTQ5NGItOTk2Yy04NjY5ZmJjMGUzNjgiLCJhcHBfYWNjZXNzIjp0cnVlLCJhZG1pbl9hY2Nlc3MiOnRydWUsImlhdCI6MTc5MjM3MDM2NiwiZXhwIjoxNzkyMzcxMjY2LCJpc3MiOiJkaXJlY3R1cyJ9.lSxE0OK3dPbOV9SIgHDaXwRgqDv2E8C-veFV6uSneQg"}}
HTTP 200
拿到 token 后查一个受保护端点(当前用户信息),确认鉴权链路通:
TOKEN=<登录回显中的 access_token>
curl -s http://127.0.0.1:8103/users/me -H "Authorization: Bearer $TOKEN" | python3 -m json.tool
实测回显(节选):
{
"data": {
"id": "7103b67b-b376-4ffb-ac0d-14c5ccfd17db",
"first_name": "Admin",
"last_name": "User",
"email": "admin@example.com",
"status": "active",
"role": "337dfcdc-c532-494b-996c-8669fbc0e368",
"provider": "default"
}
}
再测一个免鉴权探活端点收尾:
curl -s http://127.0.0.1:8103/server/ping -w " HTTP %{http_code}\n"
实测回显:
pong HTTP 200
/server/ping 返回 pong、登录 200、/users/me 正常返回管理员信息,部署链路(HTTP → 应用 → 数据库 → 缓存)全部打通。
五、数据持久化说明
全部持久化数据都落在部署目录的 4 个子目录(bind mount 到各服务内),删容器不丢数据:
| 宿主目录 | 服务内路径 | 内容 |
|---|---|---|
| ./database | /var/lib/postgresql/data | PostgreSQL 数据目录(业务表 + directus_ 系统表) |
| ./uploads | /directus/uploads | 本地文件存储(上传的图片/附件) |
| ./extensions | /directus/extensions | 自定义扩展包 |
| ./redisdata | /data | Redis 持久化文件 |
持久化实测:docker compose down 会删除容器与网络(不删挂载目录),重新 up 后数据应完整保留:
docker compose down
实测回显(节选):
Container directus-12-5-db Removed
Container directus-12-5-cache Removed
Network directus-12-5_directus-net Removed
docker compose up -d && sleep 20
curl -s -X POST http://127.0.0.1:8103/auth/login \
-H 'Content-Type: application/json' \
-d '{"email":"admin@example.com","password":"q1w2e3r4"}' \
-o /dev/null -w '重新登录 HTTP %{http_code}\n'
实测回显:
重新登录 HTTP 200
二次启动日志与首次不同,Database already initialized, skipping install 表明库已初始化、不再重建,admin 账号重新登录成功即数据完整:
[00:40:11.748] INFO: Extensions loaded
[00:40:11.752] INFO: Initializing bootstrap...
[00:40:11.754] INFO: Database already initialized, skipping install
[00:40:11.761] INFO: Done
[00:40:16.426] INFO: Server started at http://0.0.0.0:8055
数据目录落盘情况:
ls /opt/data/quzuo/directus-12-5/database | head -8
du -sh /opt/data/quzuo/directus-12-5/database
实测回显:
base
global
pg_commit_ts
pg_dynshmem
pg_hba.conf
pg_ident.conf
pg_logical
pg_multixact
48M /opt/data/quzuo/directus-12-5/database
⚠️ 注意:备份请针对
./database(可用pg_dump逻辑备份)与./uploads(文件)分别做,Redis 缓存目录无需备份。
六、环境变量表
Directus 全部行为由环境变量驱动(无主配置文件),本方案用到的变量如下:
| 变量 | 本方案取值 | 作用与默认值 |
|---|---|---|
| KEY | 255d861b-5ea1-5996-9aa3-922530ec40b1 | 项目唯一标识;参与缓存键隔离,多项目共用库时必须不同 |
| SECRET | 6116487b-cda1-52c2-b5b5-c8022c45e263 | 会话/令牌签名密钥;更换后所有登录态立即失效 |
| ADMIN_EMAIL | admin@example.com | 首次初始化创建的管理员邮箱,仅首次生效 |
| ADMIN_PASSWORD | q1w2e3r4 | 管理员初始密码(最少 8 位),仅首次生效 |
| DB_CLIENT | pg | 数据库驱动:pg / mysql / sqlite3 / mssql / oracledb / cockroachdb |
| DB_HOST | db | 数据库主机名(compose 服务名) |
| DB_PORT | 5432 | 数据库端口 |
| DB_DATABASE | directus | 库名 |
| DB_USER / DB_PASSWORD | directus / q1w2e3r4 | 数据库账号 |
| CACHE_ENABLED | true | 是否启用对象缓存(默认 false) |
| CACHE_STORE | redis | 缓存后端:memory(默认)/ redis / memcache |
| CACHE_AUTO_PURGE | true | 数据变更时自动失效相关缓存 |
| REDIS_HOST / REDIS_PORT | cache / 6379 | Redis 连接信息 |
| PUBLIC_URL | http://192.168.146.128:8103 | 对外完整 URL,用于生成文件/邮件链接 |
| CORS_ENABLED | true | 跨域支持开关(默认 false) |
| CORS_ORIGIN | true | 允许的来源;true 表示反射请求 Origin |
| WEBSOCKETS_ENABLED | true | Realtime WebSocket 端点开关 |
其余高频可配项(文件存储驱动 STORAGE_LOCATIONS/S3、限流 RATE_LIMITER、邮件 EMAIL_* 等)与逐组实测效果,见《Directus 12.5 配置参数详解》。
七、配置参数说明
三类配置关注点与检查方式:
1. 密钥类(KEY/SECRET):官方文档明确要求生产环境必须替换为随机值;SECRET 泄露等于任何人可伪造登录态。更换 SECRET 的实测效果(旧 token 立即 401)已在《Directus 12.5 配置参数详解》逐组验证。
2. 数据库连接类(DB_*):连接失败会在启动日志直接报错退出,日志中会给出 PostgreSQL 原生错误(口令错误为 password authentication failed),排障时先看 docker logs directus-12-5-app。
3. 行为开关类(CACHE_/CORS_/WEBSOCKETS_*):均在启动日志回显生效状态,如缓存启用后 GraphQL/WebSocket 与 Server started 之前的 Extensions loaded 之间无报错即正常;CORS 生效验证方式:
curl -s -o /dev/null -D - http://127.0.0.1:8103/server/ping -H 'Origin: http://192.168.1.100' | grep -i access-control
实测回显:
Access-Control-Allow-Origin: http://192.168.1.100
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: Content-Range
CORS_ORIGIN: true 把请求的 Origin 原样反射进 access-control-allow-origin,说明跨域配置已生效。
八、配置文件挂载
Directus 本体无配置文件,挂载点只有数据目录;两个需要留意的问题实测如下。
1. uploads/extensions 目录属主:Directus 进程在镜像内以 uid/gid 1000 运行,bind mount 的宿主目录若属主是 root(默认 755),启动日志会出现:
WARN: Upload directory (/directus/uploads) is not read/writeable!
实测修复(宿主执行,chown 后重启 directus 服务,告警消失):
chown -R 1000:1000 /opt/data/quzuo/directus-12-5/uploads /opt/data/quzuo/directus-12-5/extensions
docker compose up -d directus
重启后日志复查(告警不再出现):
[00:38:51.474] WARN: PostGIS isn't installed. Geometry type support will be limited.
[00:38:51.558] INFO: Server started at http://0.0.0.0:8055
2. database 目录:属 PostgreSQL 进程管理,权限由镜像内 postgres 用户(uid 70)自行处理,宿主侧不要手工 chown 或改写其中文件;备份一律用 pg_dump,直接复制目录需先停库(冷备)。
九、等价 docker run 方式(可选,最小化直跑)
不用 Compose 时,三条 docker run 也能搭出同样的栈,便于理解各服务依赖关系。以下命令逐条实测通过(先 docker compose down 释放端口与网络):
docker network create directus-net --subnet 10.89.33.0/24
启动数据库:
docker run -d --name directus-12-5-run-db --network directus-net \
-e POSTGRES_USER=directus -e POSTGRES_PASSWORD=q1w2e3r4 -e POSTGRES_DB=directus \
-v /opt/data/quzuo/directus-12-5/database:/var/lib/postgresql/data \
postgres:17-alpine
启动缓存:
docker run -d --name directus-12-5-run-cache --network directus-net \
-v /opt/data/quzuo/directus-12-5/redisdata:/data \
redis:7-alpine
等数据库就绪(实测回显 accepting connections):
docker exec directus-12-5-run-db pg_isready -U directus -d directus
/var/run/postgresql:5432 - accepting connections
启动 Directus(注意 DB_HOST 要与 db 的 --name 一致):
docker run -d --name directus-12-5-run-app --network directus-net -p 8103:8055 \
-e KEY=255d861b-5ea1-5996-9aa3-922530ec40b1 \
-e SECRET=6116487b-cda1-52c2-b5b5-c8022c45e263 \
-e ADMIN_EMAIL=admin@example.com -e ADMIN_PASSWORD=q1w2e3r4 \
-e DB_CLIENT=pg -e DB_HOST=directus-12-5-run-db -e DB_PORT=5432 \
-e DB_DATABASE=directus -e DB_USER=directus -e DB_PASSWORD=q1w2e3r4 \
-e PUBLIC_URL=http://192.168.146.128:8103 \
-v /opt/data/quzuo/directus-12-5/uploads:/directus/uploads \
-v /opt/data/quzuo/directus-12-5/extensions:/directus/extensions \
directus/directus:12.5.0
验证(实测回显):
curl -s http://127.0.0.1:8103/server/ping -w " HTTP %{http_code}\n"
curl -s -X POST http://127.0.0.1:8103/auth/login -H 'Content-Type: application/json' \
-d '{"email":"admin@example.com","password":"q1w2e3r4"}' -o /dev/null -w '登录 HTTP %{http_code}\n'
pong HTTP 200
登录 HTTP 200
直跑栈验证通过后清理,并恢复 Compose 方式管理:
docker rm -f directus-12-5-run-app directus-12-5-run-db directus-12-5-run-cache
docker network rm directus-net
cd /opt/data/quzuo/directus-12-5 && docker compose up -d
十、常用运维命令
以下命令均在 8103 实例实测。
状态与日志:
docker compose ps # 三服务状态与健康检查
docker compose logs -f directus # 跟踪应用日志
docker logs --since 30s directus-12-5-app # 最近 30 秒日志
重启:
docker compose restart directus # 只重启应用(数据库不动)
docker compose down && docker compose up -d # 全栈重建(数据在挂载目录,不丢)
进入实例执行命令:Directus 的管理 CLI 打包在镜像内 /directus/cli.js,以 node 直接调用(镜像内没有 npx 命令,docker compose exec directus npx directus ... 会报 exec: "npx": executable file not found in $PATH):
docker compose exec -T directus node /directus/cli.js --version
实测回显:
12.5.0
重置管理员密码(忘记密码时的恢复手段,无需登出原会话):
docker compose exec -T directus node /directus/cli.js users passwd \
--email admin@example.com --password q1w2e3r4
实测回显:
[00:44:05.932] INFO: Extensions loaded
[00:44:06.050] INFO: Password is updated for user 7103b67b-b376-4ffb-ac0d-14c5ccfd17db
重置后立即用新口令登录验证通过(HTTP 200)。非交互 shell(脚本/管道)执行 exec 需要加 -T,否则分配不到 TTY。
数据库直查(排障时核对系统表):
docker compose exec -T db psql -U directus -d directus -c '\dt directus_*'
实测回显(节选,全表数十张):
List of relations
Schema | Name | Type | Owner
--------+------------------------------+-------+-------