Как развернуть Django API без простоев?
У меня есть проект Django API, который мне нужно развернуть с помощью CI/CD на локальном сервере Linux, не требуя обслуживания. поскольку пользователь предыдущей сборки может использовать без простоев, как развернуть новую версию сборки.
Мне нужно развернуть Django API без простоев на сервере Linux
Возможно, вы захотите попробовать:
Развернуть в новый каталог -> Обновить символическую ссылку (current
) -& Корректно перезагрузить Gunicorn (kill -HUP
) -& Сохранить Nginx активным в качестве обратного прокси-сервера
Пример:
1. Используйте версионную структуру каталогов - размещайте каждую версию в отдельной папке с временной меткой:
/var/www/myproject/
├── current -> /var/www/myproject/releases/2025-05-06-1230/
├── releases/
│ ├── 2025-05-06-1230/
│ ├── 2025-05-05-1700/
├── shared/ (media/, static/, .env etc.)
В вашем конвейере CI/CD (например, GitLab CI, Jenkins или Bash script):
# Timestamped release path
RELEASE_DIR="/var/www/myproject/releases/$(date +%Y-%m-%d-%H%M)"
mkdir -p $RELEASE_DIR
# Clone or copy project files
git clone https://your-repo.git $RELEASE_DIR
cd $RELEASE_DIR
# Setup virtual environment
source /var/www/myproject/venv/bin/activate
# Install dependencies
pip install -r requirements.txt
# Migrate DB and collect static
python manage.py migrate --noinput
python manage.py collectstatic --noinput
# Point "current" symlink to new release
ln -sfn $RELEASE_DIR /var/www/myproject/current
# Reload Gunicorn gracefully
kill -HUP `cat /run/gunicorn.pid`
Используйте флаг Gunicorn --pid
и сигнал HUP
для корректной перезарядки:
gunicorn --pid /run/gunicorn.pid ...
kill -HUP `cat /run/gunicorn.pid`
Используйте Nginx для передачи запросов в Gunicorn, что повышает буферизацию и надежность:
location / {
proxy_pass http://unix:/run/gunicorn.sock;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}