Завершена настройка домена для дева, теста и прода. Соединение через ssh-туннель
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
# Публикация: домены, 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 │
|
||||
│ ▲ autossh (постоянно) │
|
||||
│ └── Pi : app:8000 PROD │
|
||||
forbidden-stars.ru ──►│ :443 (cert твой) → 127.0.0.1:9001 │
|
||||
│ ▲ ssh (по требованию) │
|
||||
│ └── ПК : 5173(dev)/8080(test)│
|
||||
└───────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
- **PROD** — Pi, `forbiddenstars.ru`, туннель постоянный (autossh-служба). См. [`pi/`](pi/README.md).
|
||||
- **DEV/TEST** — ПК, `forbidden-stars.ru`, туннель по требованию: в `.env` поставь
|
||||
`LOCAL_PUBLIC=vps` и запусти `run.ps1` (dev → туннель на vite:5173; test → на :8080).
|
||||
Dev и test делят порт `9001` — по очереди.
|
||||
- Разделение окружений сохраняется на уровне приложения (свои `APP_ENV`, БД, контейнеры);
|
||||
домены разные, поэтому прод и dev/test могут работать одновременно.
|
||||
|
||||
Настройка по шагам:
|
||||
1. **VPS** — [`vps/README.md`](vps/README.md): Caddy, файрвол, пользователь `tunnel`, сертификаты, `Caddyfile`.
|
||||
2. **Pi (прод)** — [`pi/README.md`](pi/README.md): Docker-приложение + autossh-служба туннеля.
|
||||
3. **ПК (dev/test)** — ключ для `tunnel@VPS` (`ssh-copy-id`), затем `LOCAL_PUBLIC=vps` + `run.ps1`.
|
||||
|
||||
Секреты не в git: сертификаты/ключи (`*.pem`, `*.key`, SSH-ключи) живут на VPS/Pi/ПК,
|
||||
в репозитории только `Caddyfile` и юнит-шаблон.
|
||||
|
||||
> Telegram-вход требует HTTPS-домен: у BotFather `/setdomain` укажи оба домена
|
||||
> (`forbiddenstars.ru` и `forbidden-stars.ru`).
|
||||
@@ -0,0 +1,38 @@
|
||||
# Raspberry Pi — ПРОД (`forbiddenstars.ru`)
|
||||
|
||||
Pi запускает приложение в Docker и держит постоянный SSH reverse-туннель к VPS.
|
||||
Снаружи Pi недоступен (CGNAT) — публичная точка только VPS, Pi сам стучится наружу.
|
||||
|
||||
## 1. Приложение (Docker)
|
||||
Из ветки `main`:
|
||||
```bash
|
||||
git pull
|
||||
cp .env.example .env # заполни секреты; APP_ENV контейнер форсит в production
|
||||
docker compose up -d --build
|
||||
curl http://localhost:8000/api/health # → {"status":"ok"}
|
||||
```
|
||||
БД на томе `db-data`, миграции и бутстрап админа — автоматически (`entrypoint.sh`).
|
||||
|
||||
## 2. Ключ для туннеля (без пароля)
|
||||
```bash
|
||||
sudo apt -y install autossh
|
||||
ssh-keygen -t ed25519 -f ~/.ssh/id_tunnel -N ""
|
||||
ssh-copy-id -i ~/.ssh/id_tunnel.pub tunnel@186.246.51.17
|
||||
# (или вручную добавь ~/.ssh/id_tunnel.pub в /home/tunnel/.ssh/authorized_keys на VPS)
|
||||
```
|
||||
Проверка туннеля вручную:
|
||||
```bash
|
||||
autossh -M 0 -N -R 9000:localhost:8000 -i ~/.ssh/id_tunnel tunnel@186.246.51.17
|
||||
# в другом окне/браузере открой https://forbiddenstars.ru — должно работать. Ctrl+C.
|
||||
```
|
||||
|
||||
## 3. Туннель как служба (автозапуск + переподключение)
|
||||
```bash
|
||||
sudo cp deploy/pi/forbidden-stars-tunnel.service /etc/systemd/system/
|
||||
sudoedit /etc/systemd/system/forbidden-stars-tunnel.service # поправь User= и путь к ключу
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl enable --now forbidden-stars-tunnel
|
||||
systemctl status forbidden-stars-tunnel
|
||||
```
|
||||
|
||||
Готово: `https://forbiddenstars.ru` отдаёт прод. Логи туннеля: `journalctl -u forbidden-stars-tunnel -f`.
|
||||
@@ -0,0 +1,27 @@
|
||||
# SSH reverse-туннель ПРОДА: VPS:9000 → Pi localhost:8000 (приложение в Docker).
|
||||
# Caddy на VPS отдаёт forbiddenstars.ru через этот туннель.
|
||||
#
|
||||
# Установка:
|
||||
# sudo cp deploy/pi/forbidden-stars-tunnel.service /etc/systemd/system/
|
||||
# # ПОПРАВЬ под себя: User=, путь к ключу (-i ...), при необходимости IP VPS.
|
||||
# sudo systemctl daemon-reload
|
||||
# sudo systemctl enable --now forbidden-stars-tunnel
|
||||
# systemctl status forbidden-stars-tunnel
|
||||
[Unit]
|
||||
Description=Forbidden Stars: SSH reverse tunnel (prod) to VPS
|
||||
After=network-online.target docker.service
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
# Замени pi на своего пользователя Raspberry Pi (и путь к ключу ниже).
|
||||
User=pi
|
||||
Environment=AUTOSSH_GATETIME=0
|
||||
ExecStart=/usr/bin/autossh -M 0 -N \
|
||||
-o ServerAliveInterval=30 -o ServerAliveCountMax=3 -o ExitOnForwardFailure=yes \
|
||||
-i /home/pi/.ssh/id_tunnel \
|
||||
-R 9000:localhost:8000 tunnel@186.246.51.17
|
||||
Restart=always
|
||||
RestartSec=10
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
@@ -0,0 +1,22 @@
|
||||
# Caddy на VPS (186.246.51.17) — единственная публичная точка входа.
|
||||
# Два домена, ОБА с твоими сертификатами; проксируют в SSH-туннели:
|
||||
#
|
||||
# forbiddenstars.ru → 127.0.0.1:9000 ← Pi (autossh, постоянно) PROD
|
||||
# forbidden-stars.ru → 127.0.0.1:9001 ← ПК (по требованию) DEV/TEST
|
||||
#
|
||||
# Caddy сам терминирует TLS (он и есть edge: видит реального клиента), а вниз к
|
||||
# приложению добавляет X-Forwarded-Proto=https / X-Forwarded-For / Host —
|
||||
# приложение это учитывает (uvicorn --proxy-headers). Положи файл в /etc/caddy/Caddyfile.
|
||||
# Сертификаты — см. deploy/vps/README.md (fullchain = leaf + промежуточные одним файлом).
|
||||
|
||||
forbiddenstars.ru {
|
||||
tls /etc/caddy/certs/forbiddenstars.ru/fullchain.pem /etc/caddy/certs/forbiddenstars.ru/privkey.pem
|
||||
encode zstd gzip
|
||||
reverse_proxy 127.0.0.1:9000
|
||||
}
|
||||
|
||||
forbidden-stars.ru {
|
||||
tls /etc/caddy/certs/forbidden-stars.ru/fullchain.pem /etc/caddy/certs/forbidden-stars.ru/privkey.pem
|
||||
encode zstd gzip
|
||||
reverse_proxy 127.0.0.1:9001
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
# VPS (186.246.51.17) — реверс-прокси Caddy + точка входа SSH-туннелей
|
||||
|
||||
Единственная публичная точка. На VPS: Caddy терминирует HTTPS твоими сертификатами
|
||||
для двух доменов и проксирует трафик в SSH reverse-туннели от Pi (прод) и ПК (dev/test).
|
||||
|
||||
```
|
||||
forbiddenstars.ru → 127.0.0.1:9000 ← Pi (autossh, постоянно) PROD
|
||||
forbidden-stars.ru → 127.0.0.1:9001 ← ПК (по требованию) DEV/TEST
|
||||
```
|
||||
|
||||
> Туннель `ssh -R` по умолчанию слушает на loopback VPS (127.0.0.1) — ровно туда смотрит
|
||||
> Caddy. `GatewayPorts` включать НЕ нужно. Снаружи порты 9000/9001 недоступны.
|
||||
|
||||
## 0. DNS
|
||||
A-записи обоих доменов → `186.246.51.17`:
|
||||
```
|
||||
forbiddenstars.ru A 186.246.51.17
|
||||
forbidden-stars.ru A 186.246.51.17
|
||||
```
|
||||
Проверка: `dig +short forbiddenstars.ru` (и второго) должны вернуть этот IP.
|
||||
|
||||
## 1. Зайти на VPS
|
||||
```bash
|
||||
ssh root@186.246.51.17 # пароль введёшь сам
|
||||
```
|
||||
|
||||
## 2. Обновление + файрвол
|
||||
```bash
|
||||
apt update && apt -y upgrade
|
||||
apt -y install ufw curl gnupg
|
||||
ufw allow OpenSSH
|
||||
ufw allow 80/tcp
|
||||
ufw allow 443/tcp
|
||||
ufw --force enable
|
||||
```
|
||||
|
||||
## 3. Установить Caddy (официальный репозиторий)
|
||||
```bash
|
||||
apt -y install debian-keyring debian-archive-keyring apt-transport-https
|
||||
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' \
|
||||
| gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
|
||||
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' \
|
||||
| tee /etc/apt/sources.list.d/caddy-stable.list
|
||||
apt update && apt -y install caddy
|
||||
```
|
||||
|
||||
## 4. Пользователь под туннели
|
||||
```bash
|
||||
useradd -m -s /bin/bash tunnel
|
||||
install -d -m 700 -o tunnel -g tunnel /home/tunnel/.ssh
|
||||
install -m 600 -o tunnel -g tunnel /dev/null /home/tunnel/.ssh/authorized_keys
|
||||
```
|
||||
Публичные ключи Pi и ПК добавишь в `/home/tunnel/.ssh/authorized_keys` на шагах настройки
|
||||
Pi (`deploy/pi/README.md`) и ПК (через `ssh-copy-id`).
|
||||
|
||||
## 5. Сертификаты
|
||||
```bash
|
||||
mkdir -p /etc/caddy/certs/forbiddenstars.ru /etc/caddy/certs/forbidden-stars.ru
|
||||
```
|
||||
Залей свои файлы с локальной машины (с каждого домена — свой `fullchain.pem` + `privkey.pem`):
|
||||
```bash
|
||||
# на локальной машине:
|
||||
scp fullchain.pem privkey.pem root@186.246.51.17:/etc/caddy/certs/forbiddenstars.ru/
|
||||
scp fullchain.pem privkey.pem root@186.246.51.17:/etc/caddy/certs/forbidden-stars.ru/
|
||||
```
|
||||
- `fullchain.pem` = твой сертификат + промежуточные GlobalSign **одним файлом** (сначала leaf, затем chain).
|
||||
- `privkey.pem` = приватный ключ (без пароля).
|
||||
```bash
|
||||
# на VPS — права:
|
||||
chown -R caddy:caddy /etc/caddy/certs && chmod -R 640 /etc/caddy/certs
|
||||
```
|
||||
|
||||
## 6. Caddyfile
|
||||
Скопируй `deploy/vps/Caddyfile` из репозитория в `/etc/caddy/Caddyfile`, затем:
|
||||
```bash
|
||||
caddy validate --config /etc/caddy/Caddyfile
|
||||
systemctl reload caddy
|
||||
```
|
||||
|
||||
## 7. Проверка
|
||||
1. Подними туннель прода на Pi (см. `deploy/pi/README.md`) и/или dev/test на ПК (`run.ps1` при `LOCAL_PUBLIC=vps`).
|
||||
2. Открой `https://forbiddenstars.ru` и `https://forbidden-stars.ru`.
|
||||
3. Пока соответствующий туннель не поднят — Caddy отдаёт `502`, это ожидаемо.
|
||||
|
||||
Логи Caddy: `journalctl -u caddy -f`.
|
||||
Reference in New Issue
Block a user