An open API service indexing awesome lists of open source software.

https://github.com/handong-app/cms-transcode-worker

Transcode worker for CMS
https://github.com/handong-app/cms-transcode-worker

celery docker ffmpeg python3 rabbitmq redis transcode

Last synced: 14 days ago
JSON representation

Transcode worker for CMS

Awesome Lists containing this project

README

          

![Build Status](https://img.shields.io/badge/build-passing-brightgreen)
![License: MIT](https://img.shields.io/badge/license-MIT-red.svg)
![Kubernetes](https://img.shields.io/badge/Kubernetes-Deployed-blue?logo=kubernetes)
![Container](https://img.shields.io/badge/Container-Docker-blue?logo=docker)
![Python](https://img.shields.io/badge/Worker-Python%203.12-blue?logo=python)
![Celery](https://img.shields.io/badge/Celery-5.3.1-brightgreen?logo=celery)
![RabbitMQ](https://img.shields.io/badge/Queue-RabbitMQ-FF6600?logo=rabbitmq)
![Redis](https://img.shields.io/badge/Redis-7.x-red?logo=redis)
![FFmpeg](https://img.shields.io/badge/Transcoder-FFmpeg-black?logo=ffmpeg)
![Storage](https://img.shields.io/badge/S3%20(MinIO)-storage-red?logo=minio)
![Infisical](https://img.shields.io/badge/Secrets-Infisical-yellow)

# πŸ“¦ CMS Transcode Worker

**cms-transcode-worker**λŠ” CMS μ‹œμŠ€ν…œμ˜ **λΉ„λ””μ˜€ νŠΈλžœμŠ€μ½”λ”©**을 λ‹΄λ‹Ήν•˜λŠ” 파이썬 Celery μ›Œμ»€μž…λ‹ˆλ‹€.
μ‚¬μš©μžκ°€ μ—…λ‘œλ“œν•œ λΉ„λ””μ˜€λ₯Ό HLS둜 λ³€ν™˜(480p/1080p)ν•˜κ³ , μ§„ν–‰ 상황을 μ‹€μ‹œκ°„μœΌλ‘œ μ „λ‹¬ν•©λ‹ˆλ‹€.

---

## 🎨 μ•„ν‚€ν…μ²˜ λ‹€μ΄μ–΄κ·Έλž¨

![Architecture Diagram](./Architecture_Diagram_v3.png)
> 이해λ₯Ό μœ„ν•΄ RabbitMQ λ₯Ό λΆ„ν• ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
> μ‹€μ œ μž‘λ™μ‹œμ— RabbitMQ λŠ” λ…λ¦½λœ μ»¨ν…Œμ΄λ„ˆμ— μœ„μΉ˜ν•©λ‹ˆλ‹€.

---

## πŸ“š λͺ©μ°¨

1. [🌟 κ°œμš”](#-κ°œμš”)
2. [πŸ› οΈ μ£Όμš” κΈ°λŠ₯](#-μ£Όμš”-κΈ°λŠ₯)
3. [πŸ”§ μ‹€ν–‰ 방법](#-μ‹€ν–‰-방법)
4. [πŸš€ νŠΈλžœμŠ€μ½”λ”© νŒŒμ΄ν”„λΌμΈ](#-νŠΈλžœμŠ€μ½”λ”©-νŒŒμ΄ν”„λΌμΈ)
5. [βš™οΈ μ£Όμš” 기술 및 ꡬ성 μš”μ†Œ](#-μ£Όμš”-기술-및-ꡬ성-μš”μ†Œ)
6. [☸️ μΏ λ²„λ„€ν‹°μŠ€ 배포](#-μΏ λ²„λ„€ν‹°μŠ€-배포)
7. [πŸ“‚ 디렉토리 ꡬ쑰](#-디렉토리-ꡬ쑰)
8. [πŸ“ κΈ°μ—¬ 및 λΌμ΄μ„ μŠ€](#-κΈ°μ—¬-및-λΌμ΄μ„ μŠ€)
---

## 🌟 κ°œμš”

- **CMS BE(Spring Boot)** μ—μ„œ **Transcode.Request MQ**둜 **νŠΈλžœμŠ€μ½”λ”© μš”μ²­**을 λ°œν–‰
- **Transcode Consumer**κ°€ μš”μ²­μ„ λ°›μ•„μ„œ **Transcode broker**(Celery with RabbitMQ)에 **enqueue**
- **Transcode Worker**κ°€ **FFmpeg**둜 **λΉ„λ””μ˜€λ₯Ό HLS둜 λ³€ν™˜**
- μ§„ν–‰λ₯ κ³Ό μƒνƒœλŠ” **Redis / RabbitMQ**둜 CMS BE에 전달
- μ΅œμ’… κ²°κ³ΌλŠ” **S3(Minio)** 에 μ—…λ‘œλ“œ
- μ΅œκ·Όμ—λŠ” **μΏ λ²„λ„€ν‹°μŠ€ ν™˜κ²½μœΌλ‘œ 이전**ν•˜μ—¬ μ•ˆμ •μ„±κ³Ό μœ μ—°μ„±μ„ κ°•ν™”ν–ˆμŠ΅λ‹ˆλ‹€.

---

## πŸ› οΈ μ£Όμš” κΈ°λŠ₯

βœ… **480p / 1080p HLS λ³€ν™˜**
βœ… **μ§„ν–‰λ₯  μ‹€μ‹œκ°„ μ—…λ°μ΄νŠΈ (Redis / RabbitMQ)**
βœ… **νŠΈλžœμŠ€μ½”λ”© μƒνƒœ μ—…λ°μ΄νŠΈ (Success / Fail)**
βœ… **S3에 HLS μ„Έκ·Έλ¨ΌνŠΈ μ—…λ‘œλ“œ**

---

## πŸ”§ μ‹€ν–‰ 방법

```bash
# 1. ν™˜κ²½ λ³€μˆ˜ 파일 볡사 및 μˆ˜μ •
cp .env.example .env
# .env νŒŒμΌμ—μ„œ RabbitMQ, Redis, S3 λ“± μ—°κ²° 정보 μ„€μ •

# 2. Docker Compose둜 μ„œλΉ„μŠ€ μ‹€ν–‰
docker-compose up --build
```

## πŸš€ νŠΈλžœμŠ€μ½”λ”© νŒŒμ΄ν”„λΌμΈ

1️⃣ **μ‚¬μš©μž μš”μ²­ β†’ CMS BE**
- μ‚¬μš©μžκ°€ CMS FE(React)μ—μ„œ 파일 μ—…λ‘œλ“œλ₯Ό μ™„λ£Œν•˜λ©΄, CMS BE(Spring Boot)둜 "S3 μ—…λ‘œλ“œ μ™„λ£Œ" μš”μ²­μ΄ μ „μ†‘λ©λ‹ˆλ‹€.

2️⃣ **νŠΈλžœμŠ€μ½”λ”© μš”μ²­ β†’ Transcode.Request MQ**
- CMS BEλŠ” νŠΈλžœμŠ€μ½”λ”© μš”μ²­μ„ **Transcode.Request MQ(RabbitMQ)**둜 λ°œν–‰(PUB)ν•©λ‹ˆλ‹€.
- 이 λ©”μ‹œμ§€μ—λŠ” S3 경둜, 파일λͺ…, νŒŒμΌνƒ€μž… λ“±μ˜ 메타데이터가 λ‹΄κΉλ‹ˆλ‹€.

3️⃣ **Transcode Consumer β†’ 브둜컀 β†’ μ›Œμ»€**
- **Transcode Consumer**(Python)λŠ” Transcode.Request MQλ₯Ό ꡬ독(SUB)ν•˜μ—¬ μƒˆλ‘œμš΄ μš”μ²­μ„ μˆ˜μ‹ ν•©λ‹ˆλ‹€.
- μš”μ²­μ„ Celery 기반의 **Transcode broker**둜 enqueue(등둝)ν•©λ‹ˆλ‹€.
- **Transcode Worker**(Celery Worker)λŠ” νμ—μ„œ μž‘μ—…μ„ κΊΌλ‚΄μ„œ **FFmpeg**둜 HLS λ³€ν™˜μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.
- λ³€ν™˜ 쀑 **Redis**둜 μ§„ν–‰λ₯ μ„ μ‹€μ‹œκ°„ μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€.
- μ§„ν–‰λ₯ κ³Ό μƒνƒœλŠ” **Transcode.Status MQ**둜 λ°œν–‰λ©λ‹ˆλ‹€.
> `transcode_service` μ—μ„œ redis 와 rabbitMQ λ‘˜ λ‹€ μ‚¬μš©ν•΄ μ§„ν–‰λ₯ μ„ 보내주고 μžˆμŠ΅λ‹ˆλ‹€.
> μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” Notifire λŠ” μ£Όμ„μ²˜λ¦¬ν•΄λ„ λ¬΄κ΄€ν•©λ‹ˆλ‹€.

4️⃣ **μ§„ν–‰ μƒνƒœ 전솑 β†’ CMS BE**
- CMS BEλŠ” **Transcode.Status MQ**λ₯Ό ꡬ독(SUB)ν•˜μ—¬ νŠΈλžœμŠ€μ½”λ”©μ˜ μƒνƒœ 및 μ§„ν–‰λ₯ μ„ μ‹€μ‹œκ°„μœΌλ‘œ ν™•μΈν•©λ‹ˆλ‹€.

5️⃣ **νŠΈλžœμŠ€μ½”λ”© κ²°κ³Ό β†’ S3 & FE**
- λ³€ν™˜λœ HLS 좜λ ₯(m3u8, ts νŒŒμΌλ“€)은 **S3**에 μ—…λ‘œλ“œλ©λ‹ˆλ‹€.
- μ΅œμ’…μ μœΌλ‘œ, CMS BEλŠ” λ³€ν™˜λœ HLS 경둜 정보λ₯Ό **CMS FE**둜 μ „λ‹¬ν•˜μ—¬ μ‚¬μš©μžμ—κ²Œ μ•Œλ €μ€λ‹ˆλ‹€.

---

## βš™οΈ μ£Όμš” 기술 및 ꡬ성 μš”μ†Œ

- **Spring Boot (CMS BE)**: API μ„œλ²„, MQ 연동
- **React (CMS FE)**: μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€
- **RabbitMQ**: νŠΈλžœμŠ€μ½”λ”© μš”μ²­/μƒνƒœ 처리용 λ©”μ‹œμ§€ 큐
- **Celery Worker**: νŠΈλžœμŠ€μ½”λ”© νƒœμŠ€ν¬ 처리
- **FFmpeg**: λΉ„λ””μ˜€λ₯Ό HLS(480p/1080p)둜 λ³€ν™˜
- **S3(MinIO)**: μ˜μƒ 파일 μ €μž₯μ†Œ
- **Redis**: νŠΈλžœμŠ€μ½”λ”© μ§„ν–‰λ₯  μ‹€μ‹œκ°„ μ—…λ°μ΄νŠΈ
- **Kubernetes**: μ»¨ν…Œμ΄λ„ˆ μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜, 배포 μžλ™ν™”

---

## ☸️ μΏ λ²„λ„€ν‹°μŠ€ 배포

λ³Έ ν”„λ‘œμ νŠΈλŠ” ν˜„μž¬ **μΏ λ²„λ„€ν‹°μŠ€(Kubernetes)** ν™˜κ²½μ—μ„œ 배포 및 μš΄μ˜λ©λ‹ˆλ‹€.
이λ₯Ό 톡해 μ»¨ν…Œμ΄λ„ˆ 기반의 μ„œλΉ„μŠ€λ₯Ό 보닀 μœ μ—°ν•˜κ³  μ•ˆμ •μ μœΌλ‘œ κ΄€λ¦¬ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

---

## πŸ“‚ 디렉토리 ꡬ쑰

```plaintext
.
β”œβ”€β”€ Architecture_Diagram_v3.png
β”œβ”€β”€ Dockerfile
β”œβ”€β”€ docker-compose.yml
β”œβ”€β”€ k8s/ # μΏ λ²„λ„€ν‹°μŠ€ λ§€λ‹ˆνŽ˜μŠ€νŠΈ
β”‚ β”œβ”€β”€ namespace.yaml
β”‚ β”œβ”€β”€ configmap.yaml
β”‚ β”œβ”€β”€ secret.yaml
β”‚ β”œβ”€β”€ cms-transcode-consumer/
β”‚ β”‚ └── deployment.yaml
β”‚ β”œβ”€β”€ cms-transcode-worker/
β”‚ β”‚ └── deployment.yaml
β”‚ └── redis/
β”‚ β”œβ”€β”€ deployment.yaml
β”‚ └── service.yaml
β”œβ”€β”€ requirements.txt
β”œβ”€β”€ src/ # μ†ŒμŠ€ μ½”λ“œ
β”‚ β”œβ”€β”€ consumer/ # RabbitMQ 컨슈머
β”‚ β”‚ └── request_consumer.py
β”‚ β”œβ”€β”€ core/ # μ„€μ • 및 곡톡 λͺ¨λ“ˆ
β”‚ β”‚ β”œβ”€β”€ config.py
β”‚ β”‚ └── s3.py
β”‚ β”œβ”€β”€ notifiers/ # MQ 및 Redis μ•Œλ¦Ό
β”‚ β”‚ β”œβ”€β”€ rabbitmq_notifier.py
β”‚ β”‚ └── redis_notifier.py
β”‚ β”œβ”€β”€ services/ # νŠΈλžœμŠ€μ½”λ”© μ„œλΉ„μŠ€ 둜직
β”‚ β”‚ └── transcode_service.py
β”‚ β”œβ”€β”€ tasks/ # Celery νƒœμŠ€ν¬
β”‚ β”‚ └── transcode_video_task.py
β”‚ β”œβ”€β”€ tests/ # ν…ŒμŠ€νŠΈ μœ ν‹Έλ¦¬ν‹°
β”‚ β”‚ β”œβ”€β”€ redis_subscriber.py
β”‚ β”‚ └── send_transcode_request.py
β”‚ β”œβ”€β”€ utils/ # μœ ν‹Έλ¦¬ν‹°
β”‚ β”‚ β”œβ”€β”€ date_utils.py
β”‚ β”‚ β”œβ”€β”€ io_utils.py
β”‚ β”‚ └── logging_utils.py
β”‚ └── worker/
β”‚ └── celery_worker.py
└── README.md
```

## πŸ“ κΈ°μ—¬ 및 λΌμ΄μ„ μŠ€

이 ν”„λ‘œμ νŠΈλŠ” [MIT License](LICENSE)둜 λ°°ν¬λ©λ‹ˆλ‹€.
μ΄μŠˆλ‚˜ PR은 μ–Έμ œλ“  ν™˜μ˜ν•©λ‹ˆλ‹€! πŸ™Œ
λ¬Έμ˜λ‚˜ μš”μ²­μ‚¬ν•­μ€ [Issues](https://github.com/handong-app/cms-transcode-worker/issues)에 λ‚¨κ²¨μ£Όμ„Έμš”.

---

🌟 **κ°μ‚¬ν•©λ‹ˆλ‹€!** 🌟