A Rankdone é uma aplicação composta de um backend em PHP, um frontend em TypeScript (Angular) e diversos micro serviços, escritos em diversas linguagens(Python, NodeJS, PHP…) , que agregam novas funcionalidades como um serviço de chat e um corretor de redações utilizando ferramentas de Machine Learning. Antes de ser migrada para Docker a aplicação enfrentava dificuldades nos deploys, que precisavam ser agendados devido a possibilidade de quebra do sistema em ambiente de produção, eram demorados e instáveis. Além disso a aplicação dependia dos serviços oferecidos pelo servidor utilizado que apresentavam instabilidade e constantemente exigiam manutenção por parte dos desenvolvedores.
Sobre o projeto
Desafios na implementação
- Mapear as dependências da aplicação e encontrar soluções Open Source que fornecem os mesmos serviços.
- Mapear as dependências de infraestrutura da aplicação.
- Automatizar o processo de deploy incluindo toda a bateria de testes antes de atualizar a aplicação em produção.
- Centralizar os logs das possíveis réplicas da aplicação em um único local.
- Criar um sistema de Service Discovery para os nós da aplicação já que os endereços são dinâmicos e não podem ser fixados no código.
Solução implementada
Para cada serviço da Rankdone (backend, frontend e os micro serviços) criamos um Dockerfile que encapsula a aplicação e um docker-compose.yml que versiona o ambiente da aplicação. Com o docker-compose o desenvolvedor consegue facilmente reproduzir toda a infraestrutura que a aplicação necessita (banco de dados, fila de mensagem, cache, etc) e o administrador pode utilizar o mesmo docker-compose como base para gerenciar a infraestrutura de produção. Implementamos pipelines, utilizando Jenkins, que utilizam essas imagens para rodar uma bateria de testes em cima do serviços e automaticamente atualizar a aplicação em produção caso erros não sejam encontrados.
Benefícios e resultados
- Alta disponibilidade e escalabilidade horizontal da aplicação em ambiente de produção.
- Redução dos custos da empresa evitando desperdícios de recursos de infraestrutura.
- Melhoria na gestão de conhecimento e transparência por parte da equipe técnica (evitando “hacks” ou “macetes” que apenas um desenvolvedor conhece).
- Centralização dos logs da aplicação em um único serviço.
- Autonomia da equipe de desenvolvimento para provisionar recursos para a aplicação (não há mais a necessidade de solicitar um V.M).