Files
LMS/docs/02-deployment.md
Vladislav Kopnin 1e1e9ae0e4 feat: закрыть остаточный backlog
- keyset-пагинация аудита с курсором (occurred_at, id) и UI «Показать ещё»
- пакетный /api/v1/labs/details и переход progress на один запрос
- абсолютный потолок сессии 30 дней (identity V12 + web), очистка refresh
- админская инвентаризация legacy-активов (/admin/legacy-assets, скрипт)
- E2E в Chromium/Firefox/WebKit (18/18), CI preflight
- LDD: 51 claim, 346 тестов, docs и handoff обновлены
2026-10-29 12:01:44 +03:00

5.5 KiB
Raw Blame History

Развёртывание

1. Диаграмма развёртывания

flowchart TB
    internet["Интернет"]
    subgraph host["Сервер lms.our-place.ru (Ubuntu, Docker)"]
        nginx["nginx (host)<br/>80/443, TLS (certbot)<br/>proxy → 127.0.0.1:8090"]
        subgraph net["docker network: lms"]
            web["container: web<br/>lms-web:latest<br/>:8090"]
            gw["container: gateway<br/>lms-gateway:latest<br/>:8080"]
            id["container: identity<br/>lms-identity:latest<br/>:8081"]
            ac["container: academic<br/>lms-academic:latest<br/>:8082"]
            pr["container: progress<br/>lms-progress:latest<br/>:8083"]
            pg["container: postgres<br/>postgres:18<br/>:5432"]
            vol1[("volume lms_pgdata")]
            vol2[("volume lms_assets<br/>/data/content-assets")]
            vol3[("volume lms_submissions<br/>/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).

Сроки сессии задаются переменными (значения по умолчанию подходят): LMS_ACCESS_TOKEN_TTL=15m, LMS_REFRESH_TOKEN_TTL=7d, LMS_SESSION_ABSOLUTE_TIMEOUT=30d, LMS_REFRESH_TOKEN_RETENTION=30d, LMS_REFRESH_TOKEN_CLEANUP_CRON для identity; LMS_SESSION_TIMEOUT=7d и LMS_SESSION_ABSOLUTE_TIMEOUT=30d для web.

3. Сборка

flowchart LR
    src["Исходники<br/>services/, libs/, web/, buildSrc/"]
    subgraph build["Dockerfile, стадия build (eclipse-temurin:21-jdk)"]
        g["./gradlew bootJar -x test<br/>(Gradle-кэш в cache-mount)"]
    end
    jar["bootJar-артефакты"]
    subgraph run["Runtime-стадии (eclipse-temurin:21-jre)"]
        r["java -jar app.jar<br/>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. Обновление и данные

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 применяет миграции автоматически<br/>при старте сервисов (identity V1..V13, 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/IMPORT.md.