UpSnap: Aplicación web Wake on Lan autohospedada

Publicado por


UpSnap
Wake on LAN

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.

Interfaz web responsiva con 35 temas, soporte i18n para 22 idiomas, gestión de usuarios con permisos granulares y despliegue sencillo mediante Docker con network_mode host para WoL.

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.

services:
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).

docker compose up -d

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).

wget https://github.com/seriousm4x/UpSnap/releases/download/v5/UpSnap_v5_linux_amd64.zip
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).

environment:
– 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.

environment:
– 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.

environment:
– 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.

environment:
– 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.

environment:
– 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.

environment:
– 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.

environment:
– 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.

user: 1000:1000

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).

volumes:
– /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 /.

# Caddy
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).

docker compose logs -f upsnap

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 pull
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.

tar -czf upsnap-backup-$(date +%F).tar.gz ./data

Restaurar backup

Detén el contenedor, reemplaza el contenido de ./data con el backup y vuelve a iniciar.

docker compose down
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.

docker inspect –format='{{.State.Health.Status}}' upsnap

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

Apoya el canal GENBYTE

Sígueme en mis redes sociales

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *