Production setup для новичков: домашний Telegram-бот + публичный IP + Google Drive ZIP¶
Этот документ описывает полный запуск проекта в проде для сценария:
- официальный сервер (
Server A) в интернете; - Telegram-бот на домашнем ПК (
Server B), который ходит наServer Aпо публичному IP; - архивы наборов/деталей хранятся как ссылки на ZIP в Google Drive.
1. Что важно понять до старта¶
1.1. Текущая логика бота в проекте¶
В текущем коде telegram_bot_service после оплаты:
- получает
parts_xlsx_file_urlизproduct_service; - читает XLSX;
- ищет STL локально в
data/details/stl_files; - собирает ZIP локально;
- отправляет 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_PASSWORDDB_PASSWORDSECRET_KEYEMAIL_HOST_PASSWORDTELEGRAM_VERIFICATION_SHARED_SECRETBOOTSTRAP_PASSWORDPUBLIC_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>:8088PRODUCT_SERVICE_URL=http://<SERVER_A_PUBLIC_IP>:8088USER_SERVICE_URL=http://<SERVER_A_PUBLIC_IP>:8088TELEGRAM_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¶
Нужно отдельной задачей доработать:
product_service— хранение отдельного поля “delivery zip link”;telegram_bot_service— отправка готового ZIP по ссылке (download + send), без сборки из STL;- 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 (обязательно)¶
- Создайте тестовый заказ на сайте.
- Откройте бота, выполните
/start, введите номер заказа. - Оплатите.
- Проверьте:
payment_statusсменился наpaid;- ZIP отправлен в Telegram;
- 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 с реальной оплатой.