diff --git a/setup.sh b/setup.sh index e665d9f..1c1909e 100755 --- a/setup.sh +++ b/setup.sh @@ -88,6 +88,40 @@ download_code() { log_info "Текущая ветка: $(git branch --show-current)" } +# Функция обновления requirements.txt +update_requirements() { + local target_dir="/root/RFB" + cd $target_dir + + log_info "Обновление requirements.txt..." + + # Создаем или обновляем requirements.txt + if [ ! -f "requirements.txt" ]; then + log_warn "requirements.txt не найден, создаем новый..." + cat > requirements.txt << EOF +streamlit>=1.28.0 +requests>=2.31.0 +pandas>=2.0.0 +numpy>=1.24.0 +plotly>=5.15.0 +watchdog>=3.0.0 +pillow>=10.0.0 +streamlit_autorefresh>=0.1.7 +EOF + else + # Проверяем, есть ли streamlit_autorefresh в requirements.txt + if ! grep -q "streamlit_autorefresh" requirements.txt; then + log_info "Добавляем streamlit_autorefresh в requirements.txt..." + echo "streamlit_autorefresh>=0.1.7" >> requirements.txt + else + log_info "streamlit_autorefresh уже есть в requirements.txt" + fi + fi + + log_info "Содержимое requirements.txt:" + cat requirements.txt +} + # Функция настройки виртуального окружения setup_venv() { local target_dir="/root/RFB" @@ -107,16 +141,22 @@ setup_venv() { # Обновление pip pip install --upgrade pip + # Обновляем requirements.txt перед установкой + update_requirements + if [ -f "requirements.txt" ]; then log_info "Установка зависимостей из requirements.txt..." pip install -r requirements.txt else log_warn "Файл requirements.txt не найден, устанавливаем базовые зависимости..." - pip install streamlit requests pandas numpy plotly + pip install streamlit requests pandas numpy plotly watchdog pillow streamlit_autorefresh fi - # Установка дополнительных зависимостей которые могут понадобиться - pip install watchdog pillow streamlit_autorefresh + # Дополнительная проверка и установка streamlit_autorefresh на всякий случай + if ! python -c "import streamlit_autorefresh" 2>/dev/null; then + log_info "Устанавливаем streamlit_autorefresh..." + pip install streamlit_autorefresh + fi # Проверка установки streamlit if ! [ -f ".venv/bin/streamlit" ]; then @@ -124,54 +164,74 @@ setup_venv() { exit 1 fi + log_info "Проверка установленных пакетов:" + python -c " +import streamlit, requests, pandas, numpy, plotly, streamlit_autorefresh +print('✓ Все основные пакеты успешно импортируются') +" + log_info "Установленные пакеты:" - pip list --format=columns + pip list --format=columns | grep -E "(streamlit|requests|pandas|numpy|plotly|autorefresh)" } -# Функция создания systemd сервиса -create_systemd_service() { +# Функция создания systemd сервисов +create_systemd_services() { local team="$1" - local service_file="/etc/systemd/system/rfb-stat.service" - log_info "Создание systemd сервиса для команды: $team..." + log_info "Создание отдельных systemd сервисов..." - # Останавливаем сервис если он уже запущен - if systemctl is-active --quiet rfb-stat.service; then - log_info "Остановка работающего сервиса..." - systemctl stop rfb-stat.service - fi + # Останавливаем и отключаем старые сервисы если они есть + for service in rfb-data.service rfb-visual.service rfb-stat.service; do + if systemctl is-active --quiet $service; then + log_info "Остановка $service..." + systemctl stop $service + fi + if systemctl is-enabled --quiet $service; then + log_info "Отключение $service..." + systemctl disable $service + fi + done - # Отключаем сервис если он включен - if systemctl is-enabled --quiet rfb-stat.service; then - log_info "Отключение сервиса..." - systemctl disable rfb-stat.service - fi + # Сервис для data + local data_service_file="/etc/systemd/system/rfb-data.service" - # Создаем запускаемый скрипт для избежания проблем с кавычками - local startup_script="/root/RFB/start_rfb.sh" - - cat > $startup_script << EOF -#!/bin/bash -cd /root/RFB -source /root/RFB/.venv/bin/activate -python3 get_data.py --team $team & -streamlit run visual.py --server.port 8501 --server.address 0.0.0.0 -EOF - - chmod +x $startup_script - - cat > $service_file << EOF + cat > $data_service_file << EOF [Unit] -Description=RFB Stat v.1.0 +Description=RFB Data Service After=network.target [Service] Type=simple User=root WorkingDirectory=/root/RFB -ExecStart=$startup_script +Environment=PATH=/root/RFB/.venv/bin +ExecStart=/root/RFB/.venv/bin/python3 get_data.py --team $team Restart=always -RestartSec=3 +RestartSec=10 +StandardOutput=journal +StandardError=journal + +[Install] +WantedBy=multi-user.target +EOF + + # Сервис для visual + local visual_service_file="/etc/systemd/system/rfb-visual.service" + + cat > $visual_service_file << EOF +[Unit] +Description=RFB Visual Service +After=network.target +Wants=rfb-data.service + +[Service] +Type=simple +User=root +WorkingDirectory=/root/RFB +Environment=PATH=/root/RFB/.venv/bin +ExecStart=/root/RFB/.venv/bin/streamlit run visual.py --server.port 8501 --server.address 0.0.0.0 +Restart=always +RestartSec=10 StandardOutput=journal StandardError=journal @@ -180,13 +240,13 @@ WantedBy=multi-user.target EOF # Настройка прав - chmod 644 $service_file + chmod 644 $data_service_file $visual_service_file log_info "Перезагрузка systemd демонов..." systemctl daemon-reload - log_info "Включение сервиса..." - systemctl enable rfb-stat.service + log_info "Включение сервисов..." + systemctl enable rfb-data.service rfb-visual.service } # Функция проверки файлов @@ -212,9 +272,6 @@ check_required_files() { fi log_info "Все необходимые файлы присутствуют" - - # Проверка прав на выполнение - chmod +x visual.py get_data.py } # Функция определения IP и команды @@ -299,27 +356,37 @@ check_port() { return 0 } -# Функция управления сервисом -manage_service() { +# Функция управления сервисами +manage_services() { local action="$1" case $action in "start") - log_info "Запуск сервиса..." - systemctl start rfb-stat.service + log_info "Запуск сервисов..." + systemctl start rfb-data.service rfb-visual.service ;; "restart") - log_info "Перезапуск сервиса..." - systemctl restart rfb-stat.service + log_info "Перезапуск сервисов..." + systemctl restart rfb-data.service rfb-visual.service ;; "stop") - log_info "Остановка сервиса..." - systemctl stop rfb-stat.service + log_info "Остановка сервисов..." + systemctl stop rfb-data.service rfb-visual.service ;; esac - # Даем время сервису на запуск/остановку - sleep 2 + # Даем время сервисам на запуск/остановку + sleep 3 +} + +# Функция проверки статуса сервисов +check_services_status() { + log_info "Статус сервисов:" + echo "=== RFB Data Service ===" + systemctl status rfb-data.service --no-pager + echo "" + echo "=== RFB Visual Service ===" + systemctl status rfb-visual.service --no-pager } # Основная функция @@ -367,18 +434,16 @@ main() { # Проверка порта check_port - # Создание systemd сервиса - create_systemd_service "$final_team" + # Создание systemd сервисов + create_systemd_services "$final_team" log_info "Настройка завершена!" - # Запуск сервиса - manage_service "start" + # Запуск сервисов + manage_services "start" # Проверка статуса - sleep 3 - log_info "Статус сервиса:" - systemctl status rfb-stat.service --no-pager + check_services_status # Получаем IP еще раз для вывода ip_address=$(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) @@ -389,9 +454,14 @@ main() { log_info "Команда: $final_team" log_info "Режим: $release" log_info "" - log_info "Для просмотра логов: journalctl -u rfb-stat.service -f" - log_info "Для перезапуска: systemctl restart rfb-stat.service" - log_info "Для остановки: systemctl stop rfb-stat.service" + log_info "Для просмотра логов:" + log_info " Данные: journalctl -u rfb-data.service -f" + log_info " Визуал: journalctl -u rfb-visual.service -f" + log_info "" + log_info "Управление сервисами:" + log_info " Перезапуск всех: systemctl restart rfb-data.service rfb-visual.service" + log_info " Остановка всех: systemctl stop rfb-data.service rfb-visual.service" + log_info " Статус: systemctl status rfb-data.service rfb-visual.service" log_info "==================================================" } diff --git a/start_rfb.sh b/start_rfb.sh deleted file mode 100755 index 5baa611..0000000 --- a/start_rfb.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -cd /root/RFB -source /root/RFB/.venv/bin/activate -python3 get_data.py --team [INFO] Определен IP адрес: 10.10.35.29 -[INFO] Используется автоопределенная команда: Pari_Nizhny_Novgorod -Pari_Nizhny_Novgorod & -streamlit run visual.py --server.port 8501 --server.address 0.0.0.0