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