Gerenciamento de aplicações para DirectAdmin
Proxy reverso automático via Unix socket com OpenLiteSpeed
Caution
Este plugin está em fase inicial de desenvolvimento. Pode conter falhas, comportamentos inesperados ou instabilidades, especialmente em ambientes de produção ou uso em larga escala. Use por sua conta e risco e reporte problemas via Issues.
O Selynt Panel é um plugin para DirectAdmin que permite a usuários hospedar e gerenciar aplicações de forma isolada, com proxy reverso automático via Unix socket integrado ao OpenLiteSpeed.
O núcleo de execução é o binário Core Selynt, responsável pelo ciclo de vida dos processos, gerenciamento de sockets e isolamento de privilégios.
- Visão geral consolidada de todas as aplicações do servidor
- Configuração do OpenLiteSpeed (templates e extProcessors)
- Detecção e seleção de versões de runtime disponíveis no sistema
- Criação, inicialização, parada, reinício e remoção de aplicações
- Vinculação de aplicações a domínios e subdomínios configurados no DirectAdmin
- Alteração da versão do runtime por aplicação (com o app desligado)
- Visualização de logs em tempo real (stdout e stderr)
| Componente | Versão |
|---|---|
| DirectAdmin | 1.708 ou superior |
| OpenLiteSpeed | 1.9.2 ou superior |
| PHP CLI | 8.0 ou superior |
| systemd com cgroup v2 | — |
setfacl (pacote acl) |
— |
| bubblewrap | opcional — apenas para o isolamento entre aplicações |
| Core Selynt | Última versão |
Note
As versões acima são as testadas, não um mínimo verificado. Versões anteriores podem funcionar, mas não foram validadas — a documentação do OpenLiteSpeed não indica desde quando as diretivas usadas existem.
Important
Requer OpenLiteSpeed como servidor web. LiteSpeed Enterprise não é suportado: ele lê a configuração do Apache, enquanto o painel injeta seus blocos nos templates openlitespeed_* do DirectAdmin, que aquele servidor não utiliza. Apache e Nginx também não são suportados — o proxy é montado sobre extProcessor, uma diretiva do OpenLiteSpeed.
No DirectAdmin, acesse Plugin Manager e forneça a URL de instalação:
https://github.com/NullSablex/selynt-panel/releases/latest/download/selynt_panel.tar.gz
Execute como root:
bash <(curl -sL https://raw.githubusercontent.com/NullSablex/selynt-panel/master/install.sh)- Permissões e setuid do binário Core Selynt
- Templates de vhost do DirectAdmin (extProcessor + rewrite condicional)
- Serviços do systemd: recuperação após reinício, varredura de portas expostas e sincronização do proxy
- Diretório de estado em
/var/lib/selynt_panel
Warning
Após a instalação, o DirectAdmin pode definir permissões restritivas no plugin.conf, impedindo a leitura pelo painel. Execute update.sh como root para corrigir.
Scripts de manutenção e diagnóstico — executar como root:
# Corrigir permissões e configuração
bash /usr/local/directadmin/plugins/selynt_panel/scripts/update.sh
# Reconfigurar templates e servidor web
/usr/local/directadmin/plugins/selynt_panel/bin/core-selynt setup-ols
# Diagnóstico completo
/usr/local/directadmin/plugins/selynt_panel/bin/core-selynt admin diagnoseNote
O mesmo diagnóstico está no painel administrativo em Diagnóstico, com o resultado já traduzido e formatado. Pela linha de comando ele sai como JSON, útil para inspeção ou automação.
Cliente → LiteSpeed → RewriteRule (condicional) → extProcessor → Unix Socket → Aplicação
- Template CUSTOM.7 — declara um
extProcessorpor vhost, apontando para o socket da aplicação - Template CUSTOM.5 — aplica um
RewriteRulecondicional: se o marker.proxy/<domínio>existir, o tráfego é redirecionado ao extProcessor; caso contrário, segue o fluxo normal (PHP, arquivos estáticos, etc.) - Sincronização — quando o conjunto de aplicações ativas muda, o binário regenera o arquivo de extProcessors e recarrega o servidor web. Um timer do systemd verifica a cada poucos segundos se há alteração pendente
selynt_panel/
├── admin/ Painel administrativo (páginas e API)
├── user/ Painel do usuário (páginas e API)
├── lib/
│ ├── common.php Utilitários compartilhados (CGI, execução do binário)
│ ├── i18n.php Tradução das páginas
│ ├── i18n/ Dicionários por idioma
│ └── node-loader.js Loader ESM — intercepta rede para Unix sockets
├── bin/ Binário Core Selynt (setuid root)
├── scripts/ Hooks de instalação do DirectAdmin
├── hooks/ Hooks do DirectAdmin (regeneração de permissões)
├── templates/ Templates para novas aplicações
├── assets-src/ Código-fonte CSS/JS (pré-minificação)
├── tools/ Ferramentas de desenvolvimento (fora do pacote)
└── images/ Menus JSON e assets compilados
/var/lib/selynt_panel/<usuário>/
├── .sockets/ Unix sockets das aplicações ativas
├── .proxy/ Markers de proxy (presença = proxy ativo)
├── .run/ PID files dos processos
└── .meta/ Metadados das aplicações
- Isolamento de privilégios — cada aplicação roda sob o UID/GID do respectivo usuário do DirectAdmin
- Isolamento entre aplicações da conta — opcional, por conta, com padrão definido pelo administrador. Ligado, cada aplicação roda sem enxergar arquivos, processos ou sockets das demais
- Bloqueio de rede — interceptação de chamadas de rede, impedindo bind direto em portas TCP/UDP. Uma varredura periódica derruba aplicação que exponha porta alcançável de fora; ouvir em
127.0.0.1continua permitido - Nada roda como root fora do binário — o plugin não executa shell script privilegiado; recuperação de boot, varredura de portas e sincronização do proxy ficam dentro do Core Selynt
- Setuid controlado — o binário Core Selynt opera com setuid root apenas para criar estruturas de estado e realizar drop de privilégio para o usuário real antes de spawnar a aplicação
- Proxy condicional — o LiteSpeed só encaminha tráfego se o marker de proxy existir, evitando conflitos com sites estáticos ou PHP
npm install
npm run build # compila e minifica assets-src/ em images/assets/
npm run check # executa cada módulo do painelO build usa o esbuild. Edite sempre assets-src/: images/assets/ é gerado e qualquer alteração à mão se perde no próximo build.
O check executa cada módulo num DOM mínimo e cobra no window os handlers citados nos onclick. Serve para o que o build não pega: uma função pode compilar, rodar sem erro e mesmo assim o botão não fazer nada, porque o atributo é resolvido no escopo global e o módulo tem o seu próprio.
As páginas de user/ e admin/ não têm extensão — o DirectAdmin executa o arquivo cujo nome bate com o caminho pedido. São scripts PHP mesmo assim, e entram no php -l como os demais.
O pacote é montado pelo workflow de release, que baixa o binário Core Selynt publicado e gera o selynt_panel.tar.gz pronto para o Plugin Manager. Para gerar um localmente, use o mesmo caminho — publique uma tag e deixe o CI montar — ou reproduza os passos do .github/workflows/release.yml.
| Workflow | Descrição |
|---|---|
| CI | Build de assets, validação do plugin.conf, sincronia de versão, lint de PHP e Shell |
| Release | Gera e publica o pacote .tar.gz automaticamente ao criar uma release no GitHub |
Leia o guia de contribuição antes de abrir uma issue ou pull request. Valem também o código de conduta e a política de uso de IA — o uso de IA é permitido, e quem contribui responde pelo que envia.
Falha de segurança não vai em issue pública: use o relato privado, como descrito no SECURITY.md.
NullSablex — github.com/NullSablex
Distribuído sob a licença AGPL-3.0-or-later.
