# Развёртывание ## 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_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 применяет миграции
V1..V5 автоматически при старте сервисов ``` - Резервные копии: `pg_dump` (том `lms_pgdata`) и `tar` томов `lms_assets`, `lms_submissions` — команды в [deploy/DEPLOY.md](../deploy/DEPLOY.md). - Порядок наполнения данными (админ → группы → лабораторная → варианты → оценки/защита → материалы) описан в [deploy/IMPORT.md](../deploy/IMPORT.md).