From 1f071cdaa691a8991907529ca5c545c56bd052ce Mon Sep 17 00:00:00 2001 From: Ochenstarik Date: Tue, 14 Jul 2026 12:31:06 +0700 Subject: [PATCH] Add GitHub server deployment guide --- README.md | 86 +++++++++++++++++++++++++++++++++++++++++++----------- install.sh | 17 ++++++++++- 2 files changed, 85 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index a6042de..2fa91c2 100644 --- a/README.md +++ b/README.md @@ -20,40 +20,92 @@ - SQLite в режиме WAL и защита от повторного дневного отчёта; - готовый Docker-запуск на сервере. -## Автоматическая установка на сервер +## Развёртывание на сервере из GitHub -Для Ubuntu или Debian используйте интерактивный установщик `install.sh`. Он скачивает актуальную копию проекта с публичной папки Яндекс.Диска, при необходимости устанавливает Docker, спрашивает токен и настройки отчётов, после чего запускает бота. +Ниже приведён готовый вариант для чистого сервера с Ubuntu 22.04/24.04 или Debian 12. Установщик сам поставит Docker и Docker Compose, запросит настройки и запустит бота с автоматическим перезапуском. -Скопируйте `install.sh` на сервер и выполните: +### 1. Подготовьте доступ к приватному репозиторию + +Репозиторий приватный, поэтому серверу нужен SSH-ключ. На сервере выполните: ```bash +sudo apt update +sudo apt install -y git openssh-client +ssh-keygen -t ed25519 -C "finance-bot-server" +cat ~/.ssh/id_ed25519.pub +``` + +При создании ключа можно нажимать `Enter`, оставляя предлагаемые значения. Скопируйте строку, которую показала последняя команда. Откройте репозиторий в GitHub и добавьте ключ: **Settings → Deploy keys → Add deploy key**. Галочку **Allow write access** не включайте — серверу достаточно доступа на чтение только к этому репозиторию. + +Проверьте подключение: + +```bash +ssh -T git@github.com +``` + +При первом подключении ответьте `yes`. Сообщение GitHub об успешной аутентификации означает, что доступ настроен. + +### 2. Скачайте и установите бота + +```bash +cd ~ +git clone git@github.com:ochenstarik-ui/finance-telegram-bot.git +cd finance-telegram-bot sudo bash install.sh ``` -Или скачайте сам установщик из публичной папки прямо на сервере: +Во время установки будут запрошены: + +- папка установки — обычно достаточно нажать `Enter`, чтобы использовать `/opt/finance-bot`; +- токен бота, полученный у [@BotFather](https://t.me/BotFather); +- часовой пояс — по умолчанию `Asia/Novosibirsk`; +- время ежедневного отчёта — по умолчанию `21:00`; +- разрешение установить Docker, если его ещё нет. + +Токен при вводе не отображается. Настройки сохраняются в `/opt/finance-bot/.env` с доступом только для root, а база данных — в постоянном Docker-томе. + +### 3. Проверьте запуск ```bash -PUBLIC_URL='https://disk.yandex.ru/d/hhbDTO08CB030Q' -INSTALLER_URL="$(curl -fsSG 'https://cloud-api.yandex.net/v1/disk/public/resources/download' \ - --data-urlencode "public_key=$PUBLIC_URL" --data-urlencode 'path=/install.sh' \ - | python3 -c 'import json,sys; print(json.load(sys.stdin)["href"])')" -curl -fsSL "$INSTALLER_URL" -o install.sh +sudo docker compose -f /opt/finance-bot/compose.yaml ps +sudo docker compose -f /opt/finance-bot/compose.yaml logs --tail=100 finance-bot +``` + +Для просмотра журнала в реальном времени: + +```bash +sudo docker compose -f /opt/finance-bot/compose.yaml logs -f finance-bot +``` + +Выход из просмотра журнала — `Ctrl+C`; бот при этом продолжит работать. + +### Обновление до новой версии + +После появления изменений в GitHub выполните: + +```bash +cd ~/finance-telegram-bot +git pull --ff-only sudo bash install.sh ``` -Установщик спросит: +Установщик предложит сохранить прежний токен. Повторное развёртывание пересоберёт контейнер, но не удалит `.env`, операции и настройки из базы данных. -- папку установки; -- токен, полученный у [@BotFather](https://t.me/BotFather); -- часовой пояс; -- время ежедневного отчёта. - -Повторный запуск обновляет код, но сохраняет `.env` и базу данных в Docker-томе. Публичная ссылка проекта уже записана в скрипте. При необходимости её можно переопределить: +### Управление ботом ```bash -sudo FINANCE_BOT_PUBLIC_URL="https://disk.yandex.ru/d/другая-ссылка" bash install.sh +# Перезапустить +sudo docker compose -f /opt/finance-bot/compose.yaml restart finance-bot + +# Остановить +sudo docker compose -f /opt/finance-bot/compose.yaml stop finance-bot + +# Запустить после остановки +sudo docker compose -f /opt/finance-bot/compose.yaml start finance-bot ``` +Если `install.sh` запустить отдельно, без остальных файлов проекта рядом, он по-прежнему сможет загрузить резервную копию с Яндекс.Диска. + ## Ручной запуск на сервере Понадобятся Docker и Docker Compose. diff --git a/install.sh b/install.sh index f62d3d7..c3e6399 100644 --- a/install.sh +++ b/install.sh @@ -6,6 +6,7 @@ PUBLIC_URL="${FINANCE_BOT_PUBLIC_URL:-https://disk.yandex.ru/d/hhbDTO08CB030Q}" DEFAULT_INSTALL_DIR="/opt/finance-bot" YANDEX_API="https://cloud-api.yandex.net/v1/disk/public/resources/download" TMP_DIR="" +SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" if [[ -t 1 ]]; then BOLD='\033[1m' @@ -203,6 +204,20 @@ except (KeyError, ValueError): info "Проект скачан и проверен" } +locate_project() { + if [[ -f "${SCRIPT_DIR}/compose.yaml" \ + && -f "${SCRIPT_DIR}/Dockerfile" \ + && -f "${SCRIPT_DIR}/pyproject.toml" \ + && -d "${SCRIPT_DIR}/app" ]]; then + DOWNLOADED_PROJECT_DIR="$SCRIPT_DIR" + info "Использую проект из ${SCRIPT_DIR}" + return + fi + + warn "Рядом с установщиком не найден проект — загружаю резервную копию с Яндекс.Диска" + download_project +} + deploy_project() { mkdir -p "$INSTALL_DIR" cp -a "${DOWNLOADED_PROJECT_DIR}/." "$INSTALL_DIR/" @@ -244,7 +259,7 @@ main() { prompt_install_dir prompt_bot_settings install_docker - download_project + locate_project deploy_project }