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

Первый production release: runbook (почти turnkey)

Цель: после подготовки вам останется только:

1) вписать IP/домен/VPN CIDR в env и команды, 2) загрузить данные (STL и наборы для продаж), 3) запустить готовые скрипты.

0) Уже подготовлено в репозитории

  • docker-compose.prod.yml — production stack сервера A.
  • docker-compose.bot.yml — Telegram bot stack сервера B.
  • docs/operations/nginx-prod-template.conf — nginx c bot gateway (8088) и source allow-list.
  • docs/operations/firewall-ufw-server-a.sh
  • docs/operations/firewall-ufw-server-b.sh
  • docs/operations/systemd/konstructorium-a.service
  • docs/operations/systemd/konstructorium-bot.service
  • scripts/release/preflight-prod-check.sh
  • scripts/release/server-a-first-release.sh
  • scripts/release/server-b-first-release.sh
  • scripts/release/sync-data-to-server-b.sh
  • .env.prod.example
  • telegram_bot_service/.env.prod.example

1) Какие endpoint должны быть доступны боту

Снаружи интернета эти endpoint не нужны для пользователей. Доступ бота дается только с доверенного source CIDR/IP к Server A:8088:

  • /api/orders/...
  • /api/models/...
  • /api/profiles/telegram/...
  • /media/... (parts xlsx)

Именно это заложено в nginx-prod-template.conf.

2) Минимум ручных параметров (вписать один раз)

На Server A

  • PUBLIC_DOMAIN (например, shop.example.com)
  • BOT_SOURCE_CIDR (например, 203.0.113.55/32 для одного публичного IP бота)
  • секреты в .env

На Server B

  • SERVER_A_PUBLIC_IP (например, 203.0.113.10)
  • секреты бота в telegram_bot_service/.env

3) Копипаста: Server A

sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg lsb-release git ufw nginx
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
sudo mkdir -p /opt/konstructorium
sudo chown -R "$USER":"$USER" /opt/konstructorium
cd /opt/konstructorium
git clone <YOUR_REPO_URL> .
cp .env.prod.example .env
cp telegram_bot_service/.env.prod.example telegram_bot_service/.env

Заполнить .env:

nano /opt/konstructorium/.env

Старт и настройка:

cd /opt/konstructorium
bash scripts/release/preflight-prod-check.sh
BOT_SOURCE_CIDR=203.0.113.55/32 USE_SSL=0 SSH_PORT=22 bash scripts/release/server-a-first-release.sh

Когда появится домен и сертификат, переключитесь на SSL:

cd /opt/konstructorium
DOMAIN=shop.example.com BOT_SOURCE_CIDR=203.0.113.55/32 USE_SSL=1 SSH_PORT=22 bash scripts/release/server-a-first-release.sh

4) Копипаста: Server B

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
sudo mkdir -p /opt/konstructorium
sudo chown -R "$USER":"$USER" /opt/konstructorium
cd /opt/konstructorium
git clone <YOUR_REPO_URL> .
cp telegram_bot_service/.env.prod.example telegram_bot_service/.env

Заполнить telegram_bot_service/.env (главное — SERVER_A_PUBLIC_IP в URL):

nano /opt/konstructorium/telegram_bot_service/.env

Старт:

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

5) Загрузка данных (то, что вы просили)

Нужно положить:

  • STL: /opt/konstructorium/data/details/stl_files
  • наборы и исходные файлы: /opt/konstructorium/data/...

На Server B желательно держать синхронную копию data/, потому что бот формирует ZIP локально.

Синхронизация с Server A на Server B:

cd /opt/konstructorium
DEST_HOST=bot.example.com SSH_USER=ubuntu SSH_PORT=22 bash scripts/release/sync-data-to-server-b.sh

6) Post-release smoke

curl -I https://shop.example.com
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/

Плюс ручной E2E:

  1. checkout на сайте,
  2. /start в Telegram,
  3. оплата,
  4. проверка ZIP в Telegram и в order_service/media.