390 - Cloudflare, self hosted, la nube y otras preguntas

390 - Cloudflare, self hosted, la nube y otras preguntas

Cloudflare es un excelente servicio que te permite poner tu Raspberry o cualquier servidor directamente en Internet, sin necesidad de abrir puertos de router.

1:25
-3:15

En los últimos episodios del podcast, hablé sobre Cloudflare, y en concreto sobre un servicio que ofrecía de túneles. Esto te permitía exponer un servicio que tuvieras corriendo en un servidor en tu casa o en una oficina a internet, aunque estuvieras detrás de un CGNAT, sin la necesidad de abrir puertos. Se trata de un servicio fantástico y gratuito, al menos en el momento de publicar este podcast.

Por supuesto que existen otras soluciones para hacer esto, pero la que ofrece Cloudflare es realmente sencilla. Otra opción, es a través de un VPS propio, y utilizando un proxy inverso como Traefik. Esta solución, también es relativamente sencilla, pero necesita de mas infraestructura para hacerlo.

Además de esto, en este episodio del podcast, trato otros temas, como las notas, las actualizaciones de repositorios, y mas, porque se trata de un episodio del podcast de preguntas y respuestas.

Cloudflare, self hosted, la nube y otras preguntas

Cloudflare, self hosted, la nube y otras preguntas

Como saber cuando se actualiza un repositorio

Oscar pregunta,

Me gustaria saber como puedo saber si un repositorio de github ha sido actualizado

Para saber si un repositorio de GitHub o GitLab ha sido actualizado, lo mas sencillo es utilizar los feed RSS. A continuación te dejo los feed.

  • Para las releases https://github.com/:owner/:repo/releases.atom
  • En el caso de los commits https://github.com/:owner/:repo/commits.atom
  • Si tienes un feed privado https://github.com/:user.private.atom?token=:secret
  • Para las etiquetas https://github.com/:user/:repo/tags.atom
  • Para la actividad de un usuario https://github.com/:user.atom

Además para los amantes de la terminal, he encontrado una fantástica aplicación llamada tuifeed, A terminal feed reader with a fancy ui.

Notas relacionadas

Eduardo pregunta,

Querido Lorenzo.Nunca me sentí tan identificado con voz como en estos sentires con respecto a tomar notas.Sobre todo en esto de probar cuanta herramienta aparezca. Y después de probar mucho y volver a la herramienta anterior, ya he aprendido que antes que probar todo, primero me he postulado, (y lo he puesto por escrito), que es lo que necesito de cualquier herramienta y para que yo la utilizo.
Esto me ha ayudado a ser más restrictivo a la hora de probar, al preguntarme ¿Esta nueva herramienta cubre las necesidades que no cubre mi herramienta actual? Y ¿Cuánto pierdo de lo que hoy me ofrece la que he adoptado? ¿Con estas preguntas en mano, son muy pocas la pruebas que al final hago?
Tal vez parecido a lo que cuentas en el podcast, hoy me he quedado con \»Joplin\» como herramienta para registrar todo lo que voy aprendiendo, todo lo que voy leyendo y, por otro lado, casi en forma experimental, también empecé a llevar algo parecido a un diario, donde escribo archivos Markdown con las vivencias, pensamientos del diario vivir.Si bien este segundo método, es enteramente sencillo y ofrece la capacidad de búsqueda (algo fundamental en todo lo que se refiere a un sistema de toma de nota), todavía no encontré (también un elemento fundamental del proceso de toma de nota) que es la de relacionar notas/archivos entre sí (con temas parecidos o relacionados)Vos como hace en tu flujo de trabajo, tus notas están llenas de link referencial a otras notas, Perdón por la ignorancia, pero ¿Cómo lo haces?¡Gracias por este proyecto y por el reto Python!!!!!Eduardo.

No se si tu caso de uso es igual al mio. En mi caso, no navego entre mis notas. Es decir, actualmente no necesito tener notas relacionadas, salvo lo que se corresponde a tutoriales o libros, que en ese caso se encuentran todas en el mismo directorio, y es fácil seguir la pista, y el orden, porque además los tengo numerados.

Si en algún caso, necesito buscar algo, realmente tiro de terminal y utilizando find o grep suelo encontrar lo que busco. Cuando esto no da resultado, y dado que todo lo que escribo lo termino publicando en atareao.es, simplemente le pregunto a Google, con la siguiente fórmula site:atareao.es <término-de-búsqueda>, reemplanzando <término-de-búsqueda> por lo que realmente quiero buscar, como ya te imaginas.

Respecto a los enlaces, si que intento enlazar a otras notas, pero realmente no lo hago siempre, y si lo hago está directamente en atareao.es. De echo, para evitar despistes, en los tutoriales, el índice lo genero de forma automática, para que no se me pase nada.

Self Hosted

Julián pregunta,

Buenas tardes Lorenzo,Primero de todo agradecerte el trabajo que haces tanto en el blog, youtube como podcast. Haces un excelente trabajo y personalmente has sido todo un descubrimiento. Soy estudiante de Ing. informática de computadores gracias a ti he descubierto docker y me esta siendo de gran ayuda.
Ahora te quería preguntar si el dominio que usas en los tutoriales de self-hosted es un dominio es real y subdominios o es en plan local y ¿como lo haces?
En mi caso tengo un hosting y dominio, además de una Raspberry pi 4 y me encuentro bajo cgnat, usando el tunel de cloudflare he conseguido acceder a mi la raspi4 con ssh y hago probado subdominio con un servidor web nginx y me funciona, lo que no he conseguido es acceder a una base de datos mysql alojada en la raspi4 ni un servidor mqtt.
He probado tus guías de selfhosted con caddy y traefik usando mi dominio, probando dominios inventados y no funciona creo que por el certificado ssl. Supongo que será cosa de hostinger o hay algo que hago mal.El tema es que con el tunel de cloudflare no consigo hacer funcionar algunos servicios algo hago mal con la autorización o las aplicaciones que hay que configurar.Si pudieras echarme un cable o hacer un tutorial más en profundidad te lo agradecería.

Por un lado, indicarte que el dominio que utilizo en los tutoriales es un dominio real, al igual que en el caso de los subdominios. De hecho en alguna ocasión puedes encontrartelos levantados. Ya me ha dicho mas de uno que los utilizaba… no se con que fin. Evidentemente, y como te puedes imaginar, inmediatamente tumbo los servicios de traefik o caddy y santas pascuas.

El dominio lo tengo contratado con DonDominio y el VPS en este caso de los tutoriales con Contabo. Es la forma mas cómoda y práctica para hacer todos los tutoriales, porque de otra forma he tenido algunos problemas.

Respecto a tenerlo alojado en una RPI 4 y bajo CGNAT puedes hacer los túneles con Cloudflare que es realmente sencillo. En este caso, tienes que hacerlo de la siguiente forma.

Yo lo hago a través de túneles en Cloudflare. Para ello, tienes que ir al apartado Zero Trust y seleccionar en el menú de la izquierda Access > Tunnels

Allí creas un nombre para tu túel, y te da las indicaciones para instalar y ejecutar el conector. Tienes diferentes opciones. Tanto en 32 bit como en 64 bit, y en arquitecturas intel y arm.

Sobre cloudflare

Enrique pregunta,

Hola. Antes que nada felicidades por tu podcast. Es verdaderamente incleible.
Escuché tu capitulo de como acceder a tu Raspberry usando túneles de cloudflare.
Estoy intentando emularlo. Actualmente me he contratado ya un dominio , he creado mi cuenta en cloudflare. Pero al momento de registrar mi dominio me pide información de registro dns y ahí no se que información se debe poner. Mi dominio lo contraté sin servidor por qué quiero usar mi propio servidor \»casero\» digamos. Pero no sé cómo configurarlo o que información poner. Tu me puedes ayudar?

En tu proveedor de dominio tienes que modificar los servidores de dominio para que apunten a los de Cloudflare,

  • elma.ns.cloudflare.com
  • nile.ns.cloudflare.com

Posteriormente tienes que esperar hasta que se produzca la propagación de DNS. Esto puede tardar hasta 48 horas. Es muy variable. En algún caso he visto que se hacía en menos de 1 hora, y en otras ocasiones hasta 1 día.

Una vez lo tengas cambiado en el proveedor de tu dominio y realizada la propagación de DNS, que seguramente puedes comprobar en el proveedor, ves a Cloudflare, y en la opciones selecciona add-site. Introduce el dominio y sigue los pasos que te indica.

Agradecimientos

Fructuoso comenta,

Hola Lorenzo.
En primer lugar enviarte un saludo y un agradecimiento por tantas horas al pie del cañón con Linux. Llevo unos años aprendiendo cositas en la terminal y gracias a tu blog y podcast sigo aprendiendo cada día más.
Quería comentarte que el vídeo de YouTube que insertas en las entradas de tu blog no se adapta al tamaño del móvil (responsive, ya sabes). Quizás dentro de un contenedor (div) con un tamaño 100% de ancho podría quedar bien. La verdad es que estoy enviándote esto desde el móvil y ni siquiera he probado cómo quedaría con las herramientas de inspección del navegador.
Te envío dos capturas para que veas cómo se ve en mi Android.
Un saludo y gracias por tu trabajo.

Le tengo que dar las gracias a Fructuoso, porque gracias a esta sugerencia, pude implementar un bloque de WordPress que me permite mostrar el vídeo de forma adaptativa o responsive.

El feedback es una auténtica maravilla, porque te permite mejorar y no solo mejorar tu, sino además mejorar lo que tu ofrece. Estoy encantado con estas iniciativas.

Sobre portadas a un audio

Santiago pregunta,

Hola como estás? Podrias escribirme un ejemplo de como llenar los campos del código que has escrito de añadir portada a un audio en tu sitio de internet,y si puedo hacerlo con archivos.flac u otros?.Gracias

Actualmente estoy utilizando dos scripts, que te pongo a continuación. Respecto a la plantilla, indicarte que es una imagen vectorial en formato svg, cuya única característica es que tiene un par de campos, el título y el subtítulo que sustituyo utilizando sed.

#!/bin/bash
temporada="$1"
episodio="$2"
directorio="${temporada}/${episodio}/"
if [ -f "audio.mp3" ]
then
    rm audio.mp3
fi
if [ -f "image.jpg" ]
then
    rm image.jpg
fi
if [ -f "output.mp4" ]
then
    rm output.mp4
fi
if [ -d "$directorio" ]
then
    #episodio=${directorio:5}
    archivomp3=$(find "$directorio" -type f -name "*.mp3" | head -n1)
    if [ ! -f "$archivomp3" ]
    then
        echo No existe el archivo MP3
        exit 1
    fi
    portadajpg=$(find "$directorio" -type f -name "*.jpg" | head -n1)
    if [ ! -f "$portadajpg" ]
    then
        echo No existe la portada JPG
        exit 1
    fi
    title=$(ffprobe "$archivomp3" 2>&1 | grep title)
    title=${title##*: }
    echo '================'
    echo "$archivomp3"
    echo "$portadajpg"
    echo "$title"
    cp "$archivomp3" ./audio.mp3
    cp "$portadajpg" ./portada.jpg
    cp recursos/plantilla.svg ./plantilla.svg
    sed -i "s/||NUMBER||/$episodio/g" plantilla.svg
    sed -i "s/||TITLE||/$title/g" plantilla.svg
    inkscape --export-type="png" plantilla.svg
    convert plantilla.png "${episodio}.jpg"
    ./audiowave.sh -b "${episodio}.jpg" -a audio.mp3 -wy 675
    mv output.mp4 "${episodio}.mp4"
    if [[ -f audio.mp3 ]]; then
        rm audio.mp3
    fi
    if [[ -f portada.jpg ]]; then
        rm portada.jpg
    fi
    if [[ -f plantilla.svg ]]; then
        rm plantilla.svg
    fi
    if [[ -f plantilla.png ]]; then
        rm plantilla.png
    fi
else
    echo No existe el directorio
fi

El script para crear la onda de audio,

#!/bin/bash
TITLE=""
SUBTITLE=""
WIDTH="1200"
HEIGHT="800"
MODE="cline" # point, line, p2p, cline
WAVE_WIDTH="1200"
WAVE_HEIGHT="100"
WAVE_COLOR="SeaShell"
WAVE_X=-1
WAVE_Y=-1
TEXT_COLOR="SeaShell"
TEXT_X=-1
TEXT_Y=-1
DIST_T=-1
AUDIO=""

POSITIONAL=()
while [[ $# -gt 0 ]]
do
key="$1"

case $key in
    -t|--titulo)
    TITLE="$2"
    shift # past argument
    shift # past value
    ;;
    -s|--subtitulo)
    SUBTITLE="$2"
    shift # past argument
    shift # past value
    ;;
    -b|--background)
    BACKGROUND="$2"
    shift # past argument
    shift # past value
    ;;
    -a|--audio)
    AUDIO="$2"
    shift # past argument
    shift # past value
    ;;
    -w|--width)
    WIDTH="$2"
    shift # past argument
    shift # past value
    ;;
    -h|--height)
    HEIGHT="$2"
    shift # past argument
    shift # past value
    ;;
    -ww|--wave_width)
    WAVE_WIDTH="$2"
    shift # past argument
    shift # past value
    ;;
    -wh|--wave_height)
    WAVE_HEIGHT="$2"
    shift # past argument
    shift # past value
    ;;
    -wc|--wave_color)
    WAVE_COLOR="$2"
    shift # past argument
    shift # past value
    ;;
    -wx|--wave_x)
    WAVE_X="$2"
    shift # past argument
    shift # past value
    ;;
    -wy|--wave_y)
    WAVE_Y="$2"
    shift # past argument
    shift # past value
    ;;
    -tc|--text_color)
    TEXT_COLOR="$2"
    shift # past argument
    shift # past value
    ;;
    -tx|--text_x)
    TEXT_X="$2"
    shift # past argument
    shift # past value
    ;;
    -ty|--text_y)
    TEXT_Y="$2"
    shift # past argument
    shift # past value
    ;;
    -dt|--distance_texts)
    DIST_T="$2"
    shift # past argument
    shift # past value
    ;;
    -m|--mode)
    MODE="$2"
    shift # past argument
    shift # past value
    ;;
    --default)
    DEFAULT=YES
    shift # past argument
    ;;
    *)    # unknown option
    POSITIONAL+=("$1") # save it in an array for later
    shift # past argument
    ;;
esac
done

set -- "${POSITIONAL[@]}" # restore positional parameters

if [[ "$WAVE_X" -eq -1 ]]
then
    WAVE_X=$(((WIDTH-WAVE_WIDTH)/2))
fi
if [[ "$WAVE_Y" -eq -1 ]]
then
    WAVE_Y=$(((HEIGHT-WAVE_HEIGHT)/2))
fi
if [ "$TEXT_X" -eq -1 ]
then
    TEXT_X=20
fi
if [[ "$TEXT_Y" -eq -1 ]]
then
    TEXT_Y=$((HEIGHT-50))
fi
if [[ "$DIST_T" -eq -1 ]]
then
    DIST_T=20
fi
TEXT_Y2=$((TEXT_Y + DIST_T))
if [[ "${#AUDIO}" -eq 0  ||  ! -f "$AUDIO" ]]
then
    echo "$AUDIO"
    echo "Usage ./audiowave.sh [-t title] [-s subtitle] [-b background_image]"
    echo "                     [-m mode] [-w width] [-h height] -a audio"
    echo "                     [-ww wave_width] [-wh wave_height] [-wc wave_color]"
    echo "                     [-wx wave_x_position] [-wy wave_y_position]"
    echo "                     [-tx text_x_position] [-ty text_y_position]"
    echo "                     [-tc text_color] [-dt distance_title_subtitle]"
    echo ""
    echo "-t set the title of the video. It's optional"
    echo "-s set the subtitle of the video. It's optional"
    echo "-b set the background_image. It's optional"
    echo "-a set the audio. It's mandatory"
    echo "-m set the mode. Default is line. Possible modes: point, line, p2p, cline"
    echo "-w set the width of the video. It's optional, default width is 640 px"
    echo "-h set the height of the video. It's optional, default height is 480 px"
    echo ""
    echo "-ww set the width of the wave. It's optional, default width is 640 px"
    echo "-wh set the height of the wave It's optional, default height is 480 px"
    echo "-wc set the color of wave. It's optional, default color is yellow"
    echo "-wx set the x position of wave. It's optional, default x position is in the middle"
    echo "-wy set the y position of wave. It's optional, default y position is in the middle"
    echo ""
    echo "-tc set the color of title and subtitle. It's optional, default color is yellow"
    echo "-tx set the x position of text. It's optional, default x position is 20 px"
    echo "-ty set the y position of text. It's optional, default y position is 100 px from bottom"
    echo "-dt set the distance between tittle and subtitle, default distance is 50px"
    exit 126
fi

if [[ -f output.mp4 ]]
then
    rm output.mp4
fi


if [[ "${#BACKGROUND}" -ne 0  && -f "$BACKGROUND" ]]
then
    ffmpeg -y -i "${AUDIO}" -loop 1 -i "$BACKGROUND" -filter_complex "\
        [0:a]showwaves=size=${WAVE_WIDTH}x${WAVE_HEIGHT}:mode=${MODE}:colors=${WAVE_COLOR}:split_channels=1:rate=30,format=rgba[top];\
        [1:v]setpts=PTS-STARTPTS, scale=${WIDTH}x${HEIGHT}, format=rgba[bottom];\
        [bottom][top]overlay=format=auto:y=${WAVE_Y}:x=${WAVE_X}[temporal];\
        [temporal]drawtext=text='${TITLE}':fontcolor=${TEXT_COLOR}:fontsize=16:font=Ubuntu:x=${TEXT_X}:y=${TEXT_Y}[l1];\
        [l1]drawtext=text='${SUBTITLE}':fontcolor=${TEXT_COLOR}:fontsize=16:font=Ubuntu:x=${TEXT_X}:y=${TEXT_Y2}[output]\
        " -map "[output]" -pix_fmt yuv420p -map 0:a -c:v libx264 -c:a libmp3lame -shortest output.mp4
else
    ffmpeg -y -i "${AUDIO}" -filter_complex "\
        [0:a]showwaves=size=${WAVE_WIDTH}x${WAVE_HEIGHT}:mode=${MODE}:colors=${WAVE_COLOR}:rate=30,format=rgba[top];\
        [top]drawtext=text='${TITLE}':fontcolor=${TEXT_COLOR}:fontsize=16:font=Ubuntu:x=${TEXT_X}:y=${TEXT_Y}[l1];\
        [l1]drawtext=text='${SUBTITLE}':fontcolor=${TEXT_COLOR}:fontsize=16:font=Ubuntu:x=${TEXT_X}:y=${TEXT_Y2}[output]\
        " -map "[output]" -pix_fmt yuv420p -map 0:a -c:v libx264 -c:a libmp3lame -shortest output.mp4
fi

Espero que te haya gustado este nuevo episodio del podcast. Si puedes, te agradecería una valoración en iVoox y/o en Apple Podcast.

Deja una respuesta

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