Files
RuvdsTest/docs/DEPLOY.md
danamir b5921292db
Some checks failed
CI/CD / build-test-deploy (push) Has been cancelled
Trim DEPLOY.md: reverse proxy is managed separately, out of scope here
2026-08-06 14:46:58 +03:00

83 lines
3.8 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/консоли хостера) — не на машине
разработки.
Реверс-прокси (nginx, TLS, домен) уже настроен отдельно и обслуживается не отсюда — этот документ
покрывает только сам стек, который должен подняться и слушать `127.0.0.1:8081`.
## 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 настраивается отдельно (не входит в этот репозиторий) — ему нужен один
`proxy_pass http://127.0.0.1:8081;` на весь сайт. Клиентский контейнер уже сам умеет
проксировать `/api/*` на сервер (см. `src/Client/nginx.conf`), поэтому отдельный location для
`/api` во внешнем nginx не нужен — один `location / { proxy_pass ...; }` покрывает всё.
## 6. Раннер CI/CD
См. `docs/CI-CD.md` — регистрируется на этой же машине, деплой-шаг пайплайна выполняет
`docker compose up -d` прямо здесь же (поверх уже поднятого в шаге 4 стека).