Files
WFL/deploy.sh

233 lines
5.8 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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" <<EOF
[Unit]
Description=WFL FastAPI Service
After=network.target
Wants=network.target
[Service]
Type=simple
User=root
WorkingDirectory=$TARGET_DIR
Environment="PATH=$TARGET_DIR/.venv/bin"
EnvironmentFile=$TARGET_ENV
ExecStart=$TARGET_DIR/.venv/bin/uvicorn app:app --host 0.0.0.0 --port 8001
Restart=always
RestartSec=5
StartLimitIntervalSec=300
StartLimitBurst=5
StandardOutput=journal
StandardError=journal
SyslogIdentifier=WFL
[Install]
WantedBy=multi-user.target
EOF
chmod 644 "$service_file"
log_info "Перезагрузка systemd..."
systemctl daemon-reload
log_info "Включение сервиса..."
systemctl enable "$SERVICE_NAME"
}
start_service() {
log_info "Запуск сервиса..."
systemctl restart "$SERVICE_NAME"
sleep 3
}
check_service_status() {
if systemctl is-active --quiet "$SERVICE_NAME"; then
log_info "Сервис успешно запущен"
systemctl status "$SERVICE_NAME" --no-pager -l
else
log_error "Сервис не запущен"
journalctl -u "$SERVICE_NAME" -n 50 --no-pager
exit 1
fi
}
main() {
local release="main"
while getopts "r:h" opt; do
case $opt in
r) release="$OPTARG" ;;
h) show_help ;;
*) log_error "Неверный аргумент"; exit 1 ;;
esac
done
check_root
log_info "Начало деплоя"
log_info "Релиз: $release"
install_packages
download_code "$release"
check_required_files
setup_venv
setup_firewall
create_systemd_service
start_service
check_service_status
log_info "========================================"
log_info "Готово"
log_info "Сервис: $SERVICE_NAME"
log_info "Директория: $TARGET_DIR"
log_info "Логи:"
log_info " journalctl -u $SERVICE_NAME -f"
log_info "Статус:"
log_info " systemctl status $SERVICE_NAME"
log_info "Перезапуск:"
log_info " systemctl restart $SERVICE_NAME"
log_info "========================================"
}
main "$@"