From cd832dbc180bb14a68b67dffccb6e5ad02110db4 Mon Sep 17 00:00:00 2001 From: YuraBombitel1 Date: Wed, 12 Aug 2026 14:48:42 +0300 Subject: [PATCH] add deploy --- README.md | 72 +++++++++++++++++++++++++------------------------------ deploy.sh | 60 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+), 40 deletions(-) create mode 100644 deploy.sh diff --git a/README.md b/README.md index 212eb3b..cc83bfa 100644 --- a/README.md +++ b/README.md @@ -4,61 +4,52 @@ Telegram-бот поддержки: пересылает сообщения кл оператора реплаем на сообщение клиента копируется обратно клиенту. Маппинг "сообщение в чате поддержки → чат клиента" хранится в SQLite. -## Деплой (systemd, Linux) +## Быстрый деплой (screen) + +Один скрипт: качает репозиторий прямо в `/opt/support-bot` (без вложенных +папок), ставит зависимости в venv, поднимает бота в screen-сессии. ```bash -# 1. Системный пользователь без shell/home -sudo useradd --system --no-create-home --shell /usr/sbin/nologin support-bot - -# 2. Код -sudo mkdir -p /opt/support-bot -sudo cp support_bot.py requirements.txt /opt/support-bot/ -cd /opt/support-bot -sudo python3 -m venv .venv -sudo ./.venv/bin/pip install -r requirements.txt - -# 3. Конфиг — реальные значения, не то, что лежит в репозитории -sudo cp support-bot.env /etc/support-bot.env -sudo nano /etc/support-bot.env # BOT_TOKEN и SUPPORT_CHAT_ID -sudo chown support-bot:support-bot /etc/support-bot.env -sudo chmod 600 /etc/support-bot.env # там токен бота - -# 4. Каталог под БД -sudo mkdir -p /var/lib/support-bot -sudo chown support-bot:support-bot /var/lib/support-bot - -# 5. Владелец кода -sudo chown -R support-bot:support-bot /opt/support-bot - -# 6. systemd -sudo cp support-bot.service /etc/systemd/system/ -sudo systemctl daemon-reload -sudo systemctl enable --now support-bot +curl -fsSL https://git.twitchmagic.pro/AdministratorEbaka1337/streamhelp-bot/raw/main/deploy.sh | bash ``` -## Проверка +Первый запуск остановится на заполнении `/etc/support-bot.env` — впиши туда +`BOT_TOKEN` и `SUPPORT_CHAT_ID` (см. ниже, как достать) и прогони скрипт ещё +раз. Каждый следующий запуск сам подтягивает свежий код и перезапускает +screen-сессию — этим же скриптом обновляешь бота при новом деплое. ```bash -sudo systemctl status support-bot -sudo journalctl -u support-bot -f +screen -r support-bot # посмотреть логи/вывод бота +# Ctrl+A, D — выйти из сессии, не убивая бота ``` -Отправь `/start` боту в личку — должен прийти шаблонный текст. Затем отправь -любое сообщение — оно должно появиться в чате поддержки (`SUPPORT_CHAT_ID`). -Ответь на него реплаем из чата поддержки — ответ должен прийти клиенту. - ## Как получить SUPPORT_CHAT_ID Добавь бота в чат поддержки, напиши туда любое сообщение и открой: `https://api.telegram.org/bot/getUpdates` — `chat.id` в ответе и есть нужное значение (для групп обычно отрицательное число). -## Обновление кода +## Проверка + +Отправь `/start` боту в личку — должен прийти шаблонный текст. Затем отправь +любое сообщение — оно должно появиться в чате поддержки (`SUPPORT_CHAT_ID`). +Ответь на него реплаем из чата поддержки — ответ должен прийти клиенту. + +## Альтернатива: systemd + +Для постоянной эксплуатации (автозапуск при перезагрузке, автоперезапуск при +падении, отдельный системный пользователь) в репозитории есть готовый unit — +`support-bot.service`. Тот же `deploy.sh` кладёт код и venv в `/opt/support-bot`, +дальше: ```bash -cd /opt/support-bot -sudo -u support-bot ./.venv/bin/pip install -r requirements.txt # если менялись зависимости -sudo systemctl restart support-bot +sudo useradd --system --no-create-home --shell /usr/sbin/nologin support-bot +sudo chown -R support-bot:support-bot /opt/support-bot /var/lib/support-bot +sudo chown support-bot:support-bot /etc/support-bot.env +sudo cp /opt/support-bot/support-bot.service /etc/systemd/system/ +sudo systemctl daemon-reload +sudo systemctl enable --now support-bot +sudo journalctl -u support-bot -f ``` ## Файлы @@ -66,6 +57,7 @@ sudo systemctl restart support-bot - `support_bot.py` — сам бот. - `support-bot.env` — **шаблон** конфига (в репозитории), реальный экземпляр живёт в `/etc/support-bot.env` на сервере и в git не попадает. -- `support-bot.service` — systemd unit. +- `deploy.sh` — деплой в screen (клонирует/обновляет, venv, зависимости, запуск). +- `support-bot.service` — systemd unit, для постоянной эксплуатации. - `requirements.txt` — зависимости (`python-telegram-bot` — используется async API v20+, более старые версии несовместимы с кодом). diff --git a/deploy.sh b/deploy.sh new file mode 100644 index 0000000..96e3448 --- /dev/null +++ b/deploy.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash +# Мобильный деплой support-бота: скачивает репозиторий прямо в целевую папку +# (без вложенной "streamhelp-support-bot/streamhelp-support-bot"), ставит +# зависимости и поднимает бота в screen-сессии. Повторный запуск обновляет код +# и перезапускает сессию — можно гонять этот скрипт при каждом деплое. +# +# Использование: +# curl -fsSL https://.../deploy.sh | bash +# или руками на сервере: +# ./deploy.sh +set -euo pipefail + +REPO_URL="https://git.twitchmagic.pro/AdministratorEbaka1337/streamhelp-bot.git" +APP_DIR="/opt/support-bot" +ENV_FILE="/etc/support-bot.env" +DB_DIR="/var/lib/support-bot" +SESSION="support-bot" + +command -v screen >/dev/null || { echo "Нужен screen: apt install -y screen (или yum/dnf)"; exit 1; } +command -v python3 >/dev/null || { echo "Нужен python3"; exit 1; } +command -v git >/dev/null || { echo "Нужен git"; exit 1; } + +# Клонируем прямо в APP_DIR — без "git clone REPO APP_DIR/streamhelp-bot". +if [ -d "$APP_DIR/.git" ]; then + git -C "$APP_DIR" pull --ff-only +else + mkdir -p "$APP_DIR" + git clone "$REPO_URL" "$APP_DIR" +fi + +cd "$APP_DIR" + +python3 -m venv .venv --upgrade-deps >/dev/null 2>&1 || python3 -m venv .venv +./.venv/bin/pip install -q -r requirements.txt + +mkdir -p "$DB_DIR" + +if [ ! -f "$ENV_FILE" ]; then + cp support-bot.env "$ENV_FILE" + chmod 600 "$ENV_FILE" + echo "!!! Заполни $ENV_FILE (BOT_TOKEN, SUPPORT_CHAT_ID) и запусти скрипт снова." + exit 1 +fi + +if grep -q "ВСТАВЬ_СЮДА_ТОКЕН_БОТА" "$ENV_FILE" || grep -q "SUPPORT_CHAT_ID=0" "$ENV_FILE"; then + echo "!!! $ENV_FILE ещё не заполнен реальными значениями — заполни и перезапусти." + exit 1 +fi + +# Пересоздаём screen-сессию: убиваем старую (если есть) и поднимаем свежую. +screen -S "$SESSION" -X quit >/dev/null 2>&1 || true +screen -dmS "$SESSION" "$APP_DIR/.venv/bin/python" "$APP_DIR/support_bot.py" + +sleep 1 +if screen -list | grep -q "\.$SESSION"; then + echo "Бот запущен в screen-сессии '$SESSION'. Смотреть: screen -r $SESSION (выход из сессии — Ctrl+A, D)." +else + echo "!!! Сессия не поднялась — смотри вывод вручную: cd $APP_DIR && ./.venv/bin/python support_bot.py" + exit 1 +fi