Runtime và deploy

Trang này chỉ để học và giải thích kiến trúc vận hành. Không deploy production khi ôn code.

Nếu chỉ cần đưa tài liệu học codebase lên domain riêng, xem Deploy docs lên Cloudflare. Docs domain docs.holilihu.online nên tách khỏi app chính holilihu.online.

Local ports

Service Port mặc định Ghi chú
Backend API 8088 http://localhost:8088/api/v3, Swagger /swagger-ui
PostgreSQL 5432 Container DB local
Frontend Angular 4200 npm start trong fe
Docs site 4010 Host port 4010 map vào Jekyll container port 4000

Jekyll mặc định dùng port 4000, nhưng máy này để docs ở 4010 để tránh nhầm/trùng với các dev server khác.

Production components

Thành phần File/runbook Vai trò
Docker Compose base docker-compose.yml Stack nền
Dev override docker-compose.dev.yml Local development
Prod override docker-compose.prod.yml Production runtime
Deploy script deploy.sh Deploy app VM
Caddy Caddyfile Reverse proxy, auto HTTPS, CSP/header
R2 storage docs/runbooks/R2_STORAGE_RUNBOOK.md Object storage
Media domain edge auth docs/runbooks/CLOUDFLARE_MEDIA_DOMAIN_EDGE_AUTH_RUNBOOK.md media.holilihu.online
Dedicated video worker deploy-video-worker.sh, DEDICATED_VIDEO_WORKER_RUNBOOK.md Tách ingest video khỏi web backend
GitHub Actions .github/workflows CI/build/smoke

Video worker

Lý do có worker riêng: video ingest, transcode và Shaka packaging nặng CPU/I/O. Nếu chạy chung web backend, upload/ingest lớn có thể ảnh hưởng request học viên.

Web backend nhận upload/confirm
-> tạo video_ingest_job
-> video-worker claim job
-> FFmpeg/Shaka Packager xử lý
-> upload HLS/DASH/offline profiles lên R2
-> backend/player phát qua signed media URL

Production caveats

  • Production phải dùng .env.prod đúng, không chạy compose prod thiếu --env-file.
  • spring.jpa.hibernate.ddl-auto production nên để Flyway quản lý, không dùng update bừa.
  • R2 secrets, JWT secrets, payment keys không commit.
  • Caddy/CSP phải cho đúng frontend, backend, Wiii iframe, media domain.
  • Cloudflare Worker/media domain không thay thế backend auth; nó là lớp edge kiểm soát media object.