Syki é um sistema open-source para gerenciamento educacional, que pode ser usado por gestores, professores e alunos.
Se cadastre em https://app.syki.com.br e teste o sistema em produção!
- Funcionalidades
- Tecnologias
- Testes
- CI/CD
- Infra
- Usabilidade
- Processamento Assíncrono
- Auditoria
- Observabilidade
- Rate Limiting
- Documentação
- Real-Time
- Cache
- Arquitetura
- Banco de Dados
- Webhooks
- Desenvolvimento
- Contribuições
O Syki possui diversas funcionalidades, que podem ser categorizadas com base em cada perfil de usuário do sistema:
- Acadêmico: usuário em cargo de gestão dentro da instituição de ensino
- Professor: usuário que leciona nas turmas da instituição
- Aluno: usuário matriculado em algum curso da instituição
- Adm: usuário administrador do sistema globalmente
Existem também as funcionalidades "Cross", que podem ser acessadas por qualquer usuário, como as de "Login" e "Esqueci Minha Senha".
- Cadastrar-se no sistema informando seu email.
- Definir senha utilizando o link de confirmação de email.
- Redefinir sua senha utilizando o link de redefinição de senha.
- Logar no sistema informando email e senha.
- Utilizar um app de autenticação (ex: Google Authenticator) para configurar o segundo fator de autenticação.
- Logar no sistema apenas ao informar corretamente o TOTP gerado no app (Time-Based One-Time Password).
- Listar notificações relacionadas com sua instituição, curso ou atividades das turmas.
- Marcar notificações já visualizadas como lidas.
- Acessar diversos dados consolidados sobre a instituição, atualizados em tempo real.
- Criar um novo campus.
- Editar um campus já existente.
- Listar todos os campus da instituição.
- Criar um novo curso.
- Listar todos os cursos da instituição.
- Criar uma nova disciplina.
- Listar todas as disciplinas da instituição.
- Criar uma nova grade curricular, vinculando curso e disciplinas.
- Listar todas as grades curriculares da instituição.
- Ofertar um curso, vinculando campus, período acadêmico, turno, curso e grade curricular.
- Listar todas as ofertas de curso da instituição.
- Criar um novo professor.
- Listar todos os professores da instituição.
- Abrir um nova turma, vinculando disciplina, professor, período acadêmico e horários.
- Liberar uma turma para matrícula, dentro do período de matrícula vigente.
- Iniciar uma turma após validar todas as matrículas.
- Finalizar uma turma ao término do período acadêmico.
- Listar todas as turmas da instituição.
- Analisar as notas dos alunos nas atividades, bem como suas frequências em cada aula.
- Criar um novo aluno, vinculando com determinada oferta de curso.
- Listar todos os alunos da instituição.
- Abrir um novo período acadêmico.
- Listar todos os períodos acadêmicos da instituição.
- Abrir um novo período de matrícula.
- Editar as datas de início e fim de um período de matrícula.
- Listar todos os períodos de matrícula da instituição.
- Enviar notificações para alunos e professores.
- Listar todas as notificações da instituição.
- Acessar diversos dados consolidados sobre suas turmas, atualizados em tempo real.
- Acompanhar qual o horário semanal das suas aulas.
- Acessar facilmente todas as turmas do período atual.
- Criar novas atividades para a turma.
- Listar todas as atividades da turma.
- Avaliar com pontuação cada entrega de atividade feita pelos alunos.
- Realizar chamadas em cada aula.
- Listar todas as aulas e suas frequências.
- Acompanhar notas e frequências dos alunos da turma.
- Acessar diversos dados consolidados sobre seu curso, atualizados em tempo real.
- Acompanhar qual o horário semanal das suas aulas.
- Visualizar facilmente todas as disciplinas do seu curso, agrupadas por período acadêmico.
- Acompanhar sua nota média no curso, bem como sua nota em cada disciplina.
- Ver sua frequência total no curso, bem como em cada turma.
- Acessar facilmente todas as turmas do período atual.
- Listar todas as atividades da turma, bem como seu desempenho em cada uma.
- Entrar nos detalhes da atividade e realizar sua entrega via link em anexo.
- Acompanhar quantidade de presenças, faltas, aulas realizadas e pendentes.
- Visualizar gráfico com sua frequência em todas as aulas realizadas até o momento.
- Ver dados consolidados sobre todo o sistema, atualizados em tempo real.
- Acompanhar todos os usuários do sistema.
- Filtrar quais estão online no momento atual.
- Listar todas as instituições de ensino cadastradas no sistema.
- Ativar/desativar features flags.
- Dashboard com eventos pendentes, processando, erros e sucessos.
- Últimos eventos ocorridos e distribuição por quantidade.
- Listagem e filtros de todos os eventos gerados por todas as instituições.
- Dados gerais e origem do evento.
- Lista dos comandos gerados pelo evento em questão.
- Dashboard com comandos pendentes, processando, erros e sucessos.
- Listagem e filtros de todos os comandos gerados por todas as instituições.
- Dados gerais e origem do comando.
- Lista do subcomandos gerados pelo comando em questão.
- Reprocessamento de comando com erro.
- Vinculo do comando caso ele pertença à um lote.
- Dashboard com lotes pendentes, processando, erros e sucessos.
- Listagem e filtros de todos os lotes gerados por todas as instituições.
- Dados gerais e origem do lote.
- Próximo comando a ser executado caso o lote termine com sucesso.
A stack predominante é a da Microsoft, utilizo C# tanto no backend quanto no frontend:
- API em ASP.NET
- Front em Blazor Webassembly
- Daemon em ASP.NET
- Banco PostgreSQL
- Build com Docker
- Deploy no Railway
- GitHub Actions
- Seq para logs
O projeto possui mais de 500 testes automatizados, divididos entre Unidade e Integração.
Os testes de unidade validam regras de negócio apenas utilizando as entidades em memória, sem dependências com o banco de dados.
Já os testes de integração são mais robustos, pois validam que os fluxos de negócio envolvendo Back + Daemon + Postgres estão funcionando corretamente.
O Syki conta com um pipeline de CI/CD, que roda no GitHub Actions toda vez que um novo commit é feito na branch master.
Esse pipeline é responsável por buildar toda a solução, rodar os testes automatizados e executar eventuais migrações contra o banco de dados.
Quando o pipeline executa com sucesso, uma integração com a plataforma Railway é disparada para que o deploy de todos os serviços seja realizado. O Railway utiliza os Dockerfiles de cada componente para gerar as imagens e subir os contâiners a partir delas. Todas as configurações necessárias para que as aplicações rodem são armazenadas como variáveis de ambiente direto no Railway.
Atualmente todos os serviços estão rodando no Railway:
Pretendo migrar toda a infra pra Azure logo logo. Vou utilizar o Terraform para provisionar os recursos na nuvem de maneira organizada e replicável para os ambientes de Staging e Produção.
O frontend do projeto conta com modos claro e escuro.
Todas as telas são responsivas, funcionando bem tanto no desktop quanto no mobile.
Pretendo criar um app usando Flutter (Android/IOS) para que o aluno possa acessar o Syki.
O Syki possui diversos fluxos de negócio naturalmente assíncronos, como o envio de notificações pros usuários via email.
Ele possui um sistema robusto de eventos, comandos e lotes para a realização dessas tarefas.
Ainda é possível acompanhar em tempo real todas as execuções do sistema, possibilitando a rápida detecção de problemas e o reprocessamento de comandos com erro.
No futuro ele vai contar também com reprocessamento automático de falhas.
Muitas das ações dos usuários no sistema possuem auditoria, ou seja, são salvas no banco de dados para que seja possível saber quem, fez o quê, quando e onde dentro da aplicação.
O padrão OpenTelemetry é utilizado nas aplicações para a coleta de logs, métricas e traces.
No futuro todos esses dados serão enviados para o DataDog.
O backend utiliza o middleware de rate limiting nativo do próprio ASP.NET para bloquear o uso abusivo da API.
Grande parte do código possui documentação via XML, que é utilizada tanto pela IDE quanto pelo Swagger para gerar o documento de especificação OpenAPI.
Utilizo o Scalar para ler esse documento e gerar a documentação completa da API.
A biblioteca SignalR foi utilizada para trazer funcionalidades em tempo real para o sistema.
Hoje é possível ser notificado em tempo real quando uma nova atividade é postada, por exemplo.
O Adm também consegue saber quais usuários estão ativos no momento, além ter acesso a quantas conexões com o servidor cada um está estabelecendo.
Utilizo a biblioteca Hybrid Cache para cachear alguns dados básicos da instituição, como seus cursos e grades curriculares.
No futuro pode ser necessária a adoção de cache distribuído, usando o Redis por exemplo.
Todo o desenvolvimento é orientado por simplicidade.
Utilizo Vertical Slices e Result Pattern em praticamente todas as funcionalidades do sistema.
Toda a estrutura do banco está mepeada no Entity Framework Core.
Acompanhe a seguir toda a evolução das tabelas:
E agora o estado atual do banco (omiti alguns relacionamentos para não poluir o diagrama):
O sistema possui suporte à Webhooks, permitindo a realização de integrações mais rápidas e eficientes.
Ele é capaz de emitir eventos quando certas ações são executadas pelos usuários, como por exemplo:
- Um novo aluno é cadastrado no sistema
- Uma nova atividade é publicada pelo professor de uma turma
Digamos que seja preciso integrar o Syki à outro serviço XYZ, que vai executar um determinado processamento toda vez que um desses eventos ocorrer.
Talvez a maneira mais simples de realizar essa integração seja através de pooling: a aplicação XYZ fica, periodicamente, chamando a Api do Syki para buscar novos eventos. Isso é simples de implementar, mas também é custoso e ineficiente, pois a maioria das chamadas não vai encontrar dados novos para serem processados, sobrecarregando a Api do Syki desnecessariamente.
Um outro jeito de abordar esse problema é através do uso de 𝘄𝗲𝗯𝗵𝗼𝗼𝗸𝘀: o serviço XYZ cadastra uma url (+ ApiKey) no Syki e escolhe quais eventos quer receber através dela. Dessa forma, toda vez que um dos eventos escolhidos ocorrer, o Syki monta um payload e chama a aplicação XYZ com os dados, em uma integração rápida e eficiente.
O GIF abaixo mostra essa integração acontecendo quando um novo aluno é cadastrado no sistema.
Obviamente essa chamada para o endpoint na aplicação XYZ pode falhar, por isso implementei também uma política de retry exponencial: caso a primeira chamada falhe, o Syki vai tentar novamente após 1 min. Caso falhe, tenta novamente após 5 min. Caso falhe novamente, tenta pela última vez após 30 min.
Ainda é possível reprocessar uma chamada manualmente via tela, para o caso onde todas as retentativas automáticas falharam ou mesmo em caso de reconciliação de dados, por exemplo.
Para rodar o sistema na sua máquina, siga os passos abaixo:
- Clone o projeto pra sua máquina
- Para subir banco + back + daemon + front, rode o comando:
docker-compose up
- Para rebuildar caso tenha alguma alteração no código:
docker-compose build --no-cache
- O back vai subir na porta 5001, o front na 5002 e o daemon na 5003
Para rodar os testes automatizados:
- All:
dotnet test --logger:"console;verbosity=detailed"
- Unit:
dotnet test --filter "FullyQualifiedName~UnitTests"
- Integration:
dotnet test --filter "FullyQualifiedName!~UnitTests"
Qualquer contribuição é bem-vinda!
Fique à vontade para usar o sistema, abrir issues, enviar pull requests e tirar dúvidas.
Computadores fazem arte | Artistas fazem dinheiro