server/auto_deploy.md
Автоматизация деплоя сервисов на сервере
на примере Yandex Cloud VM on Ubuntu 24.04
Описание
Необходимо создать скрипт для автоматизации развертывания сервисов на сервере. Скрипт должен выполнять клонирование репозитория, настройку виртуального окружения, установку зависимостей, создание конфигурационных файлов, запуск приложения и настройку автозапуска после перезагрузки системы.
Задачи
-
Клонирование репозитория:
- Скрипт должен принимать URL репозитория на GitFlic как аргумент.
- Проверить наличие каталога
/home/$USER/microservices
. Если его нет, создать. - Клонировать репозиторий в каталог
/home/$USER/microservices/PROJECT_NAME
(гдеPROJECT_NAME
— это имя репозитория, без расширения.git
).
-
Создание и настройка виртуального окружения:
- В каталоге проекта создать виртуальное окружение с помощью команды
python3 -m venv venv
. - Активировать виртуальное окружение.
- Установить зависимости, указанные в
requirements.txt
.
- В каталоге проекта создать виртуальное окружение с помощью команды
-
Создание конфигурационного файла (.env):
- Скрипт должен предложить создать файл
.env
для переменных окружения. - Если пользователь соглашается, открыть файл в редакторе
nano
для редактирования. - Если пользователь отказывается, продолжить без файла
.env
.
- Скрипт должен предложить создать файл
-
Выбор скрипта для запуска:
- Скрипт должен предоставить список всех файлов
.py
в каталоге проекта. - Пользователь выбирает один из файлов для запуска.
- Скрипт должен запомнить выбранный файл и использовать его для дальнейших шагов.
- Скрипт должен предоставить список всех файлов
-
Запуск выбранного скрипта:
- После выбора файла для запуска скрипт должен спросить, хочет ли пользователь запустить этот скрипт.
- Если пользователь подтверждает, скрипт запускается с помощью команды
python3 script_file
.
-
Настройка автозапуска с использованием systemd:
- Скрипт должен предложить настроить автозапуск приложения после перезагрузки системы.
- Если пользователь согласен, создать
systemd
unit-файл для запуска приложения. - Имя unit-файла должно соответствовать имени проекта.
- В unit-файле прописать параметры: описание, рабочую директорию, команду запуска, настройки перезапуска и путь к конфигурационному файлу
.env
. - Добавить сервис в автозапуск с помощью команд:
sudo systemctl daemon-reload
sudo systemctl enable $PROJECT_NAME.service
sudo systemctl start $PROJECT_NAME.service
- Настройка cron-задачи:
- Скрипт должен предложить настроить cron-задачу для автоматического обновления репозитория.
- Если пользователь соглашается, добавляется cron-задача в файл crontab с комментарием, указывающим на проект.
- Задача будет запускаться ежедневно в полночь.
Пример реализации скрипта
Требования
- На сервере должен быть установлен Python 3.
-
Скрипт должен иметь права на выполнение:
chmod +x /home/$USER/scripts/newdeploy
-
Для запуска скрипта используется команда:
/home/$USER/scripts/newdeploy <ssh-gitglic@url-project.git>
Или просто:
newdeploy <ssh-gitglic@url-project.git>
Завершение
После выполнения всех шагов, скрипт автоматизирует процесс развертывания и настройки сервисов на сервере, включая установку зависимостей, запуск приложений, настройку автозапуска и cron-задач.
Инструкция по работе со скриптом для автоматизации развёртывания микросервиса
Описание
Этот Bash-скрипт автоматизирует процесс развёртывания микросервиса на вашем сервере. Он включает в себя установку необходимых зависимостей, клонирование репозитория проекта, создание виртуального окружения, установку зависимостей Python, настройку автозапуска через systemd, а также добавление cron-задач для автоматического обновления проекта.
Параметры скрипта
- REPO_URL – URL-адрес Git-репозитория, который нужно клонировать (передаётся как аргумент при запуске скрипта).
- PROJECT_DIR – Путь к каталогу, в который будет клонирован проект. По умолчанию:
/home/$USER/microservices/имя_проекта
. - ENV_FILE – Путь к файлу
.env
, содержащему переменные окружения для проекта. - PROJECT_NAME – Имя проекта, которое будет использоваться для настройки systemd службы.
Как использовать
1. Запуск скрипта
Запустите скрипт, передав URL-адрес вашего репозитория в качестве аргумента:
./deploy_script.sh https://github.com/user/repo.git
2. Установка зависимостей
Скрипт обновит список пакетов и установит следующие зависимости:
- Python 3 и pip для управления зависимостями Python.
- git для клонирования репозитория.
- python3-venv для создания виртуального окружения.
3. Проверка каталога
Скрипт проверяет наличие каталога /home/$USER/microservices
и создаёт его, если он отсутствует.
4. Клонирование репозитория
- Если проект ещё не клонирован, скрипт клонирует его в указанный каталог.
- Если проект уже существует, клонирование будет пропущено.
5. Создание виртуального окружения
- Если виртуальное окружение (
venv
) ещё не создано, скрипт создаст его. - Затем активируется виртуальное окружение.
6. Установка зависимостей
Устанавливаются все зависимости, указанные в файле requirements.txt
:
pip install -r requirements.txt
7. Создание файла .env
Скрипт предложит создать файл .env
для переменных окружения:
read -p "Хотите создать файл .env для переменных окружения? (y/n): " create_env
- При согласии откроется редактор
nano
, в котором можно внести необходимые настройки.
8. Выбор и запуск Python-скрипта
-
Вам будет предложено выбрать Python-скрипт для запуска из списка всех файлов с расширением
.py
в проекте:select script_file in *.py
-
Затем можно решить, запускать ли выбранный скрипт сразу:
read -p "Хотите запустить скрипт $script_file? (y/n): " run_script
9. Настройка автозапуска через systemd
Скрипт предложит настроить автозапуск через systemd:
read -p "Хотите настроить автозапуск после перезагрузки? (y/n): " setup_autostart
-
При согласии будет создан systemd unit-файл:
sudo bash -c "cat > /etc/systemd/system/$PROJECT_NAME.service <<EOF [Unit] Description=$PROJECT_NAME After=network.target [Service] User=$USER WorkingDirectory=$PROJECT_DIR ExecStart=/bin/bash -c 'source $PROJECT_DIR/venv/bin/activate && exec python3 $PROJECT_DIR/$script_file' Restart=always EnvironmentFile=$ENV_FILE [Install] WantedBy=multi-user.target EOF"
- Служба будет активирована и запущена.
10. Настройка cron-задачи для обновления проекта
Скрипт предложит настроить cron-задачу для автоматического обновления проекта:
read -p "Хотите настроить cron-задачу для автоматического обновления? (y/n): " setup_cron
-
Выберите одно из предложенных расписаний:
echo "1) Каждые 5 минут" echo "2) Каждые 30 минут" echo "3) Каждый час в 00 минут" echo "4) Каждые 6 часов" echo "5) Ежедневно в 6 часов утра и вечера" echo "6) Ежедневно в полночь"
-
Соответствующий cron-запуск будет добавлен:
crontab -l > mycron echo "$cron_schedule cd $PROJECT_DIR && git fetch && git pull && sudo systemctl restart $PROJECT_NAME.service >> $PROJECT_DIR/cron_update.log 2>&1" >> mycron crontab mycron rm mycron
Дополнительные сведения
- Автозапуск: Настраивается через systemd, что обеспечивает перезапуск сервиса в случае его падения.
- Cron-задача: Обеспечивает регулярное обновление кода из репозитория и перезапуск службы с логированием.
Заключение
Скрипт упрощает развертывание и поддержку микросервисов, минимизируя количество ручных операций. Просто запустите его, следуйте инструкциям и настройте всё необходимое для работы вашего микросервиса.
Удаление сервиса
#!/bin/bash
# Параметры
REPO_URL=$1
PROJECT_DIR="/home/$USER/microservices/$(basename "$REPO_URL" .git)"
PROJECT_NAME=$(basename "$PROJECT_DIR")
# Остановка и удаление службы systemd
if [ -f "/etc/systemd/system/$PROJECT_NAME.service" ]; then
echo "Останавливаем и удаляем службу $PROJECT_NAME.service..."
sudo systemctl stop "$PROJECT_NAME.service"
sudo systemctl disable "$PROJECT_NAME.service"
sudo rm "/etc/systemd/system/$PROJECT_NAME.service"
sudo systemctl daemon-reload
echo "Служба $PROJECT_NAME.service удалена."
else
echo "Служба $PROJECT_NAME.service не найдена."
fi
# Удаление cron-задачи
echo "Удаляем cron-задачу для проекта $PROJECT_NAME..."
crontab -l | grep -v "$PROJECT_NAME" > mycron
crontab mycron
rm mycron
echo "Cron-задача удалена."
# Проверка корректности пути
if [ -z "$PROJECT_DIR" ] || [ "$PROJECT_DIR" == "/home/$USER/microservices" ]; then
echo "Ошибка: Некорректный путь проекта или каталог microservices."
exit 1
fi
# Удаление проекта
if [ -d "$PROJECT_DIR" ]; then
echo "Вы действительно хотите удалить проектный каталог $PROJECT_DIR? [y/n]"
read -r confirm
if [ "$confirm" == "y" ]; then
rm -rf "$PROJECT_DIR"
echo "Каталог проекта $(basename "$PROJECT_DIR") удалён."
else
echo "Удаление отменено."
fi
else
echo "Каталог проекта $(basename "$PROJECT_DIR") не найден."
fi
echo "Удаление завершено для проекта $PROJECT_NAME."