← Projetos

📦 Instalação

Código-fonte:

curl -O https://minirepo.minidc.com.br/download/minicp.tar.gz

O download é liberado apenas para IPs autorizados.

📋 Changelog (17) ver tudo / buscar →

  1. Fase 1 - Painel Inicial (Flask + Apache)

    O que foi feito

    • Criado projeto Flask em /opt/hosting-panel/
    • Interface web com sidebar, Bootstrap 5 e Bootstrap Icons
    • Dashboard com estatísticas (usuarios, dominios, disco, memoria)
    • CRUD de usuarios do sistema (useradd, chpasswd, userdel)
    • CRUD de dominios com VirtualHost Apache gerado automaticamente
    • Configuracao PHP-FPM por dominio (pool dedicado por usuario)
    • Gerenciador de servicos (Apache, PHP-FPM, MySQL, MariaDB)
    • Gerenciador de arquivos basico com visualizador
    • API REST (/api/status) para dados do sistema
    • Persistencia em JSON (data.json)

    Estrutura criada por usuario

    /home/{usuario}/
      public_html/
        index.html
        info.php
      logs/
      tmp/
      backups/
    

    VirtualHost gerado

    • Apache com proxy_fcgi para PHP-FPM via socket do pool do usuario
    • Socket: /run/php/php{ver}-fpm-{usuario}.sock
    • Logs separados por dominio ({dominio}-access.log, {dominio}-error.log)

  2. Fase 2 - Autenticação e Áreas Separadas (Admin/Cliente)

    O que foi feito

    • Sistema de login via PAM (autenticacao com credenciais do Linux)
    • root → acesso como Administrador (/admin/*)
    • usuario do painel → acesso como Cliente (/client/*)
    • Sessoes Flask com decorators @admin_required e @client_required
    • Tela de login estilizada com gradiente e branding

    Area Admin (/admin/*)

    • Dashboard completo do servidor
    • Gerenciamento de usuarios (criar, remover, alterar senha, suspender/reativar)
    • Gerenciamento de dominios (criar, remover, habilitar/desabilitar, trocar PHP)
    • Gerenciamento de servicos
    • Gerenciador de arquivos (acesso irrestrito ao filesystem)

    Area Cliente (/client/*)

    • Painel pessoal com seus dominios e uso de disco
    • Visualizacao dos seus dominios
    • Gerenciador de arquivos (restrito a /home/{usuario}/)
    • Alteracao de senha propria (valida senha atual via PAM)

    Padronizacao de diretorios

    • Home dos usuarios: /home/{usuario}/ com permissao 751
    • Estrutura criada: public_html/, logs/, tmp/, backups/
    • DocumentRoot: /home/{usuario}/public_html/ (direto, sem subpasta de dominio)
    • PHP-FPM pool com open_basedir restrito ao home do usuario

    Templates

    • base_admin.html - layout admin com sidebar azul/vermelho (badge ADMIN)
    • base_client.html - layout cliente com sidebar verde (badge CLIENTE)
    • login.html - tela de login centralizada

  3. Fase 3 - Sistema de Logs e Rebranding para MageWeb

    O que foi feito

    • Renomeado de "Hosting Panel" para "MageWeb" em todos os templates e titulos
    • Sistema de logs completo para admin e cliente

    Logs Admin (/admin/logs)

    • Logs do sistema: apache-access, apache-error, nginx-access, nginx-error, syslog, auth.log, php-fpm, mageweb
    • Logs por dominio: selecionar qualquer dominio e ver access/error log
    • Live streaming via SSE (Server-Sent Events) em tempo real com tail -f
    • Filtro de quantidade de linhas (50, 100, 200, 500, 1000)
    • Highlight de erros (vermelho), warnings (amarelo), info (azul)
    • Botao de download do log como .txt
    • Botao limpar tela

    Logs Cliente (/client/logs)

    • Apenas logs dos dominios do usuario logado (isolamento no backend)
    • Selecao entre access log e error log
    • Live streaming SSE
    • Highlight de status HTTP (200 verde, 404/500 vermelho)
    • Download e legenda explicativa
    • Limpar logs antigos: mantem somente entradas do dia atual em todos os dominios

    Endpoints SSE

    • GET /api/logs/stream - streaming admin (qualquer log)
    • GET /api/client/logs/stream - streaming cliente (apenas seus dominios)

  4. Fase 4 - Gerenciador de Arquivos do Cliente (Upload/Editar)

    O que foi feito

    • Gerenciador de arquivos completo na area do cliente com operacoes via modais

    Funcionalidades

    Operação Rota Descrição
    Upload POST /client/files/upload Arquivos, pastas e ZIPs com descompactacao
    Editar GET /api/client/files/content + POST /client/files/save Editor de codigo em modal com syntax detection
    Criar POST /client/files/create Criar arquivo vazio ou pasta
    Renomear POST /client/files/rename Modal para novo nome
    Permissoes POST /client/files/chmod Modal com chmod octal + opcao recursiva para diretorios
    Excluir POST /client/files/delete Com confirmacao
    Magento 2 POST /client/files/magento-perms Aplicar permissoes Magento 2 (dirs 755, files 644)

    Upload avancado

    • Modo Arquivos: selecao multipla, drag & drop
    • Modo Pasta: upload de pasta inteira mantendo estrutura de subdiretorios
    • Descompactacao automatica: .zip, .tar.gz, .tgz - checkbox "Descompactar apos upload"
    • Drag & drop de pastas com webkitGetAsEntry (navega recursivamente)
    • Lista com scroll, contador de pastas/arquivos, spinner durante envio
    • Maximo 100MB por arquivo

    Permissoes

    • Modal chmod com campo octal e opcao recursiva para diretorios
    • Botao Permissoes Magento 2: aplica 755 em diretorios e 644 em arquivos recursivamente em todo public_html/

    Editor de codigo (modal)

    • Carrega conteudo via AJAX (sem recarregar pagina)
    • Detecta linguagem pela extensao (PHP, HTML, JS, CSS, JSON, Python, Shell, etc)
    • Mostra info: linguagem, tamanho, numero de linhas
    • Suporte a tecla Tab (insere 4 espacos)
    • Ctrl+S salva direto
    • Botao de tela cheia e word wrap
    • Tema escuro (fundo #0f172a)

    Seguranca

    • Todos os caminhos validados com os.path.realpath() + startswith(user_home)
    • Nomes de arquivo sanitizados no upload (re.sub)
    • Ownership (chown) aplicado apos cada operacao
    • Limite de upload: 100MB (MAX_CONTENT_LENGTH)

  5. Fase 5 - Gerenciamento Completo de PHP

    O que foi feito

    • Pagina dedicada para gestao de versoes PHP (/admin/php)
    • Instalacao, remocao de versoes e modulos via apt
    • Editor de php.ini com atalhos rapidos
    • Integracao automatica com dominios

    Painel por versao instalada

    Para cada PHP instalado (ex: 7.4, 8.3) mostra:
    - Status do FPM (ativo/inativo)
    - Lista de modulos instalados (badges)
    - Dominios que usam aquela versao
    - Pools FPM configurados

    Operacoes

    Rota Descrição
    GET /admin/php Painel principal com todas as versoes
    POST /admin/php/install Instalar nova versao (5.6 a 8.5 disponiveis)
    POST /admin/php/{ver}/modules/install Instalar modulos adicionais
    POST /admin/php/{ver}/modules/remove Remover modulos (protege fpm/cli/common)
    POST /admin/php/{ver}/uninstall Desinstalar versao (bloqueia se dominio usa)
    POST /admin/php/{ver}/fpm-restart Reiniciar PHP-FPM da versao
    GET /api/admin/php/{ver}/ini Obter conteudo do php.ini (AJAX)
    POST /admin/php/{ver}/ini/save Salvar php.ini com backup automatico (.bak)

    Editor php.ini (modal)

    • Edicao separada para FPM e CLI
    • Atalhos rapidos: memory_limit, upload_max_filesize, post_max_size, max_execution_time, display_errors, date.timezone, error_reporting, max_input_time
    • Busca integrada com jump-to-line
    • Ctrl+S para salvar
    • Backup automatico antes de salvar
    • Restart FPM automatico ao salvar php.ini do FPM

    Modulos suportados

    bcmath, bz2, curl, gd, gmp, igbinary, imagick, imap, intl, mbstring, mysql, opcache, pgsql, pspell, readline, redis, soap, sqlite3, xml, xmlrpc, zip, ldap, tidy, xdebug, memcached, apcu, mcrypt

    Instalacao de nova versao

    • Modal com dropdown de versoes disponiveis no repositorio
    • Selecao de modulos com os mais comuns pre-marcados
    • Instala {php}-fpm, {php}-cli, {php}-common + modulos
    • Habilita e inicia FPM automaticamente

  6. Fase 6 - Servicos Avancados (Start/Stop/Enable/Disable/Status)

    O que foi feito

    • Pagina de servicos reescrita com controle completo do ciclo de vida
    • Detecção dinâmica de serviços (todos os PHP-FPM instalados + NGINX quando presente)

    Informacoes por servico

    • Status: Rodando (verde), Parado (vermelho), estado customizado
    • Boot: Habilitado (azul) / Desabilitado (amarelo) no systemd
    • PID: Process ID quando ativo
    • Memoria: Uso de RAM em MB
    • Uptime: Data/hora desde quando esta rodando

    Acoes

    Rota Ação Quando aparece
    POST /admin/services/{svc}/start Iniciar servico Quando parado
    POST /admin/services/{svc}/stop Parar servico (com confirmacao) Quando rodando
    POST /admin/services/{svc}/restart Reiniciar servico Quando rodando
    POST /admin/services/{svc}/enable Habilitar no boot Quando desabilitado
    POST /admin/services/{svc}/disable Desabilitar no boot Quando habilitado
    GET /api/admin/services/{svc}/status Status detalhado (modal) Sempre

    Modal de status

    • Saida completa do systemctl status com syntax highlight
    • "active (running)" em verde, "inactive (dead)" em vermelho
    • Timestamps em amarelo, enabled/disabled em azul

    Servicos gerenciados

    • apache2, nginx (quando instalado), mysql, mariadb
    • php{X.Y}-fpm (dinamico para cada versao instalada)

  7. Fase 7 - Dashboard com Top Processos

    O que foi feito

    • Dashboard reorganizado com todos os stats na mesma linha
    • Tabela de processos do sistema com auto-refresh

    Layout do dashboard (ordem de exibicao)

    1. Stats em linha unica (6 cards): Usuarios, Dominios, Disco, Memoria, CPU Cores, Load Average
    2. Sistema - barra compacta: Uptime | Disco | Memoria
    3. Usuarios + Dominios - tabelas lado a lado
    4. Top Processos - tabela por ultimo

    API de processos (GET /api/processes)

    • Parametros: sort (cpu|mem), limit (1-100)
    • Retorna: lista de processos, cores, load average
    • Usa ps aux com sort dinamico

    Tabela de processos

    Coluna Descrição
    Usuario Colorido: root (vermelho), www-data (azul), mysql (ciano)
    PID ID do processo
    CPU % Porcentagem + barra visual colorida
    MEM % Porcentagem + barra visual colorida
    RSS Memoria residente (KB/MB/GB)
    Estado Status do processo (S, R, Z, etc)
    Tempo CPU time acumulado
    Comando Com icone por tipo (apache, php-fpm, mysql, python, node, ssh)

    Controles

    • Ordenar por CPU ou MEM (toggle buttons)
    • Limite: 15, 25 ou 50 processos
    • Botao atualizar manual
    • Auto-refresh a cada 10 segundos
    • Scroll interno (max 500px)

    Load Average

    • Colorido por severidade relativa ao numero de cores
    • Verde: < 80% dos cores
    • Amarelo: 80-150% dos cores
    • Vermelho: > 150% dos cores

  8. Fase 8 - Modo de Operacao (NGINX + Apache / Apache Only)

    O que foi feito

    • Pagina dedicada para alternar entre modos de operacao do servidor web
    • Gestao completa de certificados SSL via NGINX
    • Integracao automatica com todas as funcionalidades existentes

    Dois modos disponiveis

    Apache Only:

    Internet → Apache :80 → PHP-FPM → Resposta
    
    • Apache escuta na porta 80
    • Configuracao simples, sem proxy reverso
    • Ideal para servidores pequenos

    NGINX + Apache:

    Internet → NGINX :80/443 (SSL) → Apache :8080 → PHP-FPM → Resposta
    
    • NGINX como reverse proxy na frente (porta 80/443)
    • Apache como backend (porta 8080)
    • SSL/TLS gerenciado pelo NGINX
    • HTTP/2 automatico com SSL
    • Melhor performance para arquivos estaticos

    Troca de modo (POST /admin/operation/switch)

    Para NGINX + Apache:
    1. Instala NGINX + Certbot automaticamente via apt (se nao instalados)
    2. Remove site default do NGINX
    3. Altera Apache para porta 8080 (ports.conf)
    4. Reescreve todos os VHosts Apache (*:8080)
    5. Gera configs NGINX reverse proxy para cada dominio
    6. Testa configs e reinicia ambos os servicos

    Para Apache Only:
    1. Remove configs NGINX de todos os dominios
    2. Para e desabilita NGINX
    3. Altera Apache de volta para porta 80
    4. Reescreve todos os VHosts Apache (*:80)
    5. Reinicia Apache

    Gestao de certificados SSL

    Rota Descrição
    POST /admin/operation/cert/issue Emitir certificado Let's Encrypt via certbot
    POST /admin/operation/cert/custom Upload de certificado customizado (.crt + .key)
    POST /admin/operation/cert/remove Remover SSL de um dominio
    POST /admin/operation/cert/renew Renovar todos os certificados Let's Encrypt

    Let's Encrypt

    • Modal com selecao de dominio + e-mail
    • Usa certbot certonly --nginx
    • Inclui aliases do dominio automaticamente
    • Certificados em /etc/letsencrypt/live/{dominio}/
    • Reconstroi config NGINX com bloco SSL (443 + redirect 80→443)

    Certificado customizado

    • Upload via modal (arquivo .crt/.pem + .key)
    • Salvo em /etc/ssl/mageweb/{dominio}/
    • Permissoes restritas na chave privada (chmod 600)

    Config NGINX gerada (com SSL)

    server {
        listen 80;
        server_name dominio.com;
        return 301 https://$host$request_uri;
    }
    
    server {
        listen 443 ssl http2;
        server_name dominio.com;
        ssl_certificate /etc/letsencrypt/live/dominio.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/dominio.com/privkey.pem;
        ssl_protocols TLSv1.2 TLSv1.3;
    
        # Security headers (X-Frame-Options, HSTS, etc)
    
        location / {
            proxy_pass http://127.0.0.1:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto https;
        }
    }
    

    Painel de status

    • Apache: ativo/parado + porta atual
    • NGINX: instalado / ativo / parado / nao instalado
    • Certbot: instalado ou nao
    • Total de certificados SSL ativos
    • Diagrama ASCII da arquitetura atual

    Integracoes automaticas

    • NGINX aparece na pagina de Servicos (start/stop/restart/enable/disable/status)
    • Logs NGINX adicionados na pagina de Logs (nginx-access, nginx-error)
    • Novo item Modo de Operacao na sidebar sob "Infraestrutura"

  9. Fase 9 - Cron Jobs do Cliente

    O que foi feito

    • Pagina dedicada para gestao de cron jobs na area do cliente (/client/cron)
    • Menu Cron Jobs adicionado na sidebar do cliente

    Funcionalidades

    Rota Método Descrição
    /client/cron GET Listar cron jobs do usuario
    /client/cron/add POST Adicionar novo cron job
    /client/cron/edit POST Editar cron job existente
    /client/cron/toggle POST Habilitar/desabilitar job (prefixo #DISABLED#)
    /client/cron/delete POST Remover cron job

    Interface

    • Tabela com status (ativo/desabilitado), agendamento com descricao legivel, comando
    • Descricao automatica do agendamento (ex: "A cada 5 min", "Diario as 03:00")
    • Modal de adicao e edicao com campos separados (minuto, hora, dia, mes, semana)
    • Atalhos rapidos: a cada min, 5 min, 15 min, 30 min, 1 hora, diario, semanal, mensal
    • Card de exemplos comuns + caminhos PHP (/usr/bin/php, /usr/bin/php8.3, /usr/bin/php7.4)
    • Exemplos de comandos: script PHP, Magento 2 cron:run, Laravel scheduler

  10. Fase 10 - Gestao Avancada de Usuarios (Exclusao Completa + Suspensao)

    O que foi feito

    • Exclusao completa de usuario com limpeza total de recursos
    • Sistema de suspensao/reativacao de contas
    • Modal de confirmacao com digitacao do nome do usuario
    • Opcao de backup ZIP antes da exclusao

    Exclusao completa (POST /admin/users/{user}/delete)

    Remove permanentemente:
    - Conta do sistema Linux (userdel)
    - Diretorio home completo (/home/{usuario}/)
    - Todos os dominios e VirtualHosts Apache
    - Configs NGINX e certificados SSL
    - Pools PHP-FPM de todas as versoes
    - Logs de acesso e erro do Apache
    - Crontab do usuario
    - Registros no data.json

    Backup antes de excluir

    • Checkbox marcado por padrao no modal de exclusao
    • Gera ZIP do diretorio home completo
    • Download automatico antes da exclusao
    • Arquivo temporario removido apos envio

    Suspensao de conta (POST /admin/users/{user}/suspend)

    Ao suspender:
    - Bloqueia login: usermod -L (lock) + shell para /usr/sbin/nologin
    - Desabilita todos os sites: a2dissite em cada dominio
    - Status "Suspenso" no painel (badge vermelho)
    - Linha com opacidade reduzida na tabela

    Ao reativar:
    - Desbloqueia login: usermod -U (unlock) + shell para /bin/bash
    - Reabilita todos os sites: a2ensite em cada dominio
    - Status "Ativo" restaurado


  11. Fase 11 - Terminal Web do Cliente

    O que foi feito

    • Terminal web completo na area do cliente via WebSocket (flask-socketio + xterm.js)
    • Menu Terminal na sidebar do cliente abre modal fullscreen

    Implementacao

    • Backend: PTY real (pty.fork()) executando /bin/bash -r (restricted) como o usuario
    • Frontend: xterm.js 5.5 com tema escuro, cursor piscando, scrollback 5000 linhas
    • Comunicacao: WebSocket via Socket.IO (namespace /terminal)

    Seguranca

    • Shell restrito (bash -r) impede alterar PATH/SHELL/ENV e redirecionar
    • Alias cd com guard: verifica pwd -P e bloqueia navegacao fora de /home/{usuario}/
    • PROMPT_COMMAND verifica diretorio a cada comando
    • PATH limitado a /usr/local/bin:/usr/bin:/bin
    • Uma unica sessao por usuario (mata sessoes anteriores ao conectar)
    • Transporte apenas WebSocket (sem polling duplicado)

    Interface

    • Modal fullscreen com header mostrando usuario@servidor
    • Badge de status: Conectando / Conectado / Desconectado
    • Auto-resize ao redimensionar janela
    • Cores 256 com tema personalizado

  12. Fase 12 - Integração HAProxy (Gestao Remota)

    O que foi feito

    • Pagina dedicada para gestao do HAProxy remoto (/admin/haproxy)
    • Integracao via API REST com autenticacao Basic Auth
    • Backend dedicado por servidor (bk_{hostname}) criado automaticamente
    • Filtro inteligente: exibe apenas dominios/certs/servidores deste servidor

    Arquitetura

    MageWeb (10.110.2.21) → HAProxy API (10.110.2.15:5000)
                              ↓
                        Backend: bk_mageweb1
                        Server: mageweb1 (10.110.2.21:80)
                              ↓
                        ACLs por dominio → bk_mageweb1
    

    Auto-registro

    • Ao acessar a pagina, detecta hostname e IP do servidor
    • Cria backend bk_{hostname} no HAProxy se nao existir
    • Adiciona este servidor como primeiro membro do backend

    Dominios

    Rota Descrição
    /admin/haproxy Painel com dominios, certs e backend deste servidor
    /admin/haproxy/domain/add Adicionar dominio apontando para bk_{hostname}
    /admin/haproxy/domain/remove Remover dominio do HAProxy
    /admin/haproxy/provision Provisionar completo: dominio + SSL no backend deste servidor

    Certificados SSL

    Rota Descrição
    /admin/haproxy/cert/generate Gerar Let's Encrypt via HAProxy
    /admin/haproxy/cert/renew Renovar todos os certificados
    /admin/haproxy/cert/remove Remover certificado

    Backend / Servidores

    Rota Descrição
    /admin/haproxy/backend/add-server Adicionar servidor ao backend
    /admin/haproxy/backend/remove-server Remover servidor do backend
    /admin/haproxy/backend/toggle-server Habilitar/desabilitar servidor
    /admin/haproxy/backend/remove Remover backend inteiro

    Provisionamento

    • Botao "Provisionar Dominio": adiciona ACL no HAProxy apontando para bk_{hostname} + gera certificado SSL
    • Botao "Gerar SSL" inline em dominios sem certificado

    Filtro de dados

    • Dominios: somente os que apontam para bk_{hostname}
    • Certificados: somente os que correspondem aos dominios filtrados
    • Servidores: somente os do backend bk_{hostname}

  13. Fase 13 - Tela de Configuracoes

    O que foi feito

    • Pagina dedicada de configuracoes do painel (/admin/config)
    • Menu Configuracoes na sidebar admin (secao Sistema)
    • Persistencia em data.json (chave config)

    Configuracoes disponiveis

    Geral:
    - Nome do painel

    HAProxy API:
    - Toggle habilitar/desabilitar
    - Host/IP, Porta, Path da API
    - Usuario e Senha (senha oculta, manter vazio preserva a atual)
    - Botao Testar Conexao — valida se a API responde
    - Preview da URL completa em tempo real
    - HAProxy na sidebar so aparece quando habilitado

    Rotas

    Rota Método Descrição
    /admin/config GET Tela de configuracoes
    /admin/config/save POST Salvar configuracoes
    /admin/config/haproxy-test POST Testar conexao HAProxy API

    Context Processor

    • config injetado automaticamente em todos os templates via @app.context_processor
    • Sidebar admin condicional: HAProxy so aparece se haproxy_enabled == true

  14. Estrutura Final do Projeto

    /opt/hosting-panel/
      app.py                          # Aplicacao Flask (2941 linhas, 73 rotas)
      data.json                       # Persistencia (usuarios, dominios, modo, certs, config)
      history.md                      # Este arquivo
      templates/
        login.html                    # Tela de login (PAM)
        base_admin.html               # Layout admin (sidebar + flash messages)
        base_client.html              # Layout cliente (sidebar + terminal modal)
        admin/
          dashboard.html              # Dashboard (stats, processos, usuarios, dominios)
          users.html                  # CRUD de usuarios (excluir, suspender, backup)
          domains.html                # CRUD de dominios
          php.html                    # Gestao PHP (versoes, modulos, php.ini)
          services.html               # Servicos (start/stop/restart/enable/disable)
          operation.html              # Modo de operacao (Apache/NGINX+Apache, SSL)
          haproxy.html                # Gestao HAProxy (dominios, certs, backends)
          config.html                 # Configuracoes do painel
          logs.html                   # Logs do sistema + live streaming
          files.html                  # Gerenciador de arquivos (admin)
          file_view.html              # Visualizador de arquivos (admin)
        client/
          dashboard.html              # Painel do cliente (dominios, disco, senha)
          domains.html                # Dominios do cliente
          cron.html                   # Cron jobs do cliente
          logs.html                   # Logs do cliente + live streaming + limpar antigos
          files.html                  # Gerenciador de arquivos (upload pastas/zip, chmod recursivo, Magento 2)
          file_view.html              # Visualizador de arquivos (cliente)
    
  15. Mapa Completo de Rotas (73 rotas)

    Autenticação

    Rota Método Descrição
    / GET Redirect para login ou dashboard
    /login GET, POST Tela de login (PAM)
    /logout GET Encerrar sessao

    Admin - Dashboard

    Rota Método Descrição
    /admin GET Dashboard (stats, processos)

    Admin - Usuarios

    Rota Método Descrição
    /admin/users GET Listar usuarios
    /admin/users/create POST Criar usuario (useradd)
    /admin/users/{user}/delete POST Remover usuario (completo + backup opcional)
    /admin/users/{user}/password POST Alterar senha
    /admin/users/{user}/suspend POST Suspender/reativar conta

    Admin - Dominios

    Rota Método Descrição
    /admin/domains GET Listar dominios
    /admin/domains/create POST Criar dominio + VHost + FPM pool
    /admin/domains/{dom}/delete POST Remover dominio
    /admin/domains/{dom}/toggle POST Habilitar/desabilitar site
    /admin/domains/{dom}/php POST Trocar versao PHP

    Admin - PHP

    Rota Método Descrição
    /admin/php GET Painel de versoes PHP
    /admin/php/install POST Instalar nova versao
    /admin/php/{ver}/modules/install POST Instalar modulos
    /admin/php/{ver}/modules/remove POST Remover modulos
    /admin/php/{ver}/uninstall POST Desinstalar versao
    /admin/php/{ver}/fpm-restart POST Reiniciar FPM
    /admin/php/{ver}/ini/save POST Salvar php.ini

    Admin - Servicos

    Rota Método Descrição
    /admin/services GET Listar servicos
    /admin/services/{svc}/{action} POST start/stop/restart/enable/disable

    Admin - Modo de Operacao

    Rota Método Descrição
    /admin/operation GET Painel de modo de operacao
    /admin/operation/switch POST Trocar modo (apache / nginx-apache)
    /admin/operation/cert/issue POST Emitir SSL Let's Encrypt
    /admin/operation/cert/custom POST Upload certificado customizado
    /admin/operation/cert/remove POST Remover SSL
    /admin/operation/cert/renew POST Renovar todos os certs

    Admin - HAProxy

    Rota Método Descrição
    /admin/haproxy GET Painel HAProxy (dominios, certs, backend)
    /admin/haproxy/domain/add POST Adicionar dominio ao HAProxy
    /admin/haproxy/domain/remove POST Remover dominio do HAProxy
    /admin/haproxy/cert/generate POST Gerar certificado Let's Encrypt
    /admin/haproxy/cert/renew POST Renovar todos os certificados
    /admin/haproxy/cert/remove POST Remover certificado
    /admin/haproxy/backend/add-server POST Adicionar servidor ao backend
    /admin/haproxy/backend/remove-server POST Remover servidor do backend
    /admin/haproxy/backend/toggle-server POST Habilitar/desabilitar servidor
    /admin/haproxy/backend/remove POST Remover backend
    /admin/haproxy/provision POST Provisionar dominio (ACL + SSL)

    Admin - Configuracoes

    Rota Método Descrição
    /admin/config GET Tela de configuracoes
    /admin/config/save POST Salvar configuracoes
    /admin/config/haproxy-test POST Testar conexao HAProxy

    Admin - Arquivos

    Rota Método Descrição
    /admin/files GET Navegador de arquivos
    /admin/files/view GET Visualizar arquivo

    Admin - Logs

    Rota Método Descrição
    /admin/logs GET Painel de logs

    Cliente

    Rota Método Descrição
    /client GET Dashboard do cliente
    /client/domains GET Meus dominios
    /client/files GET Meus arquivos
    /client/files/view GET Visualizar arquivo
    /client/files/upload POST Upload de arquivos/pastas/ZIP
    /client/files/save POST Salvar edicao
    /client/files/create POST Criar arquivo/pasta
    /client/files/delete POST Excluir arquivo/pasta
    /client/files/rename POST Renomear
    /client/files/chmod POST Alterar permissoes (com recursivo)
    /client/files/magento-perms POST Aplicar permissoes Magento 2
    /client/cron GET Listar cron jobs
    /client/cron/add POST Adicionar cron job
    /client/cron/edit POST Editar cron job
    /client/cron/toggle POST Habilitar/desabilitar cron job
    /client/cron/delete POST Remover cron job
    /client/logs GET Meus logs
    /client/logs/purge POST Limpar logs antigos (manter so hoje)
    /client/password POST Alterar minha senha

    APIs

    Rota Método Descrição
    /api/status GET Status do sistema (disco, mem, uptime)
    /api/processes GET Top processos (CPU/MEM)
    /api/logs/stream GET SSE streaming de logs (admin)
    /api/client/logs/stream GET SSE streaming de logs (cliente)
    /api/client/files/content GET Conteudo de arquivo (AJAX editor)
    /api/admin/php/{ver}/ini GET Conteudo php.ini (AJAX editor)
    /api/admin/services/{svc}/status GET systemctl status (AJAX modal)
    /api/admin/haproxy/{endpoint} GET Proxy para HAProxy API

    WebSocket

    Namespace Descrição
    /terminal Terminal web do cliente (PTY via Socket.IO)
  16. Tecnologias

    Componente Tecnologia
    Backend Python 3 + Flask + Flask-SocketIO
    Frontend HTML5 + Bootstrap 5.3 + Bootstrap Icons
    Terminal xterm.js 5.5 + Socket.IO
    Autenticacao PAM (python-pam)
    Web Server Apache 2.4 / NGINX (opcional)
    Load Balancer HAProxy (integracao via API REST remota)
    PHP PHP-FPM (multiplas versoes via Sury)
    SSL Let's Encrypt (certbot) / Customizado
    Persistencia JSON (data.json)
    Streaming Server-Sent Events (SSE)
    Processos ps aux, systemctl
    Compactacao zip, unzip, tar
  17. Como executar

    # Iniciar em foreground (desenvolvimento)
    cd /opt/hosting-panel && python3 app.py
    
    # Iniciar em background (producao)
    nohup python3 /opt/hosting-panel/app.py > /var/log/hosting-panel.log 2>&1 &
    
    # Acesso
    # Admin: login com root + senha do sistema
    # Cliente: login com usuario criado pelo painel + sua senha