Удалённый агент особенно бодр в первые пять минут. Он видит репозиторий, находит package.json и уже готов чинить всё сразу. Я в этот момент проверяю скучные вещи.
Отдельный пользователь и понятная папка
Для проекта нужен отдельный каталог с предсказуемым владельцем. Если сборка запускается от одного пользователя, а файлы после деплоя принадлежат другому, следующий запуск быстро превращается в археологию прав.
id
pwd
git status --short --branch
Три команды дают больше полезного контекста, чем торжественное «у нас Ubuntu».
Секреты не должны попадать в диалог
Я проверяю наличие .env, но не печатаю его содержимое. Агенту обычно достаточно знать названия обязательных переменных из .env.example и команду проверки конфигурации.
Токен в аргументах команды тоже плохая идея: он останется в истории shell и иногда мелькнёт в списке процессов.
Сначала сборка, потом Nginx
До изменения рабочего конфига запускаю тесты и production-сборку. Для Nginx есть nginx -t, для Compose — docker compose config, для systemd — хотя бы чтение последних логов сервиса.
npm ci
npm run build
sudo nginx -t
Откат должен помещаться в одну фразу
Перед деплоем я хочу закончить предложение: «Если всё сломается, я…»
Хорошие варианты — вернуть предыдущий симлинк, перезапустить старый контейнер или сделать checkout известного коммита. «Посмотрю по ситуации» технически тоже ответ, но спать после него сложнее.