Олег Карнауховweb developerОбсудить проект

Блог

Деплой релизами: симлинк, каталог данных снаружи и одна ошибка, которая стоит контента

Схема выкладки, где каждый релиз — отдельный каталог, а данные живут вне них. И почему DATA_DIR внутри релиза — потеря контента, а не неудобство.

Выкладка устроена так: сборка складывается в каталог с именем коммита, симлинк current переставляется на него, сервис перезапускается. Старые релизы какое-то время лежат рядом. Схема известная — интереснее то, что рядом с ней должно лежать, а что не должно ни в коем случае.

Раскладка

На сервере три вещи: каталог releases с релизами по коммитам, симлинк current на используемый, и каталог data. Сервис запускается с рабочим каталогом current и читает данные по абсолютному пути в переменной окружения.

Откат при такой схеме — это переставить симлинк обратно. Не пересборка, не git revert с ожиданием, а одна операция, которая либо прошла, либо нет.

deploy/allgenl-portfolio.servicebash
[Service]
WorkingDirectory=/var/www/allgenl-portfolio/current
Environment=DATA_DIR=/var/www/allgenl-portfolio/data
User=www-data
Group=www-data
ExecStart=/usr/bin/node deploy/server.mjs
DATA_DIR — абсолютный путь наружу от релизов. Это единственная строка, которая отделяет работающий сайт от потерянного контента.
ЧтоВладелецПочему так
releases/пользователь деплояих создаёт выкладка
currentпользователь деплояэто симлинк, его переставляет выкладка
data/пользователь сервисав него пишет панель
Разные владельцы у релизов и данных — не перестраховка, а следствие того, что пишут в них разные процессы.

Две проверки, которые спасают прод

Перед перезагрузкой nginx — обязательно nginx -t. Битый конфиг уронит не только новый сайт, но и все остальные на машине.

Перед пушем в ветку, с которой идёт выкладка — сборка и тесты локально. Раннер соберёт то же самое, но узнать об ошибке до того, как симлинк переставлен, дешевле.