{"id":28799733,"url":"https://github.com/handong-app/cms-transcode-worker","last_synced_at":"2026-04-13T16:34:37.418Z","repository":{"id":295918103,"uuid":"990037752","full_name":"handong-app/cms-transcode-worker","owner":"handong-app","description":"Transcode worker for CMS","archived":false,"fork":false,"pushed_at":"2025-06-06T14:45:40.000Z","size":6692,"stargazers_count":1,"open_issues_count":5,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-06-06T15:21:20.580Z","etag":null,"topics":["celery","docker","ffmpeg","python3","rabbitmq","redis","transcode"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/handong-app.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-05-25T11:24:52.000Z","updated_at":"2025-06-06T14:47:51.000Z","dependencies_parsed_at":"2025-05-28T03:28:36.498Z","dependency_job_id":"d18942d6-ba00-4671-b469-e275c359f6ee","html_url":"https://github.com/handong-app/cms-transcode-worker","commit_stats":null,"previous_names":["handong-app/cms-storage-worker","handong-app/cms-transcode-worker"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/handong-app/cms-transcode-worker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/handong-app%2Fcms-transcode-worker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/handong-app%2Fcms-transcode-worker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/handong-app%2Fcms-transcode-worker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/handong-app%2Fcms-transcode-worker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/handong-app","download_url":"https://codeload.github.com/handong-app/cms-transcode-worker/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/handong-app%2Fcms-transcode-worker/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":260506909,"owners_count":23019444,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["celery","docker","ffmpeg","python3","rabbitmq","redis","transcode"],"created_at":"2025-06-18T07:00:38.504Z","updated_at":"2026-04-13T16:34:37.412Z","avatar_url":"https://github.com/handong-app.png","language":"Python","readme":"![Build Status](https://img.shields.io/badge/build-passing-brightgreen)\n![License: MIT](https://img.shields.io/badge/license-MIT-red.svg)\n![Kubernetes](https://img.shields.io/badge/Kubernetes-Deployed-blue?logo=kubernetes)\n![Container](https://img.shields.io/badge/Container-Docker-blue?logo=docker)\n![Python](https://img.shields.io/badge/Worker-Python%203.12-blue?logo=python)\n![Celery](https://img.shields.io/badge/Celery-5.3.1-brightgreen?logo=celery)\n![RabbitMQ](https://img.shields.io/badge/Queue-RabbitMQ-FF6600?logo=rabbitmq)\n![Redis](https://img.shields.io/badge/Redis-7.x-red?logo=redis)\n![FFmpeg](https://img.shields.io/badge/Transcoder-FFmpeg-black?logo=ffmpeg)\n![Storage](https://img.shields.io/badge/S3%20(MinIO)-storage-red?logo=minio)\n![Infisical](https://img.shields.io/badge/Secrets-Infisical-yellow)\n\n# 📦 CMS Transcode Worker\n\n**cms-transcode-worker**는 CMS 시스템의 **비디오 트랜스코딩**을 담당하는 파이썬 Celery 워커입니다.  \n사용자가 업로드한 비디오를 HLS로 변환(480p/1080p)하고, 진행 상황을 실시간으로 전달합니다.\n\n---\n\n## 🎨 아키텍처 다이어그램\n\n![Architecture Diagram](./Architecture_Diagram_v3.png)\n\u003e 이해를 위해 RabbitMQ 를 분할하였습니다.  \n\u003e 실제 작동시에 RabbitMQ 는 독립된 컨테이너에 위치합니다.\n\n---\n\n## 📚 목차\n\n1. [🌟 개요](#-개요)  \n2. [🛠️ 주요 기능](#-주요-기능)  \n3. [🔧 실행 방법](#-실행-방법)  \n4. [🚀 트랜스코딩 파이프라인](#-트랜스코딩-파이프라인)  \n5. [⚙️ 주요 기술 및 구성 요소](#-주요-기술-및-구성-요소)  \n6. [☸️ 쿠버네티스 배포](#-쿠버네티스-배포)  \n7. [📂 디렉토리 구조](#-디렉토리-구조)  \n8. [📝 기여 및 라이선스](#-기여-및-라이선스)\n---\n\n## 🌟 개요\n\n- **CMS BE(Spring Boot)** 에서 **Transcode.Request MQ**로 **트랜스코딩 요청**을 발행  \n- **Transcode Consumer**가 요청을 받아서 **Transcode broker**(Celery with RabbitMQ)에 **enqueue**  \n- **Transcode Worker**가 **FFmpeg**로 **비디오를 HLS로 변환**  \n- 진행률과 상태는 **Redis / RabbitMQ**로 CMS BE에 전달  \n- 최종 결과는 **S3(Minio)** 에 업로드  \n- 최근에는 **쿠버네티스 환경으로 이전**하여 안정성과 유연성을 강화했습니다.\n\n---\n\n## 🛠️ 주요 기능\n\n✅ **480p / 1080p HLS 변환**  \n✅ **진행률 실시간 업데이트 (Redis / RabbitMQ)**  \n✅ **트랜스코딩 상태 업데이트 (Success / Fail)**  \n✅ **S3에 HLS 세그먼트 업로드**\n\n---\n\n\n## 🔧 실행 방법\n\n```bash\n# 1. 환경 변수 파일 복사 및 수정\ncp .env.example .env\n# .env 파일에서 RabbitMQ, Redis, S3 등 연결 정보 설정\n\n# 2. Docker Compose로 서비스 실행\ndocker-compose up --build\n```\n\n## 🚀 트랜스코딩 파이프라인\n\n1️⃣ **사용자 요청 → CMS BE**  \n- 사용자가 CMS FE(React)에서 파일 업로드를 완료하면, CMS BE(Spring Boot)로 \"S3 업로드 완료\" 요청이 전송됩니다.\n\n2️⃣ **트랜스코딩 요청 → Transcode.Request MQ**  \n- CMS BE는 트랜스코딩 요청을 **Transcode.Request MQ(RabbitMQ)**로 발행(PUB)합니다.  \n- 이 메시지에는 S3 경로, 파일명, 파일타입 등의 메타데이터가 담깁니다.\n\n3️⃣ **Transcode Consumer → 브로커 → 워커**  \n- **Transcode Consumer**(Python)는 Transcode.Request MQ를 구독(SUB)하여 새로운 요청을 수신합니다.  \n- 요청을 Celery 기반의 **Transcode broker**로 enqueue(등록)합니다.  \n- **Transcode Worker**(Celery Worker)는 큐에서 작업을 꺼내서 **FFmpeg**로 HLS 변환을 수행합니다.\n  - 변환 중 **Redis**로 진행률을 실시간 업데이트합니다.\n  - 진행률과 상태는 **Transcode.Status MQ**로 발행됩니다.\n  \u003e `transcode_service` 에서 redis 와 rabbitMQ 둘 다 사용해 진행률을 보내주고 있습니다.   \n  \u003e 사용하지 않는 Notifire 는 주석처리해도 무관합니다.\n\n4️⃣ **진행 상태 전송 → CMS BE**  \n- CMS BE는 **Transcode.Status MQ**를 구독(SUB)하여 트랜스코딩의 상태 및 진행률을 실시간으로 확인합니다.\n\n5️⃣ **트랜스코딩 결과 → S3 \u0026 FE**  \n- 변환된 HLS 출력(m3u8, ts 파일들)은 **S3**에 업로드됩니다.  \n- 최종적으로, CMS BE는 변환된 HLS 경로 정보를 **CMS FE**로 전달하여 사용자에게 알려줍니다.\n\n---\n\n## ⚙️ 주요 기술 및 구성 요소\n\n- **Spring Boot (CMS BE)**: API 서버, MQ 연동\n- **React (CMS FE)**: 사용자 인터페이스\n- **RabbitMQ**: 트랜스코딩 요청/상태 처리용 메시지 큐\n- **Celery Worker**: 트랜스코딩 태스크 처리\n- **FFmpeg**: 비디오를 HLS(480p/1080p)로 변환\n- **S3(MinIO)**: 영상 파일 저장소\n- **Redis**: 트랜스코딩 진행률 실시간 업데이트\n- **Kubernetes**: 컨테이너 오케스트레이션, 배포 자동화\n\n---\n\n## ☸️ 쿠버네티스 배포\n\n본 프로젝트는 현재 **쿠버네티스(Kubernetes)** 환경에서 배포 및 운영됩니다.  \n이를 통해 컨테이너 기반의 서비스를 보다 유연하고 안정적으로 관리하고 있습니다.\n\n---\n\n## 📂 디렉토리 구조\n\n```plaintext\n.\n├── Architecture_Diagram_v3.png\n├── Dockerfile\n├── docker-compose.yml\n├── k8s/                            # 쿠버네티스 매니페스트\n│   ├── namespace.yaml\n│   ├── configmap.yaml\n│   ├── secret.yaml\n│   ├── cms-transcode-consumer/\n│   │   └── deployment.yaml\n│   ├── cms-transcode-worker/\n│   │   └── deployment.yaml\n│   └── redis/\n│       ├── deployment.yaml\n│       └── service.yaml\n├── requirements.txt\n├── src/                            # 소스 코드\n│   ├── consumer/                   # RabbitMQ 컨슈머\n│   │   └── request_consumer.py\n│   ├── core/                       # 설정 및 공통 모듈\n│   │   ├── config.py\n│   │   └── s3.py\n│   ├── notifiers/                  # MQ 및 Redis 알림\n│   │   ├── rabbitmq_notifier.py\n│   │   └── redis_notifier.py\n│   ├── services/                   # 트랜스코딩 서비스 로직\n│   │   └── transcode_service.py\n│   ├── tasks/                      # Celery 태스크\n│   │   └── transcode_video_task.py\n│   ├── tests/                      # 테스트 유틸리티\n│   │   ├── redis_subscriber.py\n│   │   └── send_transcode_request.py\n│   ├── utils/                      # 유틸리티\n│   │   ├── date_utils.py\n│   │   ├── io_utils.py\n│   │   └── logging_utils.py\n│   └── worker/\n│       └── celery_worker.py\n└── README.md\n```\n\n## 📝 기여 및 라이선스\n\n이 프로젝트는 [MIT License](LICENSE)로 배포됩니다.  \n이슈나 PR은 언제든 환영합니다! 🙌  \n문의나 요청사항은 [Issues](https://github.com/handong-app/cms-transcode-worker/issues)에 남겨주세요.\n\n---\n\n🌟 **감사합니다!** 🌟","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhandong-app%2Fcms-transcode-worker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhandong-app%2Fcms-transcode-worker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhandong-app%2Fcms-transcode-worker/lists"}