Перейти к содержанию

Production setup для новичков: домашний Telegram-бот + публичный IP + Google Drive ZIP

Этот документ описывает полный запуск проекта в проде для сценария:

  • официальный сервер (Server A) в интернете;
  • Telegram-бот на домашнем ПК (Server B), который ходит на Server A по публичному IP;
  • архивы наборов/деталей хранятся как ссылки на ZIP в Google Drive.

1. Что важно понять до старта

1.1. Текущая логика бота в проекте

В текущем коде telegram_bot_service после оплаты:

  1. получает parts_xlsx_file_url из product_service;
  2. читает XLSX;
  3. ищет STL локально в data/details/stl_files;
  4. собирает ZIP локально;
  5. отправляет ZIP покупателю и загружает его в order_service.

Следствие: если у вас только ссылки на Google Drive ZIP и нет локальных STL/XLSX, текущая выдача файлов ботом работать не будет без доработки кода.

1.2. Два рабочих варианта

  • Вариант A (без доработок, рекомендован для быстрого старта): хранить локальные STL/XLSX (как сейчас ожидает код), Google Drive использовать как дополнительный архив.
  • Вариант B (целевая схема с Google Drive-only): отдельно доработать бота, чтобы он скачивал и отправлял готовые ZIP по ссылке, а не собирал из STL.

Этот runbook ниже покрывает production-инфраструктуру полностью. Для запуска прямо сейчас без кода используйте Вариант A.


2. Целевая сеть и безопасность

2.1. Публично открыто только

  • 80/tcp (HTTP -> redirect)
  • 443/tcp (HTTPS)
  • 22/tcp (SSH)

2.2. Доступ бота к API

  • 8088/tcp на Server A — bot gateway для Server B
  • доступ к 8088 разрешается только с BOT_SOURCE_CIDR (обычно <PUBLIC_BOT_IP>/32)

2.3. Не открывать наружу

  • 8001..8007 (внутренние API)
  • 5433 (PostgreSQL)
  • 6379 (Redis)
  • 3000 (frontend container loopback)

3. Плейсхолдеры (заполните один раз)

Используйте эти значения при копировании команд:

  • <DOMAIN> — ваш домен, например shop.example.com
  • <SERVER_A_PUBLIC_IP> — публичный IP официального сервера
  • <SERVER_A_PUBLIC_IP> — публичный IP официального сервера
  • <BOT_SOURCE_CIDR> — доверенный источник для бота, например 198.51.100.23/32
  • <REPO_URL> — URL вашего git-репозитория

Дополнительно:

  • USE_SSL=0 — первый запуск без домена и сертификатов (HTTP-only).
  • USE_SSL=1 — рабочий режим с доменом и SSL.

4. Шаги на Server A (официальный сервер)

4.1. Установите базовые пакеты

sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg lsb-release git ufw nginx

4.2. Установите Docker и Compose plugin

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo usermod -aG docker "$USER"
newgrp docker
docker --version
docker compose version

4.3. Разверните проект

sudo mkdir -p /opt/konstructorium
sudo chown -R "$USER":"$USER" /opt/konstructorium
cd /opt/konstructorium
git clone <REPO_URL> .

4.4. Подготовьте env

cd /opt/konstructorium
cp .env.prod.example .env
nano .env

Обязательные поля:

  • POSTGRES_PASSWORD
  • DB_PASSWORD
  • SECRET_KEY
  • EMAIL_HOST_PASSWORD
  • TELEGRAM_VERIFICATION_SHARED_SECRET
  • BOOTSTRAP_PASSWORD
  • PUBLIC_DOMAIN=<DOMAIN>
  • BOT_SOURCE_CIDR=<BOT_SOURCE_CIDR>

4.5. Подготовьте директории данных

cd /opt/konstructorium
mkdir -p data/details/stl_files
mkdir -p backups

4.6. Заполните данные

  • STL (для текущей логики бота): data/details/stl_files
  • наборы/исходники: data/...

4.7. Проверка перед запуском

cd /opt/konstructorium
bash scripts/release/preflight-prod-check.sh

4.8. Первый запуск production stack

cd /opt/konstructorium
BOT_SOURCE_CIDR=<BOT_SOURCE_CIDR> USE_SSL=0 SSH_PORT=22 bash scripts/release/server-a-first-release.sh

Это режим bootstrap: сайт доступен по http://<SERVER_A_PUBLIC_IP>, а bot-gateway работает на http://<SERVER_A_PUBLIC_IP>:8088.

4.9. Переключение на SSL (после появления домена)

sudo apt-get install -y certbot python3-certbot-nginx
sudo certbot --nginx -d <DOMAIN>
sudo nginx -t
sudo systemctl restart nginx

После получения сертификата перезапустите скрипт в SSL-режиме:

cd /opt/konstructorium
DOMAIN=<DOMAIN> BOT_SOURCE_CIDR=<BOT_SOURCE_CIDR> USE_SSL=1 SSH_PORT=22 bash scripts/release/server-a-first-release.sh

5. Шаги на Server B (домашний ПК с ботом)

5.1. Установите Docker

sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg lsb-release git ufw
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo usermod -aG docker "$USER"
newgrp docker

5.2. Разверните проект

sudo mkdir -p /opt/konstructorium
sudo chown -R "$USER":"$USER" /opt/konstructorium
cd /opt/konstructorium
git clone <REPO_URL> .
cp telegram_bot_service/.env.prod.example telegram_bot_service/.env

5.3. Настройте bot env

cd /opt/konstructorium
nano telegram_bot_service/.env

Обязательные значения:

  • ORDER_SERVICE_URL=http://<SERVER_A_PUBLIC_IP>:8088
  • PRODUCT_SERVICE_URL=http://<SERVER_A_PUBLIC_IP>:8088
  • USER_SERVICE_URL=http://<SERVER_A_PUBLIC_IP>:8088
  • TELEGRAM_VERIFICATION_SHARED_SECRET=<точно как на Server A>
  • TELEGRAM_BOT_TOKEN=<token>
  • TELEGRAM_PAYMENTS_PROVIDER_TOKEN=<provider_token>

5.4. Подготовьте каталоги данных

cd /opt/konstructorium
mkdir -p data/details/stl_files

5.5. Синхронизируйте данные с Server A (если Вариант A)

На Server A:

cd /opt/konstructorium
DEST_HOST=<SERVER_B_PUBLIC_OR_VPN_HOST> SSH_USER=<USER_ON_B> SSH_PORT=22 bash scripts/release/sync-data-to-server-b.sh

5.6. Запустите бота

cd /opt/konstructorium
bash scripts/release/server-b-first-release.sh

6. Проверка связности по публичному IP

На Server B:

curl -i http://<SERVER_A_PUBLIC_IP>:8088/api/orders/

Ожидаемо: HTTP отвечает (может быть 401/403, это нормально).


7. Как использовать Google Drive ZIP в текущей системе

7.1. Что можно сделать уже сейчас

  • хранить “эталонные” ZIP в Google Drive;
  • добавлять ссылки в instructions_link карточек товара;
  • держать локальные STL/XLSX для автоматической выдачи ботом (Вариант A).

7.2. Что требуется для Google Drive-only

Нужно отдельной задачей доработать:

  1. product_service — хранение отдельного поля “delivery zip link”;
  2. telegram_bot_service — отправка готового ZIP по ссылке (download + send), без сборки из STL;
  3. fallback/timeout/retry при недоступности Google Drive.

Без этой доработки production лучше запускать в режиме Вариант A.


8. Финальная проверка после релиза

8.1. Технический smoke

На Server A:

docker compose -f /opt/konstructorium/docker-compose.prod.yml ps
curl -i http://127.0.0.1:8001/api/health/
curl -i http://127.0.0.1:8002/api/health/
curl -i http://127.0.0.1:8003/api/models/
curl -I https://<DOMAIN>

На Server B:

docker compose -f /opt/konstructorium/docker-compose.bot.yml ps
docker compose -f /opt/konstructorium/docker-compose.bot.yml logs --tail=100 telegram_bot

8.2. Бизнес smoke (обязательно)

  1. Создайте тестовый заказ на сайте.
  2. Откройте бота, выполните /start, введите номер заказа.
  3. Оплатите.
  4. Проверьте:
  5. payment_status сменился на paid;
  6. ZIP отправлен в Telegram;
  7. ZIP сохранен в order_service/media.

9. Откат и бэкап

9.1. Бэкап перед релизом

cd /opt/konstructorium
mkdir -p backups
docker compose -f docker-compose.prod.yml exec -T db pg_dump -U "$POSTGRES_USER" "$POSTGRES_DB" > backups/pre_release_$(date +%F_%H%M).sql

9.2. Быстрый rollback

cd /opt/konstructorium
git fetch --all
git checkout <PREVIOUS_STABLE_TAG_OR_COMMIT>
docker compose -f docker-compose.prod.yml up -d --build

10. Чеклист “готово к прод”

  • [ ] 8088 доступен только из BOT_SOURCE_CIDR.
  • [ ] Бот видит Server A по публичному IP.
  • [ ] В интернет не открыты внутренние порты сервисов.
  • [ ] Секреты заполнены, CHANGE_ME_* не осталось.
  • [ ] Данные (data/) загружены и синхронизированы.
  • [ ] Пройден E2E smoke с реальной оплатой.