Dashboard web para gestionar containers Docker y reverse proxies de Nginx en tus servidores. Un solo binario que te permite ver, asociar y configurar servicios con SSL automático desde el navegador.
ServerPilot se instala en un servidor Linux y te da:
- Vista de containers Docker en tiempo real con puertos y estado.
- Vista de sitios Nginx con dominio, proxy pass y estado de SSL.
- Mapeo automático entre containers Docker y configuraciones Nginx (detecta la relación via reverse proxy).
- SSL con un clic usando Let's Encrypt (certbot), con renovación automática.
- Asociar sitios a containers eligiendo entre dos plantillas: NestJS (con WebSocket) o API (reverse proxy estándar).
- Habilitar/deshabilitar sitios Nginx directamente desde la interfaz.
- Auto-actualización del binario desde GitHub.
curl -fsSL https://raw.githubusercontent.com/mrthoabby/serverpilot/master/install.sh | shEl instalador detecta tu OS y arquitectura, descarga el binario correcto, y lo coloca en /usr/local/bin/sp (o ~/.local/bin/sp si no tenés sudo).
git clone https://github.com/mrthoabby/serverpilot.git
cd serverpilot
go build -o sp .
sudo mv sp /usr/local/bin/Ejecutá el asistente de configuración. Esto revisa las dependencias e instala lo que falte:
sudo sp setupEl setup hace dos cosas en orden:
[1/2] Dependencias — Verifica que Docker y Nginx estén instalados. Si alguno falta, te pregunta si querés instalarlo (usa apt-get). Si ya están instalados, sigue adelante.
[2/2] Credenciales de admin — Te pide un usuario y contraseña para el dashboard web. La contraseña se hashea con bcrypt y se guarda en /etc/serverpilot/config.json con permisos 0600.
Ejemplo de salida:
=== ServerPilot Setup ===
[1/2] Checking dependencies...
✓ Docker is installed
✗ Nginx is not installed
→ Install Nginx? [Y/n]: Y
✓ Nginx installed successfully
Dependencies OK.
[2/2] Setting up admin credentials...
Enter admin username: admin
Enter admin password: ********
Confirm password: ********
✓ Credentials saved to /etc/serverpilot/config.json
=== Setup Complete ===
Run 'sp start' to launch the web dashboard.
sp startEl dashboard queda disponible en http://IP-DEL-SERVIDOR:8090. Para usar otro puerto:
sp start --port 9090Para ejecutarlo como daemon (background) — se instala como servicio systemd automáticamente:
sudo sp start -dO con puerto custom:
sudo sp start -d --port 9090El daemon se inicia con el servidor, se reinicia solo si falla, y se actualiza automáticamente cuando ejecutás sp update.
Para ver el estado, parar o ver logs:
sp status # ver estado del daemon
sudo sp stop # parar el daemon
journalctl -u serverpilot -f # ver logs en vivoAbrí tu navegador y andá a:
http://tu-servidor:8090
Ingresá el usuario y contraseña que configuraste en el setup. El dashboard tiene tres pestañas:
Docker Containers — Muestra todos los containers corriendo con nombre, imagen, estado y puertos. Los containers que no tienen un sitio Nginx asociado muestran un botón "Associate Site".
Nginx Sites — Muestra todos los sitios configurados con dominio, puerto, proxy pass, estado de SSL y si está habilitado o no. Desde acá podés habilitar/deshabilitar SSL y activar/desactivar sitios.
Mappings — Muestra la relación entre containers y sitios. ServerPilot detecta esta relación analizando los proxy_pass de las configs de Nginx y comparándolos con los puertos de los containers. También te muestra containers sin sitio asociado y sitios huérfanos (que apuntan a containers que ya no existen).
Si querés acceder al dashboard desde fuera del servidor usando un dominio (en lugar de IP:8090), usá:
sudo sp expose --domain panel.miservidor.comEsto crea automáticamente un reverse proxy en Nginx que apunta al dashboard. ServerPilot:
- Genera la config en
/etc/nginx/sites-available/panel.miservidor.com - La habilita con symlink en
sites-enabled/ - Valida con
nginx -t - Recarga Nginx
Después podés acceder al dashboard en http://panel.miservidor.com.
Si el dashboard corre en un puerto diferente al 8090:
sudo sp expose --domain panel.miservidor.com --port 9090Para agregar SSL al dominio expuesto:
certbot --nginx -d panel.miservidor.comsp updateDescarga la última versión desde GitHub y reemplaza el binario actual. No necesita reiniciar el dashboard manualmente.
sp --version- Ir a la pestaña "Docker Containers".
- Encontrar el container que no tiene sitio (muestra botón "Associate Site").
- Hacer clic en "Associate Site".
- Seleccionar la plantilla:
- NestJS — Reverse proxy con soporte WebSocket, headers de proxy (
X-Forwarded-For,X-Real-IP,Upgrade,Connection). - API — Reverse proxy estándar con headers de rate limiting.
- NestJS — Reverse proxy con soporte WebSocket, headers de proxy (
- Ingresar el dominio (ej:
api.miapp.com). - Confirmar.
ServerPilot automáticamente: crea la config en /etc/nginx/sites-available/, la habilita con un symlink en sites-enabled/, valida la config con nginx -t, y recarga Nginx.
- Ir a la pestaña "Nginx Sites".
- Encontrar el sitio sin SSL (candado rojo).
- Hacer clic en "Enable SSL".
ServerPilot ejecuta certbot --nginx -d tu-dominio --non-interactive --agree-tos para obtener el certificado de Let's Encrypt. La renovación automática queda configurada via el timer de certbot.
Mismo proceso pero con el botón "Disable SSL". Modifica la config de Nginx para remover las directivas SSL y recarga.
Los botones "Enable" y "Disable" en la pestaña "Nginx Sites" crean o eliminan el symlink en /etc/nginx/sites-enabled/ y recargan Nginx.
La forma más fácil es usar el flag -d (daemon):
sudo sp start -dEsto automáticamente crea el archivo de servicio en /etc/systemd/system/serverpilot.service, habilita el servicio para que arranque con el servidor, e inicia el dashboard en background.
Si preferís crear el servicio manualmente:
sudo tee /etc/systemd/system/serverpilot.service > /dev/null <<EOF
[Unit]
Description=ServerPilot Dashboard
After=network.target docker.service nginx.service
[Service]
Type=simple
ExecStart=/usr/local/bin/sp start
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable serverpilot
sudo systemctl start serverpilotVerificar estado:
sp status
# o directamente:
sudo systemctl status serverpilotSi usás ufw y accedés directamente por IP+puerto, abrí el puerto del dashboard:
sudo ufw allow 8090/tcpSi usás sp expose con un dominio, no necesitás abrir el 8090 — Nginx ya escucha en el 80 (y 443 con SSL). Solo asegurate de tener abiertos los puertos HTTP/HTTPS:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcpEn producción, considerá acceder via SSH tunnel en lugar de exponer el puerto:
ssh -L 8090:localhost:8090 usuario@tu-servidor
# Luego abrí http://localhost:8090 en tu navegador localLa configuración se guarda en /etc/serverpilot/config.json con permisos 0600 (solo root puede leerlo). Contiene:
username— Nombre de usuario del admin.password_hash— Hash bcrypt de la contraseña.session_secret— Secreto para firmar las sesiones (generado concrypto/rand).
Para cambiar las credenciales, ejecutá sp setup de nuevo.
serverpilot/
├── main.go # Punto de entrada
├── version.go # Versión actual del binario
├── go.mod # Dependencias Go
│
├── cmd/ # Comandos CLI (Cobra)
│ ├── root.go # Comando raíz "sp"
│ ├── setup.go # sp setup
│ ├── start.go # sp start [--port] [-d]
│ ├── stop.go # sp stop
│ ├── status.go # sp status
│ ├── credentials.go # sp credentials [--reset]
│ ├── expose.go # sp expose --domain [--port]
│ └── update.go # sp update (auto-actualización + restart)
│
├── internal/
│ ├── sysinfo/ # Recolección de métricas del sistema
│ │ └── sysinfo.go
│ ├── deps/ # Detector e instalador de Docker y Nginx
│ │ └── deps.go
│ ├── auth/ # Autenticación (bcrypt + sesiones)
│ │ └── auth.go
│ ├── docker/ # Módulo Docker (listar containers, puertos)
│ │ └── docker.go
│ ├── nginx/ # Módulo Nginx (parsear configs, sites)
│ │ └── nginx.go
│ ├── mapper/ # Mapeo Docker ↔ Nginx + gestión SSL
│ │ ├── mapper.go
│ │ └── ssl.go
│ ├── templates/ # Plantillas Nginx (NestJS, API)
│ │ └── templates.go
│ └── web/ # Servidor HTTP + dashboard
│ ├── server.go # Servidor y rutas
│ ├── handlers.go # Handlers de API REST
│ ├── middleware.go # Auth, logging, recovery
│ └── static/
│ └── index.html # Dashboard (HTML/CSS/JS embebido)
│
├── vs-pre-run/ # Makefile ejecutado por el comando `vs` al hacer release
│ └── Makefile
├── homebrew/Formula/ # Fórmulas Homebrew
│ └── sp.rb
├── install.sh # Script de instalación Linux/macOS
├── install.ps1 # Nota para Windows (Linux-only)
└── .vscommit # Paths para commit selectivo
- Contraseñas hasheadas con bcrypt (costo por defecto). Nunca se guardan en texto plano.
- Sesiones con tokens generados con
crypto/rand(32 bytes, hex). CookiesHttpOnlyySameSite=Strict. - Ejecución de comandos con
exec.Commandy argumentos separados. Nunca se usash -ccon input concatenado. - Validación de inputs en todos los endpoints API con regex de allowlist. Se rechazan HTML tags.
- Prevención de path traversal en todas las operaciones de archivos (se valida que los paths estén dentro de
/etc/nginx/). - Errores genéricos en las respuestas API. Los errores internos se loguean server-side.
- Config con permisos 0600 — Solo root puede leer el archivo de configuración.
El dashboard usa estos endpoints internamente. Todos requieren autenticación excepto /api/login.
| Método | Endpoint | Descripción |
|---|---|---|
| POST | /api/login |
Autenticar con usuario/contraseña |
| POST | /api/logout |
Cerrar sesión |
| GET | /api/containers |
Listar containers Docker |
| GET | /api/sites |
Listar sitios Nginx |
| GET | /api/mappings |
Mapeo Docker ↔ Nginx |
| POST | /api/ssl/enable |
Habilitar SSL para un dominio |
| POST | /api/ssl/disable |
Deshabilitar SSL para un dominio |
| POST | /api/sites/create |
Crear sitio Nginx desde plantilla |
| POST | /api/sites/enable |
Habilitar sitio Nginx |
| POST | /api/sites/disable |
Deshabilitar sitio Nginx |
| GET | /api/system |
Métricas del sistema (CPU, RAM, disco, containers) |
El proyecto usa versionator (vs) para gestionar versiones y releases. Los binarios se distribuyen via GitHub Releases.
Cuando ejecutás vs -p (o -m, -M) en este repo, versionator:
- Actualiza
version.gocon la nueva versión. - Ejecuta automáticamente
vs-pre-run/Makefile— que compila los binarios para todas las plataformas y actualiza la fórmula Homebrew. - Hace commit, tag, y push.
# Instalar versionator si no lo tenés
brew tap mrthoabby/versionator
brew install vs
# Bump patch (1.0.0 → 1.0.1), compila binarios, commit, tag, push
vs -p
# Bump minor (1.0.0 → 1.1.0)
vs -m
# Bump major (1.0.0 → 2.0.0)
vs -MEso es todo. El comando vs automáticamente:
- Actualiza
version.go - Ejecuta
vs-pre-run/Makefile(compila binarios, actualiza fórmula Homebrew) - Hace commit de
version.go+release/*+homebrew/*(definidos en.vscommit) - Crea el tag y push
Los binarios quedan en el repo dentro de release/{VERSION}/ y se descargan via raw.githubusercontent.com.
cd vs-pre-run && make build-all
# Los binarios se generan en release/{VERSION}/
# sp-linux-amd64, sp-linux-arm64, sp-darwin-amd64, sp-darwin-arm64El install.sh y sp update descargan los binarios desde https://raw.githubusercontent.com/mrthoabby/serverpilot/master/release/X.Y.Z/sp-{os}-{arch}.
- Linux (Ubuntu 20.04+, Debian 11+, o similar con
apt-get) - Docker (se instala automáticamente si falta)
- Nginx (se instala automáticamente si falta)
- Certbot (se instala al habilitar SSL por primera vez)
- Puerto 8090 disponible (configurable)
- Fork del repositorio.
- Crear branch:
git checkout -b feature/mi-feature. - Hacer cambios y agregar tests:
go test ./.... - Enviar pull request con descripción clara.
Para cambios grandes, abrir un issue primero para discutir el approach.
MIT License. Ver LICENSE para detalles.