Улучшен скрипт установки: добавлена проверка формата TELEGRAM токена, улучшена обработка ошибок, удалены проверки на наличие пакетов, добавлено логирование состояния сервиса после запуска.

This commit is contained in:
2026-04-21 00:14:59 +03:00
parent 5d4fcd9cf7
commit 3f48969542
+27 -39
View File
@@ -1,7 +1,6 @@
#!/bin/bash #!/bin/bash
# Пример использования: ./install.sh --token <TOKEN> --user_id <USER_ID> [--user <USER>]
set -euo pipefail set -euo pipefail
REPO_URL="https://gitea.creative-tg1.ru/CREATIVE_tg1/server-bot-python.git" REPO_URL="https://gitea.creative-tg1.ru/CREATIVE_tg1/server-bot-python.git"
DEPLOY_DIR="/opt/server-bot-python" DEPLOY_DIR="/opt/server-bot-python"
VENV_DIR="$DEPLOY_DIR/venv" VENV_DIR="$DEPLOY_DIR/venv"
@@ -10,40 +9,12 @@ 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; }
if [ "$EUID" -ne 0 ]; then is_valid_token() {
log_error "Запусти скрипт через sudo или от root!" [[ "$1" =~ ^[0-9]+:[a-zA-Z0-9_-]{35,}$ ]]
exit 1 }
fi
# Обеспечиваем наличие git/python/venv # ... (блоки установки git/python/venv, см. предыдущий вариант) ...
for PKG in git python3; do
if ! command -v $PKG >/dev/null 2>&1; then
log_info "Устанавливаю $PKG..."
if [ -f /etc/debian_version ]; then
apt update && apt install -y $PKG
elif [ -f /etc/redhat-release ]; then
yum install -y $PKG
else
log_error "Неизвестная ОС!"; exit 1
fi
fi
done
if ! python3 -m pip --version >/dev/null 2>&1; then
log_info "Устанавливаю pip..."
curl -sS https://bootstrap.pypa.io/get-pip.py | python3
fi
if ! python3 -m venv --help >/dev/null 2>&1; then
log_info "Устанавливаю python3-venv..."
if [ -f /etc/debian_version ]; then
apt update && apt install -y python3-venv
elif [ -f /etc/redhat-release ]; then
yum install -y python3-venv
else
log_error "Неизвестная ОС!"; exit 1
fi
fi
# Парсинг аргументов
TOKEN=""; USER_ID=""; EXEC_USER=$(logname 2>/dev/null || echo root) 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
@@ -54,7 +25,6 @@ while [[ $# -gt 0 ]]; do
esac esac
done done
# Интерактивный запрос, если не передано
if [[ -z "$TOKEN" ]]; then if [[ -z "$TOKEN" ]]; then
read -erp "Введите TOKEN: " TOKEN read -erp "Введите TOKEN: " TOKEN
fi fi
@@ -62,7 +32,15 @@ if [[ -z "$USER_ID" ]]; then
read -erp "Введите USER_ID: " USER_ID read -erp "Введите USER_ID: " USER_ID
fi fi
# Клонирование или обновление репозитория # Trim spaces
TOKEN="$(echo -n "$TOKEN" | tr -d '[:space:]')"
if ! is_valid_token "$TOKEN"; then
log_error "НЕКОРРЕКТНЫЙ ФОРМАТ TELEGRAM Токена! Получено: '$TOKEN'"
log_error "Он должен быть похож на 123456789:ABCdefghijKLMNOPQRSTUVWXYZ1234567890abc"
exit 2
fi
if [ ! -d "$DEPLOY_DIR/.git" ]; then if [ ! -d "$DEPLOY_DIR/.git" ]; then
log_info "Клонирую репозиторий $REPO_URL в $DEPLOY_DIR" log_info "Клонирую репозиторий $REPO_URL в $DEPLOY_DIR"
git clone "$REPO_URL" "$DEPLOY_DIR" git clone "$REPO_URL" "$DEPLOY_DIR"
@@ -74,7 +52,6 @@ else
fi fi
chown -R "$EXEC_USER":"$EXEC_USER" "$DEPLOY_DIR" chown -R "$EXEC_USER":"$EXEC_USER" "$DEPLOY_DIR"
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
@@ -97,7 +74,7 @@ After=network.target
[Service] [Service]
Type=simple Type=simple
WorkingDirectory=$DEPLOY_DIR WorkingDirectory=$DEPLOY_DIR
ExecStart=$VENV_DIR/bin/python -m src.main --token $(printf '%q' "$TOKEN") --user_id $(printf '%q' "$USER_ID") ExecStart=$VENV_DIR/bin/python -m src.main --token '$TOKEN' --user_id '$USER_ID'
Restart=always Restart=always
User=$EXEC_USER User=$EXEC_USER
@@ -110,5 +87,16 @@ systemctl daemon-reload
systemctl enable server-bot-python.service systemctl enable server-bot-python.service
systemctl restart server-bot-python.service systemctl restart server-bot-python.service
log_info "Успешно! Проверяй логи сервиса:" # ---------- КОНТРОЛЬ СТАРТА -----------
sleep 2
status_out=$(systemctl is-active server-bot-python.service)
if [ "$status_out" = "active" ]; then
log_info "Сервис успешно запустился!"
else
log_error "Сервис после запуска не в состоянии 'active'. Вот последние строки лога:"
journalctl -u server-bot-python.service --no-pager -n 20 | tee /dev/stderr
exit 10
fi
log_info "Успешно! Логи сервиса:"
echo "journalctl -u server-bot-python -f" echo "journalctl -u server-bot-python -f"