From c1d64f6a79522c7406ffca96042c3a61a1b2ed41 Mon Sep 17 00:00:00 2001 From: Nikolay Unuchek Date: Sat, 17 Oct 2026 17:53:18 +0300 Subject: [PATCH] =?UTF-8?q?chore(deploy):=20=D0=B0=D0=B4=D1=80=D0=B5=D1=81?= =?UTF-8?q?=D0=B0=20=D1=81=D0=B5=D1=80=D0=B2=D0=B5=D1=80=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=B8=D0=B7=20deploy/.env.local,=20=D0=B0=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D0=B8=D0=B7=20=D1=80=D0=B5=D0=BF=D0=BE=D0=B7=D0=B8=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DEPLOY_HOST, RELAY_HOST и TELEGRAM_BOT_ID обязательны и читаются из неотслеживаемого deploy/.env.local (образец — .env.local.example). --- .gitignore | 1 + deploy/.env.local.example | 7 +++++++ deploy/deploy.sh | 7 +++++-- deploy/setup-nginx.sh | 7 +++++-- deploy/tg-relay/deploy.sh | 9 ++++++--- docs/deploy.md | 3 ++- docs/plan.md | 2 +- 7 files changed, 27 insertions(+), 9 deletions(-) create mode 100644 deploy/.env.local.example diff --git a/.gitignore b/.gitignore index e826df3..4695706 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,4 @@ playwright-report/ # бинарник детектора impeccable (16 МБ, ставится `npx impeccable install`) .claude/skills/impeccable/scripts/bin/ .idea/ +!deploy/.env.local.example diff --git a/deploy/.env.local.example b/deploy/.env.local.example new file mode 100644 index 0000000..66188b6 --- /dev/null +++ b/deploy/.env.local.example @@ -0,0 +1,7 @@ +# Скопировать в deploy/.env.local (не коммитится) и заполнить. +# ssh-адрес VPS для deploy.sh и setup-nginx.sh +DEPLOY_HOST=root@ +# ssh-адрес домашнего сервера для tg-relay/deploy.sh +RELAY_HOST=nick@ +# числовая часть токена бота до двоеточия +TELEGRAM_BOT_ID= diff --git a/deploy/deploy.sh b/deploy/deploy.sh index d158feb..9744a23 100755 --- a/deploy/deploy.sh +++ b/deploy/deploy.sh @@ -2,13 +2,16 @@ # Деплой «Кварты» на VPS. Запускать локально из корня репозитория: # deploy/deploy.sh — собрать HEAD и выкатить # deploy/deploy.sh --rollback — вернуть предыдущий тег из /root/kvarta_site/.deployed -# Хост: DEPLOY_HOST (по умолчанию root@185.5.249.52). +# Хост: DEPLOY_HOST из deploy/.env.local или окружения. # # На сервере рядом чужие боевые сайты: скрипт трогает только /root/kvarta_site, # контейнеры проекта kvarta и образы kvarta-landing/kvarta-api. Никаких prune. set -euo pipefail -DEPLOY_HOST="${DEPLOY_HOST:-root@185.5.249.52}" +# адреса серверов в репо не храним: deploy/.env.local (образец — deploy/.env.local.example) +# shellcheck source=/dev/null +[[ -f "$(dirname "$0")/.env.local" ]] && source "$(dirname "$0")/.env.local" +DEPLOY_HOST="${DEPLOY_HOST:?задайте DEPLOY_HOST в deploy/.env.local (см. deploy/.env.local.example)}" REMOTE_DIR=/root/kvarta_site COMPOSE_FILE=docker-compose_vps.yml PROJECT=kvarta diff --git a/deploy/setup-nginx.sh b/deploy/setup-nginx.sh index 7be70f1..2740663 100755 --- a/deploy/setup-nginx.sh +++ b/deploy/setup-nginx.sh @@ -1,13 +1,16 @@ #!/usr/bin/env bash # Однократная настройка nginx и HTTPS для kvarta.unuchak.com. Запускать локально из корня: # CERTBOT_EMAIL=you@example.com deploy/setup-nginx.sh -# Хост: DEPLOY_HOST (по умолчанию root@185.5.249.52). Повторный запуск безопасен. +# Хост: DEPLOY_HOST из deploy/.env.local или окружения. Повторный запуск безопасен. # # На сервере чужие боевые сайты: при ошибке `nginx -t` наш симлинк убирается # и reload не делается — общий nginx не должен упасть из-за нашего конфига. set -euo pipefail -DEPLOY_HOST="${DEPLOY_HOST:-root@185.5.249.52}" +# адреса серверов в репо не храним: deploy/.env.local (образец — deploy/.env.local.example) +# shellcheck source=/dev/null +[[ -f "$(dirname "$0")/.env.local" ]] && source "$(dirname "$0")/.env.local" +DEPLOY_HOST="${DEPLOY_HOST:?задайте DEPLOY_HOST в deploy/.env.local (см. deploy/.env.local.example)}" DOMAIN=kvarta.unuchak.com CONF_SRC="deploy/nginx/$DOMAIN.conf" AVAILABLE="/etc/nginx/sites-available/$DOMAIN" diff --git a/deploy/tg-relay/deploy.sh b/deploy/tg-relay/deploy.sh index 8d18ce6..03339f0 100755 --- a/deploy/tg-relay/deploy.sh +++ b/deploy/tg-relay/deploy.sh @@ -1,11 +1,14 @@ #!/usr/bin/env bash # Ставит ретранслятор Bot API на домашний сервер. Запускать локально из корня: -# TELEGRAM_BOT_ID=8959389487 deploy/tg-relay/deploy.sh -# RELAY_HOST (по умолчанию nick@192.168.100.50), RELAY_BIND — адрес Tailscale хоста (по умолчанию его tailscale ip -4). +# deploy/tg-relay/deploy.sh (TELEGRAM_BOT_ID и RELAY_HOST — в deploy/.env.local) +# RELAY_HOST — ssh-адрес домашнего сервера, RELAY_BIND — адрес Tailscale хоста (по умолчанию его tailscale ip -4). # Токен бота сюда не нужен: ретранслятор только пересылает запросы. set -euo pipefail -RELAY_HOST="${RELAY_HOST:-nick@192.168.100.50}" +# адреса серверов в репо не храним: deploy/.env.local (образец — deploy/.env.local.example) +# shellcheck source=/dev/null +[[ -f "$(dirname "$0")/../.env.local" ]] && source "$(dirname "$0")/../.env.local" +RELAY_HOST="${RELAY_HOST:?задайте RELAY_HOST в deploy/.env.local (см. deploy/.env.local.example)}" RELAY_PATH="${RELAY_PATH:-/home/nick/home_server/kvarta_tg_relay}" : "${TELEGRAM_BOT_ID:?задайте TELEGRAM_BOT_ID — числовая часть токена до двоеточия}" [[ $TELEGRAM_BOT_ID =~ ^[0-9]+$ ]] || { echo "TELEGRAM_BOT_ID — только цифры" >&2; exit 1; } diff --git a/docs/deploy.md b/docs/deploy.md index 2372e6a..b7a9887 100644 --- a/docs/deploy.md +++ b/docs/deploy.md @@ -11,10 +11,11 @@ kvarta-api → Tailscale → домашний сервер :8788 kvarta-tg-relay ## Первый запуск +0. `cp deploy/.env.local.example deploy/.env.local` и вписать ssh-адреса VPS и домашнего сервера и id бота — в репо адресов нет. 1. `CERTBOT_EMAIL=… deploy/setup-nginx.sh` — конфиг nginx, `nginx -t`, reload, сертификат. Повторный запуск безопасен. 2. `deploy/deploy.sh` — сборка образов `linux/amd64` локально (JS собирается нативно, нативные модули — под целевую платформу), `docker save | ssh docker load`, `docker-compose up -d`, проверка `/api/health`. Требует чистого дерева git. 3. На VPS заполнить `/root/kvarta_site/api.env` (chmod 600, скрипты его не трогают): `TELEGRAM_BOT_TOKEN`, `TELEGRAM_ADMIN_ID`, `TELEGRAM_API_BASE=http://:8788`. -4. `TELEGRAM_BOT_ID=<цифры токена до двоеточия> deploy/tg-relay/deploy.sh` — ретранслятор на домашнем сервере (оба узла должны быть в Tailscale; на VPS — `tailscale up --accept-dns=false`, чтобы не задеть DNS соседних сайтов). +4. `deploy/tg-relay/deploy.sh` — ретранслятор на домашнем сервере (оба узла должны быть в Tailscale; на VPS — `tailscale up --accept-dns=false`, чтобы не задеть DNS соседних сайтов). 5. Telegram: администратор пишет боту `/start`; в группе включить «Темы», сделать бота админом с правом «Управление темами»; написать в группе `/setup`. Бот создаст «Kvarta Cafe: Заявки» и «Kvarta Cafe: Система» и пришлёт в личку `TELEGRAM_CHAT_ID`, `TELEGRAM_LEADS_THREAD_ID`, `TELEGRAM_SYSTEM_THREAD_ID` — вписать в `api.env` и перезапустить api: ``` diff --git a/docs/plan.md b/docs/plan.md index 2a83473..5c5b56a 100644 --- a/docs/plan.md +++ b/docs/plan.md @@ -148,7 +148,7 @@ CREATE TABLE lead_clarifications ( ## Деплой -- Сервер: root@185.5.249.52, x86_64, `docker-compose` v2.23 (плагина `docker compose` нет), диск занят на 89%. Рядом чужие боевые сайты — трогаем только своё. +- Сервер: root@, x86_64, `docker-compose` v2.23 (плагина `docker compose` нет), диск занят на 89%. Рядом чужие боевые сайты — трогаем только своё. - `/root/kvarta_site/`: `docker-compose_vps.yml` (landing `127.0.0.1:13120:3000`, api `127.0.0.1:13121:3000`, volume `kvarta-data:/data` только у api, `restart: unless-stopped`), `api.env` (chmod 600, заполняет автор, скрипты не трогают). - `deploy/deploy.sh` (локально): чистое дерево → `SHA` → buildx `linux/amd64` → `kvarta-landing:$SHA`, `kvarta-api:$SHA` (+`latest`) → проверка ≥1 ГБ свободно → `docker save | gzip | ssh 'gunzip | docker load'` → scp compose → `up -d` → ждать `/api/health` 30 с → удалить `kvarta-*` кроме текущего и предыдущего. `--rollback` — на предыдущий тег. Никакого общего `docker image prune`. - `deploy/setup-nginx.sh` (однократно): конфиг по образцу ai-testing (`/` → 13120, `/api/` → 13121, `X-Real-IP`), `nginx -t` → reload → `certbot --nginx -d kvarta.unuchak.com`.