# Развёртывание
## 1. Диаграмма развёртывания
```mermaid
flowchart TB
internet["Интернет"]
subgraph host["Сервер lms.our-place.ru (Ubuntu, Docker)"]
nginx["nginx (host)
80/443, TLS (certbot)
proxy → 127.0.0.1:8090"]
subgraph net["docker network: lms"]
web["container: web
lms-web:latest
:8090"]
gw["container: gateway
lms-gateway:latest
:8080"]
id["container: identity
lms-identity:latest
:8081"]
ac["container: academic
lms-academic:latest
:8082"]
pr["container: progress
lms-progress:latest
:8083"]
pg["container: postgres
postgres:18
:5432"]
vol1[("volume lms_pgdata")]
vol2[("volume lms_assets
/data/content-assets")]
vol3[("volume lms_submissions
/data/submissions")]
end
end
internet -->|HTTPS| nginx
nginx -->|HTTP| web
web --> gw
gw --> id
gw --> ac
gw --> pr
id --> pg
ac --> pg
pr --> pg
ac --> vol2
pr --> vol3
pg --> vol1
```
Наружу публикуется только web на `127.0.0.1:8090`; доступ снаружи — через nginx и TLS.
## 2. Контейнеры и переменные окружения
| Сервис | Образ / стадия Dockerfile | Порт | Ключевые переменные | Тома |
|---|---|---|---|---|
| postgres | `postgres:18` | 5432 (внутр.) | `POSTGRES_DB`, `POSTGRES_USER`, `POSTGRES_PASSWORD` | `lms_pgdata` |
| identity | `target: identity` | 8081 | `LMS_DB_URL` (схема `identity`), `LMS_DB_USER`, `LMS_DB_PASSWORD` | — |
| academic | `target: academic` | 8082 | `LMS_DB_URL` (`academic`), `LMS_CONTENT_ASSETS_DIR`, `LMS_JWT_JWK_SET_URI` | `lms_assets` |
| progress | `target: progress` | 8083 | `LMS_DB_URL` (`progress`), `LMS_SUBMISSIONS_DIR`, `LMS_IDENTITY_URI`, `LMS_ACADEMIC_URI`, `LMS_JWT_JWK_SET_URI` | `lms_submissions` |
| gateway | `target: gateway` | 8080 | `LMS_IDENTITY_URI`, `LMS_ACADEMIC_URI`, `LMS_PROGRESS_URI`, `LMS_JWT_JWK_SET_URI` | — |
| web | `target: web` | 8090 | `LMS_GATEWAY_URL`, `SERVER_PORT` | — |
Общие для сервисов переменные БД: `LMS_DB_USER`, `LMS_DB_PASSWORD`, `LMS_DB_NAME`.
`LMS_JWT_JWK_SET_URI` обязателен для gateway, academic и progress —
в контейнерах это `http://identity:8081/api/v1/auth/jwks.json` (иначе 401).
## 3. Сборка
```mermaid
flowchart LR
src["Исходники
services/, libs/, web/, buildSrc/"]
subgraph build["Dockerfile, стадия build (eclipse-temurin:21-jdk)"]
g["./gradlew bootJar -x test
(Gradle-кэш в cache-mount)"]
end
jar["bootJar-артефакты"]
subgraph run["Runtime-стадии (eclipse-temurin:21-jre)"]
r["java -jar app.jar
TZ=Europe/Moscow"]
end
src --> g --> jar --> r
```
Java на сервере не нужна: сборка и запуск — внутри контейнеров.
`deploy/deploy.sh up` собирает образы и запускает стек из `docker-compose.prod.yml`.
## 4. Nginx
`deploy/nginx/lms.our-place.ru.conf`:
- `listen 80` (TLS добавляет `certbot --nginx`), `server_name lms.our-place.ru`;
- ACME-челлендж через `/.well-known/acme-challenge/`;
- `client_max_body_size 120m` — загрузка ZIP-архивов лабораторных и решений;
- `proxy_pass http://127.0.0.1:8090` c заголовками
`Host`, `X-Real-IP`, `X-Forwarded-For`, `X-Forwarded-Proto`, `X-Forwarded-Host`;
- таймауты 300 с на чтение/отправку.
Web-сервис запускается с `server.forward-headers-strategy: framework`,
поэтому корректно формирует https-редиректы за прокси.
## 5. Обновление и данные
```mermaid
sequenceDiagram
autonumber
participant Dev as Разработчик
participant Git as Gitea
participant Srv as Сервер /opt/LMS
participant DC as docker compose
participant PG as postgres
Dev->>Git: git push origin master
Srv->>Git: git pull
Srv->>DC: ./deploy/deploy.sh up
DC->>DC: docker build (5 стадий)
DC->>PG: старт postgres (volume lms_pgdata)
DC->>DC: старт identity → academic → progress → gateway → web
Note over DC: Flyway применяет миграции автоматически
при старте сервисов (identity V1..V10, academic V1..V12, progress V1..V9 и V11..V13; у web миграций нет)
```
- Локально (`docker-compose.yml`) поднимается только `postgres`; прод-стек — `docker-compose.prod.yml`.
- Резервные копии: `pg_dump` (том `lms_pgdata`) и `tar` томов `lms_assets`,
`lms_submissions` — команды в [deploy/DEPLOY.md](../deploy/DEPLOY.md).
- Порядок наполнения данными (админ → группы → лабораторная → варианты →
оценки/защита → материалы) описан в [deploy/IMPORT.md](../deploy/IMPORT.md).