Files
magistr/compose.yaml
2026-07-19 20:16:12 +03:00

87 lines
3.3 KiB
YAML
Executable File

services:
backend:
restart: unless-stopped
build:
context: ./backend
dockerfile: Dockerfile
environment:
SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/${POSTGRES_DB:-app_db}
POSTGRES_USER: ${POSTGRES_USER:-myuser}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD должен быть задан в .env}
JWT_SECRET: ${JWT_SECRET:?JWT_SECRET должен быть задан в .env}
JWT_ACCESS_TOKEN_TTL: ${JWT_ACCESS_TOKEN_TTL:-15m}
JWT_REFRESH_TOKEN_TTL: ${JWT_REFRESH_TOKEN_TTL:-7d}
JWT_REFRESH_COOKIE_NAME: ${JWT_REFRESH_COOKIE_NAME:-magistr_refresh}
JWT_REFRESH_COOKIE_SECURE: ${JWT_REFRESH_COOKIE_SECURE:-false}
JWT_REFRESH_CLEANUP_ENABLED: ${JWT_REFRESH_CLEANUP_ENABLED:-true}
JWT_REFRESH_CLEANUP_RETENTION: ${JWT_REFRESH_CLEANUP_RETENTION:-30d}
JWT_REFRESH_CLEANUP_BATCH_SIZE: ${JWT_REFRESH_CLEANUP_BATCH_SIZE:-500}
JWT_REFRESH_CLEANUP_MAX_BATCHES: ${JWT_REFRESH_CLEANUP_MAX_BATCHES:-20}
JWT_REFRESH_CLEANUP_INTERVAL_MS: ${JWT_REFRESH_CLEANUP_INTERVAL_MS:-3600000}
JWT_REFRESH_CLEANUP_INITIAL_DELAY_MS: ${JWT_REFRESH_CLEANUP_INITIAL_DELAY_MS:-60000}
LOGIN_RATE_MAX_FAILURES: ${LOGIN_RATE_MAX_FAILURES:-5}
LOGIN_RATE_ATTEMPT_WINDOW: ${LOGIN_RATE_ATTEMPT_WINDOW:-15m}
LOGIN_RATE_BASE_BLOCK_DURATION: ${LOGIN_RATE_BASE_BLOCK_DURATION:-1m}
LOGIN_RATE_MAX_BLOCK_DURATION: ${LOGIN_RATE_MAX_BLOCK_DURATION:-15m}
LOGIN_AUDIT_CLEANUP_ENABLED: ${LOGIN_AUDIT_CLEANUP_ENABLED:-true}
LOGIN_AUDIT_RETENTION: ${LOGIN_AUDIT_RETENTION:-90d}
LOGIN_AUDIT_CLEANUP_BATCH_SIZE: ${LOGIN_AUDIT_CLEANUP_BATCH_SIZE:-500}
LOGIN_AUDIT_CLEANUP_MAX_BATCHES: ${LOGIN_AUDIT_CLEANUP_MAX_BATCHES:-20}
LOGIN_AUDIT_CLEANUP_INTERVAL_MS: ${LOGIN_AUDIT_CLEANUP_INTERVAL_MS:-86400000}
LOGIN_AUDIT_CLEANUP_INITIAL_DELAY_MS: ${LOGIN_AUDIT_CLEANUP_INITIAL_DELAY_MS:-120000}
TRUSTED_PROXY_CIDRS: ${TRUSTED_PROXY_CIDRS:-172.16.0.0/12}
BUSINESS_TIME_ZONE: ${BUSINESS_TIME_ZONE:-Europe/Moscow}
TZ: ${TZ:-Europe/Moscow}
JAVA_TOOL_OPTIONS: -Duser.timezone=${TZ:-Europe/Moscow}
OTEL_SDK_DISABLED: ${OTEL_SDK_DISABLED:-true}
depends_on:
db:
condition: service_healthy
healthcheck:
test: [ "CMD-SHELL", "wget --quiet --spider http://127.0.0.1:8080/actuator/health/liveness" ]
interval: 5s
timeout: 3s
retries: 12
start_period: 20s
networks:
- magistr
- proxy
frontend:
restart: unless-stopped
build:
context: ./frontend
dockerfile: Dockerfile
networks:
- magistr
- proxy
depends_on:
backend:
condition: service_healthy
db:
image: postgres:16.3-alpine@sha256:36ed71227ae36305d26382657c0b96cbaf298427b3f1eaeb10d77a6dea3eec41
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER:-myuser}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD должен быть задан в .env}
POSTGRES_DB: ${POSTGRES_DB:-app_db}
healthcheck:
test: [ "CMD-SHELL", "pg_isready -U \"$${POSTGRES_USER}\" -d \"$${POSTGRES_DB}\"" ]
interval: 5s
timeout: 5s
retries: 5
networks:
- magistr
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
magistr:
driver: bridge
proxy:
external: true
volumes:
postgres_data: