- JavaScript 37.3%
- CSS 25.8%
- HTML 18.5%
- TypeScript 18.2%
- Dockerfile 0.2%
|
All checks were successful
Deploy Palworld Dashboard / deploy (push) Successful in 13s
|
||
|---|---|---|
| .github/workflows | ||
| frontend/src | ||
| prisma | ||
| public | ||
| scripts | ||
| src | ||
| .dockerignore | ||
| .gitignore | ||
| angular.json | ||
| Dockerfile | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| server.js | ||
| tsconfig.app.json | ||
| tsconfig.json | ||
palworld-dashboard
Panel simple para monitorear un servidor Palworld con snapshots cada 5 segundos y actualización por WebSocket.
Stack
- Node.js
- Express
ws- Palworld Paldex API proxy
- Angular 22 para el frontend
- HTML, CSS y TypeScript
Arquitectura
El backend está separado por contexto:
src/application: orquestación y casos de usosrc/domain: reglas y modelos purossrc/infrastructure: MySQL/Prisma, Redis, REST API de Palworld, probe de red y métricas del hostfrontend/src: frontend Angulardist/palworld-dashboard/browser: build compilado que sirve Express
La idea es mantener el dashboard como un monolito modular, no como un archivo gigante.
Desarrollo local
npm install
npm start
npm start ejecuta primero npm run build:web y luego levanta el backend Express.
Luego abre http://localhost:3000.
Si quieres compilar solo el frontend:
npm run build:web
Persistencia con MySQL
Si defines DATABASE_URL, el dashboard usa Prisma para guardar snapshots en MySQL 8 y ejecuta las migraciones al arrancar.
Ejemplo:
DATABASE_URL="mysql://usuario:clave@localhost:3306/palworld_dashboard"
Con esa variable activa:
- el arranque corre
prisma migrate deploy - se conecta el cliente Prisma
- los snapshots se guardan en la tabla
snapshots
También puedes ejecutar las migraciones manualmente:
npm run db:migrate
Despliegue automático
Hay un workflow de GitHub Actions en .github/workflows/deploy-palworld-dashboard.yml que:
- Se dispara en
pushamaincuando cambia este proyecto. - Entra por SSH y ejecuta
/home/ruben/scripts/deploy-palworld-dashboard.sh.
Necesitas definir estos secrets en el repositorio:
DEPLOY_HOSTDEPLOY_USERDEPLOY_SSH_KEYDEPLOY_PORTopcional, por defecto22
El servidor debe tener:
- El script en
/home/ruben/scripts/deploy-palworld-dashboard.sh. - Permisos de ejecución sobre ese script.
git,npmy todo lo que use tu script instalados en el servidor.
Docker
docker build -t palworld-dashboard .
docker run --rm -p 3000:3000 palworld-dashboard
Si quieres que el panel lea temperatura del host dentro de Docker, monta también:
-v /sys/class/hwmon:/sys/class/hwmon:ro \
-v /sys/class/thermal:/sys/class/thermal:ro
API
GET /api/snapshotGET /api/history?bucket=hour|day&limit=24GET /api/paldex/catalog?section=pals|items|gear&term=Relaxaurus&page=1&limit=12GET /api/paldex/search?term=Relaxaurus&limit=12GET /api/paldex/:section/searchGET /healthzWS /ws
Palworld REST API
Si quieres leer el mundo y los jugadores desde la API oficial, configura:
PALWORLD_REST_URLPALWORLD_REST_USERPALWORLD_REST_PASSWORDDATABASE_URL: cadena de conexión MySQL para PrismaPALWORLD_RESTART_ANNOUNCE_TIME: hora local para avisar reinicio, por defecto02:55PALWORLD_RESTART_ANNOUNCE_TIMEZONE: zona horaria del aviso, por defectoAmerica/SantiagoPALWORLD_RESTART_ANNOUNCE_MESSAGE: mensaje enviado aPOST /announce, por defectoEl servidor se reiniciara pronto.PALWORLD_RESTART_ANNOUNCE_ENABLED: activa o desactiva el aviso, por defectotrue
Ejemplo:
PALWORLD_REST_URL=http://palworld-server:8212
PALWORLD_REST_USER=usuario
PALWORLD_REST_PASSWORD=clave
PALWORLD_RESTART_ANNOUNCE_TIME=02:55
PALWORLD_RESTART_ANNOUNCE_TIMEZONE=America/Santiago
Palworld Paldex API
El dashboard también puede consultar el catálogo de Paldex para buscar pals, items y gear, mostrando imágenes e iconos de elementos.
Configura:
PALDEX_API_URL: base URL del API de Paldex para la sección de pals, por ejemplohttp://paldex-api:3000PALDEX_ASSET_BASE_URL: base URL para resolver imágenes del catálogo, por defecto usa la URL de la API o el repo públicoPALDEX_DATA_BASE_URL: base URL de los JSON públicos del catálogo, por defecto usa el repo de Paldex en GitHubPALDEX_API_TIMEOUT_MS: timeout en milisegundos para la búsqueda remota, por defecto8000
El dashboard no llama al origen directamente desde el navegador: lo hace por backend a través de GET /api/paldex/catalog y sus aliases.
La vista del dashboard incluye:
- pestañas para
pals,itemsygear - filtros para
types,suitabilitiesydropsen la sección de pals - paginación visual en el catálogo
- detalle compacto al hacer click en una card
El catálogo expone filtros como:
termnametypetypessuitabilitiesdropskey
Y soporta paginación con:
pagelimit
El repo incluye assets en:
public/images/paldeckpublic/images/elementspublic/images/items
Qué hace
- Sirve un dashboard visual.
- Lee CPU y memoria reales desde
/proc. - Puede probar el puerto del servidor de Palworld si configuras
PALWORLD_HOSTyPALWORLD_PORT. - Si configuras la REST API de Palworld, muestra nombre del servidor, descripción, world GUID, jugadores conectados y métricas del mundo.
- Puede dibujar los jugadores sobre un mapa OpenSeadragon con zoom y anotaciones sobre una imagen de alta resolución incluida o con otra que le pases, y ajusta los bounds del mundo por variables.
- Puede buscar pals, items y gear desde el catálogo de Paldex y mostrar cards con imagen, tipos e iconos elementales.
- Mantiene una base lista para conectar pub/sub real y leer métricas del host o del contenedor.
Variables de entorno
PORT: puerto HTTP del dashboard, por defecto3000HOSTNAME: interfaz de escucha, por defecto0.0.0.0PALWORLD_HOST: host o IP del servidor PalworldPALWORLD_PORT: puerto del servidor PalworldPALWORLD_MAX_PLAYERS: capacidad máxima mostrada en el panel, por defecto32REFRESH_INTERVAL_MS: intervalo de refresco, por defecto5000PALWORLD_REST_URL: URL base de la REST API de PalworldPALWORLD_REST_USER: usuario de la REST APIPALWORLD_REST_PASSWORD: contraseña de la REST APIPALWORLD_RESTART_ANNOUNCE_ENABLED: activa el anuncio automatico de reinicio por REST, por defectotruePALWORLD_RESTART_ANNOUNCE_TIME: hora local del anuncio automatico, por defecto02:55PALWORLD_RESTART_ANNOUNCE_TIMEZONE: zona horaria del anuncio automatico, por defectoAmerica/SantiagoPALWORLD_RESTART_ANNOUNCE_MESSAGE: mensaje enviado al endpoint/announcePALWORLD_RESTART_ANNOUNCE_CHECK_INTERVAL_MS: frecuencia de revision del scheduler, por defecto30000PALDEX_API_URL: URL base del API de Palworld PaldexPALDEX_ASSET_BASE_URL: base URL para resolver imágenes del catálogo de PaldexPALDEX_DATA_BASE_URL: base URL de los JSON del catálogo de PaldexPALDEX_API_TIMEOUT_MS: timeout en milisegundos para consultas al Paldex API, por defecto8000DATABASE_URL: cadena de conexión MySQL para PrismaPALWORLD_MAP_IMAGE: URL o ruta pública de la imagen del mapa, por ejemplo/map.jpg. Si no la defines, usa la imagen incluida enpublic/map.jpgPALWORLD_MAP_CAPTION: texto de ayuda que se muestra sobre el mapaPALWORLD_MAP_TRANSFORM:referencepara usar la misma proyección del mapa online de referencia, oboundspara usar límites configurablesPALWORLD_MAP_X_MIN: límite mínimo X del mundo, por defecto-500000PALWORLD_MAP_X_MAX: límite máximo X del mundo, por defecto500000PALWORLD_MAP_Y_MIN: límite mínimo Y del mundo, por defecto-500000PALWORLD_MAP_Y_MAX: límite máximo Y del mundo, por defecto500000PALWORLD_MAP_INVERT_Y: invierte el eje Y al pintar el mapa, por defectotrueREDIS_URL: URL opcional para persistir y leer históricoREDIS_HISTORY_KEY: clave opcional para la serie histórica, por defectopalworld:historyHISTORY_RETENTION_DAYS: cuántos días conservar en Redis, por defecto30