7 / 8
Deploy на VPS
До сих пор всё происходило на одной машине. Но реальные проекты живут на серверах — а туда нужен и бинарник Athanor, и зашифрованный файл, и, что важнее всего, ключ, которым его расшифровывать.
Что делает athanor deploy
athanor deploy user@my-vps
Шаг за шагом:
1. получить linux/amd64-бинарник athanor
(если текущая машина уже linux/amd64 — просто копия работающего
бинарника; иначе нужна пересборка из исходников, см. ниже)
│
▼
2. проверить локальные файлы; подготовить <remote_path>.athanor-staging
│
▼
3. scp: бинарник, нормализованный athanor.yaml, secrets, identity → staging
│
▼
4. chmod 700 <staging> && chmod 600 <манифест/секреты/identity>
&& chmod 755 <бинарник>
│
▼
5. smoke-test в staging; затем активация с резервной копией и откатом
│
▼
6. повторный smoke-test уже в <remote_path>
remote_path берётся не из флага командной строки, а из
deploy.remote_path в athanor.yaml — это деталь конфигурации проекта, а
не разовый параметр команды.
SSH и SCP запускаются неинтерактивно (BatchMode=yes) с тайм-аутом
подключения. До активации текущая рабочая копия не меняется. При сбое
финального smoke-теста прежние файлы восстанавливаются автоматически.
Развёрнутый манифест получает локальный ./<имя secrets_file>, поэтому
абсолютный или внешний путь с машины разработчика не протекает на VPS.
Важно: на сервер уезжает сам приватный ключ
Об этом стоит сказать прямо, а не прятать в списке шагов выше: deploy
копирует на VPS сам файл identity — приватный ключ, которым
расшифровывается secrets.enc.yaml, защищённый только правами файла
(chmod 600), без дополнительного шифрования. Это принципиально другая
граница доверия, чем просто "секреты зашифрованы": стоит identity оказаться
на сервере — и этот сервер полностью способен расшифровать всё, что этим
ключом защищено. Компромисс осознанный: без ключа на сервере команда
athanor run там попросту не заработает. Именно поэтому на действительно
менее доверенном VPS имеет смысл завести отдельный ключ (athanor init
--own-key для этого конкретного проекта) вместо общего на всего
разработчика.
Deploy не управляет SSH-доступом
deploy не хранит и не запрашивает пароль или ключ для входа на сервер —
он буквально вызывает системные ssh/scp с тем хостом, что вы передали
(алиас из ~/.ssh/config или user@host), используя то, что уже
настроено: ключ в ssh-agent или в конфиге. Если для входа нужен пароль, а
не ключ, команда просто упадёт с ошибкой на первом же ssh-вызове — вместо
того чтобы пытаться этот пароль у вас как-то выцарапать. Секреты приложения
и доступ к самому серверу — два разных контура доверия, и deploy их не
смешивает.
Кросс-компиляция и ATHANOR_SRC_DIR
deploy запускается из каталога вашего проекта — например,
веб-приложения, — а не из репозитория Athanor: там просто нет исходников
Athanor для сборки. Поэтому:
- если машина, с которой вы деплоите, уже
linux/amd64(тот же Linux, что и VPS) — используется копия уже запущенного бинарника, пересборка не нужна; - если архитектуры расходятся — скажем, деплой с Mac на linux/amd64-VPS —
понадобится переменная окружения
ATHANOR_SRC_DIR, указывающая на чекаут исходников самого Athanor, чтобы кросс-компилироватьGOOS=linux GOARCH=amd64прямо оттуда.
Несколько проектов на одном VPS
Как уживаются несколько проектов на одном сервере — вопрос уже не deploy,
а манифеста (глава 3):
- разные секреты — просто разные
remote_pathу разных проектов,deployих никак не пересекает; - общие секреты локально — оба манифеста могут указывать на один
secrets_file, но каждый deploy копирует его снимок в свойremote_path. Автоматической синхронизации между разными каталогами на VPS нет.
Контрольный вопрос. Чем принципиально отличается доверие к VPS после
athanor deploy от доверия к git-репозиторию, в который закоммичен
secrets.enc.yaml?
Ответ: репозиторий с secrets.enc.yaml содержит только зашифрованные
значения — без приватного ключа они бесполезны. VPS после deploy получает
и зашифрованный файл, и сам приватный ключ — то есть полную возможность
расшифровать секреты, а не просто их зашифрованную копию.