Como estou desenvolvendo uma rede social de futebol do zero: stack, desafios e aprendizados
Salve pessoal, beleza? meu primeiro post aqui gostaria de compartilhar com vocês meu mais novo projeto, o Futeboxd, uma rede social para criar avaliações de partidas de futebol. Só pra esclarecer isso não é um Pitch(talvez seja um pouco) mas eu quero fazer mais uma descrição técnica dele, da onde saiu a idéia, como eu o construí ele, tecnologias usadas etc.
Sumário:
Por que eu criei o Futeboxd?
Arquitetura do projeto
Tecnologias usadas
Funcionalidades do Futeboxd
Futuro do Futeboxd
Conclusão
Por que eu criei o Futeboxd?
A idéia surgiu após eu ler alguns posts no X(antigo Twitter) sobre alguém criar um Letterboxd de futebol. Percebi que não existia um app amplo para avaliar partidas, eu encontrei alguns mas de um nicho bem limitado, como o RateGame que faz exatamente isso mas é limitado apenas a Liga Inglesa, eu então resolvi botar a mão na massa! Além de ser um projeto que eu gostaria de usar, vi nisso uma ótima oportunidade para desenvolver algo com usuários reais, melhorar meu portfólio e, quem sabe, conquistar aquela sonhada vaguinha.
Arquitetura do projeto
Inicialmente eu quebrei a cabeça com isso, a primeira coisa que eu fiz foi procurar uma fonte para buscar dados de partidas, inicialmente encontrei algumas apis mas que eram caras demais pro meu momento. Foi então que encontrei uma api da ESPN, não tem documentação, não é citada em nenhum site deles mas por algum motivo funciona e é totalmente aberta aqui uma doc dela feita pela comunidade, até agora eu não sei se é permitido o uso dela porque ela não é citada em nada da ESPN, mas se der ruim eu tenho uma alternativa: fazer web scraping do site Fbref, o que é permitido por eles mas com um rate limiting.
Abaixo você pode ver um desenho da arquitetura atual do futeboxd:
Sim, microsserviços! Uma das grandes vantagens desse projeto foi que eu cai na real que eu não sabia nada! Eu achava que sabia sobre microsserviços, achava que sabia sobre clean arch mas eu não sabia nada. Só assistir cursos e nunca aplicar na prática não te ensina nada, eu sabia aplicar esses conceitos mas apenas nos projetos dos cursos que eu fiz, quando comecei a desenvolver um projeto do zero eu não consegui aplicar direito esses conhecimentos. Comecei a criar vários serviços, um para usuários outro para reviews outro para likes isso aumentou demais a complexidade do projeto, detalhe: tudo isso pra rodar em uma única VPS! Foi então que eu parei e repensei o projeto inteiro, e escolhi manter do jeito que está, um microsserviço e um monolito, com isso eu consigo escalar o serviço de futebol(o que na minha cabeça vai receber várias requisições), e ao mesmo tempo consigo deixar o monolito principal sem a complexidade que microsserviços introduz. E não podemos esquecer do serviço de atualização de dados de futebol, esse serviço basicamente é um cron job, que busca por partidas de uma liga específica(mais pra baixo detalharei quais ligas estão incluidas no Futeboxd) e cria crons jobs para os horários das partidas, depois atualiza de 5 em 5 minutos até que a partida acabe, eu fiz de uma maneira síncrona e bem espaçada para que não sobrecarregue os servidores da ESPN e eu acabe com um IP bloqueado.
Tecnologias Usadas
Para esse projeto eu optei por usar Golang nas apis sem qualquer framework(sim, estou escrevendo SQL puro), apesar de eu ser um desenvolvedor Java e estar almejando por uma vaga para trabalhar com Java, esse é um projeto que eu desenvolvi para ser usado por usuários reais, e eu precisava de uma linguagem que consumisse muita pouca memória e como eu estava estudando Golang na época, optei por escolher ele. para o worker eu escolhi o nodejs por motivos de ele ser bastante dinâmico com tipos e a api da ESPN não tem uma estrutura definida, e usar JS ajuda na hora que erros acontecem pela estrutura retornada pela API não ser o que o código estava esperando.
A lista completa:
- Serviço de futebol: Golang
- Monolito principal: Golang
- Worker: Nodejs
- Banco de dados: Postgres
- Armazenamento de imagens: Digital ocean spaces(estava usando AWS mas o digital ocean oferece um plano grátis além de ser significamente mais barato)
- Envio de emails: Resend
- Hospedagem: Hostinger com Docker swarm
Funcionalidades do Futeboxd
Atualmente o Futeboxd conta com funcionalidades básicas de uma rede social, você pode criar reviews, comentar nas reviews de outras pessoas, dar likes, seguir pessoas, fazer pesquisas, além também de ter um feed personalizado e recomendação de pessoas pra seguir com base na sua rede e no time que você torce, recomendando pessoas que torcem para o mesmo time.
Eu me baseei bastance no Tabnews para desenvolver esse projeto, tanto que a parte de autenticação e basicamente copiada daqui, apenas adaptei para o Golang e para o meu caso de uso.
Na parte de futebol, atualmente tenho um banco de dados com 60 mil partidas desde 2006 sendo atualizado continuamente nas seguintes ligas:
- Copa do Brasil
- Supercopa do Brasil
- Campeonato Paulista
- Campeonato Carioca
- Campeonato Gaúcho
- Campeonato Mineiro
- Copa do Nordeste
- Champions League
- Europa League
- Eliminatórias Europa
- Copa do Mundo
- Mundial de Clubes
- Copa Libertadores
- Copa Sul-Americana
- Copa América
- Premier League
- EFL Championship
- La Liga
- Copa do Rei
- Ligue One
- Bundesliga
- Serie A
- Primeira Liga
- Amistoso
- Eurocopa
- Copa da Liga Inglesa
- Eliminatórias América
- Copa da Inglaterra
- Copa da Itália
- Supercopa da Espanha
- Copa da Alemanha
- Super Copa da UEFA
- Recopa
- Mundial de Clubes
- Conference League
Futuro do Futeboxd
Eu pretendo apenas deixar esse projeto como um portfólio para eu conseguir uma vaga, e quem sabe se ele tiver uma boa base de usuários fiéis usar um modelo de monetização parecido com o que o Letterboxd usa. Mas mesmo assim eu mantenho uma lista de funções que planejo adicionar ao site:
- Notificações via push e email
- Fazer comentários em comentários
- Sistema de moderação com denúncias e um backoffice
- Adicionar um campo que o usuário pode digitar se ele foi ao estádio ou não, criando um "diário" com isso
- Criação de comunidades parecido com o Reddit
- Discussões ao vivo, como um chat da Twitch para partidas acontecendo ao vivo
- Uma melhor categorização das notícias, podendo listar notícias sobre um time especifíco ou sobre um termo
Além disso, estou considerando deixar o código do Futeboxd aberto no futuro para a comunidade contribuir. A API REST dele já é aberta, mas ainda não existe uma documentação, o que está no meu roadmap para desenvolver.
Conclusão
O Futeboxd é um projeto que acima de tudo me deu bastante aprendizado sobre desenvolvimento de software, sobre arquitetura, containers, clean code, SQL e sobre Golang que eu era um completo iniciante na linguagem quando comecei o projeto. Hoje, sinto que tenho uma base sólida e uma experiência considerável com ela.
E pra você que chegou até aqui o projeto já está no ar, Clique aqui
Fonte: https://futeboxd.com