# Публикация: домены, VPS, туннели Приложение крутится дома (Pi — прод) и на твоём ПК (dev/test). Дома белого IP нет (CGNAT), поэтому наружу выставляем через **VPS-привратник**: на нём Caddy терминирует HTTPS твоими сертификатами и проксирует трафик в SSH reverse-туннели, которые приложение само открывает к VPS. ``` ┌──────────── VPS 186.246.51.17 (Caddy) ───────────┐ forbiddenstars.ru ───►│ :443 (cert твой) → 127.0.0.1:9000 │ │ ▲ туннель-КОНТЕЙНЕР │ │ └── Pi : app:8000 PROD │ forbidden-stars.ru ──►│ :443 (cert твой) → 127.0.0.1:9001 │ │ ▲ контейнер (test) ИЛИ │ │ ▲ ssh с ПК (dev) │ │ ├── ПК test : app:8000 │ │ └── ПК dev : vite:5173 │ └───────────────────────────────────────────────────┘ ``` - **PROD** — Pi. `docker compose up -d` поднимает два сервиса: `app` + `tunnel`. У `app` **портов на хост нет** — наружу его выставляет только туннель-контейнер (`ssh -R 9000:app:8000` к VPS). Постоянно, Docker сам переподключает. См. [`pi/`](pi/README.md). - **TEST** — ПК. То же самое: `docker compose -f docker-compose.test.yml up` поднимает `app` + `tunnel` (`ssh -R 9001:app:8000`). Портов на хост нет — тест виден только на `forbidden-stars.ru`. Обычно запускается лаунчером при `APP_ENV=test`. - **DEV** — ПК, нативно (`uvicorn`+`vite`). По умолчанию только на localhost; при `LOCAL_PUBLIC=vps` лаунчер (`run.ps1`) дополнительно поднимает SSH-туннель с ПК (`ssh -R 9001:localhost:5173`) → дев виден на `forbidden-stars.ru`. - DEV и TEST делят слот **9001** (`forbidden-stars.ru`) → поднимай что-то **одно за раз**. PROD на отдельном слоте **9000** (`forbiddenstars.ru`) — работает независимо. Ключ туннеля — **`deploy/tunnel/id_tunnel`** (приватный, в git не идёт). Его публичную часть добавь в `authorized_keys` пользователя `tunnel` на VPS. Один и тот же ключ годится для контейнерного туннеля (Pi/ПК) и для dev-туннеля `run.ps1`. Настройка по шагам: 1. **VPS** — [`vps/README.md`](vps/README.md): Caddy, файрвол, пользователь `tunnel`, сертификаты, `Caddyfile`. 2. **Pi (прод)** — [`pi/README.md`](pi/README.md): ключ в `deploy/tunnel/id_tunnel`, `.env`, `docker compose up -d`. 3. **ПК (dev/test)** — тот же ключ в `deploy/tunnel/id_tunnel` (для test-контейнера) и/или ключ по умолчанию для dev (`run.ps1`); pubkey — в `authorized_keys` у `tunnel@VPS`. Секреты не в git: сертификаты/ключи (`*.pem`, `*.key`, `id_tunnel*`) живут на VPS/Pi/ПК, в репозитории только `Caddyfile`, `deploy/tunnel/` (образ туннеля) и шаблоны. > Telegram-вход требует HTTPS-домен: у BotFather `/setdomain` укажи оба домена > (`forbiddenstars.ru` и `forbidden-stars.ru`).