Автоматизированный Docker-образ Directus со встроенной синхронизацией схемы и коллекций через directus-sync. Проект демонстрирует интеграцию плагина directus-sync с автоматическим применением дампа при старте контейнера, позволяя синхронизировать конфигурацию Directus между средами разработки без потери ключевых настроек и без вмешательства в данные базы данных.
- двухэтапная сборка Docker: установка расширений на первом этапе, финальный образ на базе
directus/directus:11.14.0; - автоматический bootstrap, запуск seed-скриптов и применение дампа
directus-syncпри старте контейнера; - seed-скрипты на Knex для заполнения
directus_collections,directus_fieldsиdirectus_relationsиз snapshot-файла с топологической сортировкой коллекций; - pull/push снапшотов и коллекций между локальной средой разработки и удалённым экземпляром Directus;
- конфигурация
directus-syncс наследованием: базовые, локальные и remote-настройки через отдельные config-файлы; - сохранение идентификаторов коллекций при синхронизации (
preserveIds: all); - поддержка S3-совместимого хранилища для загружаемых файлов;
- PostgreSQL 16 в качестве базы данных;
- отказоустойчивый запуск: graceful degradation при отсутствии дампа синхронизации.
Directus 11.14, Node.js 20, Docker, Docker Compose, PostgreSQL 16, pnpm, Knex, directus-sync v3.
Архитектура — двухэтапная Docker-сборка с entrypoint-автоматизацией. На первом этапе устанавливается npm-пакет directus-extension-sync как расширение Directus. На втором этапе собирается финальный образ на базе официального directus/directus, в который копируются расширение, seed-скрипты и дамп синхронизации. Точка входа — entrypoint.sh, выполняющая bootstrap, запуск, seed и push. Конфигурация синхронизации разделена на три файла с наследованием: базовый, локальный и удалённый.
flowchart TD
A[entrypoint.sh] --> B[1. Bootstrap Directus]
B --> C[2. Запуск Directus через pm2]
C --> D[3. Ожидание healthcheck]
D --> E{4. Есть ли snapshot.json?}
E -->|да| F[Seed: прямые записи в directus_collections/fields/relations]
E -->|нет| G[Пропуск seed]
F --> H[5. directus-sync push --no-snapshot]
G --> H
H --> I[6. Сервер работает]
sequenceDiagram
participant Dev as Среда разработки (локальная)
participant Git as Репозиторий
participant Prod as Production (Docker)
Dev->>Dev: directus-sync pull
Dev->>Git: коммит dump-файлов
Git->>Prod: сборка образа с дампом
Prod->>Prod: entrypoint: seed + push
Note over Prod: Схема применена автоматически
Скопируйте .env.example в .env и заполните значения. Файл .env исключён из Git через .gitignore.
| Переменная | Назначение | По умолчанию |
|---|---|---|
PORT |
порт Directus | 8055 |
LOG_LEVEL |
уровень логирования | info |
NODE_ENV |
окружение Node.js | production |
SECRET |
JWT-секрет Directus | (обязательно) |
PUBLIC_URL |
публичный URL экземпляра | http://localhost:8055 |
ROOT_REDIRECT |
перенаправление с корня | ./admin |
ADMIN_EMAIL |
email администратора | admin@example.com |
ADMIN_PASSWORD |
пароль администратора | (обязательно) |
ADMIN_TOKEN |
статический токен администратора, используется для directus-sync push |
(опционально) |
MIGRATIONS_PATH |
путь к миграциям | ./migrations |
EXTENSIONS_PATH |
путь к расширениям | ./extensions |
STORAGE_LOCATIONS |
тип хранилища файлов | local |
STORAGE_S3_DRIVER |
S3-драйвер | s3 |
STORAGE_S3_REGION |
регион S3 | auto |
STORAGE_S3_ENDPOINT |
endpoint S3 | (опционально) |
STORAGE_S3_KEY |
S3 access key | (опционально) |
STORAGE_S3_SECRET |
S3 secret key | (опционально) |
STORAGE_S3_FORCE_PATH_STYLE |
path-style для S3 | true |
STORAGE_S3_BUCKET |
имя S3 bucket | (опционально) |
STORAGE_S3_ROOT |
корневой путь в S3 bucket | (опционально) |
DB_CLIENT |
клиент БД | pg |
DB_HOST |
хост БД | db |
DB_PORT |
порт БД | 5432 |
DB_DATABASE |
имя БД | directus |
DB_USER |
пользователь БД | postgres |
DB_PASSWORD |
пароль БД | postgres |
EMAIL_VERIFY_SETUP |
проверка email-настроек | true |
EMAIL_TRANSPORT |
транспорт email | smtp |
EMAIL_SMTP_HOST |
SMTP-хост | (опционально) |
EMAIL_SMTP_PORT |
SMTP-порт | 465 |
EMAIL_SMTP_USER |
SMTP-пользователь | (опционально) |
EMAIL_SMTP_PASSWORD |
SMTP-пароль | (опционально) |
EMAIL_FROM |
адрес отправителя | no-reply@example.com |
Требования: Docker Engine и Docker Compose v2.
cp .env.example .env
# заполните SECRET, ADMIN_EMAIL и ADMIN_PASSWORD
docker compose --env-file .env up --buildCompose поднимает PostgreSQL 16 и Directus в одной сети с проверкой готовности БД перед стартом админки. При старте выполняется bootstrap, seed из snapshot и directus-sync push. Админ-панель доступна по адресу http://localhost:8055/admin.
Остановка сервисов:
docker compose downpnpm installПосле настройки локального экземпляра Directus можно выполнять pull/push синхронизации:
# Получить текущую схему и коллекции из локального Directus
pnpm sync:local:pull
# Применить локальные изменения к локальному Directus
pnpm sync:local:push
# Получить схему и коллекции из удалённого Directus
pnpm sync:remote:pull
# Применить локальные изменения к удалённому Directus
pnpm sync:remote:push
# Запустить только seed-скрипты
pnpm seed:startДля работы локальных команд необходим запущенный экземпляр Directus и переменная окружения ADMIN_TOKEN, заданная в .env или в окружении.
Проект автоматизирует синхронизацию конфигурации Directus между средами с помощью directus-sync:
- Разработка: разработчик настраивает коллекции, поля, роли и права доступа в локальном Directus.
- Pull: выполняется
pnpm sync:local:pull— текущая схема и коллекции сохраняются вdirectus-sync-dump/. - Фиксация: dump-файлы коммитятся в репозиторий.
- Сборка: Docker-образ включает дамп внутрь контейнера.
- Развёртывание: при старте контейнера entrypoint автоматически применяет seed и выполняет
directus-sync push, восстанавливая конфигурацию на целевом экземпляре.
Синхронизация не затрагивает пользовательские данные — только схему, роли, права и настройки коллекций.
Настройки разделены на три файла в extensions/directus-sync/:
directus-sync.config.base.cjs— базовые параметры (путь дампа, сохранение ID, сортировка JSON);directus-sync.config.local.cjs— локальный экземпляр, URLhttp://0.0.0.0:8055и токен изADMIN_TOKEN;directus-sync.config.remote.cjs— удалённый экземпляр, URL изPUBLIC_URLи токен изADMIN_TOKEN.
Файлы используют механизм extends для наследования базовых настроек.
tree -L 3Основные пути:
Dockerfile # двухэтапная сборка образа
entrypoint.sh # точка входа: bootstrap, seed, sync push
docker-compose.base.yml # базовый сервис Directus с общими настройками
docker-compose.yml # полный стек: PostgreSQL + Directus
package.json # зависимости и скрипты синхронизации
seeds/main.cjs # запуск seed-скриптов через Knex
seeds/directus-sync.seed.cjs # заполнение таблиц из snapshot.json
extensions/directus-sync/ # конфигурационные файлы directus-sync
directus-sync-dump/ # дамп схемы и коллекций (генерируется через pull)
migrations/ # кастомные миграции Directus
uploads/ # загружаемые файлы (монтируются как volume)