Sign inSign up

jusaba/dns

By jusaba

Updated 3 months ago

Cliente para miniDynDns

Image
0

100K+

jusaba/dns repository overview

Cliente para miniDynDns

Esta imagen ha sido creada para construir un cliente de minidyndns instalado en los servidores de de dns . Para serverpic se han instalado dos servidores de dns que, para esta documentación, por cuestiones de privacidad, denominaremos dns1.com y dns2.com. Por idéntica razón, el dominio que vamos a utilizar lo denominamos como dominio.es

Vamos a suponer también que el host donde vamos a instalar el cliente queremos que se llame lleida.dominio.es. Es indispensable que lleida se de de alta en los dos servidores minidyndns y vamos a suponer también que lleida se ha dado de alta en los servidores registrandolo en db.yml con el password passlleida.

Instalación 🔧

Para descargar la imagen

docker pull jusaba/dns:latest

Como se ha construido la imagen 🛠️

Pre-requisitos 📋

Para crear el contenedor, en el directorio donde se encuentre Dockerfile y se vaya a hacer el build se necesita un fichero con nombre start.sh con el siguiente contenido

#!/bin/bash
# /home/pi/ip/start.sh
# Soporte para numero indeterminado de servidores DNS
# Los servidores se pasan como variable SERVIDORES separados por comas
# Ejemplo: SERVIDORES=dns1.com,dns2.com,dns3.com
# O mediante variables servidor1, servidor2, etc. para compatibilidad

rm -f /home/pi/ip/ActualizaDNS.py
touch /home/pi/ip/ActualizaDNS.py
rm -f /var/spool/cron/crontabs/root
touch /var/spool/cron/crontabs/root

# Generar script Python que obtiene la IP pública y la envía como parámetro
echo "import requests" >> /home/pi/ip/ActualizaDNS.py
echo "from requests.auth import HTTPBasicAuth" >> /home/pi/ip/ActualizaDNS.py
echo "" >> /home/pi/ip/ActualizaDNS.py
echo "# Obtener IP publica" >> /home/pi/ip/ActualizaDNS.py
echo "try:" >> /home/pi/ip/ActualizaDNS.py
echo "    myip = requests.get('https://api.ipify.org', timeout=10).text.strip()" >> /home/pi/ip/ActualizaDNS.py
echo "except:" >> /home/pi/ip/ActualizaDNS.py
echo "    myip = requests.get('https://ifconfig.me/ip', timeout=10).text.strip()" >> /home/pi/ip/ActualizaDNS.py
echo "" >> /home/pi/ip/ActualizaDNS.py

# Si se usa la nueva variable SERVIDORES (separados por comas)
if [ -n "$SERVIDORES" ]; then
    echo "$SERVIDORES" | tr ',' '\n' | while read servidor; do
        servidor=$(echo "$servidor" | tr -d ' ')
        if [ -n "$servidor" ]; then
            echo "requests.get(f'http://${servidor}:8001/?myip={myip}', auth=HTTPBasicAuth('$host', '$password'))" >> /home/pi/ip/ActualizaDNS.py
        fi
    done
else
    # Compatibilidad con formato antiguo (servidor1, servidor2, etc.)
    i=1
    while true; do
        eval servidor=\$servidor$i
        if [ -z "$servidor" ]; then
            break
        fi
        echo "requests.get(f'http://${servidor}:8001/?myip={myip}', auth=HTTPBasicAuth('$host', '$password'))" >> /home/pi/ip/ActualizaDNS.py
        i=$((i + 1))
    done
fi

# Configurar cron
service cron stop
chmod 600 /var/spool/cron/crontabs/root
echo "*/${refresco} * * * * python3 /home/pi/ip/ActualizaDNS.py" >> /var/spool/cron/crontabs/root
service cron reload
cron -f

La imagen se ha creado mediante el siguiente Dockerfile

FROM debian:bookworm-slim

ENV TZ=Europe/Madrid

LABEL version=2.0
LABEL autor=Julian_Salas

RUN apt-get update -y && \
    apt-get upgrade -y && \
    apt-get install -y --no-install-recommends \
        cron \
        python3 \
        python3-requests && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

COPY ./start.sh /home/pi/ip/start.sh
WORKDIR /home/pi/ip

CMD ["bash", "start.sh"]


Build manual

Para la creación del contenedor se ha utilizado buildx para hacerlo multiplataforma

docker buildx build --platform=linux/amd64,linux/arm64,linux/arm/v7 -t jusaba/dns:latest . --push

Build automático con GitHub Actions

El proyecto incluye un workflow de GitHub Actions que construye y publica automáticamente la imagen Docker cuando:

  • Se hace push a la rama main
  • Se crea un tag con formato v* (ej: v1.0.0, v2.1.0)
  • Se ejecuta manualmente desde la pestaña Actions
Configuración de secretos

Para que el workflow funcione, debes configurar los siguientes secretos en tu repositorio de GitHub:

  1. Ve a Settings > Secrets and variables > Actions
  2. Añade los siguientes secretos:
    • DOCKER_USERNAME: Tu usuario de Docker Hub
    • DOCKER_PASSWORD: Tu password o token de acceso de Docker Hub
Versionado con tags

Para publicar una nueva versión:

git tag v1.0.0
git push origin v1.0.0

Esto generará automáticamente las tags 1.0.0, 1.0 y latest en Docker Hub.

Arranque del contenedor ⚙️

El contenedor soporta un número indeterminado de servidores DNS. Hay dos formas de configurarlos:

Opción 1: Variable SERVIDORES (Recomendada)

Usar una única variable SERVIDORES con los servidores separados por comas:

docker run -e host=lleida \
           -e refresco=1 \
           -e password=passlleida \
           -e SERVIDORES=dns1.com,dns2.com,dns3.com \
           -d --name dns jusaba/dns:latest
Opción 2: Variables numeradas (Compatibilidad)

Para compatibilidad con versiones anteriores, también se pueden usar variables numeradas:

docker run -e host=lleida \
           -e refresco=1 \
           -e password=passlleida \
           -e servidor1=dns1.com \
           -e servidor2=dns2.com \
           -e servidor3=dns3.com \
           -d --name dns jusaba/dns:latest
Variables de entorno
VariableDescripción
hostNombre del host del dominio (ej: lleida para lleida.dominio.es). Debe estar dado de alta en los servidores DNS
refrescoTiempo en minutos de actualización de la IP
passwordPassword con el que se ha dado de alta el host en los servidores DNS
SERVIDORESLista de servidores DNS separados por comas (ej: dns1.com,dns2.com,dns3.com)
servidor1, servidor2, ...URLs de los servidores DNS (formato antiguo, mantiene compatibilidad)
Usando archivo de configuración

También se pueden almacenar las variables en un fichero parametros.env:

host=lleida
refresco=1
password=lleidapass
SERVIDORES=dns1.com,dns2.com,dns3.com

Y arrancar el contenedor así:

docker run --env-file parametros.env -d --name dns jusaba/dns:latest

Contribuyendo 🖇️

Wiki 📖

Versionado 📌

Autores ✒️

  • Julián Salas Barolome Desarrollo y documentación

Licencia 📄

Este proyecto es libre para utilizarlo como cliente de minidyndns

Expresiones de Gratitud 🎁

  • Comenta a otros sobre este proyecto 📢
  • Invita una cerveza 🍺 o un café ☕ a alguien del equipo.
  • Da las gracias públicamente 🤓.
  • etc.

⌨️ La presentación de esta documentación ha sido posible gracias a Villanuevand 😊

Tag summary

Content type

Image

Digest

sha256:32276d99f

Size

44.6 MB

Last updated

3 months ago

docker pull jusaba/dns