Repository navigation
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
86 lines (82 loc) · 3.74 KB
/
Copy pathdocker-compose.yml
File metadata and controls
86 lines (82 loc) · 3.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
services:
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: lecturelog
POSTGRES_PASSWORD: ${CORE_POSTGRES_PASSWORD:?CORE_POSTGRES_PASSWORD is required}
POSTGRES_DB: lecturelog
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U lecturelog"]
interval: 5s
timeout: 3s
retries: 10
minio:
image: minio/minio:RELEASE.2025-09-07T16-13-09Z
command: server /data --console-address ":9001"
environment:
MINIO_ROOT_USER: ${S3_ACCESS_KEY:?S3_ACCESS_KEY is required}
MINIO_ROOT_PASSWORD: ${S3_SECRET_KEY:?S3_SECRET_KEY is required}
# Серверная авточистка оборванных multipart-заливок (orphan-частей).
# MinIO делает это сам, без lifecycle-правила — действие
# AbortIncompleteMultipartUpload через ILM в MinIO не работает (закрыто
# апстримом как working-as-intended, см. minio/minio#19115, #16120).
# Закрепляем дефолты явно ради воспроизводимости деплоя.
MINIO_API_STALE_UPLOADS_EXPIRY: 24h
MINIO_API_STALE_UPLOADS_CLEANUP_INTERVAL: 6h
volumes:
- miniodata:/data
healthcheck:
test: ["CMD", "mc", "ready", "local"]
interval: 5s
timeout: 3s
retries: 10
# Наружу MinIO в автономном режиме не выставляем: движок ходит по internal
# endpoint http://minio:9000 внутри docker-сети. Раскомментируй для отладки/консоли.
# ports:
# - "9000:9000"
# - "9001:9001"
# Создание бакета lectures и применение правил жизненного цикла (ILM) при старте.
# Скрипт идемпотентен (mc mb --ignore-existing + mc ilm rule import целиком
# перезаписывает набор правил). После инита контейнер завершается — это инит-шаг,
# а не постоянный сервис.
minio-init:
image: minio/mc:RELEASE.2025-08-13T08-35-41Z
depends_on:
minio:
condition: service_healthy
environment:
S3_BUCKET: ${S3_BUCKET:-lectures}
S3_ACCESS_KEY: ${S3_ACCESS_KEY:?S3_ACCESS_KEY is required}
S3_SECRET_KEY: ${S3_SECRET_KEY:?S3_SECRET_KEY is required}
volumes:
- ./docker/minio-init.sh:/minio-init.sh:ro
entrypoint: ["/bin/sh", "/minio-init.sh"]
api:
build: .
depends_on:
db:
condition: service_healthy
minio:
condition: service_healthy
env_file: .env
environment:
DATABASE_URL: postgresql+asyncpg://lecturelog:${CORE_POSTGRES_PASSWORD:?CORE_POSTGRES_PASSWORD is required}@db:5432/lecturelog
S3_INTERNAL_ENDPOINT: http://minio:9000
S3_BUCKET: ${S3_BUCKET:-lectures}
S3_ACCESS_KEY: ${S3_ACCESS_KEY:?S3_ACCESS_KEY is required}
S3_SECRET_KEY: ${S3_SECRET_KEY:?S3_SECRET_KEY is required}
# S3_PUBLIC_ENDPOINT не задан -> presigned выключен (автономный режим):
# /uploads и /result-url отдают 409, стрим GET /result работает.
volumes:
# Только кеш транскриптов: он должен переживать пересоздание контейнера
# (деплой нового образа), иначе перезапуск лекции снова платит за STT.
# Остальной WORK_DIR остаётся во writable layer.
- lecturelog-core-transcript-cache:/app/data/transcript_cache
ports:
- "8000:8000"
volumes:
pgdata:
miniodata:
lecturelog-core-transcript-cache: