Docker собирает приложение на Mac. Контроллер отправляет готовые образы на VPS через SSH и запускает их. Исходники на VPS не нужны. Ниже — один VPS, локальные изображения и отключённые резервные копии.
1. Создайте профиль в Generator UI
В Deployment включите Docker и Production deployment, выберите CI provider → None. В Deployment environments создайте профиль production с preset Single server. Внутри профиля выберите Image delivery → Transfer image archives over SSH, заполните свои домены, TLS contact email и Runtime directory. В Backup destination выберите None; для рабочих изображений используется Local files, выбранный для проекта.
Подробное пояснение полей — в подготовке профиля. Нажмите Save deployment settings, затем Generate. Настройки появятся в deploy/generated/environments/production.json; пустой custom-файл рядом в deploy/custom/environments/ можно пока не менять. Копировать JSON в deploy/environments/ не требуется.
2. Подготовьте VPS и Mac
Сначала выполните подготовку сервера и доменов. Затем откройте на Mac терминал в корне сгенерированного проекта example-project и выполните все шаги подготовки окружения и SSH.
В профиле production укажите Backend SSH target — deploy@203.0.113.10 со своим IP. Runtime directory — каталог на VPS, а не на Mac. Сохраните настройки и выполните Generate. Для local-медиа и отключённого backup отдельного файла секретов не требуется.
Для двух VPS создайте профиль с preset Separate frontend / backend. Подготовьте обе машины, заполните оба SSH target и создайте одинаковый Runtime directory на каждой. DNS admin направьте на frontend, API — на backend. Команды выпуска ниже остаются теми же.
3. Выполните первый запуск
На Mac, из корня example-project, с запущенным Docker Desktop. Если открыли новый терминал, сначала задайте пути к уже подготовленным SSH-файлам:
export DEPLOY_SSH_KEY_FILE="$HOME/.config/admingen/production/id_ed25519"
export DEPLOY_KNOWN_HOSTS_FILE="$HOME/.config/admingen/production/known_hosts"
bash ./deploy/control build --env production --output release-001.json
bash ./deploy/control provision --env production --release release-001.json --confirm production
bash ./deploy/control deploy --env production --release release-001.json --confirm production
bash ./deploy/control status --env production --json
Выполняйте команды по одной и переходите дальше только после успеха. Build собирает версию; provision проверяет окружение и готовит секреты, PostgreSQL и HTTPS; deploy применяет миграции и запускает приложение. После provision приложение ещё может показывать страницу обслуживания. Успешный deploy заканчивается status=complete; status должен показывать записанный текущий релиз, а проверка готовности — успешное состояние.
Build создаст release-001.json и рядом *.images.tar с образами backend, admin и служебных компонентов. Не переименовывайте архив и храните его рядом с JSON. Контроллер сам проверяет архив и доставляет его по SSH. На VPS проверенная копия сохраняется в <root>/image-archives/.
Это архив приложения, а не резервная копия БД или пользовательских изображений. Отдельный registry не требуется, но во время сборки Mac скачивает базовые образы и зависимости из интернета.
Для следующего раздела откройте отдельный терминал VPS через уже настроенный SSH:
ssh -i "$DEPLOY_SSH_KEY_FILE" -o IdentitiesOnly=yes \
-o "UserKnownHostsFile=$DEPLOY_KNOWN_HOSTS_FILE" deploy@203.0.113.10
Используйте IP backend-VPS.
Создайте первого администратора
Для нового проекта без данных выполните на VPS под deploy или root:
docker ps --filter label=com.docker.compose.service=backend
Возьмите имя из столбца NAMES и замените им ИМЯ_BACKEND_КОНТЕЙНЕРА:
docker exec -it ИМЯ_BACKEND_КОНТЕЙНЕРА \
admin bootstrap-superadmin --if-needed --login owner
Введите и подтвердите пароль длиной 12–128 байт UTF-8; ввод скрыт. Откройте https://admin.example.com со своим доменом и войдите как owner. Если суперадминистратор уже существует, эта команда не заменяет его и не сбрасывает пароль.
Если переносите заполненную БД из разработки, после успешного первого deploy перейдите к переносу данных в Docker-окружение. Импорт заменит новую БД, включая созданный аккаунт; после него используйте аккаунты из перенесённой базы.
Обновите приложение
Вернитесь в терминал Mac, в корень example-project. Подготовьте новые исходники: если изменения пришли из Git, выполните git pull --ff-only. При новом терминале экспортируйте два SSH-пути, как выше. Затем:
bash ./deploy/control build --env production --output release-002.json
bash ./deploy/control deploy --env production --release release-002.json --confirm production
bash ./deploy/control status --env production --json
Каждый build использует новый output; не перезаписывайте предыдущий релиз. Provision повторять не нужно. Ожидайте status=complete и новый текущий релиз в status. Сохраняйте JSON и архивы версий, к которым может понадобиться вернуться.
В этой инструкции backup отключён. Для данных отдельно настройте резервные копии; для хранения рабочих изображений вне VPS — S3.
Если выпуск остановился
В том же месте, где запускали control:
bash ./deploy/control status --env production --json
bash ./deploy/control logs --env production --service backend
Сохраните сообщение об ошибке и operation ID. Продолжение — в восстановлении операции. Не удаляйте каталог данных или state для повторной попытки. Ошибка первого deploy после миграций также требует разбора операции, даже если текущий релиз ещё не записан.