Улучшен скрипт установки: добавлены цветные сообщения для логирования, улучшена проверка наличия git, python3, pip и venv, устранены привилегии sudo при установке, добавлено обновление репозитория.

This commit is contained in:
2026-04-20 23:57:05 +03:00
parent e85f246ccf
commit c6af4d3cdc
+50 -37
View File
@@ -3,21 +3,40 @@
set -euo pipefail set -euo pipefail
# Цветной вывод для ошибок и инфо REPO_URL="https://gitea.creative-tg1.ru/CREATIVE_tg1/server-bot-python.git"
RED='\033[0;31m' DEPLOY_DIR="/opt/server-bot-python"
GREEN='\033[0;32m' VENV_DIR="$DEPLOY_DIR/venv"
NC='\033[0m' # No Color
GREEN='\033[0;32m'; RED='\033[0;31m'; NC='\033[0m'
log_info() { echo -e "${GREEN}[INFO] $*${NC}"; } log_info() { echo -e "${GREEN}[INFO] $*${NC}"; }
log_error() { echo -e "${RED}[ERROR] $*${NC}" >&2; } log_error() { echo -e "${RED}[ERROR] $*${NC}" >&2; }
# Проверка и установка python3, pip и venv # Проверка на root для установки пакетов и копирования файлов
if [ "$EUID" -ne 0 ]; then
log_error "Пожалуйста, запустите этот скрипт с sudo или от root"
exit 1
fi
# Проверка наличия git (для клонирования)
if ! command -v git >/dev/null 2>&1; then
log_info "git не найден. Устанавливаю..."
if [ -f /etc/debian_version ]; then
apt update && apt install -y git
elif [ -f /etc/redhat-release ]; then
yum install -y git
else
log_error "Неизвестная ОС. Установите git вручную."
exit 1
fi
fi
# Проверка и установка python3, pip и venv (можно оптимизировать как раньше)
if ! command -v python3 >/dev/null 2>&1; then if ! command -v python3 >/dev/null 2>&1; then
log_info "Python3 не найден. Устанавливаю..." log_info "Python3 не найден. Устанавливаю..."
if [ -f /etc/debian_version ]; then if [ -f /etc/debian_version ]; then
sudo apt update && sudo apt install -y python3 apt update && apt install -y python3
elif [ -f /etc/redhat-release ]; then elif [ -f /etc/redhat-release ]; then
sudo yum install -y python3 yum install -y python3
else else
log_error "Неизвестная ОС. Установите python3 вручную."; exit 1 log_error "Неизвестная ОС. Установите python3 вручную."; exit 1
fi fi
@@ -25,22 +44,22 @@ fi
if ! python3 -m pip --version >/dev/null 2>&1; then if ! python3 -m pip --version >/dev/null 2>&1; then
log_info "pip не найден. Устанавливаю..." log_info "pip не найден. Устанавливаю..."
curl -sS https://bootstrap.pypa.io/get-pip.py | sudo python3 curl -sS https://bootstrap.pypa.io/get-pip.py | python3
fi fi
if ! python3 -m venv --help >/dev/null 2>&1; then if ! python3 -m venv --help >/dev/null 2>&1; then
log_info "venv не найден. Устанавливаю..." log_info "venv не найден. Устанавливаю..."
if [ -f /etc/debian_version ]; then if [ -f /etc/debian_version ]; then
sudo apt update && sudo apt install -y python3-venv apt update && apt install -y python3-venv
elif [ -f /etc/redhat-release ]; then elif [ -f /etc/redhat-release ]; then
sudo yum install -y python3-venv yum install -y python3-venv
else else
log_error "Неизвестная ОС. Установите python3-venv вручную."; exit 1 log_error "Неизвестная ОС. Установите python3-venv вручную."; exit 1
fi fi
fi fi
# Парсинг аргументов # Парсинг аргументов
TOKEN=""; USER_ID=""; EXEC_USER="$(whoami)" TOKEN=""; USER_ID=""; EXEC_USER=$(logname 2>/dev/null || echo root)
while [[ $# -gt 0 ]]; do while [[ $# -gt 0 ]]; do
case $1 in case $1 in
--token) TOKEN="$2"; shift 2 ;; --token) TOKEN="$2"; shift 2 ;;
@@ -50,45 +69,39 @@ while [[ $# -gt 0 ]]; do
esac esac
done done
# Аргументы из ввода if [[ -z "$TOKEN" ]]; then read -p "Введите TOKEN: " TOKEN; fi
if [[ -z "$TOKEN" ]]; then if [[ -z "$USER_ID" ]]; then read -p "Введите USER_ID: " USER_ID; fi
read -p "Введите TOKEN: " TOKEN
fi # Клонирование репозитория (или обновление)
if [[ -z "$USER_ID" ]]; then if [ ! -d "$DEPLOY_DIR/.git" ]; then
read -p "Введите USER_ID: " USER_ID log_info "Клонирование репозитория в $DEPLOY_DIR"
git clone "$REPO_URL" "$DEPLOY_DIR"
else
log_info "Репозиторий уже существует. Обновляем..."
cd "$DEPLOY_DIR"
git pull
cd -
fi fi
# DEPLOY_DIR chown -R "$EXEC_USER":"$EXEC_USER" "$DEPLOY_DIR"
DEPLOY_DIR="/opt/server-bot-python"
VENV_DIR="$DEPLOY_DIR/venv"
sudo mkdir -p "$DEPLOY_DIR"
# Устанавливаем владельца. Предполагаем, что EXEC_USER уже существует
sudo chown -R "$EXEC_USER":"$EXEC_USER" "$DEPLOY_DIR"
# Исключаем копирование мусора
rsync -a --exclude='.git' --exclude='__pycache__' ./ "$DEPLOY_DIR"/
# requirements.txt check
if [[ ! -f "$DEPLOY_DIR/requirements.txt" ]]; then if [[ ! -f "$DEPLOY_DIR/requirements.txt" ]]; then
log_error "Файл requirements.txt не найден в $DEPLOY_DIR!"; exit 1 log_error "Файл requirements.txt не найден в $DEPLOY_DIR!"; exit 1
fi fi
# Создание виртуального окружения под EXEC_USER, если не существует # Создание виртуального окружения
if [[ ! -d "$VENV_DIR" ]]; then if [[ ! -d "$VENV_DIR" ]]; then
log_info "Создаю виртуальное окружение Python..." log_info "Создаю виртуальное окружение Python..."
sudo -u "$EXEC_USER" python3 -m venv "$VENV_DIR" sudo -u "$EXEC_USER" python3 -m venv "$VENV_DIR"
fi fi
# Установка зависимостей под EXEC_USER
log_info "Устанавливаю зависимости Python..." log_info "Устанавливаю зависимости Python..."
sudo -u "$EXEC_USER" "$VENV_DIR/bin/pip" install --upgrade pip sudo -u "$EXEC_USER" "$VENV_DIR/bin/pip" install --upgrade pip
sudo -u "$EXEC_USER" "$VENV_DIR/bin/pip" install -r "$DEPLOY_DIR/requirements.txt" sudo -u "$EXEC_USER" "$VENV_DIR/bin/pip" install -r "$DEPLOY_DIR/requirements.txt"
# Создаем systemd unit-файл # systemd unit
SERVICE_FILE="/etc/systemd/system/server-bot-python.service" SERVICE_FILE="/etc/systemd/system/server-bot-python.service"
cat <<EOL > "$SERVICE_FILE"
cat <<EOL | sudo tee "$SERVICE_FILE" > /dev/null
[Unit] [Unit]
Description=Server Bot Python Description=Server Bot Python
After=network.target After=network.target
@@ -106,9 +119,9 @@ EOL
log_info "Перезапуск systemd-сервиса..." log_info "Перезапуск systemd-сервиса..."
sudo systemctl daemon-reload systemctl daemon-reload
sudo systemctl enable server-bot-python.service systemctl enable server-bot-python.service
sudo systemctl restart server-bot-python.service systemctl restart server-bot-python.service
log_info "Деплой и запуск завершены." log_info "Деплой и запуск завершены."
echo "Логи сервиса: sudo journalctl -u server-bot-python -f" echo "Логи сервиса: journalctl -u server-bot-python -f"