miércoles, 14 de mayo de 2025

Configura tu servidor de juegos Nintendo Switch con Ownfoil y DNS dinámico

Automatiza tu subdominio con IP dinámica usando Cloudflare y mantén tu servidor Ownfoil siempre disponible desde cualquier lugar.


Objetivo

Configurar foil.nintendomagica.com para que se actualice automáticamente con tu IP pública dinámica desde casa (ideal para Raspberry Pi o servidores caseros).


🔧 Paso 1: Mover la gestión DNS a Cloudflare

Problema: SiteGround no ofrece DNS dinámico, lo que impide actualizar la IP automáticamente.

✅ Solución: Usar Cloudflare para la gestión DNS

  1. Regístrate gratis en Cloudflare
  2. Agrega tu dominio nintendomagica.com
  3. Verifica que foil.nintendomagica.com esté en los registros DNS. Si no, agrégalo manualmente.
  4. Cambia los nameservers en SiteGround por los que te da Cloudflare (por ejemplo: lisa.ns.cloudflare.com, matt.ns.cloudflare.com)

📊 Nota: Esto transfiere todo el DNS a Cloudflare. Tu sitio puede seguir alojado en SiteGround, solo los DNS serán gestionados desde Cloudflare.

SiteGround no soporta DNS dinámico

SiteGround Config

🔺 Paso 2: Configurar Cloudflare como servidor DNS

  1. Agrega tu dominio (ej. nintendomagica.com) a Cloudflare.
  2. Verifica que se reconozca tu subdominio (ej. foil.nintendomagica.com). Si no está, agrégalo.
Configurar cloudflare como servidor DNS

Cambiar el Server Name

Cambiar server name en siteground.com

⏳ Esto puede tardar hasta 24 horas en activarse totalmente. Ten paciencia.


🔐 Paso 3: Obtener tu API Token de Cloudflare

  1. Ve a Perfil de API Tokens
  2. Crea un nuevo token con permisos:
    • Zone.Zone: Read
    • Zone.DNS: Edit
  3. Apóyalo a la zona: nintendomagica.com

📄 Paso 4: Script para actualizar la IP en tu Raspberry

Este script bash actualiza la IP en Cloudflare solo si ha cambiado:

#!/bin/bash
# -----------------------------------------
# Script para actualizar IP pública en DNS
# Autor: Aníbal Copitán
# Blog: https://blog.anibalcopitan.com
# Fecha: 2025-05-12
# -----------------------------------------

# CONFIGURACIÓN INICIAL
API_TOKEN="TU_TOKEN"
ZONE_NAME="nintendomagica.com"
RECORD_NAME="foil.nintendomagica.com"
IP_FILE="/tmp/last_ip.txt"

# Obtener IP pública actual
CURRENT_IP=$(curl -s http://ipv4.icanhazip.com)

# Verificar si la IP cambió
if [ -f "$IP_FILE" ]; then
    LAST_IP=$(cat "$IP_FILE")
    if [ "$CURRENT_IP" == "$LAST_IP" ]; then
        echo "La IP no ha cambiado: $CURRENT_IP"
        exit 0
    fi
fi

# Guardar nueva IP
echo "$CURRENT_IP" > "$IP_FILE"

# Obtener ZONE ID
ZONE_ID=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones?name=$ZONE_NAME" \
     -H "Authorization: Bearer $API_TOKEN" -H "Content-Type: application/json" | jq -r '.result[0].id')

# Obtener RECORD ID
RECORD_ID=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records?name=$RECORD_NAME" \
    -H "Authorization: Bearer $API_TOKEN" -H "Content-Type: application/json" | jq -r '.result[0].id')

# Actualizar el registro A
curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \
    -H "Authorization: Bearer $API_TOKEN" \
    -H "Content-Type: application/json" \
    --data "{\"type\":\"A\",\"name\":\"$RECORD_NAME\",\"content\":\"$CURRENT_IP\",\"ttl\":120,\"proxied\":false}" > /dev/null

echo "IP actualizada a $CURRENT_IP"

⏰ Paso 5: Automatizar con crontab

Edita tu crontab:

crontab -e

Agrega esta línea:

*/5 * * * * /home/pi/custom-ownfoil/script.sh

Este cron ejecuta el script cada 5 minutos, actualizando tu subdominio solo si la IP ha cambiado.


✅ Resultado final

Tu subdominio foil.nintendomagica.com siempre estará actualizado con tu IP pública dinámica. Ideal para jugar en red o acceder a tu servidor desde cualquier lugar.


🚀 Deploy de Ownfoil con Docker

Usamos el repositorio custom-ownfoil para:

  • Iniciar Ownfoil automáticamente con Docker
  • Migrar fácilmente datos usando volúmenes
  • Evitar dependencias del sistema (sin venv o Python local)

Pasos:

git clone git@github.com:enlacee/custom-ownfoil.git
cd custom-ownfoil
docker-compose up -d
Deploy con ownfoil con docker compose

Asegúrate de tener Docker y Docker Compose instalados.


🛍️ HTTPS fácil con Caddy

Paso 1: Abre los puertos 80 (http) y 443 (https)

Caddy usará el puerto 80 para generar certificados SSL automáticamente.

Paso 2: Instala Caddy

Mucho más simple que configurar Nginx, Caddy permite proxy reverso y SSL automático con mínima configuración.

Paso 3: Crea un archivo Caddyfile en la raíz del proyecto

Configurar el archivo con el siguiente comando:

sudo nano /etc/caddy/Caddyfile
#:80 {
#   root * /usr/share/caddy
#   file_server
#}

foil.nintendomagica.com {
    reverse_proxy localhost:8465 {
        header_up X-Forwarded-Proto {scheme}
    }
}

# Para asegurarte de que nadie entre por HTTP (sin cifrar), añade redirección automática:
http://foil.nintendomagica.com {
    redir https://foil.nintendomagica.com{uri}
}

Este archivo le dice a Caddy que reciba las peticiones HTTPS en foil.nintendomagica.com y las redirija al puerto 8465 local, donde corre Ownfoil.

Paso 4: Corre Caddy como servicio

Verificar que Caddy funciona correctamente

sudo systemctl reload caddy
sudo systemctl status caddy

El resultado sera el siguiente:

Configuracion realizada al subdominio

Ver resumen en video

📌 Conclusión

Este proyecto fue una gran experiencia para aprender sobre servidores DNS dinámicos y configuración avanzada en casa. Aunque SiteGround no permite DNS dinámico, Cloudflare y su API nos brindan una alternativa poderosa y flexible. Gracias al uso de bash, Docker y Caddy:

  • Aprendí a automatizar la actualización de IP pública.
  • Configuré múltiples servicios usando subdominios en mi Raspberry Pi.
  • Descubrí cómo aprovechar Caddy como proxy inverso y generador automático de certificados HTTPS.

Este conocimiento me abre puertas para proyectos futuros, como servidores PHP, Node.js, Ruby, Django y más, todo desde casa, sin pagar servicios externos. ¡Linux y Raspberry Pi al poder!

Referencias:

No hay comentarios:

Publicar un comentario

Soy Aníbal 🐧💻. ¿Tienes una gran Idea/Proyecto?

¿Tienes un proyecto en mente o necesitas resolver un desafío técnico? Estoy aquí para ayudarte a encontrar la mejor solución. 🚀

Hablemos sobre tu proyecto