Улучшен скрипт установки: добавлены цветные сообщения для логирования, улучшена обработка ошибок, добавлена возможность указания пользователя для выполнения команд, а также добавлена проверка наличия файла requirements.txt.
This commit is contained in:
+54
-52
@@ -1,94 +1,94 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# Пример использования: ./install.sh --token <TOKEN> --user_id <USER_ID>
|
# Пример использования: ./install.sh --token <TOKEN> --user_id <USER_ID> [--user <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
|
# Проверка и установка python3, pip и venv
|
||||||
if ! command -v python3 >/dev/null 2>&1; then
|
if ! command -v python3 >/dev/null 2>&1; then
|
||||||
echo "Python3 не найден. Устанавливаю..."
|
log_info "Python3 не найден. Устанавливаю..."
|
||||||
if [ -f /etc/debian_version ]; then
|
if [ -f /etc/debian_version ]; then
|
||||||
sudo apt update && sudo apt install -y python3
|
sudo apt update && sudo apt install -y python3
|
||||||
elif [ -f /etc/redhat-release ]; then
|
elif [ -f /etc/redhat-release ]; then
|
||||||
sudo yum install -y python3
|
sudo yum install -y python3
|
||||||
else
|
else
|
||||||
echo "Неизвестная ОС. Установите python3 вручную."
|
log_error "Неизвестная ОС. Установите python3 вручную."; exit 1
|
||||||
exit 1
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! python3 -m pip --version >/dev/null 2>&1; then
|
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
|
curl -sS https://bootstrap.pypa.io/get-pip.py | sudo python3
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! python3 -m venv --help >/dev/null 2>&1; then
|
if ! python3 -m venv --help >/dev/null 2>&1; then
|
||||||
echo "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
|
sudo apt update && sudo apt install -y python3-venv
|
||||||
elif [ -f /etc/redhat-release ]; then
|
elif [ -f /etc/redhat-release ]; then
|
||||||
sudo yum install -y python3-venv
|
sudo yum install -y python3-venv
|
||||||
else
|
else
|
||||||
echo "Неизвестная ОС. Установите python3-venv вручную."
|
log_error "Неизвестная ОС. Установите python3-venv вручную."; exit 1
|
||||||
exit 1
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Парсинг аргументов
|
# Парсинг аргументов
|
||||||
while [[ "$#" -gt 0 ]]; do
|
TOKEN=""; USER_ID=""; EXEC_USER="$(whoami)"
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
case $1 in
|
case $1 in
|
||||||
--token)
|
--token) TOKEN="$2"; shift 2 ;;
|
||||||
TOKEN="$2"
|
--user_id) USER_ID="$2"; shift 2 ;;
|
||||||
shift 2
|
--user) EXEC_USER="$2"; shift 2 ;;
|
||||||
;;
|
*) log_error "Неизвестный параметр $1"; exit 1 ;;
|
||||||
--user_id)
|
|
||||||
USER_ID="$2"
|
|
||||||
shift 2
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "Неизвестный параметр $1"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
if [[ -z "$TOKEN" || -z "$USER_ID" ]]; then
|
# Аргументы из ввода
|
||||||
if [[ -z "$TOKEN" ]]; then
|
if [[ -z "$TOKEN" ]]; then
|
||||||
read -p "Введите TOKEN: " TOKEN
|
read -p "Введите TOKEN: " TOKEN
|
||||||
fi
|
fi
|
||||||
if [[ -z "$USER_ID" ]]; then
|
if [[ -z "$USER_ID" ]]; then
|
||||||
read -p "Введите USER_ID: " USER_ID
|
read -p "Введите USER_ID: " USER_ID
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Папка для деплоя
|
# DEPLOY_DIR
|
||||||
DEPLOY_DIR="/opt/server-bot-python"
|
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"
|
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
|
if [[ ! -d "$VENV_DIR" ]]; then
|
||||||
python3 -m venv "$VENV_DIR"
|
log_info "Создаю виртуальное окружение Python..."
|
||||||
|
sudo -u "$EXEC_USER" python3 -m venv "$VENV_DIR"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Установка pip в venv, если не установлен
|
# Установка зависимостей под EXEC_USER
|
||||||
if [[ ! -f "$VENV_DIR/bin/pip" ]]; then
|
log_info "Устанавливаю зависимости Python..."
|
||||||
"$VENV_DIR/bin/python" -m ensurepip --upgrade || \
|
sudo -u "$EXEC_USER" "$VENV_DIR/bin/pip" install --upgrade pip
|
||||||
curl -sS https://bootstrap.pypa.io/get-pip.py | "$VENV_DIR/bin/python"
|
sudo -u "$EXEC_USER" "$VENV_DIR/bin/pip" install -r "$DEPLOY_DIR/requirements.txt"
|
||||||
fi
|
|
||||||
|
|
||||||
# Установка зависимостей в venv
|
# Создаем systemd unit-файл
|
||||||
"$VENV_DIR/bin/pip" install --upgrade pip
|
|
||||||
"$VENV_DIR/bin/pip" install -r "$DEPLOY_DIR/requirements.txt"
|
|
||||||
|
|
||||||
# Создание systemd unit-файла
|
|
||||||
SERVICE_FILE="/etc/systemd/system/server-bot-python.service"
|
SERVICE_FILE="/etc/systemd/system/server-bot-python.service"
|
||||||
|
|
||||||
sudo bash -c "cat > $SERVICE_FILE" <<EOL
|
cat <<EOL | sudo tee "$SERVICE_FILE" > /dev/null
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=Server Bot Python
|
Description=Server Bot Python
|
||||||
After=network.target
|
After=network.target
|
||||||
@@ -96,17 +96,19 @@ After=network.target
|
|||||||
[Service]
|
[Service]
|
||||||
Type=simple
|
Type=simple
|
||||||
WorkingDirectory=$DEPLOY_DIR
|
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
|
Restart=always
|
||||||
User=$(whoami)
|
User=$EXEC_USER
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
EOL
|
EOL
|
||||||
|
|
||||||
# Перезапуск сервиса
|
log_info "Перезапуск systemd-сервиса..."
|
||||||
|
|
||||||
sudo systemctl daemon-reload
|
sudo systemctl daemon-reload
|
||||||
sudo systemctl enable server-bot-python.service
|
sudo systemctl enable server-bot-python.service
|
||||||
sudo systemctl restart 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"
|
||||||
Reference in New Issue
Block a user