UpSnap: Aplicación web Wake on Lan autohospedada
Despierta dispositivos en red con una interfaz moderna construida con SvelteKit, Go y PocketBase
Vídeo tutorial en YouTube
Mira el vídeo completo sobre cómo instalar y usar UpSnap: Aplicación web Wake on Lan autohospedada en el canal GENBYTE:
¿Qué es UpSnap: Aplicación web Wake on Lan autohospedada?
UpSnap es una aplicación web de código abierto diseñada para enviar paquetes mágicos Wake on LAN (WoL) y gestionar dispositivos de red desde una interfaz gráfica. Está desarrollada con SvelteKit en el frontend, Go en el backend y utiliza PocketBase como base de datos embebida y sistema de autenticación. El proyecto permite despertar equipos con un clic, programar encendidos mediante tareas cron, escanear la red para descubrir dispositivos, monitorizar puertos y apagar máquinas mediante comandos personalizados. Se distribuye como binario único, imagen Docker multi-arquitectura y paquete AUR para Arch Linux, facilitando su despliegue en entornos caseros o de pequeña empresa.
Características principales
Despertar dispositivos con un clic
Panel de control que envía paquetes mágicos WoL a los dispositivos registrados, permitiendo encenderlos desde la interfaz web.
Eventos programados con cron
Automatiza el encendido de dispositivos definiendo expresiones cron para cada equipo.
Comprobación de puertos personalizada
Permite hacer ping a cualquier puerto TCP/UDP para verificar la disponibilidad de servicios específicos.
Descubrimiento de red con nmap
Escanea la red local para detectar dispositivos y rellenar automáticamente direcciones MAC e IP (requiere nmap).
Seguimiento de IP mediante ARP
Actualiza periódicamente la dirección IP de cada dispositivo mediante escaneo ARP periódico (requiere nmap).
Soporte para FQDN
Permite usar nombres de dominio completos (FQDN) en lugar de direcciones IP para identificar dispositivos.
Apagado remoto con comando personalizado
Ejecuta un comando definido por el usuario para apagar o gestionar el dispositivo de forma remota.
Gestión de usuarios segura
Sistema de autenticación con roles: administradores con acceso total y usuarios con permisos por dispositivo (ver, editar, encender, apagar).
Registro de actividad para superusuarios
Página de logs accesible solo por administradores para auditar acciones en la aplicación.
Internacionalización (i18n)
Interfaz traducida a 22 idiomas, incluyendo español, inglés, alemán, francés, japonés, chino, árabe y más.
35 temas visuales
Amplia selección de temas claros y oscuros para personalizar la apariencia de la interfaz.
Imágenes Docker multi-arquitectura
Disponibles para amd64, arm64, arm/v7 y arm/v6 en GitHub Container Registry y Docker Hub.
Autohospedado y ligero
Binario único sin dependencias externas complejas, diseñado para ejecutarse en hardware modesto (Raspberry Pi, NAS, servidores caseros).
Requisitos del sistema
- Docker y Docker Compose (recomendado) o runtime de Go para compilación manual
- Capacidad NET_RAW en el contenedor para paquetes WoL, ping privilegiado y escaneo nmap
- Modo de red host (network_mode: host) obligatorio para que funcionen los paquetes mágicos WoL
- Volumen persistente para datos de PocketBase (./data:/app/pb_data)
- nmap instalado en la imagen (incluido en la imagen oficial) para escaneo de red y ARP
- Opcional: avahi y dbus en el host si se usan dominios .local (FQDN mDNS)
- Opcional: configuración de sysctl net.ipv4.ping_group_range para ping sin privilegios en Linux
Instalación con Docker Compose
Despliegue con Docker Compose (recomendado)
Crea un archivo docker-compose.yml con la configuración base. La imagen oficial requiere network_mode: host y la capability NET_RAW. El volumen ./data persiste la base de datos PocketBase y la configuración.
upsnap:
cap_add:
– NET_RAW
cap_drop:
– ALL
container_name: upsnap
image: ghcr.io/seriousm4x/upsnap:5
network_mode: host
restart: unless-stopped
volumes:
– ./data:/app/pb_data
# environment:
# – TZ=Europe/Berlin
# – UPSNAP_HTTP_LISTEN=0.0.0.0:8090
# – UPSNAP_INTERVAL=*/10 * * * * *
# – UPSNAP_LOG_LEVEL=INFO
# – UPSNAP_SCAN_RANGE=192.168.1.0/24
# – UPSNAP_SCAN_TIMEOUT=500ms
# – UPSNAP_PING_PRIVILEGED=true
# – UPSNAP_WEBSITE_TITLE=Custom name
# user: 1000:1000
# security_opt:
# – no-new-privileges=true
Iniciar el contenedor
Ejecuta docker compose up -d en el directorio donde se encuentra el archivo docker-compose.yml. La aplicación estará disponible en el puerto 8090 de la interfaz configurada (por defecto 0.0.0.0:8090).
Ejecución directa del binario (alternativa)
Descarga el binario correspondiente a tu arquitectura desde la página de releases de GitHub, dale permisos de ejecución y ejecútalo con la flag serve. Requiere privilegios para NET_RAW (setcap o sudo).
unzip UpSnap_v5_linux_amd64.zip
chmod +x upsnap
sudo setcap 'cap_net_raw=+p' ./upsnap
./upsnap serve –http=0.0.0.0:8090
Acceder al proyecto
Acceso a la interfaz web
Abre un navegador y accede a http://<IP_DEL_HOST>:8090 (o el puerto configurado en UPSNAP_HTTP_LISTEN). Al primer acceso se solicita crear un usuario administrador. Tras el registro inicial, inicia sesión para añadir dispositivos y configurar la aplicación.
Acceso mediante proxy inverso (Caddy)
Configura un bloque de sitio en Caddy para exponer UpSnap bajo un dominio con HTTPS automático. El ejemplo asume que UpSnap escucha en localhost:8090.
Acceso mediante proxy inverso (nginx)
Configura un server block en nginx para proxy_pass hacia el puerto 8090 local, incluyendo cabeceras estándar para preservar IP y protocolo original.
Casos de uso
- Encender equipos de escritorio, servidores caseros o NAS desde el móvil o navegador sin necesidad de acceso físico.
- Programar el encendido automático de estaciones de trabajo al inicio de la jornada laboral mediante expresiones cron.
- Monitorizar la disponibilidad de servicios críticos (SSH, HTTP, bases de datos) comprobando puertos específicos.
- Descubrir y registrar automáticamente dispositivos en la red local para mantener un inventario actualizado.
- Apagar remotamente máquinas Linux/Windows mediante SSH, RPC u otros comandos personalizados definidos por el administrador.
- Gestionar permisos por usuario: permitir que miembros de la familia o compañeros enciendan solo sus dispositivos asignados.
- Ejecutar en Raspberry Pi, NAS (Synology, TrueNAS) o cualquier servidor Linux con Docker para disponibilidad 24/7 con bajo consumo.
Configuración avanzada
Cambiar puerto de escucha
Define la variable de entorno UPSNAP_HTTP_LISTEN en docker-compose.yml para modificar la IP y puerto donde escucha la aplicación (por defecto 0.0.0.0:8090).
– UPSNAP_HTTP_LISTEN=0.0.0.0:5000
Configurar zona horaria para tareas cron
Establece la variable TZ para que las expresiones cron se evalúen en la zona horaria deseada.
– TZ=Europe/Berlin
Ajustar intervalo de comprobación de estado (ping)
Modifica UPSNAP_INTERVAL con una expresión cron de 6 campos (segundos incluidos) para definir cada cuánto se hace ping a los dispositivos.
– UPSNAP_INTERVAL=*/30 * * * * *
Definir rango de escaneo de red
Especifica UPSNAP_SCAN_RANGE en notación CIDR para limitar el descubrimiento de dispositivos a una subred concreta.
– UPSNAP_SCAN_RANGE=192.168.10.0/24
Configurar timeout de escaneo nmap
Ajusta UPSNAP_SCAN_TIMEOUT con el valor de –host-timeout de nmap (ej. 500ms, 1s) para controlar cuánto esperar a cada host durante el escaneo.
– UPSNAP_SCAN_TIMEOUT=1s
Desactivar ping privilegiado
Establece UPSNAP_PING_PRIVILEGED=false para usar ping sin privilegios. Requiere configurar sysctl net.ipv4.ping_group_range en el host Linux.
– UPSNAP_PING_PRIVILEGED=false
Personalizar título de la web
Cambia el título que aparece en la pestaña del navegador y en la interfaz con UPSNAP_WEBSITE_TITLE.
– UPSNAP_WEBSITE_TITLE=Mi UpSnap
Ejecutar como usuario no root
Crea el directorio data con permisos adecuados (mkdir data && chown 1000:1000 data) y descomenta user: 1000:1000 en docker-compose.yml. Consulta la wiki para detalles completos.
Montar bus D-Bus para dominios .local (mDNS)
Si usas FQDN terminados en .local, monta el socket de system bus de D-Bus en el contenedor (solo si entiendes las implicaciones de seguridad).
– /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket:ro
Ejecutar en sub-ruta (sub-path)
Configura el proxy inverso para servir UpSnap bajo una sub-ruta (ej. /upsnap/). Requiere strip_prefix en Caddy o configuración location en nginx. La ruta debe terminar en /.
handle /upsnap-sub-path/* {
uri strip_prefix /upsnap-sub-path
reverse_proxy localhost:8090
}
# nginx
location /upsnap-sub-path/ {
proxy_pass http://localhost:8090/;
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 $scheme;
}
Gestión y mantenimiento
Ver logs de la aplicación
Consulta los logs del contenedor para depuración o auditoría. El nivel de detalle se controla con UPSNAP_LOG_LEVEL (DEBUG, INFO, WARN, ERROR, OFF).
Actualizar a nueva versión
Descarga la nueva imagen y recrea el contenedor manteniendo el volumen de datos. La base de datos PocketBase migra automáticamente si es necesario.
docker compose up -d
Backup de la base de datos y configuración
Copia el directorio ./data (montado en /app/pb_data) que contiene la base de datos SQLite de PocketBase, archivos de configuración y posibles certificados.
Restaurar backup
Detén el contenedor, reemplaza el contenido de ./data con el backup y vuelve a iniciar.
rm -rf ./data/*
tar -xzf upsnap-backup-2024-01-15.tar.gz
docker compose up -d
Comprobar salud del contenedor
La imagen incluye un healthcheck que consulta /api/health cada 10 segundos. Verifica el estado con docker inspect o docker compose ps.
Stack técnico
- Go (backend, binario único)
- SvelteKit (frontend, SSR/SPA)
- PocketBase (base de datos embebida, autenticación, API en tiempo real)
- nmap (escaneo de red, descubrimiento ARP)
- Alpine Linux (imagen base Docker)
- Docker multi-arch (amd64, arm64, arm/v7, arm/v6)
- Caddy / nginx (proxy inverso recomendado)
Referencias oficiales
- Repositorio oficial en GitHub: https://github.com/seriousm4x/UpSnap
- Imágenes Docker en GitHub Container Registry: https://github.com/seriousm4x/UpSnap/pkgs/container/upsnap
- Imágenes Docker en Docker Hub: https://hub.docker.com/r/seriousm4x/upsnap
- Página de releases (binarios y changelog): https://github.com/seriousm4x/UpSnap/releases
- Wiki: Uso de FQDN: https://github.com/seriousm4x/UpSnap/wiki/Use-FQDN
- Wiki: Usuario no root: https://github.com/seriousm4x/UpSnap/wiki/Use-non%E2%80%90root-user
- Wiki: Apagado de dispositivos: https://github.com/seriousm4x/UpSnap/wiki/How-to-use-shutdowns
- Wiki: Añadir idiomas: https://github.com/seriousm4x/UpSnap/wiki/How-to-add-languages
- Paquete AUR (Arch Linux): https://aur.archlinux.org/packages/upsnap-bin
- Documentación de PocketBase: https://pocketbase.io/docs
Apoya el canal GENBYTE
¿Te ha sido útil este contenido?
Suscríbete a YouTube
Newsletter GENBYTE
Ko-fi
Contacto: [email protected]
