Automatizacion: Diario de Lecherito

Lecherito

Pues bueno, aqui es un poco para poner lo que tengo montado y las cosas que voy cambiando. Voy a copiar un poco lo que puse en el hilo de Ideas! Ya que apenas ha cambiado, y los cambios los voy a ir poniendo en respuest a este hilo. Aqui se pueden hacer comentarios y criticas a como lo estoy haciendo y asi podemos aprender juntitos.

Objetivo

Tengo dos objetivos claros con lo de la automatizacion, lo primero es hacerme la vida mas facil (plex) y lo segudo desarrollar mas rapido para poder hacerme la vida mas facil.

  1. El primer objetivo es facil, coger herramientas que ya estan hechas en la mayoria de casos y configurarlas un poquito para que hagan lo que quieres.
  2. El segundo no es tan facil ya que no suele haber ya hecho algo que se adapte a todas mis necesidades (y me guste su estilo), asi que seria cosa de hacerlo yo. Para esto, tengo que automatizar startup de proyectos, deployments... etc.

Mi setup

Tecnologias

  1. Docker: Instalar Docker en Synology es easy
  2. Kotlin: Estoy usando Kotlin multiplataforma para todo lo que estoy haciendo, hay cosas que solo las hago para la JVM pero en general estoy tirando para ejecutables nativos.
  3. Gradle: Para hacer build de los proyectos e incluso ejecutar algunos de los procesos

Contenedores

Todo esta automatizado en este aspecto, estoy usando docker compose y tengo un archivo con toda la configuracion de los contenedores. Que se actualizan una vez a la semana de madrugada, y se levantan solos cuando hago un commit a ese fichero en concreto.

  1. Bazarr: Subtitulos para las series
  2. Gilab-runner: El runner de gitlab para integracion continua (es necesario si quieres usar CI)
  3. Gitlab: Tengo todos mis proyectos personales que no quiero que esten en Github (gorrito de papel de plata incoming)
  4. Grafana: Visor de datos, normalmente metricas, pero lo he adaptado para pillar datos de postgres sobre mis transacciones bancarias)
  5. Jackett: Agregador de APIs para torrenting
  6. Nginx: Routing desde subdominios hasta los puertos (del tipo: plex.mydomain.com)
  7. Plex: Tengo plex pass (lifetime) y lo uso para las series que no estan en Netflix (y Anime)
  8. Postgres: Monitorizacion, ahora mismo solo es para los bancos pero tengo alguna que otra idea por medio
  9. Radarr: Una vez configurado, se baja las peliculas automaticamente
  10. Runners: Estas son las imagenes que levanta el gitlab-runner y que son (o no) reutilizables, se borran cada X y sin problema.
  11. Sonarr: Igual que Radarr, pero para las series

Lo que yo tengo

  1. Las series y las peliculas se bajan automaticamente y me envian un mensaje a Telegram cuando estan disponibles en Plex.
  2. Plugin para firefox que envia lo que veo desde Netflix hacia Trakt.tv
  3. Las transacciones de los bancos las exporto y las subo al proyecto donde se meten en el postgres y puedo ver datos en grafana del tipo: Ahorros totales, gastos totales, ahorro mensual... etc
  4. WIP: Estoy trabajando en un templater, basicamente quiero un template para proyectos que hago (normalmente dentro del NAS) y poder crear proyectos en cuestion de segundos. Los templates estan alojados en Github y cada uno puede tener los suyos propios, por ejemplo quiero tener un template que es un servicio con Ktor en nativo y el packaging vaya en docker asi solo me preocupo de escribir el codigo que necesito en vez de todo el wrapper cada vez. Una especie de mvn-archetype pero sin ser esa basura. (Aunque esto me esta llevando mas de lo que me gustaria)
  5. Dotfiles: Tengo todas mis dotfiles en Gitlab y tengo la configuracion comun en un sitio y ademas en cada uno de los sistemas que uso, tengo comandos y cosas especificas:
    1. NAS: Tengo comandos para los gitlab runners etc
    2. Mac: Cosas del mac
    3. WSL Ubuntu: Mierdas de ubuntu
  6. Internamente tengo ejecutables para manejar mis proyectos, lo tengo todo configurado en un JSON. Cada proyecto tiene un alias y puedo hacer build, update y clear sin tan siquiera estar en ese directorio: build dotfiles, o para navegar facilmente al proyecto cdp dotfiles. Todo tiene autocompletado asi que no me tengo ni que acordar de los nombres
  7. Para el mac tengo Alfred, bastante curioso el programita ya que ahora puedo ejecutar builds etc con el Cmd+Space, ademas de tener todos mis favoritos (uso el mac para programar), y URLs como search engines en vez de todo en Firefox.
5
Lecherito

El primer cambio que he hecho estos dias, es cambiar de nginx a Traefik. La verdad es que ha sido un cambio bastante agradable que creo que me va a mejorar la calidad de vida ya que me he quitado de por medio unas cuantas cosas innecesarias (como un CI para cuando cambiaba algun archivo de configuracion de nginx para reiniciar el contenedor). En este caso con Traefik no hace falta ya que lo pilla al vuelo, no solo eso si no que tambien funciona con docker asi que la mayoria de configuraciones fueron a base de labels en docker compose.

La imagen que uso es

  traefik:
    # The official v2 Traefik docker image
    image: traefik:v2.2
    container_name: traefik
    ports:
      # The HTTP port
      - "44589:80"
      # The Web UI (enabled by --api.insecure=true)
      - "44590:8080"
    volumes:
      # So that Traefik can listen to the Docker events
      - /var/run/docker.sock:/var/run/docker.sock
      - /volume1/workspace/dotfiles/traefik:/etc/traefik

Bastante sencillo, lo pille de un tutorial que no me acuerdo cual fue, por lo demas todo es por defecto

La configuracion tambien es bastante sencilla

logLevel = "INFO"
traefikLogsFile = "/etc/traefik/logs.txt"

[entryPoints]
  [entryPoints.http]
  address = ":80"

[api]
  insecure = true

[providers]
  [providers.file]
    directory = "/etc/traefik/dynamic"
    watch = true

  [providers.docker]
    exposedByDefault = false

Por ahora no he a;adido SSL, que va a mi lista de TODOs. Pero mas o menos todo funcionaba, excepto 2 contenedores que tenian una red propia, y no se por que, cambiando la red con traefik.docker.network=networkhere siempre me tiraba timeout.

Asi que lo solucione con configuraciones dinamicas y un simple redirect, un ejemplo de grafana:

[http.services]
  [http.services.grafana.loadBalancer]
    [[http.services.grafana.loadBalancer.servers]]
      url = "http://192.168.100.41:4383"

## Dynamic configuration
[http.routers]
  [http.routers.grafana-router]
    rule = "Host(`grafana.HOSTNAME`)"
    service = "grafana"
1 1 respuesta
Lecherito

Ahora me he puesto con el NAS otro poco, he hecho un cron para hacer git pull cada minuto para cuando hago cambios ya que la configuracion de arriba la tengo desde el workspace, esto es que puedo hacer commit, el cron hara el pull y Traefik hara load de las configuraciones. No solo eso pero tambien uso mis utilidades dentro del nas, asi que nunca viene mal

Se que no es algo ideal pero menos da una piedra, esto funciona y de mientras me dejara hacer otras cosas mas molonas, pero esto es algo que quiero revisar tarde o tremprano.

Como siempre, tengo los crons configurados por plataforma (Synology, Mac, Ubuntu WSL), asi que puedo tener los que quiera como quiera.

project_folder=$WORKSPACE_ROOT/cron

case $PLATFORM in
    Mac)
        ./$project_folder/mac/jobs.sh
        ;;
    Synology)
        ./$project_folder/synology/jobs.sh
        ;;
    Windows)
        ./$project_folder/bash_windows/jobs.sh
        ;;
esac
1 respuesta
wdaoajw

#3 te recomiendo que mires de meter algo de CI/CD de verdad, tipo Jenkins, incluso para sustituir las tareas cron.

Para lo de traeffic, échale un ojo a confd que te puede ser util

Me dedico a este tipo de cosas, así que cualquier duda no te cortes.

PD: Para que cuando se haga un commit de lancen tareas, puedes asignar un webhook en el repo

1 respuesta
Lecherito

#4 Tengo gitlab, la cosa es que gitlab esta dentro de un container asi que necesitaria una imagen muy concreta con git instalado para poder hacer git pull, no?

Gitlab -> Gitlab runner -> Nueva imagen que es la que ejecuta el comando.

Y esta imagen la tengo con una imagen que tengo con docker-compose para poder leveantar/tirar containers desde el CI/CD

2 respuestas
VonRundstedt

En contenedores había leido "progres-monitoring" ...

Lecherito

Please, ahorremonos esos comentarios. Se que es gracioso y eso pero no quiero tener nada que ver con politica aqui.

JuAn4k4

Si configuras push en vez de pull tendrás menos consumo de cpu y tal, aunque imagino que no tendrás tantas ramas/prs abiertas como para que suponga un problema.

1 respuesta
Lecherito

#8 la cosa es que con traefik voy a poder ahora enrutar mis propios servicios y eso, así que me podré hacer uno que lo que haga será git pull cuando pase algo. Y eso configurarlo en gitlat y tirar el cron al carajo

1 respuesta
wdaoajw

#5 Eso es, lanzas un contenedor con una imagen custom si lo necesitas (igual un BusyBox/Ubuntu con un script pasado como volumen te sirve) y que haga lo que necesitas.

El CI/CD de gitlab no lo he usado, pero no pinta muy diferente del de Jenkins. Lo bueno de este último es que puedes directamente crear Jobs periódicos como si fueran Cronjobs, y de esta forma si por cualquier cosa la ejecución falla te enteras. Con los Cronjobs es un coñazo

Lecherito

Edito este para poner el log de cambios:

  1. Cambiar el root del workspace a algo montado en el NAS y hacer que se ejecute un git pull cada vez que hago commit: Empieza aqui
Lecherito

Del post anterior:

Bastante tonto por mi parte, he visto que puedes tener una imagen por cada stack, asi que cambiare el docker por el de git, montare (si veo que se puede), el proyecto entero y solo tengo que hacer un git pull.

Pero...

Pues ale, al final he conseguido montar volumenes en la imagen que genera el gitlab-runner y ya tengo esto haciendo el git pull sin necesidad de cron jobs.

Running before_script and script
$ git -C /workspace/dotfiles reset --hard HEAD
HEAD is now at 99fc63f Remove sleep and add strict hostkey checking to false
$ git -C /workspace/dotfiles pull
Already up to date.

Ademas que con esto, tambien he conseguido que Traefik haga reload de las cosas cuando hago push! Ya he llegado a como lo tenia antes pero sin nginx y sin reiniciar contenedores de maneras raras.

robb

#2 Me parece super interesante tu post y espero que lo sigas completando.

Una pregunta, podrías dar más info de esto:

Grafana: Visor de datos, normalmente metricas, pero lo he adaptado para pillar datos de postgres sobre mis transacciones bancarias)

En concreto lo de tus transacciones bancarias, me interesa porque me quiero montar una cosa por el estilo.. me gustaría saber que métricas te mides y como has hecho la conexión con tus transacciones de tu banco.

1 respuesta
Lecherito

#13 Eso lo comente un poco en el otro hilo, por ahora la insercion es manual, manual en el sentido que me tengo que bajar los csv de los bancos y rular un script. Pero en el futuro (supongo que parte de este diario), automatizare eso.

Sobre las metricas, mira #1 del hilo de las ideas.

1
W0rd

#5 por que necesitas hacer un git pull periódicamente? tienes webhooks pero mismamente puedes actualizar tus contenedores en una las builds de las pipelines

JuAn4k4

#9 te da lo mismo trafeik, eso es para el exterior, dentro de tu red puedes hacerlo por el service name como host, sin salir por fuera. Porque tenias gitlab dentro, no?

Tendrás que configurar bien el host de cada uno de los dos servicios y luego configurarlos juntos: https://docs.gitlab.com/ee/integration/jenkins.html

Si en docker-compose gitlab es:

gitlab: 
  image: ...

la url es: http://gitlab/

1 respuesta
Lecherito

#16 La verdad es que no entiendo lo que dices xDD. Yo no tengo Jenkins por ningun sitio.

1 respuesta
Hipnos

No he entendido cuál es tu objetivo en el primer post. Dices lo que piensas usar y que tienes algunas cosas hechas, pero no describes lo que quieres hacer.

1 respuesta
Lecherito

#18 porque no tengo un objetivo claro, estoy experimentando y esto es para contar las cosas que voy haciendo y como las voy haciendo. Las ideas las ire pillando del hilo de ideas seguramente y otras que se me ocurran.

Una de las cosas a las que quiero llegar es poder levantar un servicio en cuestion de una horita con todo enrutado y pudiendo enviar requests.

1 respuesta
Hipnos

#19 Un servicio de qué?

Es que me cuesta mucho seguirte

2 respuestas
HeXaN

#20 Algo así: https://en.wikipedia.org/wiki/Service_(systems_architecture)

1
Lecherito

#20 Ah, perdon. Pues mira, por ejemplo una de las cosas que tengo pensadas para lo de los bancos seria poder meter transacciones, y en vez de hacerlo a "mano" como ahora, podria tener un servicio que lo hace por mi. Llamalo servicio, componente, cosa que hace X donde X es una peque;a funcionalidad. El link del pato lo explica bien.

1 respuesta
bLaKnI

#22 ¿Pero es que quieres montarte una suite de open-banking?

1 respuesta
Lecherito

#23 como digo, todavía no sé lo que quiero, pero no quiero tener que hacer ese tipo de cosas a mano. Simplemente estoy probando y experimentando, aprendiendo por el camino.

De ahí lo de abrir el hilo para ideas, hay cosas muy curiosas para hacer ya en ese hilo y cuando esté en mi casita y pueda jugar con sensores, etc supongo que molará mucho más

1 respuesta
HeXaN

#24 Espero que no te pase como a mí que me compro una casa y al ver el coñazo (físico) de montarlo todo he sudado xD

1 respuesta
JuAn4k4

#17 Pensaba que tenias el pull de todos los repos de gitlab para hacer algo cada X tiempo en un cron, en lugar de tener un CI donde git te hiciera push al pushear tu cualquier cambio a cualquier repo. Vamos que puedes cambiar el pull por push usando jenkins o similar.

Lecherito

#25 Puede que sea lo que me pase, pero por ahora tengo bastante ilusion de tener mi casa. De peque;o, mi padre tenia un monton de cosas de electronica y solia cacharrear un monton con las cosas que me dejaba.

Ontopic:
El otro dia hice un template para un hello world en la JVM y lo "unico" que tengo que hacer ahora:

  1. Crear otro template a partir de ese que tenga ktor como dependencia y hacer el hello world pero en internet.
  2. Buscar de alguna manera easy (quiza plugin de Gradle), meter esa aplicacion en docker
  3. Cuando hago pull que se haga deploy en el NAS

Como cosas extra estoy pensando en meterle comandos before/after a los templates, ademas de que seria diferente en windows/linux asi que tengo que pensar una buena forma de hacerlo. Esto lo necesito porque me gustaria usar el buildSrc que tengo para las dependencias en gradle aunque si veo que es sencillo publicar un plugin para gradle cuando juegue con el de docker seguramente me ponga a hacer otro con las dependencias y asi me ahorro el tener un buildSrc aunque siempre viene bien para tener cosas conjuntas (aunque lo dicho, todo se puede transformar a plugin).

Lecherito

Pues bastante productivo el dia, entre medias de unos rushes a Scarlet Monastery he sacado algo de tiempo.

He creado el template de ktor, bastante limpio!

fun main(args: Array<String>) {
    val server = embeddedServer(Netty, port = 8080) {
        routing {
            rootRouting(this)
            demoRouting(this)
        }
    }
    server.start(wait = true)
}

val rootRouting = { routing: Routing ->
    routing.get {
        call.respondText("Hello World!", ContentType.Text.Plain)
    }
}

val demoRouting = { routing: Routing ->
    routing.get {
        call.respondText("HELLO WORLD!")
    }
}

El templater genera un proyecto con el core de codigo como este y puedo hacer gradle run para tener el server up. Tardo literalmente 10 segundos en tener el proyecto arriba, abrirlo con intellij y rularlo:

templater ktor-service -n my-new-service
cd my-new-service
idea build.gradle.kts
gradle run

Con eso ya se hace todo!!! No solo eso si no que lo he publicado en Brew asi que tengo mi ejecutable (solo para macos por ahora) en todos sitios, ademas de tener la dependencia con libgit2. Una grata sorpresa que no sabia como iba a lidiar con esa dependencia, asi que todo perfecto.

Lecherito

Pues ya tengo el templater en brew con una bottle, no solo un ejecutable prehecho, por ahora con un repositorio privado, luego mas tarde probare a montar un docker para generar el ejecutable de linux desde ahi y ale. Ademas de que voy a meter todas las utilidades ahi.

Ahora mismo las utilidades las tengo a;adiendo al PATH la carpeta donde se generan con gradle, entonces si estoy desarrollando algo y hago un gradle clean, me quedo sin ellas xDD, asi que la tarea para esta tarde es mirar docker y migrar tambien las utilidades (esto segundo no deberia tardar casi nada, la verdad)

1 respuesta
bLaKnI

#29 Pero y al final, ¿que vas a tener exactamente? ¿Que estas creando? ¿La capacidad de que exactamente? Con "un pim pam" poder hacer un "X"?

1 respuesta