From 6de3607a02cb25cd77218ba0d4628ef284fae1ad Mon Sep 17 00:00:00 2001 From: Alexey Barabanov Date: Mon, 10 Nov 2025 08:46:28 +0000 Subject: [PATCH 1/7] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B8=D0=B7=20=D0=A0=D0=A4=D0=91=20=D0=B2=20?= =?UTF-8?q?=D0=9A=D0=A5=D0=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy.sh | 75 ++++++++++++++++++++++++++----------------------------- 1 file changed, 36 insertions(+), 39 deletions(-) diff --git a/deploy.sh b/deploy.sh index b7364c7..4079e8b 100644 --- a/deploy.sh +++ b/deploy.sh @@ -8,14 +8,11 @@ NC='\033[0m' # No Color show_help() { echo "Использование: $0 -t <домашняя команда> -r <релиз> [-l <лига>]" - echo " -t Домашняя команда" echo " -r Релиз (тег или ветка в git)" - echo " -l Лига (опционально)" echo " -h Показать эту справку" echo "" - echo "Пример: $0 -t cska -r main" - echo "Пример: $0 -t zenit -r Barabanov_TEST -l vtb" - echo "Пример: $0 -t avtodor -r main" + echo "Пример: $0 -r Barabanov_TEST" + echo "" exit 0 } @@ -58,9 +55,9 @@ install_packages() { # Функция загрузки кода download_code() { - local repo_url="https://git.tvstart.ru/ychernenko/RFB.git" + local repo_url="https://git.tvstart.ru/ychernenko/KHL.git" local release="$1" - local target_dir="/root/RFB" + local target_dir="/root/KHL" log_info "Создание рабочей директории $target_dir..." mkdir -p $target_dir @@ -93,7 +90,7 @@ download_code() { # Функция настройки виртуального окружения setup_venv() { - local target_dir="/root/RFB" + local target_dir="/root/KHL" cd $target_dir log_info "Создание виртуального окружения..." @@ -151,36 +148,36 @@ create_systemd_service() { fi # Останавливаем и отключаем старый сервис если он есть - if systemctl is-active --quiet rfb-data.service; then - log_info "Остановка rfb-data.service..." - systemctl stop rfb-data.service + if systemctl is-active --quiet khl-data.service; then + log_info "Остановка khl-data.service..." + systemctl stop khl-data.service fi - if systemctl is-enabled --quiet rfb-data.service; then - log_info "Отключение rfb-data.service..." - systemctl disable rfb-data.service + if systemctl is-enabled --quiet khl-data.service; then + log_info "Отключение khl-data.service..." + systemctl disable khl-data.service fi # Формируем команду для data сервиса - local data_command="/root/RFB/.venv/bin/python3 /root/RFB/get_data.py --team \"$team\"" + local data_command="/root/KHL/.venv/bin/python3 /root/KHL/get_data.py"" if [ -n "$league" ]; then data_command="$data_command --league \"$league\"" fi # Создаем сервисный файл в правильной директории - local data_service_file="/etc/systemd/system/rfb-data.service" + local data_service_file="/etc/systemd/system/khl-data.service" log_info "Создание файла сервиса: $data_service_file" cat > "$data_service_file" << EOF [Unit] -Description=RFB Data Service +Description=khl Data Service After=network.target [Service] Type=simple User=root -WorkingDirectory=/root/RFB -Environment=PATH=/root/RFB/.venv/bin +WorkingDirectory=/root/KHL +Environment=PATH=/root/KHL/.venv/bin ExecStart=$data_command Restart=always RestartSec=30 @@ -197,13 +194,13 @@ EOF log_info "Перезагрузка systemd демона..." systemctl daemon-reload - log_info "Включение сервиса rfb-data.service..." - systemctl enable rfb-data.service + log_info "Включение сервиса khl-data.service..." + systemctl enable khl-data.service } # Функция проверки файлов check_required_files() { - local target_dir="/root/RFB" + local target_dir="/root/KHL" cd $target_dir local missing_files=() @@ -325,16 +322,16 @@ manage_services() { case $action in "start") - log_info "Запуск сервиса rfb-data.service..." - systemctl start rfb-data.service + log_info "Запуск сервиса khl-data.service..." + systemctl start khl-data.service ;; "restart") - log_info "Перезапуск сервиса rfb-data.service..." - systemctl restart rfb-data.service + log_info "Перезапуск сервиса khl-data.service..." + systemctl restart khl-data.service ;; "stop") - log_info "Остановка сервиса rfb-data.service..." - systemctl stop rfb-data.service + log_info "Остановка сервиса khl-data.service..." + systemctl stop khl-data.service ;; esac @@ -344,11 +341,11 @@ manage_services() { # Функция проверки статуса сервиса check_service_status() { - log_info "Статус сервиса rfb-data.service:" - if systemctl is-active rfb-data.service; then - systemctl status rfb-data.service --no-pager -l + log_info "Статус сервиса khl-data.service:" + if systemctl is-active khl-data.service; then + systemctl status khl-data.service --no-pager -l else - log_warn "Сервис rfb-data.service не запущен" + log_warn "Сервис khl-data.service не запущен" fi } @@ -398,7 +395,7 @@ main() { show_help fi - log_info "Начало установки RFB Data Service..." + log_info "Начало установки khl Data Service..." log_info "Команда: $team, Релиз: $release" if [ -n "$league" ]; then log_info "Лига: $league" @@ -468,17 +465,17 @@ main() { log_info "Режим: $release" log_info "" log_info "Для просмотра логов:" - log_info " journalctl -u rfb-data.service -f" + log_info " journalctl -u khl-data.service -f" log_info "" log_info "Управление сервисом:" - log_info " Перезапуск: systemctl restart rfb-data.service" - log_info " Остановка: systemctl stop rfb-data.service" - log_info " Статус: systemctl status rfb-data.service" - log_info " Логи: journalctl -u rfb-data.service" + log_info " Перезапуск: systemctl restart khl-data.service" + log_info " Остановка: systemctl stop khl-data.service" + log_info " Статус: systemctl status khl-data.service" + log_info " Логи: journalctl -u khl-data.service" log_info "" log_info "Проверка работы:" log_info " Проверить процессы: ps aux | grep get_data.py" - log_info " Проверить логи: tail -f /root/RFB/logs/*.log 2>/dev/null || echo 'Директория логов не найдена'" + log_info " Проверить логи: tail -f /root/KHL/logs/*.log 2>/dev/null || echo 'Директория логов не найдена'" log_info "==================================================" } From 6d1e83d6fea7ee9a4d5dc23960c48ffaa7d83e01 Mon Sep 17 00:00:00 2001 From: Alexey Barabanov Date: Mon, 10 Nov 2025 14:38:10 +0300 Subject: [PATCH 2/7] ver 1 --- .gitignore | 5 +- deploy.sh | 370 ++++++++++++++++++++++++++++------------------------- 2 files changed, 199 insertions(+), 176 deletions(-) mode change 100644 => 100755 deploy.sh diff --git a/.gitignore b/.gitignore index 2eea525..c48f48e 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ -.env \ No newline at end of file +.env +/.venv +/logs/* +/__pycache__ \ No newline at end of file diff --git a/deploy.sh b/deploy.sh old mode 100644 new mode 100755 index 4079e8b..0ac9095 --- a/deploy.sh +++ b/deploy.sh @@ -4,15 +4,20 @@ RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' +BLUE='\033[0;34m' NC='\033[0m' # No Color +# Конфигурация +REPO_URL="https://git.tvstart.ru/ychernenko/KHL.git" +TARGET_DIR="/root/KHL" +SERVICE_NAME="khl-data.service" + show_help() { - echo "Использование: $0 -t <домашняя команда> -r <релиз> [-l <лига>]" + echo "Использование: $0 -r <релиз> [-h]" echo " -r Релиз (тег или ветка в git)" echo " -h Показать эту справку" echo "" echo "Пример: $0 -r Barabanov_TEST" - echo "" exit 0 } @@ -30,13 +35,41 @@ log_error() { echo -e "${RED}[ERROR]${NC} $1" >&2 } +log_debug() { + echo -e "${BLUE}[DEBUG]${NC} $1" >&2 +} + +# Функция проверки зависимостей системы +check_dependencies() { + local deps=("git" "python3" "pip3" "netstat" "systemctl") + local missing=() + + for dep in "${deps[@]}"; do + if ! command -v "$dep" &> /dev/null; then + missing+=("$dep") + fi + done + + if [ ${#missing[@]} -ne 0 ]; then + log_warn "Отсутствуют некоторые команды: ${missing[*]}" + return 1 + fi + return 0 +} + # Функция проверки и установки пакетов install_packages() { log_info "Обновление списка пакетов..." - apt-get update + if ! apt-get update; then + log_error "Ошибка при обновлении списка пакетов" + exit 1 + fi log_info "Установка необходимых пакетов..." - apt-get install -y python3 python3-pip python3-venv git net-tools + if ! apt-get install -y python3 python3-pip python3-venv git net-tools; then + log_error "Ошибка при установке пакетов" + exit 1 + fi # Проверка установки if ! command -v python3 &> /dev/null; then @@ -55,32 +88,36 @@ install_packages() { # Функция загрузки кода download_code() { - local repo_url="https://git.tvstart.ru/ychernenko/KHL.git" local release="$1" - local target_dir="/root/KHL" + local target_dir="$TARGET_DIR" log_info "Создание рабочей директории $target_dir..." - mkdir -p $target_dir + mkdir -p "$target_dir" if [ -d "$target_dir/.git" ]; then log_info "Обновление существующего репозитория..." - cd $target_dir + cd "$target_dir" || exit 1 git fetch --all - git checkout $release - git pull origin $release + if ! git checkout "$release"; then + log_error "Не удалось переключиться на релиз $release" + log_info "Доступные ветки:" + git branch -r + exit 1 + fi + git pull origin "$release" else - log_info "Клонирование репозитория $repo_url..." - git clone $repo_url $target_dir - cd $target_dir - git checkout $release - fi - - # Проверка успешности checkout - if [ $? -ne 0 ]; then - log_error "Не удалось переключиться на релиз $release" - log_error "Доступные ветки:" - git branch -r - exit 1 + log_info "Клонирование репозитория $REPO_URL..." + if ! git clone "$REPO_URL" "$target_dir"; then + log_error "Ошибка при клонировании репозитория" + exit 1 + fi + cd "$target_dir" || exit 1 + if ! git checkout "$release"; then + log_error "Не удалось переключиться на релиз $release" + log_info "Доступные ветки:" + git branch -r + exit 1 + fi fi log_info "Код успешно загружен (релиз: $release)" @@ -90,11 +127,20 @@ download_code() { # Функция настройки виртуального окружения setup_venv() { - local target_dir="/root/KHL" - cd $target_dir + local target_dir="$TARGET_DIR" + cd "$target_dir" || exit 1 + + # Удаляем существующее виртуальное окружение для чистоты + if [ -d ".venv" ]; then + log_info "Удаление существующего виртуального окружения..." + rm -rf .venv + fi log_info "Создание виртуального окружения..." - python3 -m venv .venv + if ! python3 -m venv .venv; then + log_error "Не удалось создать виртуальное окружение" + exit 1 + fi if [ ! -f ".venv/bin/activate" ]; then log_error "Не удалось создать виртуальное окружение" @@ -105,7 +151,9 @@ setup_venv() { source .venv/bin/activate # Обновление pip - pip install --upgrade pip + if ! pip install --upgrade pip; then + log_warn "Не удалось обновить pip" + fi # Проверка наличия requirements.txt if [ -f "requirements.txt" ]; then @@ -114,24 +162,29 @@ setup_venv() { log_info "Все зависимости успешно установлены" else log_error "Ошибка при установке зависимостей из requirements.txt" - log_warn "Попытка установки базовых зависимостей..." - pip install requests pandas numpy + exit 1 fi else log_warn "Файл requirements.txt не найден, устанавливаем базовые зависимости..." - pip install requests pandas numpy + if ! pip install requests pandas numpy fastapi uvicorn python-telegram-handler python-dotenv; then + log_error "Ошибка при установке базовых зависимостей" + exit 1 + fi fi # Проверка основных пакетов log_info "Проверка установки основных пакетов..." - python -c " + if ! python -c " try: import requests, pandas, numpy print('✓ Все основные пакеты успешно импортируются') except ImportError as e: print(f'✗ Ошибка импорта: {e}') exit(1) -" +"; then + log_error "Ошибка при проверке пакетов" + exit 1 + fi log_info "Установленные пакеты:" pip list --format=columns @@ -139,45 +192,34 @@ except ImportError as e: # Функция создания systemd сервиса create_systemd_service() { - local team="$1" - local league="$2" - - log_info "Создание systemd сервиса для команды: $team" - if [ -n "$league" ]; then - log_info "Лига: $league" - fi + log_info "Создание systemd сервиса" # Останавливаем и отключаем старый сервис если он есть - if systemctl is-active --quiet khl-data.service; then - log_info "Остановка khl-data.service..." - systemctl stop khl-data.service + if systemctl is-active --quiet "$SERVICE_NAME"; then + log_info "Остановка $SERVICE_NAME..." + systemctl stop "$SERVICE_NAME" fi - if systemctl is-enabled --quiet khl-data.service; then - log_info "Отключение khl-data.service..." - systemctl disable khl-data.service + if systemctl is-enabled --quiet "$SERVICE_NAME"; then + log_info "Отключение $SERVICE_NAME..." + systemctl disable "$SERVICE_NAME" fi # Формируем команду для data сервиса - local data_command="/root/KHL/.venv/bin/python3 /root/KHL/get_data.py"" - if [ -n "$league" ]; then - data_command="$data_command --league \"$league\"" - fi - - # Создаем сервисный файл в правильной директории - local data_service_file="/etc/systemd/system/khl-data.service" + local data_command="$TARGET_DIR/.venv/bin/python3 $TARGET_DIR/get_data.py" + local data_service_file="/etc/systemd/system/$SERVICE_NAME" log_info "Создание файла сервиса: $data_service_file" cat > "$data_service_file" << EOF [Unit] -Description=khl Data Service +Description=KHL Data Service After=network.target [Service] Type=simple User=root -WorkingDirectory=/root/KHL -Environment=PATH=/root/KHL/.venv/bin +WorkingDirectory=$TARGET_DIR +Environment=PATH=$TARGET_DIR/.venv/bin ExecStart=$data_command Restart=always RestartSec=30 @@ -192,16 +234,22 @@ EOF chmod 644 "$data_service_file" log_info "Перезагрузка systemd демона..." - systemctl daemon-reload + if ! systemctl daemon-reload; then + log_error "Ошибка при перезагрузке systemd демона" + exit 1 + fi - log_info "Включение сервиса khl-data.service..." - systemctl enable khl-data.service + log_info "Включение сервиса $SERVICE_NAME..." + if ! systemctl enable "$SERVICE_NAME"; then + log_error "Ошибка при включении сервиса" + exit 1 + fi } # Функция проверки файлов check_required_files() { - local target_dir="/root/KHL" - cd $target_dir + local target_dir="$TARGET_DIR" + cd "$target_dir" || exit 1 local missing_files=() local required_files=("get_data.py") @@ -227,74 +275,26 @@ check_required_files() { fi } -# Функция определения IP и команды (исправленная) -detect_team() { - local team_arg="$1" - - # Определение IP адреса - if [[ "$(uname -s)" == "Linux" ]]; then - ip_address=$(ip route get 1 2>/dev/null | awk '{print $7; exit}' || - ip a 2>/dev/null | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | - grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1' | head -n1) - else - log_error "Скрипт работает только на Linux" - exit 1 - fi - - log_info "Определен IP адрес: $ip_address" - - # База данных хостов в виде пар IP-команда - declare -A hosts=( - ["10.10.35.21"]="cska" - ["10.10.35.22"]="Lokomotiv Kuban" - ["10.10.35.23"]="uralmash" - ["10.10.35.24"]="betcity parma" - ["10.10.35.25"]="avtodor" - ["10.10.35.26"]="zenit" - ["10.10.35.27"]="samara" - ["10.10.35.28"]="mba-mai" - ["10.10.35.29"]="Pari Nizhny Novgorod" - ["10.10.35.30"]="unics" - ) - - # Определение команды по IP - detected_team="${hosts[$ip_address]}" - - # Определение финальной команды (приоритет у аргумента, затем у автоопределения) - if [[ -n "$team_arg" ]]; then - final_team="$team_arg" - log_info "Используется команда из аргумента: $final_team" - elif [[ -n "$detected_team" ]]; then - final_team="$detected_team" - log_info "Используется автоопределенная команда: $final_team" - else - log_error "Не удалось определить команду. Укажите явно через -t" - echo "Доступные команды:" >&2 - for ip in "${!hosts[@]}"; do - echo " $ip: ${hosts[$ip]}" >&2 - done - exit 1 - fi - - # Возвращаем только чистую строку с названием команды (без цветовых кодов) - echo "$final_team" -} - # Функция настройки firewall setup_firewall() { log_info "Настройка firewall (открытие порта 8000)..." # Проверяем наличие ufw if command -v ufw &> /dev/null && systemctl is-active --quiet ufw; then - ufw allow 8000/tcp - log_info "Порт 8000 открыт в ufw" + if ufw allow 8000/tcp; then + log_info "Порт 8000 открыт в ufw" + else + log_warn "Не удалось открыть порт 8000 в ufw" + fi fi # Для firewalld (CentOS/RHEL) if command -v firewall-cmd &> /dev/null && systemctl is-active --quiet firewalld; then - firewall-cmd --permanent --add-port=8000/tcp - firewall-cmd --reload - log_info "Порт 8000 открыт в firewalld" + if firewall-cmd --permanent --add-port=8000/tcp && firewall-cmd --reload; then + log_info "Порт 8000 открыт в firewalld" + else + log_warn "Не удалось открыть порт 8000 в firewalld" + fi fi } @@ -303,9 +303,9 @@ check_port() { local port=8000 local occupied=false - if command -v netstat &> /dev/null && netstat -tuln 2>/dev/null | grep ":$port " > /dev/null; then + if command -v netstat &> /dev/null && netstat -tuln 2>/dev/null | grep -q ":$port "; then occupied=true - elif command -v ss &> /dev/null && ss -tuln 2>/dev/null | grep ":$port " > /dev/null; then + elif command -v ss &> /dev/null && ss -tuln 2>/dev/null | grep -q ":$port "; then occupied=true fi @@ -322,30 +322,42 @@ manage_services() { case $action in "start") - log_info "Запуск сервиса khl-data.service..." - systemctl start khl-data.service + log_info "Запуск сервиса $SERVICE_NAME..." + if ! systemctl start "$SERVICE_NAME"; then + log_error "Ошибка при запуске сервиса" + return 1 + fi ;; "restart") - log_info "Перезапуск сервиса khl-data.service..." - systemctl restart khl-data.service + log_info "Перезапуск сервиса $SERVICE_NAME..." + if ! systemctl restart "$SERVICE_NAME"; then + log_error "Ошибка при перезапуске сервиса" + return 1 + fi ;; "stop") - log_info "Остановка сервиса khl-data.service..." - systemctl stop khl-data.service + log_info "Остановка сервиса $SERVICE_NAME..." + if ! systemctl stop "$SERVICE_NAME"; then + log_error "Ошибка при остановке сервиса" + return 1 + fi ;; esac # Даем время сервису на запуск/остановку sleep 3 + return 0 } # Функция проверки статуса сервиса check_service_status() { - log_info "Статус сервиса khl-data.service:" - if systemctl is-active khl-data.service; then - systemctl status khl-data.service --no-pager -l + log_info "Статус сервиса $SERVICE_NAME:" + if systemctl is-active "$SERVICE_NAME" &>/dev/null; then + systemctl status "$SERVICE_NAME" --no-pager -l + return 0 else - log_warn "Сервис khl-data.service не запущен" + log_warn "Сервис $SERVICE_NAME не запущен" + return 1 fi } @@ -360,7 +372,12 @@ check_system() { fi # Проверка свободного места - local available_space=$(df /root --output=avail | tail -1) + local available_space + available_space=$(df "$TARGET_DIR" --output=avail 2>/dev/null | tail -1) + if [ -z "$available_space" ]; then + available_space=$(df / --output=avail | tail -1) + fi + if [ "$available_space" -lt 1048576 ]; then # Меньше 1GB log_warn "Мало свободного места: $((available_space / 1024)) MB" else @@ -368,39 +385,46 @@ check_system() { fi # Проверка памяти - local total_mem=$(grep MemTotal /proc/meminfo | awk '{print $2}') - log_info "Оперативная память: $((total_mem / 1024)) MB" + if [ -f /proc/meminfo ]; then + local total_mem + total_mem=$(grep MemTotal /proc/meminfo | awk '{print $2}') + log_info "Оперативная память: $((total_mem / 1024)) MB" + fi + + # Проверка архитектуры + log_info "Архитектура: $(uname -m)" +} + +# Функция очистки при прерывании +cleanup() { + log_info "Очистка..." + if [ -f "/etc/systemd/system/$SERVICE_NAME" ]; then + manage_services "stop" + systemctl disable "$SERVICE_NAME" 2>/dev/null || true + rm -f "/etc/systemd/system/$SERVICE_NAME" + systemctl daemon-reload + fi } # Основная функция main() { - local team="" local release="main" # значение по умолчанию - local league="" # переменная для лиги # Обработка аргументов командной строки - while getopts "t:r:l:h" opt; do + while getopts "r:h" opt; do case $opt in - t) team="$OPTARG" ;; r) release="$OPTARG" ;; - l) league="$OPTARG" ;; h) show_help ;; *) log_error "Неверный аргумент"; exit 1 ;; esac done - - # Проверка обязательных аргументов - if [ -z "$team" ] && [ -z "$release" ]; then - log_error "Необходимо указать команду (-t) и релиз (-r)" - show_help - fi - - log_info "Начало установки khl Data Service..." - log_info "Команда: $team, Релиз: $release" - if [ -n "$league" ]; then - log_info "Лига: $league" + + log_info "Начало установки KHL Data Service..." + if [ -n "$release" ]; then + log_info "Релиз: $release" else - log_info "Лига: не указана (будет использовано значение по умолчанию)" + log_info "Релиз: не указан (будет использовано значение по умолчанию: main)" + release="main" fi # Проверка прав root @@ -409,9 +433,15 @@ main() { exit 1 fi + # Установка обработчика прерывания + trap 'log_error "Прервано пользователем"; cleanup; exit 1' INT TERM + # Проверка системы check_system + # Проверка зависимостей + check_dependencies + # Установка пакетов install_packages @@ -424,16 +454,6 @@ main() { # Настройка виртуального окружения setup_venv - # Определение команды - ТЕПЕРЬ БЕЗ временного файла - final_team=$(detect_team "$team") - log_info "Финальная команда: '$final_team'" - - # Проверка что команда не пустая и не содержит спецсимволов - if [[ -z "$final_team" || "$final_team" =~ [^a-zA-Z0-9[:space:]-] ]]; then - log_error "Некорректное название команды: '$final_team'" - exit 1 - fi - # Настройка firewall setup_firewall @@ -441,46 +461,46 @@ main() { check_port # Создание systemd сервиса - create_systemd_service "$final_team" "$league" + create_systemd_service log_info "Настройка завершена!" # Запуск сервиса - manage_services "start" + if manage_services "start"; then + log_info "Сервис успешно запущен" + else + log_error "Не удалось запустить сервис" + exit 1 + fi # Проверка статуса check_service_status # Получаем IP для вывода + local ip_address ip_address=$(ip route get 1 2>/dev/null | awk '{print $7; exit}' || ip a 2>/dev/null | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1' | head -n1) log_info "==================================================" log_info "Установка завершена успешно!" - log_info "Команда: $final_team" - if [ -n "$league" ]; then - log_info "Лига: $league" - fi - log_info "Режим: $release" + log_info "Релиз: $release" + log_info "Рабочая директория: $TARGET_DIR" log_info "" log_info "Для просмотра логов:" - log_info " journalctl -u khl-data.service -f" + log_info " journalctl -u $SERVICE_NAME -f" log_info "" log_info "Управление сервисом:" - log_info " Перезапуск: systemctl restart khl-data.service" - log_info " Остановка: systemctl stop khl-data.service" - log_info " Статус: systemctl status khl-data.service" - log_info " Логи: journalctl -u khl-data.service" + log_info " Перезапуск: systemctl restart $SERVICE_NAME" + log_info " Остановка: systemctl stop $SERVICE_NAME" + log_info " Статус: systemctl status $SERVICE_NAME" + log_info " Логи: journalctl -u $SERVICE_NAME" log_info "" log_info "Проверка работы:" log_info " Проверить процессы: ps aux | grep get_data.py" - log_info " Проверить логи: tail -f /root/KHL/logs/*.log 2>/dev/null || echo 'Директория логов не найдена'" + log_info " Проверить логи: tail -f $TARGET_DIR/logs/*.log 2>/dev/null || echo 'Директория логов не найдена'" log_info "==================================================" } -# Обработка прерывания -trap 'log_error "Прервано пользователем"; exit 1' INT TERM - # Запуск основной функции main "$@" \ No newline at end of file From 17b1c9de8b90d160e82a8945c830bc284df29a51 Mon Sep 17 00:00:00 2001 From: Alexey Barabanov Date: Mon, 10 Nov 2025 14:38:39 +0300 Subject: [PATCH 3/7] VER1.1 --- __pycache__/smb_excel.cpython-312.pyc | Bin 4960 -> 4963 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/__pycache__/smb_excel.cpython-312.pyc b/__pycache__/smb_excel.cpython-312.pyc index b9691a7f5395f5bfdf880a726a43c11074769840..5c270735bcaa9cb4573d63d49e62162d97c6697d 100644 GIT binary patch delta 97 zcmaE$_E?SgG%qg~0}wpgDVXW8k=KEVTTH(wKfgrZ+rvkHa}?7;MwVZUF~2tdXVzt5 z{54sZkLBd-G!uY|KzjB|cUYK*ssPt4{BriF|ww-{q?ZT`!w x%ffhTvNp$ifo!0L28It(43a7fA}@>UPuAx&W@eBu*qq9FiJkG*W(z@WCIEA<9HIaK From 78e28eaa9235dc254f6290b930607ca4930773a9 Mon Sep 17 00:00:00 2001 From: Alexey Barabanov Date: Mon, 10 Nov 2025 14:41:02 +0300 Subject: [PATCH 4/7] add dotenv_path="/mnt/khl/.env" --- get_data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/get_data.py b/get_data.py index 4cc8e63..a2b93cd 100644 --- a/get_data.py +++ b/get_data.py @@ -25,7 +25,7 @@ _stop_event = Event() _worker_thread: Thread | None = None # Загружаем переменные из .env -load_dotenv() +load_dotenv(dotenv_path="/mnt/khl/.env") api_user = os.getenv("API_USER") api_pass = os.getenv("API_PASS") league = os.getenv("LEAGUE") From 5894d2d8a528a651231c0a9535e2023885749191 Mon Sep 17 00:00:00 2001 From: Alexey Barabanov Date: Mon, 10 Nov 2025 14:48:44 +0300 Subject: [PATCH 5/7] =?UTF-8?q?=D0=9D=D0=B5=D0=BC=D0=BD=D0=BE=D0=B3=D0=BE?= =?UTF-8?q?=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=B2=20=D0=BA=D0=B0=D1=87=D0=B5=D1=81=D1=82=D0=B2=D0=B5=20?= =?UTF-8?q?=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81=D0=B0=20=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=BB=D0=B8=D0=BD=D1=83=D0=BA=D1=81=D0=B5.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __pycache__/get_data.cpython-312.pyc | Bin 35507 -> 35583 bytes __pycache__/smb_excel.cpython-312.pyc | Bin 4963 -> 4922 bytes get_data.py | 2 +- requirements.txt | 3 ++- smb_excel.py | 2 +- 5 files changed, 4 insertions(+), 3 deletions(-) diff --git a/__pycache__/get_data.cpython-312.pyc b/__pycache__/get_data.cpython-312.pyc index 6d4df545e5241ade3224bdc6a161668e00aa63d7..85bfb8a5dc6aff0009631ea0ff6ac7f7b987ee3b 100644 GIT binary patch delta 5853 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 U{o;5~vtW%4KJsQRvIZ`pQAf%9QI z)4INH7f5@3w!Ydhn8Ik=Y?uk#Ew1k19?4a#zmb5OTB7P=tG541++5XlrsrvZnzB>p5T zfO29_N!gJN^>4fXX^(Qcz*TN>hi83?b0gR>4&Tg^ej>JXZrnW$?tRCfW<_Y4dq8U? z`J9}UBl4(ZLXto-0AUhnpnOpc;l%#ohJ5Bj2h!q#~askIzN+&7~_>yFtKL`mJsd=_|YM$XvX?!h7he8KMN$7LnDHvP+ zHr9wUTr)Qla$7HvoLsUllcIcLEl$Nn?6`=S!2;)y&dX1FQR??rxK%KT?#el%=mei0Q_e*nx(x(omS delta 932 zcmZuuO=uHA6rRa$Hk+T#?zS~aYnnzhDcjN()I;$PsTREmh2CTZ$0$vL40phi$59o-pqURzW2VF_on#0XnZh? z7=iWewOzZqZj92^^~t%lhF;PsVT7smXek!#@lrfQt`HXP5T^0O3k6w(lnfT(Nv89p ztFmZEEtxC^ejJbh7=R?e1X$dHJca9{z;i8TL$=L^*f1MmM>Z6ef}B2YZ4glhO1h(! zh6YeFKph1PZb{t{HU`Y$1E$K3Zm5Ut25^@S^=3h@%9GsUBd&tF5p0}m5DUAZz|(o` z))a*QS#E~qplRxk>P*Ndbk=rg&se^;aH;8eyxOicJ^7wK$l>n`G&;Z!gXxejsxHhR z-gQGSY0-vrk2d@e?D@Q~&^60mQ#2~|+Ff35RoXX2PM%e-Q&VoJyXQ|}MtsHRWv^Xt zly9Hx88yGmY62RU+trq%2yEAjRQqCj(Z$s&Z=onhmv1AvF;T#K74Lma%^xgbJ=Qkk z#~~uHi70fRYr|B&i;RavL2gGr>i8BXD(2*;aCRanBPK9&8jK$W^Scy0MDFR2sM)+iB^J{`HABo{g*=*5Xim#xi3}~s{lql2x>@5D{Zo?soO~Al zKl!OSIUu@cI@FRWtFGaXJ8AjQDlXW5=0.115.0 uvicorn>=0.30.0 requests>=2.31.0 python-telegram-handler -python-dotenv>=1.1.0 \ No newline at end of file +python-dotenv>=1.1.0 +lxml \ No newline at end of file diff --git a/smb_excel.py b/smb_excel.py index c28478c..acb7b85 100644 --- a/smb_excel.py +++ b/smb_excel.py @@ -1,7 +1,7 @@ # smb_excel.py (обновлённый фрагмент) from io import BytesIO from typing import Optional, Union, Any, Dict -from smb.SMBConnection import SMBConnection +#from smb.SMBConnection import SMBConnection import pandas as pd import re From e81eb5b0fcdee9a853cfe5b788d614ebac67aea7 Mon Sep 17 00:00:00 2001 From: Alexey Barabanov Date: Mon, 10 Nov 2025 16:46:00 +0300 Subject: [PATCH 6/7] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=BD=D0=BE=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=20=D1=84?= =?UTF-8?q?=D0=B0=D0=B9=D0=BB=D0=B0=20=D0=BE=D0=BA=D1=80=D1=83=D0=B6=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- get_data.py | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index c48f48e..e4480fa 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ .env /.venv /logs/* -/__pycache__ \ No newline at end of file +*/__pycache__ \ No newline at end of file diff --git a/get_data.py b/get_data.py index 19e5746..fa21e2b 100644 --- a/get_data.py +++ b/get_data.py @@ -25,7 +25,13 @@ _stop_event = Event() _worker_thread: Thread | None = None # Загружаем переменные из .env -load_dotenv(dotenv_path="/mnt/khl/.env") +if load_dotenv(dotenv_path="/mnt/khl/.env",verbose=True): + print("Добавить в лог что был найден файл окружения!!") + pass +else: + load_dotenv() + print("Добавить в лог что не был найден файл окружения!!") + api_user = os.getenv("API_USER") api_pass = os.getenv("API_PASS") league = os.getenv("LEAGUE") From fb12719e60b5931b5861c30a93a0ae95c4d1d366 Mon Sep 17 00:00:00 2001 From: Alexey Barabanov Date: Mon, 10 Nov 2025 16:59:53 +0300 Subject: [PATCH 7/7] add python-dotenv --- .gitignore | 2 +- requirements.txt | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index e4480fa..c48f48e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ .env /.venv /logs/* -*/__pycache__ \ No newline at end of file +/__pycache__ \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 8b173bb..f91e978 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,4 +6,5 @@ uvicorn>=0.30.0 requests>=2.31.0 python-telegram-handler python-dotenv>=1.1.0 -lxml \ No newline at end of file +lxml +python-dotenv \ No newline at end of file