Самостоятельный запуск
Здесь описан целевой порядок самостоятельного запуска беты Vrata 0.1.
До выхода v0.1.0 публичных образов в GHCR может не быть. Если вы работаете с исходниками, соберите образы локально с флагом --build.
Требования
- Docker с Compose v2.
- Сервер на Linux или локальное окружение Docker.
- Порты для приложения, сервиса состояния комнаты (room-state), LiveKit и MinIO. Исполнитель удалённого браузера (remote-browser) доступен только внутри сети compose; наружу Caddy публикует лишь его WebSocket
/frames, защищённый токеном. - Для публичного развёртывания по HTTPS: домены или тестовые имена хостов для адресов app, state, livekit и browser.
Быстрый старт со сборкой из исходников
Из корня репозитория:
docker compose --env-file infra/docker/.env.selfhost.example -f infra/docker/compose.selfhost.yml config
docker compose --env-file infra/docker/.env.selfhost.example -f infra/docker/compose.selfhost.yml up -d --build
Smoke-проверки:
curl -fsS http://127.0.0.1:4000/health
curl -fsS http://127.0.0.1:4000/rooms/demo-room
curl -fsS http://127.0.0.1:4000/control-plane
Остановка после локальной оценки:
docker compose --env-file infra/docker/.env.selfhost.example -f infra/docker/compose.selfhost.yml down
Чтобы удалить постоянные данные тестового развёртывания:
docker compose --env-file infra/docker/.env.selfhost.example -f infra/docker/compose.selfhost.yml down -v
Запуск из образов выпуска
После выхода v0.1.0 скопируйте пример env-файла и выберите тег выпуска:
cp infra/docker/.env.selfhost.example infra/docker/.env.selfhost
Отредактируйте infra/docker/.env.selfhost: укажите настоящие секреты, домены и IMAGE_TAG.
Затем выполните:
docker compose --env-file infra/docker/.env.selfhost -f infra/docker/compose.selfhost.yml pull
docker compose --env-file infra/docker/.env.selfhost -f infra/docker/compose.selfhost.yml up -d
Обязательные настройки
CONTROL_PLANE_ADMIN_TOKEN: замените стойким секретом.STATE_TOKEN_SECRET: замените стойким секретом.REMOTE_BROWSER_TOKEN_SECRET: замените стойким секретом.VRATA_INTERNAL_SERVICE_TOKEN: замените стойким секретом.REMOTE_BROWSER_INTERNAL_TOKEN: задайте отдельный стойкий секрет для границы с экспериментальным исполнителем.POSTGRES_PASSWORD: замените стойким паролем.MINIO_ROOT_USERиMINIO_ROOT_PASSWORD: замените значениями для рабочей среды.VRATA_APP_BASE_URL,ROOM_STATE_PUBLIC_URL,LIVEKIT_URLиREMOTE_BROWSER_PUBLIC_URL: укажите адреса, доступные из браузеров.LIVEKIT_NODE_IP: укажите публичный IP-адрес, который объявляет узел LiveKit. Предстартовая проверка рабочей конфигурации отклоняет loopback-адреса, частные и зарезервированные адреса, а также заглушки.VRATA_LIVEKIT_TCP_PORTиVRATA_LIVEKIT_UDP_PORT: откройте эти порты прямо на сервере. Они нужны LiveKit для резервного канала WebRTC ICE/TCP и медиатрафика по UDP.
Входящий в комплект файл compose запускает LiveKit в режиме --dev для быстрого старта беты 0.1, поэтому локальные значения по умолчанию — LIVEKIT_API_KEY=devkey и LIVEKIT_API_SECRET=secret. Прежде чем открывать развёртывание шире, чем для пробного использования, замените их защищённой конфигурацией LiveKit.
Удалённый браузер — экспериментальная функция, по умолчанию REMOTE_BROWSER_ENABLED=false. Чтобы включить его, задайте узкий список REMOTE_BROWSER_ALLOWED_ORIGINS и проверьте значения REMOTE_BROWSER_MAX_SESSIONS, REMOTE_BROWSER_SESSION_TTL_SECONDS, REMOTE_BROWSER_CPU_LIMIT, REMOTE_BROWSER_MEMORY_LIMIT и REMOTE_BROWSER_PIDS_LIMIT. Не открывайте порт исполнителя напрямую в недоверенные сети.
Постоянные данные
Файл compose для самостоятельного запуска хранит данные в томах Docker:
postgres-data— данные комнат и control plane;minio-data— объекты пакетов сцен;caddy-dataиcaddy-config— состояние Caddy.
Перед обновлением делайте резервную копию этих томов. Используйте pnpm backup:compose, проверьте полученный манифест командой pnpm backup:validate и храните артефакты вне git. Подробнее — в docs/backup-restore.md и docs/upgrades.md.
Добавление пространства
В 0.1 минимальный порядок работает через API:
- подготовьте пакет сцены со
scene.jsonи ассетами; - загрузите его в MinIO или S3-совместимое хранилище;
- зарегистрируйте метаданные пакета сцены через API;
- привяжите пакет к комнате;
- откройте адрес комнаты и проверьте диагностику.
Структура пакета описана в docs/scene-bundle-contract.md.
Запуск в рабочей среде
Не открывайте доступ к самостоятельно развёрнутой установке с секретами из примера. Вариант с compose.selfhost.yml предназначен для локальной оценки и оставляет LiveKit в режиме --dev.
Для публичного сервера используйте профиль, безопасный для рабочей среды:
cp infra/docker/.env.production.example infra/docker/.env.production
Отредактируйте infra/docker/.env.production: замените каждое значение REPLACE_WITH_*, примерные имена хостов и публичные адреса. Публичные адреса, к которым обращается браузер, должны использовать https:// или wss://. Исключение — явная предстартовая проверка только на loopback с VRATA_ALLOW_INSECURE_PRODUCTION_URLS=true.
Перед запуском сервисов выполните предстартовую проверку:
node tools/validate-production-config.mjs --env-file infra/docker/.env.production
Проверьте модель compose:
docker compose --env-file infra/docker/.env.production -f infra/docker/compose.production.yml config
Запуск из образов, собранных из исходников:
docker compose --env-file infra/docker/.env.production -f infra/docker/compose.production.yml up -d --build
Или, после выхода v0.1.0, запуск из опубликованных образов выпуска:
docker compose --env-file infra/docker/.env.production -f infra/docker/compose.production.yml pull
docker compose --env-file infra/docker/.env.production -f infra/docker/compose.production.yml up -d
Smoke-проверки:
curl -fsS "$VRATA_APP_BASE_URL/health"
curl -fsS "$VRATA_APP_BASE_URL/rooms/demo-room"
curl -fsS "$VRATA_APP_BASE_URL/diagnostics"
curl -fsS "$CONTROL_PLANE_PUBLIC_URL"
Предстартовая проверка рабочей конфигурации не даёт запустить сервисы, если находит отсутствующие обязательные переменные, публичные адреса http:// / ws://, CORS с подстановочным знаком, режим dev-ролей через параметры запроса, секреты-заглушки, слабые секреты, повторяющиеся значения секретов, неверные публичный IP или порты LiveKit, а также хост в LIVEKIT_URL, не совпадающий с VRATA_LIVEKIT_DOMAIN. Диагностика содержит только имена переменных и коды причин; значения секретов выводиться не должны.
Сетевой профиль LiveKit / TURN
Профиль compose для рабочей среды запускает LiveKit не в режиме --dev, а с явной конфигурацией из LIVEKIT_CONFIG. Caddy завершает HTTPS для сигнального адреса LIVEKIT_URL, например wss://livekit.example.com, и перенаправляет трафик на livekit:7880.
Откройте входящие порты на сервере или в облачном файрволе:
80/tcpи443/tcp— для ACME в Caddy и HTTPS-трафика приложения.VRATA_LIVEKIT_TCP_PORT/tcp, по умолчанию7881/tcp, — для резервного канала WebRTC ICE/TCP.VRATA_LIVEKIT_UDP_PORT/udp, по умолчанию7882/udp, — для прямого медиатрафика по UDP.LIVEKIT_TURN_TLS_PORT/tcp, по умолчанию5349/tcp, — только приLIVEKIT_TURN_ENABLED=true.LIVEKIT_TURN_UDP_PORT/udp, по умолчанию3478/udp, — только приLIVEKIT_TURN_ENABLED=true.LIVEKIT_TURN_RELAY_RANGE_START-LIVEKIT_TURN_RELAY_RANGE_END/udp, по умолчанию50000-50100/udp, — только приLIVEKIT_TURN_ENABLED=trueи если файрвол требует явно указать диапазон портов ретрансляции.
Требования к DNS:
VRATA_APP_DOMAINуказывает на публичный сервер.VRATA_STATE_DOMAINуказывает на тот же сервер, если сервис состояния комнаты не вынесен отдельно.VRATA_LIVEKIT_DOMAINуказывает на тот же сервер или на сервер LiveKit и должен совпадать сLIVEKIT_URL.LIVEKIT_TURN_DOMAINпри включённом TURN/TLS должен быть отдельным именем хоста.
Варианты TURN/TLS:
- Оставьте
LIVEKIT_TURN_ENABLED=falseдля публичного профиля только с сигнализацией. - Установите
LIVEKIT_TURN_ENABLED=true, чтобы LiveKit объявлял встроенный TURN. - При
LIVEKIT_TURN_EXTERNAL_TLS=trueзавершайте TURN/TLS на внешнем балансировщике уровня L4 и перенаправляйте трафик наLIVEKIT_TURN_TLS_PORT. - При
LIVEKIT_TURN_EXTERNAL_TLS=falseпередайтеLIVEKIT_TURN_CERT_FILEиLIVEKIT_TURN_KEY_FILEв контейнер LiveKit через override-файл compose или монтирование с хоста. - Не используйте
VRATA_LIVEKIT_DOMAINв качествеLIVEKIT_TURN_DOMAIN: предстартовая проверка отклоняет такую конфигурацию, чтобы маршрутизация сигнализации и TURN/TLS оставалась явной.
Ответы API /health и /health/ready содержат несекретную диагностику развёртывания LiveKit в dependencies.livekitConfig: состояние TLS для сигнализации, настроенный хост, признак включения TURN, домен TURN, порты TURN и диапазон ретрансляции. Диагностика runtime, которую клиент отправляет в POST /api/rooms/:roomId/diagnostics, включает media.webrtc: состояния транспортов, состояние выбранной пары ICE-кандидатов, типы кандидатов и логические флаги доступности и использования ретрансляции TURN. Снимок runtime намеренно не содержит исходных адресов и портов ICE-кандидатов.
Когда публичные DNS и HTTPS настроены, откройте в браузере $VRATA_APP_BASE_URL/diagnostics?roomId=demo-room&autorun=1. Добавьте skipMic=1, если нужно обойтись без запроса права на микрофон, но сохранить проверки API, WSS сервиса состояния комнаты, хранилища, LiveKit и WebRTC/TURN. JSON-отчёт прикладывайте к обращениям в поддержку: значения параметров, похожие на токены, и ключи, похожие на секреты, в нём скрыты.
В рабочей среде POST /api/tokens/media и POST /api/tokens/remote-browser-media возвращают livekit_config_invalid, если адрес, ключ или секрет LiveKit не заданы, небезопасны или всё ещё совпадают с учётными данными для разработки.
Откат для этого профиля затрагивает только метаданные и конфигурацию: верните предыдущий .env.production и тег образа через pnpm rollback:compose, затем выполните smoke-проверку адреса приложения. Если проблема в самом профиле рабочей среды, остановите его и вернитесь к ранее использованному задокументированному файлу compose. Восстановление базы данных на момент времени здесь не предусмотрено.
Обновления и откат
Здесь описаны целевые правила обновления самостоятельно развёрнутых установок Vrata 0.1.
Правила
- Обновляйтесь на явные теги образов по SemVer, например
0.1.1. - Не используйте
latestкак цель обновления. - Перед каждым минорным обновлением делайте резервную копию Postgres и MinIO.
- Откат схемы базы данных на предыдущую версию не гарантируется.
- Откат — это возврат к предыдущему тегу образа приложения без удаления томов.
Резервная копия перед обновлением
Перед сменой тегов образов создайте и проверьте резервную копию compose-стека:
pnpm backup:compose -- --env-file infra/docker/.env.selfhost --compose-file infra/docker/compose.selfhost.yml --output-dir backups
pnpm backup:validate -- --backup-dir backups/vrata-<timestamp>-<image-tag>
Команда резервного копирования выгружает Postgres, объекты бакетов MinIO, опись объектов, метаданные политик бакетов (если они есть), метаданные образов и манифест с контрольными суммами. Восстановление и действия при аварии описаны в docs/backup-restore.md.
Обновление
Отредактируйте infra/docker/.env.selfhost:
IMAGE_TAG=0.1.1
Затем выполните:
docker compose --env-file infra/docker/.env.selfhost -f infra/docker/compose.selfhost.yml pull
docker compose --env-file infra/docker/.env.selfhost -f infra/docker/compose.selfhost.yml up -d
Smoke-проверки:
curl -fsS "$VRATA_APP_BASE_URL/health"
curl -fsS "$VRATA_APP_BASE_URL/rooms/demo-room"
curl -fsS "$VRATA_APP_BASE_URL/control-plane"
Откат
Если smoke-проверка не прошла, верните в IMAGE_TAG предыдущий заведомо рабочий тег и перезапустите сервисы:
pnpm rollback:compose -- \
--previous-image-tag 0.1.0 \
--env-file infra/docker/.env.selfhost \
--compose-file infra/docker/compose.selfhost.yml \
--smoke-base-url "$VRATA_APP_BASE_URL" \
--confirm-rollback
Не запускайте down -v при откате, если только вы не хотите намеренно удалить данные.
Состояние миграций
Сейчас схема создаётся при первом запуске: слой хранения API идемпотентно создаёт таблицы и столбцы. Отдельный механизм запуска миграций запланирован; без него Vrata не может давать более строгих гарантий обновления в рабочей среде.
Резервное копирование, восстановление и откат
Профили compose Vrata для самостоятельного запуска и рабочей среды хранят постоянное состояние в именованных томах Docker. Скрипт tools/backup-restore.mjs даёт оператору всё нужное, чтобы выгрузить это состояние, проверить артефакты резервной копии, восстановить их, откатить теги образов без удаления томов и выполнить smoke-проверки.
Что входит в резервную копию
- Postgres: SQL-дамп
pg_dump --clean --if-exists --no-owner --no-privileges. - Хранилище MinIO или S3-совместимое хранилище из compose: зеркальная копия объектов бакетов, файл описи объектов и метаданные политик скачивания бакетов, если они есть.
- Метаданные платформы: версия схемы манифеста, время создания, версия пакета Vrata,
IMAGE_TAG, коммит git, профиль compose, имена файлов compose и env, размеры артефактов и контрольные суммы SHA-256. - Снимок образов compose: вывод
docker compose imagesдля диагностики. - Выгрузки со staging могут включать запись о принятом выпуске, привязанную к контрольной сумме, и имена всех override-файлов Compose. Обёртка для staging описана в
docs/deployment-staging.md.
По умолчанию резервные копии записываются в backups/. Этот каталог исключён из git: артефакты резервных копий могут содержать закрытые метаданные комнат и ассеты сцен.
Создание резервной копии
Из корня репозитория:
pnpm backup:compose -- --env-file infra/docker/.env.selfhost --compose-file infra/docker/compose.selfhost.yml --output-dir backups
Для профиля рабочей среды используйте infra/docker/.env.production и infra/docker/compose.production.yml.
Команда завершается с ненулевым кодом, если не удалось снять дамп Postgres, зеркалировать MinIO, сделать снимок образов или записать манифест. В журнал попадают только пути и стабильные коды ошибок; значения секретов из env-файла вычищаются из stderr команд.
Проверка резервной копии
pnpm backup:validate -- --backup-dir backups/vrata-<timestamp>-<image-tag>
Что проверяется:
- схема манифеста и обязательные метаданные источника;
- что пути артефактов не выходят за пределы каталога резервной копии;
- что обязательные артефакты Postgres и описи MinIO существуют;
- что размеры артефактов и контрольные суммы SHA-256 совпадают с манифестом.
Повреждённый или неполный манифест приводит к ненулевому коду завершения ещё до начала восстановления.
Восстановление
Восстановление перезаписывает состояние целевого развёртывания: SQL-дамп применяется к Postgres, а сохранённый набор объектов зеркалируется обратно в MinIO с флагом --remove.
Не запускайте восстановление на рабочем сервере, если вы явно не выбрали эту резервную копию точкой восстановления.
pnpm restore:compose -- \
--backup-dir backups/vrata-<timestamp>-<image-tag> \
--env-file infra/docker/.env.selfhost \
--compose-file infra/docker/compose.selfhost.yml \
--smoke-base-url http://127.0.0.1:4000 \
--smoke-room-id demo-room \
--confirm-restore
Восстановление всегда начинается с проверки манифеста. После применения дампа и объектов выполняются smoke-проверки /health, /rooms/:roomId, /api/rooms/:roomId/manifest и адреса пакета сцены из манифеста, если он указан.
Откат тега образа
Откат затрагивает только конфигурацию и образы. Перед правкой env-файла команда проверяет целевой тег и адрес для smoke-проверки, затем обновляет IMAGE_TAG, скачивает образы сервисов приложения и выполняет docker compose up -d --no-build. Она не запускает docker compose down -v и не удаляет тома Postgres и MinIO.
pnpm rollback:compose -- \
--previous-image-tag 0.1.0 \
--env-file infra/docker/.env.selfhost \
--compose-file infra/docker/compose.selfhost.yml \
--smoke-base-url http://127.0.0.1:4000 \
--smoke-room-id demo-room \
--confirm-rollback
Перед сменой IMAGE_TAG предыдущий env-файл копируется в backups/rollback-env/. latest как цель отката отклоняется: используйте явный тег SemVer или неизменяемый тег SHA.
Только smoke-проверка
pnpm smoke:compose -- --smoke-base-url http://127.0.0.1:4000 --smoke-room-id demo-room
Запускайте её после ручного восстановления или обслуживания хранилища.
Срок хранения
Пробный прогон удаления старых резервных копий:
pnpm backup:prune -- --output-dir backups --retention-days 14
Удаление:
pnpm backup:prune -- --output-dir backups --retention-days 14 --confirm-prune
Срок хранения по умолчанию можно задать в VRATA_BACKUP_RETENTION_DAYS. Команда очистки рассматривает только каталоги, имена которых начинаются с vrata-.
Перед удалением копии она проверяет контрольные суммы и всегда оставляет как минимум две более новые проверенные резервные копии. Неполные или повреждённые копии сохраняются для диагностики и не считаются точками восстановления.
Действия при аварии
- Если возможно, остановите запись в пострадавшее развёртывание.
- Выберите самую свежую проверенную резервную копию, манифест которой проходит
pnpm backup:validate. - Восстановите её с
--confirm-restoreи доступным--smoke-base-url. - Если проблема не в данных, а в образе приложения, выполните
pnpm rollback:composeс предыдущим явным тегом образа. - Выполните smoke-команду и запишите в заметки об инциденте каталог резервной копии, восстановленный
IMAGE_TAG, коммит git и результат smoke-проверки.
Ограничения
- Восстановление на момент времени и инкрементальные резервные копии объектов в
0.1не входят. - Откат схемы базы данных не гарантируется. Перед минорными обновлениями резервная копия обязательна.
- Скрипты рассчитаны на Postgres и MinIO, которыми управляет compose. Для внешних управляемых баз данных и объектных хранилищ, помимо этой инструкции, нужны снимки средствами провайдера.
Источник: docs/self-hosting.md, docs/upgrades.md, docs/backup-restore.md в vrata-labs/platform на ревизии 380b2e7ff1dd, лицензия Apache-2.0. GitHub