
🔨 Um gerenciador de máquinas moderno e multiplataforma
Um hub de gerenciamento de hosts para frotas de máquinas Linux. Instale o agente Platypus em cada host que você possui; o agente faz uma conexão de volta ao seu servidor Platypus via TLS + protobuf; a partir do servidor, você obtém um shell interativo, gerenciamento de arquivos e tunelamento de rede em cada host gerenciado — através de um único plano de controle central.
Uma IU de navegação plana estilo Vercel com um painel de projeto, um navegador de host/listener/sessão, um console de despacho multi-host e um gerenciador de usuários administradores. Veja a galeria completa em docs/screenshots/. Execute make screenshots novamente para regenerá-las a partir do aplicativo ao vivo.
O Platypus é distribuído como dois binários de backend mais um cliente desktop independente:
| Binário | Função |
|---|---|
platypus-server | Daemon. Aceita conexões de agentes de entrada em portas de ingresso TLS; expõe uma API REST + WebSocket para ferramentas de administração; serve binários de agente para distribuição. |
platypus-agent | O processo que roda em cada host gerenciado. Conecta-se de volta ao servidor via TLS + protobuf. |
platypus-desktop | GUI de desktop nativa (Wails v2). Conecte-se a qualquer servidor acessível com URL + segredo; IU com abas para sessões, terminais, listeners, arquivos, túneis. Veja desktop/. |
O servidor é puramente uma API — sem IU web embutida. Múltiplos desktops podem se conectar ao mesmo servidor simultaneamente.
config.ymlA maneira mais rápida de obter um sistema Platypus completo em execução (incluindo o Servidor, a IU Web e um Distribuidor de Agentes baseado em MinIO) é usando o Docker Compose:
git clone https://github.com/WangYihang/Platypus
cd Platypus
docker-compose up -d
https://localhost:9443 no seu navegador (o contêiner vem com um certificado autoassinado; seu navegador solicitará que você o aceite na primeira visita).bootstrap_secret é escrito em /app/data/bootstrap.secret dentro do contêiner na primeira inicialização (modo 0600). Leia-o com docker compose exec platypus-server cat /app/data/bootstrap.secret, use-o uma vez para criar o primeiro administrador, depois exclua o arquivo. Após a inicialização, o segredo não é mais aceito.curl ... | sh, assinado e fixado ao CA do projeto, para implantar agentes em sua frota.Requer Go 1.24+ e protoc (apenas se você regenerar o código protobuf).
git clone https://github.com/WangYihang/Platypus
cd Platypus
make build # → ./build/{platypus-server,platypus-agent}
Outros alvos úteis: make test, make lint, make snapshot (multi-plataforma via goreleaser), make help.
Contribuidores devem instalar os hooks do git para que gofmt / goimports / go vet / golangci-lint sejam executados antes de cada commit:
pip install pre-commit # ou: pipx install pre-commit
make hooks # único uso: configura .git/hooks/pre-commit
make pre-commit # opcional: executa todos os hooks em todos os arquivos agora
Requer Node 22+, dependências da CLI do Wails (wails doctor) e as bibliotecas WebView da plataforma (webkit2gtk-4.1 no Linux, WebView2 no Windows, WKWebView no macOS).
make desktop-deps # único uso: instala CLI do Wails + pacotes pnpm
make desktop-build # → desktop/build/bin/platypus-desktop
make desktop-dev # modo dev com hot-reload
Mesmas páginas, mesmas funcionalidades (exceto push de eventos em tempo real), roda em qualquer navegador:
make web-ui # → desktop/frontend/dist-web/ (pacote estático)
make web-ui-serve # pré-visualizar em http://localhost:8080
dist-web/ é totalmente estático; coloque-o no GitHub Pages / S3 / nginx. Aponte-o para qualquer platypus-server através do formulário de login.
Notas completas em desktop/README.md.
Baixe o arquivo apropriado para seu SO/arquitetura da página de Releases, extraia e execute.
docker build -t platypus-server .
docker run --rm -p 9443:9443 \
-e PLATYPUS_DEV=1 \
-v $(pwd)/config.yml:/config.yml \
platypus-server
PLATYPUS_DEV=1 ativa o fallback de KEK em disco para que uma nova inicialização funcione sem problemas; para produção, remova essa env var e defina PLATYPUS_CA_KEK (32 bytes hex; openssl rand -hex 32) para que a chave de criptografia da chave privada do CA nunca seja escrita ao lado do banco de dados criptografado.
./build/platypus-server # primeiro plano; Ctrl-C para desligamento gracioso
Para produção, execute o servidor sob systemd em vez de colocá-lo em segundo plano manualmente.
platypus-server contra o mesmo banco de dados até que a revogação entre processos seja implementada. Escala vertical + um standby de alta disponibilidade é o formato suportado; réplicas horizontais balanceadas por carga não são.PLATYPUS_DEV=1 também esteja presente (o que ativa um fallback apenas para desenvolvimento em disco em <data-dir>/ca.kek — inseguro para produção porque o texto cifrado e a chave acabam no mesmo volume).distributor.store.endpoint definido), defina PLATYPUS_DISTRIBUTOR_STORE_ACCESS_KEY_ID e PLATYPUS_DISTRIBUTOR_STORE_SECRET_ACCESS_KEY em vez de colocá-los diretamente no config.yml. O config.docker.yml incluído vem com os campos YAML em branco por esse motivo.192.168.88.129
0.0.0.0:9443192.168.88.130 (executa platypus-agent)Primeiro, execute ./platypus-server. Um config.yml é gerado a partir de assets/config.example.yml se nenhum existir. Os padrões são sensatos.
Para inscrever um novo host gerenciado:
O comando de uma linha renderizado pelo servidor se parece com:
curl -fsSL https://<server>:9443/api/v1/install/<one-shot-token> | sh
O token de instalação de uso único expira pouco após a emissão e é queimado no primeiro acesso bem-sucedido. O script que o servidor retorna:
curl --cacert (sem -k, sem TOFU);PLATYPUS_INSECURE_DOWNLOAD=1.Não escreva manualmente URLs
curl http://...para o caminho legado/agent/<host>:<port>— esse fluxo foi removido. Sempre renderize o comando de instalação através da IU para que ele carregue a âncora de confiança.
Abra o aplicativo desktop (platypus-desktop) ou a IU web (make web-ui-serve), preencha a URL do servidor e o segredo, e pronto. Abas: Sessions (cada agente que se conectou), Terminal, Files, Tunnels, Listeners.
Obrigado a todos os nossos apoiadores! 🙏 [Torne-se um apoiador]
Apoie este projeto tornando-se um patrocinador. Seu logotipo aparecerá aqui com um link para seu site. [Torne-se um patrocinador]