Add GitHub server deployment guide
This commit is contained in:
parent
2ce385554f
commit
1f071cdaa6
2 changed files with 85 additions and 18 deletions
86
README.md
86
README.md
|
|
@ -20,40 +20,92 @@
|
||||||
- SQLite в режиме WAL и защита от повторного дневного отчёта;
|
- SQLite в режиме WAL и защита от повторного дневного отчёта;
|
||||||
- готовый Docker-запуск на сервере.
|
- готовый Docker-запуск на сервере.
|
||||||
|
|
||||||
## Автоматическая установка на сервер
|
## Развёртывание на сервере из GitHub
|
||||||
|
|
||||||
Для Ubuntu или Debian используйте интерактивный установщик `install.sh`. Он скачивает актуальную копию проекта с публичной папки Яндекс.Диска, при необходимости устанавливает Docker, спрашивает токен и настройки отчётов, после чего запускает бота.
|
Ниже приведён готовый вариант для чистого сервера с Ubuntu 22.04/24.04 или Debian 12. Установщик сам поставит Docker и Docker Compose, запросит настройки и запустит бота с автоматическим перезапуском.
|
||||||
|
|
||||||
Скопируйте `install.sh` на сервер и выполните:
|
### 1. Подготовьте доступ к приватному репозиторию
|
||||||
|
|
||||||
|
Репозиторий приватный, поэтому серверу нужен SSH-ключ. На сервере выполните:
|
||||||
|
|
||||||
```bash
|
```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
|
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
|
```bash
|
||||||
PUBLIC_URL='https://disk.yandex.ru/d/hhbDTO08CB030Q'
|
sudo docker compose -f /opt/finance-bot/compose.yaml ps
|
||||||
INSTALLER_URL="$(curl -fsSG 'https://cloud-api.yandex.net/v1/disk/public/resources/download' \
|
sudo docker compose -f /opt/finance-bot/compose.yaml logs --tail=100 finance-bot
|
||||||
--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
|
Для просмотра журнала в реальном времени:
|
||||||
|
|
||||||
|
```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
|
sudo bash install.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
Установщик спросит:
|
Установщик предложит сохранить прежний токен. Повторное развёртывание пересоберёт контейнер, но не удалит `.env`, операции и настройки из базы данных.
|
||||||
|
|
||||||
- папку установки;
|
### Управление ботом
|
||||||
- токен, полученный у [@BotFather](https://t.me/BotFather);
|
|
||||||
- часовой пояс;
|
|
||||||
- время ежедневного отчёта.
|
|
||||||
|
|
||||||
Повторный запуск обновляет код, но сохраняет `.env` и базу данных в Docker-томе. Публичная ссылка проекта уже записана в скрипте. При необходимости её можно переопределить:
|
|
||||||
|
|
||||||
```bash
|
```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.
|
Понадобятся Docker и Docker Compose.
|
||||||
|
|
|
||||||
17
install.sh
17
install.sh
|
|
@ -6,6 +6,7 @@ PUBLIC_URL="${FINANCE_BOT_PUBLIC_URL:-https://disk.yandex.ru/d/hhbDTO08CB030Q}"
|
||||||
DEFAULT_INSTALL_DIR="/opt/finance-bot"
|
DEFAULT_INSTALL_DIR="/opt/finance-bot"
|
||||||
YANDEX_API="https://cloud-api.yandex.net/v1/disk/public/resources/download"
|
YANDEX_API="https://cloud-api.yandex.net/v1/disk/public/resources/download"
|
||||||
TMP_DIR=""
|
TMP_DIR=""
|
||||||
|
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
|
||||||
if [[ -t 1 ]]; then
|
if [[ -t 1 ]]; then
|
||||||
BOLD='\033[1m'
|
BOLD='\033[1m'
|
||||||
|
|
@ -203,6 +204,20 @@ except (KeyError, ValueError):
|
||||||
info "Проект скачан и проверен"
|
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() {
|
deploy_project() {
|
||||||
mkdir -p "$INSTALL_DIR"
|
mkdir -p "$INSTALL_DIR"
|
||||||
cp -a "${DOWNLOADED_PROJECT_DIR}/." "$INSTALL_DIR/"
|
cp -a "${DOWNLOADED_PROJECT_DIR}/." "$INSTALL_DIR/"
|
||||||
|
|
@ -244,7 +259,7 @@ main() {
|
||||||
prompt_install_dir
|
prompt_install_dir
|
||||||
prompt_bot_settings
|
prompt_bot_settings
|
||||||
install_docker
|
install_docker
|
||||||
download_project
|
locate_project
|
||||||
deploy_project
|
deploy_project
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue