diff --git a/backupdb.sh b/backupdb.sh new file mode 100644 index 0000000..28cca7a --- /dev/null +++ b/backupdb.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +# Настройки +DB_NAME="testposts" +BACKUP_DIR="/opt/testbot-git/dbbackup" +DATE=$(date +"%Y-%m-%d_%H-%M-%S") +BACKUP_FILE="$BACKUP_DIR/${DB_NAME}_${DATE}.sql" + +# Создаем каталог для бэкапов если не существует +mkdir -p "$BACKUP_DIR" + +# Делаем дамп базы данных +mysqldump --databases "$DB_NAME" > "$BACKUP_FILE" + +# Проверяем успешность выполнения +if [ $? -eq 0 ]; then + echo "Бэкап успешно создан: $BACKUP_FILE" +else + echo "Ошибка при создании бэкапа!" + exit 1 +fi diff --git a/services/post-deploy.sh b/services/post-deploy.sh new file mode 100644 index 0000000..2ead01d --- /dev/null +++ b/services/post-deploy.sh @@ -0,0 +1,235 @@ +#!/bin/bash + +# Скрипт post-deploy.sh для автоматического развертывания проекта +# Выполняется после развертывания проекта + +set -e # Остановка при любой ошибке + +# Цвета для вывода +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# Функция для логирования +log() { + echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')] $1${NC}" +} + +error() { + echo -e "${RED}[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: $1${NC}" + exit 1 +} + +warning() { + echo -e "${YELLOW}[$(date '+%Y-%m-%d %H:%M:%S')] WARNING: $1${NC}" +} + +# Определяем корневую директорию проекта +PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +VENV_DIR="$PROJECT_ROOT/venv" +REQUIREMENTS_FILE="$PROJECT_ROOT/requirements.txt" +BACKUP_SCRIPT="$PROJECT_ROOT/backupdb.sh" +ENSURE_DB_SCRIPT="$PROJECT_ROOT/ensure_db.py" +SERVICES_DIR="$PROJECT_ROOT/services" +SERVICES_BACKUP_DIR="$SERVICES_DIR/backups" +SYSTEMD_DIR="/etc/systemd/system" + +log "Начинаем post-deploy процесс для проекта: $PROJECT_ROOT" + +# 1. Проверка и создание виртуального окружения Python +log "Проверяем наличие виртуального окружения Python..." + +if [ ! -d "$VENV_DIR" ]; then + log "Виртуальное окружение не найдено. Создаем новое..." + + # Проверяем наличие python3 + if ! command -v python3 &> /dev/null; then + error "Python3 не найден в системе. Установите Python3 перед продолжением." + fi + + # Создаем виртуальное окружение + python3 -m venv "$VENV_DIR" + + if [ $? -eq 0 ]; then + log "Виртуальное окружение успешно создано" + else + error "Ошибка при создании виртуального окружения" + fi +else + log "Виртуальное окружение уже существует" +fi + +# Активируем виртуальное окружение +log "Активируем виртуальное окружение..." +source "$VENV_DIR/bin/activate" + +# Проверяем наличие requirements.txt +if [ ! -f "$REQUIREMENTS_FILE" ]; then + error "Файл requirements.txt не найден в $REQUIREMENTS_FILE" +fi + +# Обновляем pip и устанавливаем зависимости +log "Обновляем pip и устанавливаем зависимости из requirements.txt..." +pip install --upgrade pip +pip install -r "$REQUIREMENTS_FILE" + +if [ $? -eq 0 ]; then + log "Зависимости успешно установлены" +else + error "Ошибка при установке зависимостей" +fi + +# 2. Запуск backupdb.sh для бэкапа базы данных +log "Запускаем бэкап базы данных..." + +if [ ! -f "$BACKUP_SCRIPT" ]; then + error "Скрипт backupdb.sh не найден в $BACKUP_SCRIPT" +fi + +# Делаем скрипт исполняемым +chmod +x "$BACKUP_SCRIPT" + +# Запускаем бэкап +bash "$BACKUP_SCRIPT" + +if [ $? -eq 0 ]; then + log "Бэкап базы данных выполнен успешно" +else + error "Ошибка при выполнении бэкапа базы данных" +fi + +# 3. Запуск ensure_db.py для проверки и создания БД +log "Запускаем проверку и создание структуры базы данных..." + +if [ ! -f "$ENSURE_DB_SCRIPT" ]; then + error "Скрипт ensure_db.py не найден в $ENSURE_DB_SCRIPT" +fi + +# Запускаем скрипт проверки БД +python3 "$ENSURE_DB_SCRIPT" + +if [ $? -eq 0 ]; then + log "Проверка и создание структуры базы данных выполнена успешно" +else + error "Ошибка при выполнении проверки базы данных" +fi + +# 4. Проверка и обновление systemd сервисов +log "Проверяем и обновляем systemd сервисы..." + +# Создаем каталог для резервных копий сервисов +mkdir -p "$SERVICES_BACKUP_DIR" + +# Список сервисов для проверки +SERVICES=("testbot-git.service" "testedit-git.service") + +for service in "${SERVICES[@]}"; do + log "Обрабатываем сервис: $service" + + SERVICE_FILE="$SERVICES_DIR/$service" + SYSTEMD_SERVICE="$SYSTEMD_DIR/$service" + + # Проверяем наличие файла сервиса в проекте + if [ ! -f "$SERVICE_FILE" ]; then + warning "Файл сервиса $SERVICE_FILE не найден, пропускаем" + continue + fi + + # Проверяем, нужно ли обновлять сервис + UPDATE_NEEDED=false + + if [ ! -f "$SYSTEMD_SERVICE" ]; then + log "Сервис $service не найден в systemd, будет создан" + UPDATE_NEEDED=true + else + # Сравниваем даты модификации файлов + if [ "$SERVICE_FILE" -nt "$SYSTEMD_SERVICE" ]; then + log "Файл сервиса $service в проекте новее, обновляем" + UPDATE_NEEDED=true + else + log "Сервис $service актуален, пропускаем" + fi + fi + + if [ "$UPDATE_NEEDED" = true ]; then + log "Копируем файл сервиса $service в systemd..." + + # Создаем резервную копию существующего файла в каталог проекта + if [ -f "$SYSTEMD_SERVICE" ]; then + BACKUP_FILE="$SERVICES_BACKUP_DIR/${service}.backup.$(date +%Y%m%d_%H%M%S)" + sudo cp "$SYSTEMD_SERVICE" "$BACKUP_FILE" + log "Создана резервная копия: $BACKUP_FILE" + fi + + # Копируем новый файл сервиса + sudo cp "$SERVICE_FILE" "$SYSTEMD_SERVICE" + + if [ $? -eq 0 ]; then + log "Файл сервиса $service успешно скопирован" + else + error "Ошибка при копировании файла сервиса $service" + fi + + # Устанавливаем правильные права доступа + sudo chmod 644 "$SYSTEMD_SERVICE" + sudo chown root:root "$SYSTEMD_SERVICE" + fi +done + +# 5. Перезапуск сервисов +log "Перезапускаем systemd сервисы..." + +for service in "${SERVICES[@]}"; do + SYSTEMD_SERVICE="$SYSTEMD_DIR/$service" + + if [ -f "$SYSTEMD_SERVICE" ]; then + log "Останавливаем сервис $service..." + sudo systemctl stop "$service" || warning "Не удалось остановить сервис $service (возможно, не запущен)" + + log "Перезагружаем конфигурацию systemd..." + sudo systemctl daemon-reload + + log "Запускаем сервис $service..." + sudo systemctl start "$service" + + if [ $? -eq 0 ]; then + log "Сервис $service успешно запущен" + + # Проверяем статус сервиса + sleep 2 + if sudo systemctl is-active --quiet "$service"; then + log "Сервис $service активен и работает" + else + warning "Сервис $service запущен, но может работать некорректно" + sudo systemctl status "$service" --no-pager -l + fi + else + error "Ошибка при запуске сервиса $service" + fi + + # Включаем автозапуск сервиса + sudo systemctl enable "$service" + log "Автозапуск для сервиса $service включен" + else + warning "Файл сервиса $SYSTEMD_SERVICE не найден, пропускаем перезапуск" + fi +done + +log "Post-deploy процесс завершен успешно!" +log "Все сервисы обновлены и перезапущены" + +# Показываем статус всех сервисов +log "Текущий статус сервисов:" +for service in "${SERVICES[@]}"; do + if sudo systemctl list-unit-files | grep -q "$service"; then + echo -n " $service: " + if sudo systemctl is-active --quiet "$service"; then + echo -e "${GREEN}АКТИВЕН${NC}" + else + echo -e "${RED}НЕАКТИВЕН${NC}" + fi + else + echo -e " $service: ${YELLOW}НЕ НАЙДЕН${NC}" + fi +done diff --git a/services/testbot-git.service b/services/testbot-git.service new file mode 100644 index 0000000..d259604 --- /dev/null +++ b/services/testbot-git.service @@ -0,0 +1,13 @@ +# /etc/systemd/system/testbot-git.service +[Unit] +Description=AUTOTEST Zilant Bot service group - Channel Bot +After=network.target + +[Service] +User=root +WorkingDirectory=/opt/testbot +ExecStart=/opt/testbot-git/venv/bin/gunicorn --bind 192.168.0.109:5005 --workers 4 wsgi_bot:app +Restart=always + +[Install] +WantedBy=multi-user.target diff --git a/services/testedit-git.service b/services/testedit-git.service new file mode 100644 index 0000000..4cd8e5d --- /dev/null +++ b/services/testedit-git.service @@ -0,0 +1,13 @@ +# /etc/systemd/system/testedit-git.service +[Unit] +Description=AUTOTEST Zilant Bot service group - Reposter Control +After=network.target + +[Service] +User=root +WorkingDirectory=/opt/testbot +ExecStart=/opt/testbot-git/venv/bin/gunicorn --bind 192.168.0.109:5006 --workers 4 wsgi_edit:app +Restart=always + +[Install] +WantedBy=multi-user.target