Files
RuvdsTest/docs/DEPLOY.md
danamir 773dbb493e
Some checks failed
CI/CD / build-test-deploy (push) Has been cancelled
Add production deployment guide and harden compose for it
- docker-compose.yml: bind client/server ports to 127.0.0.1 only — the
  client container is the sole intended public entry point (it proxies
  /api/* to the server itself), a host-level nginx sits in front of it in
  production. Client__Origin now configurable via CLIENT_ORIGIN env var.
- docs/DEPLOY.md: step-by-step for a fresh Linux target (Docker install,
  clone, .env secrets, nginx + certbot).
- docs/CI-CD.md: runner registration for that same target machine, in
  "host" mode so the deploy step's `docker compose up -d` acts on the
  actual running stack.
2026-08-06 14:18:22 +03:00

119 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Деплой на боевой сервер (Linux VPS)
Выполняется один раз, вручную, на целевой машине (`ruvdstest.danamir.site`). После этого шага
CI/CD (`.gitea/workflows/ci-cd.yml`) берёт на себя все последующие обновления при push в `master`.
Все команды ниже выполняются на самой целевой машине (по SSH/консоли хостера) — не на машине
разработки.
## 0. Предварительные условия
- DNS-запись `ruvdstest.danamir.site` уже указывает на IP этой машины (проверить: `dig +short ruvdstest.danamir.site`).
- Открыты порты 80 и 443 (для HTTP-01 challenge certbot и самого HTTPS).
## 1. Установить Docker
```bash
curl -fsSL https://get.docker.com | sh
sudo systemctl enable --now docker
sudo usermod -aG docker $USER # затем перелогиниться, чтобы применилось
```
Проверить:
```bash
docker --version
docker compose version
```
## 2. Склонировать репозиторий
```bash
sudo mkdir -p /opt/ruvdstests
sudo chown $USER:$USER /opt/ruvdstests
git clone https://git.danamir.su/danamir/RuvdsTest.git /opt/ruvdstests
cd /opt/ruvdstests
```
## 3. Настроить `.env` с боевыми секретами
```bash
cp .env.example .env
# Сгенерировать длинный случайный JWT-секрет и подставить в .env:
sed -i "s|^JWT_SECRET=.*|JWT_SECRET=$(openssl rand -base64 48 | tr -d '\n')|" .env
# Сгенерировать пароль для Postgres:
sed -i "s|^POSTGRES_PASSWORD=.*|POSTGRES_PASSWORD=$(openssl rand -base64 24 | tr -d '\n')|" .env
# Публичный origin — на этом этапе это скорее формальность (клиент теперь
# ходит на /api того же origin, кросс-доменных запросов не будет), но
# выставить правильно не помешает:
echo "CLIENT_ORIGIN=https://ruvdstest.danamir.site" >> .env
cat .env # свериться, что все три значения на месте
```
## 4. Поднять стек
```bash
docker compose up -d --build
docker compose ps # все три контейнера должны быть Up/healthy
```
Проверить изнутри машины, что всё работает (пока без TLS, напрямую на loopback-порт клиента):
```bash
curl -s http://127.0.0.1:8081/api/login -X POST \
-H "Content-Type: application/json" \
-d '{"Email":"teacher@example.com","Password":"teacher123"}'
# ожидается {"Ok":{"Token":"...", ...}}
```
## 5. Установить nginx + получить сертификат
```bash
sudo apt update && sudo apt install -y nginx certbot python3-certbot-nginx
```
Создать `/etc/nginx/sites-available/ruvdstest`:
```nginx
server {
listen 80;
server_name ruvdstest.danamir.site;
location / {
proxy_pass http://127.0.0.1:8081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
```
Клиентский контейнер уже сам умеет проксировать `/api/*` на сервер (см. `src/Client/nginx.conf`),
поэтому хостовому nginx достаточно одного `proxy_pass` на весь сайт целиком — отдельный location
для `/api` тут не нужен.
```bash
sudo ln -s /etc/nginx/sites-available/ruvdstest /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d ruvdstest.danamir.site
```
`certbot --nginx` сам допишет `listen 443 ssl`, сертификат и редирект с 80 на 443 в тот же файл.
## 6. Проверить снаружи
Открыть `https://ruvdstest.danamir.site` в браузере — должен появиться экран логина, залогиниться
демо-пользователем, убедиться что запросы в Network идут на `https://ruvdstest.danamir.site/api/...`
(не на `localhost`).
## 7. Раннер CI/CD
См. `docs/CI-CD.md` — регистрируется на этой же машине, деплой-шаг пайплайна выполняет
`docker compose up -d` прямо здесь же (поверх уже поднятого в шаге 4 стека).