Goverse é uma plataforma moderna de comunicação em tempo real inspirada em soluções como Discord e Google Meet, desenvolvida com arquitetura de microsserviços em Go.
- Autenticação (senha, OAuth com JWTs RS256)
- Criação e gerenciamento de salas
- Chat em tempo real via WebSocket (em desenvolvimento)
- Vídeo via WebRTC (em desenvolvimento)
- Notificações em tempo real
- Arquitetura desacoplada com gRPC
- Observabilidade com Prometheus e Grafana
- Go (Golang)
- gRPC
- WebSocket
- WebRTC
- Docker & Docker Compose
- Kubernetes
- PostgreSQL & Redis
- Traefik como API Gateway
goverse/
├── auth-service/
├── user-service/
├── room-service/
├── auth-middleware/
├── chat-service/
├── traefik/
├── monitoring/
└── k8s/Nota: O api-gateway manual foi substituído pelo Traefik + auth-middleware, uma abordagem mais robusta e de fácil manutenção para roteamento e autenticação na borda.
Clone o repositório:
git clone https://github.com/FelipeFelipeRenan/goverse.git
cd goversePreencha os arquivos .env em cada pasta de serviço, usando os arquivos .env.example como base.
Execute os serviços com Docker Compose: O projeto contém dois ambientes:
Ambiente de Produção-Like (Recomendado): Usa o Traefik como gateway, forçando toda a comunicação pela borda.
docker-compose -f docker-compose-traefik.yml up --buildAmbiente de Desenvolvimento Rápido: Expõe as portas de todos os serviços diretamente, útil para debug.
Ambiente de Desenvolvimento Rápido: Expõe as portas de todos os serviços diretamente, útil para debug.
docker-compose up --buildCrie as Chaves de Autenticação (Obrigatório): Crie uma pasta .keys na raiz do projeto e adicione-a ao seu .gitignore. Em seguida, gere as chaves:
# Gerar a chave privada
openssl genpkey -algorithm RSA -out .keys/private.pem -pkeyopt rsa_keygen_bits:2048# Extrair a chave pública
openssl rsa -pubout -in .keys/private.pem -out .keys/public.pemA documentação das APIs está disponível via Swagger. Após iniciar os serviços, acesse:
http://localhost:8088/swagger/index.html
Cada serviço contém seus próprios testes de unidade. Para rodar os testes de um serviço específico:
cd room-service
go test ./... -vTestes com curl (Acessando o Gateway na porta 80) Rotas Públicas Criar um usuário:
curl -X POST http://localhost/user \
-H "Content-Type: application/json" \
-d '{
"username": "novo_usuario",
"email": "novo@email.com",
"password": "senha123"
}'Retornar todos os usuários:
curl http://localhost/usersFazer Login (para obter um token):
export CSRF_TOKEN=$(curl -s -X POST http://localhost/auth/login \
-H "Content-Type: application/json" \
-d '{"type": "password", "email": "admin@goverse.com", "password": "senha123"}' \
--cookie-jar cookies.txt | jq -r '.csrf_token')Rotas Protegidas Após obter um token JWT com a rota de login, você pode usá-lo para acessar as rotas protegidas no cabeçalho Authorization.
Retornar os dados de um usuário logado
curl http://localhost/auth/me --cookie cookies.txt
Retornar um usuário pelo seu ID:
curl http://localhost/user/<id_do_usuario> \
-H "Authorization: Bearer <SEU_TOKEN_JWT>"Criar uma sala:
curl -X POST http://localhost/rooms \
--cookie cookies.txt \
-H "X-CSRF-TOKEN: $CSRF_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Sala do Admin",
"description": "Sala criada via cURL",
"is_public": true,
"max_members": 20
}'Listar salas do usuário logado
curl http://localhost/rooms/mine --cookie cookies.txtListar todas as salas (com filtros):
curl "http://localhost/rooms?limit=10&offset=0&public_only=true&keyword=Estudos" \
-H "Authorization: Bearer <SEU_TOKEN_JWT>"Atualizar informações de uma sala (requer ser dono ou admin):
curl -X PATCH http://localhost/rooms/<id-da-sala> \
--cookie cookies.txt \
-H "X-CSRF-TOKEN: $CSRF_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Novo Nome da Sala Geral"
}'Deletar uma sala (requer ser o dono):
curl -X DELETE http://localhost/rooms/<id_da_sala> \
-H "Authorization: Bearer <SEU_TOKEN_JWT>"Mostrar todos os membros de uma sala:
curl http://localhost/rooms/<id_da_sala>/members \
-H "Authorization: Bearer <SEU_TOKEN_JWT>"Adicionar um membro a uma sala (requer ser dono ou admin):
curl -X POST http://localhost/rooms/<id-da-sala>/members \
--cookie cookies.txt \
-H "X-CSRF-TOKEN: $CSRF_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"user_id": "<id-do-usuario-adicionado>",
"role": "member"
}'Deletar um membro da sala (requer ser dono ou admin):
curl -X DELETE http://localhost/rooms/<id_da_sala>/members/<id_do_membro> \
-H "Authorization: Bearer <SEU_TOKEN_JWT>"Mudar a role de um membro (requer ser dono ou admin):
curl -X PUT http://localhost/rooms/<id_da_sala>/members/<id_do_membro>/role \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <SEU_TOKEN_JWT>" \
-d '{ "new_role": "admin" }'Para se conectar a sala, basta rodar o comando:
wscat -c "ws://localhost/ws?roomId=sala-final" \
-H "Cookie: access_token=$(grep 'access_token' cookies.txt | cut -f7)"Para utilizar a aplicação com o Kubernetes no Minikube:
Inicie o cluster:
minikube startCrie os segredos necessários (execute a partir da raiz do projeto):
# Lembre-se de criar todos os secrets para senhas de banco, etc.
# Exemplo para as chaves JWT:
kubectl create secret generic jwt-keys-secret -n goverse \
--from-file=private.pem=./.keys/private.pem \
--from-file=public.pem=./.keys/public.pemAplique os manifestos:
make k8s-applyExponha as portas do Traefik:
make traefik-portsPara utilizar a aplicação com o Kubernetes, utilizando no minikube como cluster, basta utilizar os comandos:
Para iniciar o cluster:
minikube startPara aplicar os manifests:
make k8s-applyPara expor as portas:
make traefik-ports📄 Licença Distribuído sob a licença MIT.