diff --git a/install.sh b/install.sh index f6884b7..f96adfb 100644 --- a/install.sh +++ b/install.sh @@ -1,94 +1,94 @@ #!/bin/bash -# Пример использования: ./install.sh --token --user_id +# Пример использования: ./install.sh --token --user_id [--user ] + +set -euo pipefail + +# Цветной вывод для ошибок и инфо +RED='\033[0;31m' +GREEN='\033[0;32m' +NC='\033[0m' # No Color + +log_info() { echo -e "${GREEN}[INFO] $*${NC}"; } +log_error() { echo -e "${RED}[ERROR] $*${NC}" >&2; } -set -e # Проверка и установка python3, pip и venv if ! command -v python3 >/dev/null 2>&1; then - echo "Python3 не найден. Устанавливаю..." + log_info "Python3 не найден. Устанавливаю..." if [ -f /etc/debian_version ]; then sudo apt update && sudo apt install -y python3 elif [ -f /etc/redhat-release ]; then sudo yum install -y python3 else - echo "Неизвестная ОС. Установите python3 вручную." - exit 1 + log_error "Неизвестная ОС. Установите python3 вручную."; exit 1 fi fi if ! python3 -m pip --version >/dev/null 2>&1; then - echo "pip не найден. Устанавливаю..." + log_info "pip не найден. Устанавливаю..." curl -sS https://bootstrap.pypa.io/get-pip.py | sudo python3 fi if ! python3 -m venv --help >/dev/null 2>&1; then - echo "venv не найден. Устанавливаю..." + log_info "venv не найден. Устанавливаю..." if [ -f /etc/debian_version ]; then sudo apt update && sudo apt install -y python3-venv elif [ -f /etc/redhat-release ]; then sudo yum install -y python3-venv else - echo "Неизвестная ОС. Установите python3-venv вручную." - exit 1 + log_error "Неизвестная ОС. Установите python3-venv вручную."; exit 1 fi fi # Парсинг аргументов -while [[ "$#" -gt 0 ]]; do +TOKEN=""; USER_ID=""; EXEC_USER="$(whoami)" +while [[ $# -gt 0 ]]; do case $1 in - --token) - TOKEN="$2" - shift 2 - ;; - --user_id) - USER_ID="$2" - shift 2 - ;; - *) - echo "Неизвестный параметр $1" - exit 1 - ;; + --token) TOKEN="$2"; shift 2 ;; + --user_id) USER_ID="$2"; shift 2 ;; + --user) EXEC_USER="$2"; shift 2 ;; + *) log_error "Неизвестный параметр $1"; exit 1 ;; esac done -if [[ -z "$TOKEN" || -z "$USER_ID" ]]; then - if [[ -z "$TOKEN" ]]; then - read -p "Введите TOKEN: " TOKEN - fi - if [[ -z "$USER_ID" ]]; then - read -p "Введите USER_ID: " USER_ID - fi +# Аргументы из ввода +if [[ -z "$TOKEN" ]]; then + read -p "Введите TOKEN: " TOKEN +fi +if [[ -z "$USER_ID" ]]; then + read -p "Введите USER_ID: " USER_ID fi -# Папка для деплоя +# DEPLOY_DIR DEPLOY_DIR="/opt/server-bot-python" - -# Копируем проект -sudo mkdir -p "$DEPLOY_DIR" -sudo rsync -a --exclude='.git' --exclude='__pycache__' ./ "$DEPLOY_DIR"/ - -# Установка зависимостей 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 + log_error "Файл requirements.txt не найден в $DEPLOY_DIR!"; exit 1 +fi + +# Создание виртуального окружения под EXEC_USER, если не существует if [[ ! -d "$VENV_DIR" ]]; then - python3 -m venv "$VENV_DIR" + log_info "Создаю виртуальное окружение Python..." + sudo -u "$EXEC_USER" python3 -m venv "$VENV_DIR" fi -# Установка pip в venv, если не установлен -if [[ ! -f "$VENV_DIR/bin/pip" ]]; then - "$VENV_DIR/bin/python" -m ensurepip --upgrade || \ - curl -sS https://bootstrap.pypa.io/get-pip.py | "$VENV_DIR/bin/python" -fi +# Установка зависимостей под EXEC_USER +log_info "Устанавливаю зависимости Python..." +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" -# Установка зависимостей в venv -"$VENV_DIR/bin/pip" install --upgrade pip -"$VENV_DIR/bin/pip" install -r "$DEPLOY_DIR/requirements.txt" - -# Создание systemd unit-файла +# Создаем systemd unit-файл SERVICE_FILE="/etc/systemd/system/server-bot-python.service" -sudo bash -c "cat > $SERVICE_FILE" < /dev/null [Unit] Description=Server Bot Python After=network.target @@ -96,17 +96,19 @@ After=network.target [Service] Type=simple WorkingDirectory=$DEPLOY_DIR -ExecStart=$VENV_DIR/bin/python $DEPLOY_DIR/src/main.py --token $TOKEN --user_id $USER_ID +ExecStart=$VENV_DIR/bin/python $DEPLOY_DIR/src/main.py --token $(printf '%q' "$TOKEN") --user_id $(printf '%q' "$USER_ID") Restart=always -User=$(whoami) +User=$EXEC_USER [Install] WantedBy=multi-user.target EOL -# Перезапуск сервиса +log_info "Перезапуск systemd-сервиса..." + sudo systemctl daemon-reload sudo systemctl enable server-bot-python.service sudo systemctl restart server-bot-python.service -echo "Деплой и запуск завершены. Логи: sudo journalctl -u server-bot-python -f" +log_info "Деплой и запуск завершены." +echo "Логи сервиса: sudo journalctl -u server-bot-python -f" \ No newline at end of file