#!/bin/bash set -euo pipefail RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' REPO_URL="https://git.tvstart.ru/ychernenko/WFL.git" TARGET_DIR="/root/WFL" SERVICE_NAME="wfl-data.service" TARGET_ENV="/mnt/wfl/.env" log_info() { echo -e "${GREEN}[INFO]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } show_help() { echo "Использование: $0 [-r <релиз>] [-h]" echo " -r Релиз (ветка или тег), по умолчанию: main" echo " -h Показать справку" echo echo "Пример:" echo " $0 -r main" exit 0 } check_root() { if [[ $EUID -ne 0 ]]; then log_error "Скрипт должен запускаться с правами root" exit 1 fi } install_packages() { log_info "Обновление списка пакетов..." apt-get update log_info "Установка пакетов..." apt-get install -y python3 python3-pip python3-venv git net-tools } download_code() { local release="$1" log_info "Подготовка директории $TARGET_DIR..." mkdir -p "$TARGET_DIR" if [ -d "$TARGET_DIR/.git" ]; then log_info "Обновление существующего репозитория..." cd "$TARGET_DIR" git fetch --all git checkout "$release" git pull origin "$release" else log_info "Клонирование репозитория..." git clone "$REPO_URL" "$TARGET_DIR" cd "$TARGET_DIR" git checkout "$release" fi log_info "Код загружен" log_info "Текущая ветка: $(git branch --show-current)" log_info "Последний коммит: $(git log --oneline -1)" } setup_venv() { cd "$TARGET_DIR" if [ -d ".venv" ]; then log_info "Удаление старого виртуального окружения..." rm -rf .venv fi log_info "Создание виртуального окружения..." python3 -m venv .venv source .venv/bin/activate log_info "Обновление pip..." pip install --upgrade pip if [ -f "requirements.txt" ]; then log_info "Установка зависимостей из requirements.txt..." pip install -r requirements.txt else log_error "Файл requirements.txt не найден" exit 1 fi log_info "Проверка uvicorn..." .venv/bin/python -c "import fastapi, uvicorn; print('FastAPI и uvicorn установлены')" } check_required_files() { cd "$TARGET_DIR" if [ ! -f "app.py" ]; then log_error "Файл app.py не найден в $TARGET_DIR" exit 1 fi log_info "Файл app.py найден" } setup_firewall() { log_info "Открытие порта 8001..." if command -v ufw >/dev/null 2>&1 && systemctl is-active --quiet ufw; then ufw allow 8001/tcp || log_warn "Не удалось открыть порт 8001 в ufw" fi if command -v firewall-cmd >/dev/null 2>&1 && systemctl is-active --quiet firewalld; then firewall-cmd --permanent --add-port=8001/tcp || true firewall-cmd --reload || true fi } create_systemd_service() { local service_file="/etc/systemd/system/$SERVICE_NAME" log_info "Создание systemd unit: $service_file" if systemctl is-active --quiet "$SERVICE_NAME"; then log_info "Остановка старого сервиса..." systemctl stop "$SERVICE_NAME" fi if systemctl is-enabled --quiet "$SERVICE_NAME"; then systemctl disable "$SERVICE_NAME" || true fi cat > "$service_file" <