Учебник веб-разработки
Разделы учебника
На этой странице

XI. DevOps

SourceCraft CI и развёртывание на VPS

Оглавление · Основы CI/CD · Релизный контракт

Репозиторий — zakharov-dev/gheilt. Оба remote, origin и sourcecraft, указывают на него. GitHub Actions отключены, workflow удалены; GitHub не участвует в доставке. Registry — существующий YC crpml6ifd12s8cbmbg3m. Образы собираются только в SourceCraft CI для linux/amd64. На VPS устанавливаются готовые образы по digest, без сборки npm/pnpm или Docker.

Окружения

ИсточникНазначениеПубликация
Собственный PRПолный изолированный стендweb.pr-N.gheilt.mxsource.xyz и соседние CMS/media/Storybook/docs
maintestweb.test.gheilt.mxsource.xyz и соседние сервисы
release/X.Ystagingweb.staging.gheilt.mxsource.xyz и соседние сервисы
Последний опубликованный stable vX.Y.Zproductiongheilt.mxsource.xyz, cms., media., storybook., docs.

CI сайта проверяется с изолированной CMS-фикстурой. Полные стенды получают копию опубликованного контента текущей production CMS и Garage; внешний сайт не используется. Production получает те же четыре digest, что staging, без повторной сборки. Draft и prerelease остаются вне production. Подробнее: релизные ветки и жизненный цикл стендов.

Как доставка доходит до VPS

Конфигурация — .sourcecraft/ci.yaml. Проверки отделены от публикации с IAM. Service connection yandex-cloud выдаёт CI временный доступ к registry. Capsule связывает точный SHA, запуск и digest каждого образа. Control plane из доверенного main публикует состояние веток, PR и native Releases.

VPS сам читает registry по HTTPS: sourcecraft-receive.timer запускает receiver каждые две минуты, control plane обновляется раз в десять минут. Входящий SSH от CI не нужен. Puller key хранится только на VPS; PAT разработчика не передаётся контейнерам. Trusted scripts установлены в /opt/gheilt/preview-tools/SHA, а не исполняются из произвольного PR checkout.

Receiver использует общий /opt/gheilt/deploy.lock. Для production сначала проверяются совместимость CMS и восстановление private backup. Caddy переключает четыре приложения; PostgreSQL, Garage и uploads остаются общими. Active receipt записывается после публичного smoke, затем прежние приложения останавливаются, а совпавшая staging generation охлаждается. Production всегда работает.

Обычный выпуск

Из своей ветки создайте PR в main или точную release-ветку. Для release branch, changelog и draft используйте maintainer CLI. После готовности staging публикация native stable Release запускает promotion. Теги не перемещайте.

Для чтения запусков:

src run list -R zakharov-dev/gheilt --json
src run get NUMBER -R zakharov-dev/gheilt --json

На VPS состояние доставки читается без сборок:

systemctl status sourcecraft-receive.service sourcecraft-receive.timer
journalctl -u sourcecraft-receive.service --no-pager -n 50

Успех CI подтверждает сборку и публикацию. Работающий production подтверждают active receipt, фактические digest контейнеров и публичный X-App-Release. При ошибке сначала выясните фазу intent и состояние данных; не запускайте повторный bootstrap и не удаляйте тома ради восстановления приложения.

Подготовка хоста и административный доступ

Используются Docker Compose, Python 3, systemd, curl, flock и Linux-утилиты. Пользователь — atmanki-deploy, каталог — /opt/gheilt, backend network — atmanki_default. Dedicated SSH key нужен для администрирования; host key проверяется через StrictHostKeyChecking=yes. Членство в docker group даёт широкие полномочия на хосте и не является restricted shell.

Bootstrap нового хоста — scripts/deploy/bootstrap.sh; существующий хост не переинициализируют при обновлении. Старые имена томов и роли PostgreSQL сохраняются: смена Compose project не переносит данные. История переноса — отчёт Atmanki. Caddy собирается отдельно workflow caddy-image при изменении proxy; обычный application commit его не пересобирает.