Documentação do Hub
O Platform Hub é um orquestrador de ambientes efêmeros. Ele permite que desenvolvedores disponibilizem versões funcionais de seus sistemas (Projetos) que podem ser instanciados sob demanda por qualquer usuário.
O Ciclo de Vida
Entenda o que acontece nos bastidores quando você utiliza a plataforma:
- Build/Pull: O Hub lê a pasta do projeto e constrói a imagem Docker instantaneamente.
- Rede: O container é conectado à
rede_globalinterna, permitindo acesso via Proxy reverso seguro (HTTPS). - Execução: O usuário acessa o sistema via URL amigável (ex:
projeto.hub.local). - Contagem: Um temporizador é iniciado no momento da criação.
- Faxina: Ao atingir o tempo limite, o "Vigia Noturno" entra em ação para limpar recursos.
⏳ Limites e Persistência
Para garantir a performance do servidor e evitar superlotação, todos os ambientes possuem um limite de tempo rigoroso de 30 minutos.
Comportamento por Tipo de Projeto
Projetos Oficiais (Pasta /projects)
São projetos fixos da empresa (ex: GLPI, ERPs).
Ao fim dos 30min: O container é desligado. Arquivos são mantidos no volume persistente.
Projetos Custom (Build Lab)
São testes temporários enviados via Zip.
Ao fim dos 30min: O container é desligado E todos os arquivos são deletados permanentemente.
Como Criar um Novo Simulador
Existem duas formas de criar simuladores: adicionando permanentemente na pasta projects/ (Oficial) ou usando o Build Lab (Temporário).
🧪 Build Lab (Upload de Zip)
O Build Lab permite que você suba um arquivo .zip contendo seu projeto. O sistema extrai, constrói a imagem e roda instantaneamente.
Atenção: O tempo de vida (30min) começa a contar no momento do Upload.
Para testar, crie um arquivo zip com a seguinte estrutura mínima:
├── Dockerfile (Obrigatório)
└── index.html (Ou app.py, etc)
🐳 Padrões Oficiais: Dockerfile
O Dockerfile é a receita do seu bolo. Ele diz ao Platform Hub como instalar e rodar seu projeto. Abaixo estão os dois modelos mais comuns e seguros.
Regra de Ouro
Sua aplicação DEVE escutar no host 0.0.0.0. Se configurar para localhost ou 127.0.0.1, o Proxy não conseguirá acessar seu container.
Opção A: Aplicações Dinâmicas (Python/Flask)
Ideal para APIs, Dashboards e Automações.
# 1. Escolha a imagem base (Use versões 'slim' para ser mais rápido)
FROM python:3.9-slim
# 2. Define o fuso horário para evitar problemas de horário (Opcional)
ENV TZ=America/Sao_Paulo
# 3. Cria a pasta de trabalho dentro do container
WORKDIR /app
# 4. Instala dependências do sistema operacional (se precisar de algo extra)
# O 'rm -rf' no final diminui o tamanho da imagem limpando o cache
RUN apt-get update && apt-get install -y \
gcc \
curl \
&& rm -rf /var/lib/apt/lists/*
# 5. Copia e instala as dependências do Python
# Dica: Copiamos o requirements.txt ANTES do resto para aproveitar o cache do Docker
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 6. Copia todo o restante do seu código para dentro da pasta /app
COPY . .
# 7. Documenta qual porta o sistema usa (Apenas informativo)
EXPOSE 80
# 8. O comando que inicia tudo
# Lembre-se: host='0.0.0.0' é OBRIGATÓRIO para funcionar no Hub
CMD ["python", "app.py"]
Opção B: Sites Estáticos (HTML/CSS/JS)
Ideal para portfólios, documentações e landpages. Usa Apache para servir os arquivos.
# 1. Usa a imagem oficial do Apache (httpd) ou Nginx
FROM httpd:2.4
# 2. Copia seus arquivos HTML para a pasta padrão do Apache
# (Certifique-se de que seu arquivo principal se chama index.html)
COPY ./ /usr/local/apache2/htdocs/
# 3. Ajuste de permissões (Opcional, mas recomendado para segurança)
RUN chmod -R 755 /usr/local/apache2/htdocs/
# O Apache já expõe a porta 80 e inicia automaticamente,
# então não precisa de CMD no final.
📄 Modelo de index.html
Quer que seu projeto tenha a "cara" do Platform Hub? Copie este código para o seu index.html. Ele já vem estilizado e responsivo.
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Meu Projeto - Platform Hub</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
:root { --bg: #fbfbfd; --text: #1d1d1f; --blue: #0071e3; --card: #fff; }
body { font-family: -apple-system, sans-serif; background: var(--bg); color: var(--text); margin: 0; padding-top: 60px; display: flex; flex-direction: column; min-height: 100vh; }
.navbar { position: fixed; top: 0; width: 100%; height: 60px; background: rgba(255,255,255,0.8); backdrop-filter: blur(20px); border-bottom: 1px solid rgba(0,0,0,0.05); display: flex; align-items: center; justify-content: center; z-index: 100; }
.navbar h1 { font-size: 16px; margin: 0; display: flex; align-items: center; gap: 8px; }
.container { max-width: 800px; margin: 0 auto; padding: 40px 20px; flex: 1; text-align: center; }
.status-card { background: var(--card); border-radius: 20px; padding: 40px; box-shadow: 0 4px 20px rgba(0,0,0,0.05); margin-top: 40px; border: 1px solid rgba(0,0,0,0.05); }
.icon-success { color: #34c759; font-size: 48px; margin-bottom: 20px; }
h2 { font-size: 28px; margin: 0 0 10px 0; }
p { color: #86868b; line-height: 1.5; }
.data-table { width: 100%; margin-top: 30px; border-collapse: collapse; text-align: left; }
.data-table th { color: #86868b; font-size: 12px; text-transform: uppercase; padding: 10px; border-bottom: 1px solid #eee; }
.data-table td { padding: 15px 10px; border-bottom: 1px solid #eee; font-family: monospace; font-size: 14px; }
.tag { background: #e3f2fd; color: var(--blue); padding: 4px 8px; border-radius: 6px; font-size: 11px; font-weight: bold; }
footer { text-align: center; padding: 20px; color: #86868b; font-size: 12px; border-top: 1px solid #eee; background: #f5f5f7; }
</style>
</head>
<body>
<nav class="navbar">
<h1><i class="fa-solid fa-cube" style="color: #0071e3;"></i> Platform Hub Project</h1>
</nav>
<div class="container">
<div class="status-card">
<i class="fa-regular fa-circle-check icon-success"></i>
<h2>Projeto Rodando com Sucesso!</h2>
<p>Se você está vendo esta tela, seu container Apache/Nginx subiu corretamente.</p>
<table class="data-table">
<tr><th>Parâmetro</th> <th>Valor</th></tr>
<tr><td>Status</td> <td><span class="tag">ONLINE</span></td></tr>
<tr><td>Servidor</td> <td>Apache/2.4 (Debian)</td></tr>
<tr><td>Persistência</td> <td style="color: #ff3b30;">Volátil (30 min)</td></tr>
</table>
</div>
</div>
<footer>Platform Hub • © 2026</footer>
</body>
</html>
Estrutura de Projetos Oficiais
Para projetos fixos que não devem ser deletados, navegue até a pasta projects/ no servidor.
├── meu_novo_projeto/
│ ├── config.json (Metadados do Card)
│ ├── Dockerfile (Instruções de Build)
│ └── src/ (Seus arquivos de código)
O Arquivo config.json
Este arquivo define como seu projeto aparece no Dashboard principal.
{
"id": "calculadora_uber",
"name": "Calculadora Uber",
"description": "Sistema para cálculo de custos.",
"build_local": true,
"internal_port": 80,
"docs_url": "https://meunotion.so/docs"
}
Exemplo Rápido: Dockerfile Simples
Para quem precisa apenas rodar um script Python sem complexidade:
FROM python:3.9-slim
WORKDIR /app
COPY . .
RUN pip install flask
CMD ["python", "app.py"]