Um sistema de codificação de vídeos em Go que processa vídeos MP4 para o formato DASH (Dynamic Adaptive Streaming over HTTP), utilizando arquitetura orientada a eventos com RabbitMQ.
- Processamento assíncrono de vídeos com workers
- Codificação DASH para streaming adaptativo
- Upload/Download automático para AWS S3 (ou LocalStack)
- Fila de mensagens com RabbitMQ
- Persistência com PostgreSQL/SQLite
- Containerização com Docker
- Testes unitários com cobertura
O projeto segue uma arquitetura em camadas baseada em Clean Architecture:
├── domain/ # Entidades de negócio (Video, Job)
├── application/ # Casos de uso e serviços
│ ├── repositories/ # Contratos e implementações de repositórios
│ └── services/ # Lógica de negócio
└── framework/ # Infraestrutura (DB, Queue, Utils)
├── cmd/ # Ponto de entrada da aplicação
├── database/ # Configuração do banco de dados
├── queue/ # Configuração do RabbitMQ
└── utils/ # Utilitários gerais
- Go 1.24.2 - Linguagem principal
- PostgreSQL/SQLite - Banco de dados
- RabbitMQ - Fila de mensagens
- AWS S3/LocalStack - Armazenamento de arquivos
- GORM - ORM para Go
- Bento4 - Ferramentas de processamento de vídeo
- FFmpeg - Manipulação de mídia
- Docker - Containerização
- Docker e Docker Compose
- Make (opcional)
- Clone o repositório:
git clone https://github.com/raffreitas/codeflix-video-encoder.git
cd codeflix-video-encoder- Configure as variáveis de ambiente:
cp .env.example .envEdite o arquivo .env conforme necessário:
# Banco de dados
DB_TYPE="postgres"
DSN="dbname=encoder sslmode=disable user=postgres password=root host=db"
# AWS/LocalStack
INPUT_BUCKET_NAME="codeflix-local"
OUTPUT_BUCKET_NAME="codeflix-local"
# RabbitMQ
RABBITMQ_DSN="amqp://rabbitmq:rabbitmq@rabbitmq:5672/"
RABBITMQ_CONSUMER_QUEUE_NAME="videos"
# Concorrência
CONCURRENCY_UPLOAD=10
CONCURRENCY_WORKERS=1- Inicie todos os serviços:
docker-compose up -d- Execute a aplicação:
docker-compose exec app go run framework/cmd/server/server.goOs serviços estarão disponíveis em:
- Aplicação: Container app
- PostgreSQL:
localhost:5432 - RabbitMQ Management:
http://localhost:15672(rabbitmq/rabbitmq) - LocalStack S3:
http://localhost:4566
domain/video.go- Entidade Video com validaçõesdomain/job.go- Entidade Job para controle de processamento
application/services/video_service.go- Serviços de processamento de vídeoapplication/services/job_service.go- Orquestração do fluxo de jobsapplication/services/job_worker.go- Workers para processamento assíncronoapplication/services/job_manager.go- Gerenciamento de workers e filasapplication/services/upload_manager.go- Upload concorrente para S3
framework/database/db.go- Configuração do banco de dadosframework/queue/queue.go- Cliente RabbitMQframework/utils/utils.go- Utilitários gerais
- Recebimento: Mensagem recebida via RabbitMQ
- Validação: Validação do JSON e criação do vídeo
- Download: Download do vídeo do bucket S3
- Fragmentação: Fragmentação com
mp4fragment - Codificação: Codificação DASH com
mp4dash - Upload: Upload concorrente dos arquivos processados
- Limpeza: Remoção dos arquivos temporários
- Notificação: Envio de notificação de conclusão
{
"resource_id": "52d8ef70-e795-41ab-9846-2523bf34c30e",
"file_path": "video.mp4",
"status": "pending"
}Execute os testes:
# Todos os testes
docker-compose exec app go test ./...
# Testes específicos
docker-compose exec app go test ./domain/...
docker-compose exec app go test ./application/services/...
docker-compose exec app go test ./application/repositories/...- ✅
domain/video_test.go- Validação de entidades - ✅
domain/job_test.go- Criação de jobs - ✅
application/repositories/video_repository_test.go- Persistência de vídeos - ✅
application/repositories/job_repository_test.go- Persistência de jobs - ✅
application/services/video_service_test.go- Processamento de vídeos - ✅
application/services/upload_manager_test.go- Upload para S3
# Logs da aplicação
docker-compose logs -f app
# Acesso ao container
docker-compose exec app sh
# Restart dos serviços
docker-compose restart
# Limpeza completa
docker-compose down -vO sistema utiliza duas tabelas principais:
- videos: Armazena informações dos vídeos
- jobs: Controla o estado do processamento
Este projeto está sob a licença MIT. Veja o arquivo LICENSE para detalhes.
Desenvolvido com ❤️ em Go