Примеры сервисов и жизненный цикл переключения
Полное определение сервиса, семантика on_enable / on_disable / notes и типичные ловушки.
Содержание
Заголовок раздела «Содержание»Полное определение сервиса
Заголовок раздела «Полное определение сервиса»type: appcontainer: app-mainrequired: truedir: ./services/maindir_internal: /workspacework_dir_internal: /workspace/srcicon: "📦"info: title: "Main Application" paths: - name: "API Documentation" path: /api/docs icon: "📖"ports: http: 80hosts: web: app.localhostconfigs: - .envdirs: - logs - home - runtimecli: mode: auto shell: bash user: www-data workdir: /workspace/srcrender: ide: enabled: true ai: enabled: trueЖизненный цикл переключения
Заголовок раздела «Жизненный цикл переключения»Блоки on_enable, on_disable и notes управляют тем, что происходит при переключении сервиса через dwe services enable/disable.
Схема on_enable и on_disable
Заголовок раздела «Схема on_enable и on_disable»on_enable: requires: none | restart | deploy | deploy-or-restart # что запускать после записи local.yml before: [command-id] # пользовательские команды, запускаемые до записи переключения after: [command-id] # пользовательские команды, запускаемые после записи переключенияon_disable: requires: none | restart # deploy не разрешён на disable before: [command-id] after: [command-id]| Поле | По умолчанию | Описание |
|---|---|---|
requires | restart | Что должно произойти, чтобы изменение вступило в силу. none → только запись local.yml; restart → запустить dwe restart; deploy → запустить dwe deploy run --service <name>; deploy-or-restart → deploy, когда сервис ещё ни разу не разворачивался, иначе restart (только для on_enable). deploy и deploy-or-restart запрещены в on_disable. |
before | — | ID пользовательских команд (из workspace/commands/) для запуска до записи переключения. Каждая должна быть type: shell или type: script. |
after | — | ID пользовательских команд для запуска после записи переключения. Применяется то же ограничение типа. |
Хук-команды запускаются с --yes (неинтерактивно), stdout отбрасывается, stderr захватывается для сообщений об ошибках.
Схема notes
Заголовок раздела «Схема notes»notes: enable: "Run migrations after enabling this service." disable: "Safe to disable while the stack is running."Заметки показываются в выводе плана (dwe services enable/disable --print-plan), чтобы провести оператора через ручные последующие шаги.
План переключения и --apply
Заголовок раздела «План переключения и --apply»dwe services enable <name> (без --apply) записывает local.yml и фиксирует ожидающую операцию в журнале состояния deploy. Ожидающая операция отображается в dwe status, пока не очищена. --apply выполняет план немедленно (запускает хуки, инициирует restart или deploy, как объявлено в requires).
Типичные ловушки
Заголовок раздела «Типичные ловушки»- Редактирование
dirв потомкеextends— потомок, задающийdir, полностью заменяетdirродителя (не сливается). Это намеренно для сервисов, живущих в другом host-каталоге. - Абсолютные пути в
dirs— записи dirs должны быть относительными путями. Абсолютные пути или пути с..отклоняютсяservice_dirs_ensureкак проверка безопасности. - Отсутствие
containerв потомке —containerне наследуется черезextends:. Потомок без явногоcontainerполучает по умолчанию имя своей папки (тот же дефолт, что применяется к любому сервису). Объявляйтеcontainerявно, когда имя папки не подходит как имя контейнера. - Забытый
depends_on:у потомка — не наследуется. Потомок, нуждающийся в зависимости, должен объявить её явно. (compose:наследуется от родителя, когда потомок его опускает — см. Правила разрешения наследования.) - Блок
render:под сервисомtool/infra— блокrender:только для app. Записи tool / infra, объявляющие его, не загружаются. Чтобы прикрепить шаблонный пак к не-app сервису, его нужно сначала переопределить какapp(с обязательнымdir:). - Существующий не-симлинк по пути управляемого симлинка — если
CLAUDE.md(или другой путьsymlinks[].link) уже существует как обычный файл,dwe render aiотказывается его перезаписывать и завершается с ошибкой:refuse to overwrite non-symlink file at <path>; remove it or disable via render.ai.enabled: false. Удалите файл первым или установитеrender.ai.enabled: falseдля этого сервиса.