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.

Conceito Chave: Ao contrário de um servidor tradicional que fica ligado 24/7, os sistemas aqui são efêmeros. Eles nascem quando você clica em "Iniciar" e possuem um tempo de vida pré-definido.

O Ciclo de Vida

Entenda o que acontece nos bastidores quando você utiliza a plataforma:

  1. Build/Pull: O Hub lê a pasta do projeto e constrói a imagem Docker instantaneamente.
  2. Rede: O container é conectado à rede_global interna, permitindo acesso via Proxy reverso seguro (HTTPS).
  3. Execução: O usuário acessa o sistema via URL amigável (ex: projeto.hub.local).
  4. Contagem: Um temporizador é iniciado no momento da criação.
  5. 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:

meu_projeto.zip
├── 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.

Arquivo: index.html
<!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.

projects/
├── 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"]