Pular para o conteúdo principal

Programe pelo Navegador com Code Lab

O projeto Code Lab permite programar diretamente pelo navegador, sem nenhuma outra dependência externa. É interessante para os casos em que se quer fazer um experimento rápido mas não há um computador com a linguagem instalada e configurada por perto.

Esse projeto foi feito originalmente como uma prova de conceito e também ajudar meus alunos a usarem diferentes linguagens de programação sem a necessidade de instalar nada na máquina deles.

Funcionamento

A execução de um código de fonte desconhecida traz riscos à segurança porque um código malicioso pode tentar tomar o controle do sistema, acessar áreas e dados restritos ou fazer mau uso de recursos disponíveis (memória, processos, disco etc.). A forma de mitigar esse risco é executando o código em um sandbox, que é um tipo de virtualização de um ambiente restrito e controlado 1.

No Code Lab, o sandbox é baseado em um container Docker denominado de codebox, que contém com todas as linguagens, bibliotecas e ferramentas oferecidas pelo Code Lab, mas que roda com limitações de permissões de usuário, tempo, memória e restrição de acesso à rede. Mesmo que haja uma violação, seus efeitos serão contidos e depois eliminados quando o container for destruído.

A comunicação é feita através da entrada e saída padrões stdin e stdout do codebox. Os arquivos do projeto, dados de entrada e os comandos a serem executados são enviados pelo stdin. A saída (stdout) e os erros (stderr) dos comandos são agrupados e devolvidos pelo stdout do codebox.

Arquitetura

O codebox é a parte mais importante mas não funciona sozinho: Tudo começa com a aplicação web, que segue o padrão SPA (Single Page Application) e é construída com Vue.js. O backend está hospedado em um droplet do DigitalOcean. A aplicação é servida através de um proxy reverso pelo Caddy e de um servidor Hypercorn, que usa o padrão ASGI, e serve a aplicação feita com FastAPI.

A execução dos projetos não é imediata. Primeiro é feita uma verificação no cache (Redis) e só se não estiver lá é que o projeto é executado no codebox.

Versão Anterior

A primeira versão deste projeto foi lançada em 2015. Era uma aplicação MPA (Multiple-Page Application) baseada em Javascript e JQuery no frontend. No backend, usava NGinX de servidor web, GUnicorn como servidor WSGI, Flask de framework web, Redis para cache e Docker como sandbox.

Desde então, muita coisa mudou:

  • Agora é mais fácil separar o frontend do backend com frameworks para construção de aplicações SPA (Single Page Application) tais como Vue.js e React. Estes frameworks tornaram o frontend mais robusto e o backend bem mais enxuto, composto basicamente de uma REST API para troca de informações.
  • No backend, os frameworks web para Python mais modernos tal como o FastAPI usam programação assíncrona, aumentando a capacidade de processamento e a eficiência do uso do servidor.
  • E o CSS3 também evoluiu com novas estruturas tais como o modelo Flexbox e Grid Layout.

A atualização do projeto levou a grandes mudanças. Praticamente, apenas a ideia permaneceu a mesma pois todo o resto foi alterado, inclusive a funcionalidade do codebox, que foi bastante simplificada para permitir executar projetos com diferentes estruturas e comandos.

Código Open Source

O código-fonte dos projetos do Code Lab e Codebox estão disponíveis no GitHub em 2 e 3. Começaram como dois projetos distintos, depois eu juntei o projeto do codebox no repositório do Code Lab, mas serão separados novamente, em breve, porque terão caminhos diferentes: o codebox vai ser desenvolvimento como um microsserviço para ser usado independentemente do Code Lab.

Referências

1 Sandbox (computer security): https://en.wikipedia.org/wiki/Sandbox_(computer_security)
2 Repositório do Code Lab: https://github.com/andredias/codelab
3 Repositório do Codebox: https://github.com/andredias/codebox

Comentários

Comments powered by Disqus