/calango-online-judge

Web plataform for Calango problems and submissions.

Primary LanguagePythonGNU General Public License v3.0GPL-3.0

Parsifal logo

Calango Online Judge (COJ)

O COJ é uma plataforma web para correção automática de algoritmos feitos na pseudolinguagem Calango.

Arquitetura e Tecnologias

Para o funcionamento completo da solução, são necessários os seguintes serviços:

Serviço Linguagem Framework Repositório
Plataforma Web Python Django Aqui
Microserviço Julgador Java Spring GitHub

Outros repositórios importantes para este projeto:

Serviço Linguagem Framework Repositório
Calango IDE Java Swing GitHub
Calango Interpretador Java Puro GitHub

Rodando Localmente

Primeiramente, clone este repositório:

git clone https://github.com/GeovanaRamos/calango-online-judge.git

Crie uma márquina virtual e entre no ambiente:

virtualenv venv -p python3
source venv/bin/activate

Instale os pacotes necessários:

(venv) pip install -r web/requirements.txt

Para prosseguir, você deve ter disponível localmente o PostgreSQL ou o SQLite dentro da pasta web. Por default, o settings.py utiliza o PostgreSQL em produção (DEBUG=False) e o SQLite em desenvolvimento (DEBUG=True). Se desejar, altere essas configurações no arquivo settings.py. Para desenvolvimento, todas as variáveis já possuem valores defaults, então não é necessário configurar nenhuma variável se seguir os passos descritos aqui. Para configuração em produção, veja a seção Deploy.

Agora execute as migrações do banco de dados:

(venv) python manage.py migrate

Se não desejar popular o banco de dados, siga para o próximo passo. Caso contrário, execute o comando abaixo para popular o banco com dados falsos e ter uma visão de como a aplicação se comporta em situações reais.

(venv) python manage.py seed

Por fim, execute a aplicação:

(venv) python manage.py runserver

Acesse localhost:8000 e verá a aplicação em execução. Para ter acesso ao site de administração, acesse localhost:8000/admin.

Se você executou o comando seed, já existem dois perfis de usuário que também são administradores. As credencias são as seguintes:

Perfil de Aluno
Usuário: aluno@email.com
Senha: admin
Perfil de Professor
Usuário: professor@email.com
Senha: admin

Serviços Complementares

Para realizar o julgamento dos códigos, é necessário ter uma instância do microserviço em execução. Acesse o repositório para ter acesso as instruções de execução. Após garantir que o microserviço está em execução na porta 8080, execute obrigatoriamente o qcluster em um outro terminal para lidar com as submissões assincronamente:

(venv) python manage.py qcluster

Para testar o envio de emails, execute o seguinte comando em um outro terminal:

python -m smtpd -n -c DebuggingServer localhost:1025

Esse comando irá executar um servidor SMTP de testes, assim o COJ conseguirá enviar os emails com sucesso e você poderá ver o resultado no terminal.

Deploy

Este repositório possui um workflow de deploy contínuo na branch master. A cada commit, é gerada uma imagem docker nova para este repositório e é feito o pull da imagem no servidor.

Para colocar a aplicação em produção incialmente, sem o deploy contínuo, as ações necessárias são:

  1. Adicionar o docker-compose-prod.yml no servidor;
  2. Adicionar a pasta nginx no servidor;
  3. Garantir as credenciais de acesso às imagens docker no servidor;
  4. Ter um domínio com certificado SSL da Let's Encrypt já no servidor;
  5. Ter um email para o site;
  6. Criar um arquivo .env.prod com as seguintes variáveis:
POSTGRES_USER=(usuário do banco)
POSTGRES_PASSWORD=(senha do banco)
POSTGRES_DB=(nome do banco)

DEBUG=False
ENABLE_HTTPS=True
SECRET_KEY=(chave aleatória do Django)
DJANGO_ALLOWED_HOSTS=(domínio ou domínios separado por espaços)
EMAIL_HOST_USER=(email do site)
EMAIL_HOST_PASSWORD=(senha do email do site)
COJ_SERVICE_URL=http://judge:8080/judge

DATABASE=postgres
SQL_HOST=db
SQL_PORT=5432
  1. Executar os seguintes comandos:
docker login docker.pkg.github.com -u $GITHUB_USERNAME -p $GITHUB_TOKEN
docker-compose -f docker-compose-prod.yml pull
docker-compose -f docker-compose-prod.yml up -d
docker-compose -f docker-compose-prod.yml exec -d web python manage.py qcluster

Imagem do Calango por Freepik em Flaticon