Automatizacion: Diario de Lecherito

Lecherito

#60 Si, pero disfruto como un enano. Todo empezo porque queria hacer un scrobber de estos para plex y mira donde he terminado xdddddd.

Cuando empece con la liberria de configuracion fue porque lo necesitaba para un juego que estaba haciendo y al final termine sin hacer el juego y 1 a;o y pico trabajando en la libreria.

La cosa es que necesito hacer las cosas eficientes o no las hago. No puedo empezar a hacer basuras que me van a dar sida verlas en 6 meses. Literalmente me es imposible, pero bueno, ahora me es sencillito crear nuevos proyectos etc etc. Me falta que sea sencillo hacerles deploy.

Tambien creo que habra gente que aprenda algo con este diario, ni puta idea xdd

2
Lecherito

Poca cosa ultimamente, he estado trasteando un monton con SSL y HTTPS. Ahora tengo todos mis subdominios a full seguridad!

Cosas que he descubierto:

  1. Odio TOML, que asco de sintaxis macho.
  2. Dns challenge >>>>>> http challenge. Que comodo es el de dns.
  3. Al actualizar Synology DSM va a sobreescribir algunos ficheros de configuracion (por ejemplo redirecciones en el puerto 80/443) y hay que volver a cambiarlo.

La verdad es que como ahora estoy haciendo varias cosas a la vez, no me canso por asi decirlo. Cuando me canso de una cosa me voy a otra y ya volvere a lo otro. Las ultimas veces que hacia algo siempre estaba con una sola cosa de la que me acababa quemando y en este caso es un alivio bastante grande poder simplemente hacer otra cosa en vez de dejarlo todo por completo y seguir jugando a cualquier cosa random.

1
Lecherito

Pues estos dias me he dedicado a investigar lo de los bancos (lo teneis en el otro hilo) y visto que se puede hacer de una manera mas o menos sencilla me he puesto a hacerle deploy al servicio que tendre para insertar las transacciones.

He tenido algunos problemas ya que tengo un repositorio de artefactos maven privado pero por lo demas bastante normalito!

Al final todo se reduce al fichero de ci de gitlab (.gitlab-ci.yml) y asi es como me ha quedado:

stages:
  - release
  - build-image
  - deploy

release:
  when: on_success
  stage: release
  image: gradle:6.5
  script:
    - gradle release
  artifacts:
    paths:
      - build/libs/

build-image:
  stage: build-image
  when: on_success
  script:
    - docker stop BankerService || true
    - docker build -t bankerservice .

deploy:
  when: on_success
  stage: deploy
  script:
    - docker run --name BankerService -d -p 17500:8080 bankerservice

El dockerfile no es mas que un COPY el jar y RUN. Es la primera vez que lo hago, seguramente queden muchas esquinas que pulir pero bueno por ahora estoy mas o menos contento, estas cosas las estoy metiendo al template privado que tengo para cuando creo un servicio.

Sobre cosas menores:

  1. Estaba registrando los gitlab-runners a un proyecto en concreto, he tenido que resetear la contrase;a de admin para poder usar el token de los shared runners y ahora ya funciona en todos los proyectos (esto mola)
  2. Se puede gener el gitlab-runner en local para no tener que debugear en remoto haciendo un commit cada vez (esto me va a ahorrar algo de tiempo xD)
  3. Tenia un monton de endpoints en http y menudo co;azo cambiarlos todos, como consejo empezad con HTTPS cuanto antes :D
  4. En IntelliJ existe una manera de importar proyectos (cada uno con su propio repositorio) y el IDE va a sustituir las dependencias en Gradle por las locales haciendo asi el desarrollo bastante mas sencillo. De esta manera puedo a;adir varios proyectos como diferentes modulos en el mismo entorno y el IDE se encarga de lo demas. Si quereis leer un poco mas, aqui esta el post donde lo encontre (https://intellij-support.jetbrains.com/hc/en-us/community/posts/360005958400-Resolve-dependencies-in-project-with-Gradle-Modules-) esta bastante ocultado ya que parece que por ahora no es 100% fiable pero por lo que yo he visto va de lujo. Todo esto viene porque tengo cada proyecto en su propio repositorio en vez de un solo repositorio y que sea multiproyecto)

Tooling

He estado mejorando el OceanLibPlugin (el plugin de gradle que uso para manejar mis dependencias de una manera mas comoda) y le he a;adido override de versiones. Me parece un co;azo tener versiones del tipo 0.5.33, y prefiero tener un simple 1.0 (aunque esto tambien es un poco costumbre), y las versiones las puedo actualizar en el plugin y se actualizaran automaticamente en todos los proyectos donde use ese override. Ahora las dependencias me quedan asi:

Y me mola mucho porque esta super claro y ordenadito ademas de no necesitar cual es el fqmi de cada artefacto, de esa basura se encarga el plugin.

Bancos

Sobre los bancos, ya tengo un PoC de como pillar las transacciones aunque no se porque pero el token que me viene del banco parece solo durar 24 horas aunque lo refresques, es algo bastante curioso pero bueno, sigo testeando y aprendiendo sobre tink.

Los siguientes pasos en este frente son:

  1. Revisar los campos del servicio y la base de datos para tener todos los campos que necesito
  2. Usar el cliente BankerClient para insertar las transacciones
  3. Hacer deploy del servicio que recibe e inserta las transacciones cada X horas
  4. Mover grafana hacia la nueva base de datos
  5. Opcional (por ahora): A;adir algun tipo de autenticacion, aunque sea un simple user y pass random (aunque no es demasiado urgente, todo esta dentro de la VPN)
  6. Opcional: Investigar a ver como puedo traer las transacciones de hace X tiempo solamente, ahora mismo las trae absolutamente todas (y no hay mas huevos) y tendria que checkear yo mismo las cosas.

Extra:

  1. Tengo pensado hacer un dibujito sobre como estan montadas las cosas, a ver si ma;ana me acuerdo de ello y lo pongo por aqui.

Seguro que me dejo algo en el tintero pero vamos, esto es en lo que he estado dedicando el tiempo estos ultimos dias.

1
Lecherito

Pues este seria el diagrama de los repositorios y contenedores de docker que estoy usando para el sistema bancario

Es mas o menos lo que tengo, la leyenda seria:

  • Lo rojo es un contenedor docker (ya hecho o creado desde el jar)
  • Lo azul es una libreria
  • Lo que tiene un borde mas gordito es un repositorio en gitlab

Las dependencias van con el plugin de gradle (que es un wrapper de un mavencentral) y lo que me queda de hacer es el Fetcher que pilla transacciones y las envia al BankerService. Y los clients/model/services estan importados en el IDE como modulos asi que es easy el desarrollo.

1 1 respuesta
danao

#64 tienes pensado hacer análisis de datos en tiempo real?

Lo digo por si no conoces influxdb, es una base de datos para ese tipo de cosas.

Buen curro 👏👏👏

2 respuestas
Unrack

#65 A colación yo estoy testeando timescale. Aún no es muy escalable pero tiene mayor rendimiento que influx en un solo nodo y está basada en postgre (lo que beneficia en casi todo a la hora de consulta)

1 respuesta
danao

#66 entiendo que el tema de alta disponibilidad lo resolverán con postgre no?
La verdad que influxdb está bien pero depende para qué proyecto, he leido sobre ella no muy a fondo pero si que hablan de las limitaciones que tiene, para proyectos peques bien, para proyectos de plataforma y tal, no tanto.

Gracias por la info, siempre está bien conocer techs nuevas

Lecherito

#65 Pues teniendo en cuenta que hago una media de 1 transaccion diaria en mis bancos, no creo que haga falta saber nada en tiempo real. Lo que mas me interesa es el analisis que haga con esos datos (pero claro, para ello tengo que tener esos datos xD.

InfluxDB o Prometheus es lo que tengo pensado para almacenar las metricas aunque a esto todavia le tengo que dar una vuelta sobre como lo quiero. Aunque tambien tengo que investigar sobre Open Telemetry ya que estoy 99% seguro que eso va a ser el futuro (mayormente porque he trabajado de eso xDDD), supongo que sera algo parecido a sql y las implementaciones que hay detras.

A ver si hoy me pongo un rato y hago el fetcher, que no deberia ser nada dificil. El problema es que si no tienes la cuenta "premium", de los 35 centimos mensuales cuando haces login a una cuenta bancaria se borran a las 24 horas asi que tendria que cambiar el codigo cada 24 horas y eso es un co;azo. Les tengo ya un ticket para que me cambien al modelo premium y ya tenerlo todo preparado. De todas maneras me queda limpiar mucho codigo y cosas hardcoded asi que tengo trabajo para un rato xD

1
Lecherito

Un poco full vago hoy :D, me he dedicado a mejorar el plugin de Gradle para que sea incluso mas easy el crear nuevos proyectitos. El template usando el plugin se queda asi:

import ocean.ocean
import ocean.dependencies.*

plugins {
    java
    kotlin("jvm") version "1.3.70"
    id("com.github.johnrengelman.shadow") version "4.0.4"
}

ocean {
    this.name = "{{name|classname}}"
    this.version = 1.0
}

dependencies {
    implementation(kotlin("stdlib"))

    src {

    }

    tst {
        MockK[1.0]
    }
}

Y luego ya se le pueden poner mas dependencias ez clap!

PD: Los de Tink todavia no me han cambiado a premium asi que lo dejare un pelin de lado hasta que me lo cambien (no creo que tarden mas de 1 o dos dias mas)

Lecherito

Pues esta ma;ana me he dedicado a actualizar el NAS y configurar los backups que todavia no los tenia. He usado Hyper Backup y esta bien guardadito en S3 Infrequent Access.

Ayer tambien descubri "jib" una herramienta de gradle para crear imagenes de un contenedor desde la aplicacion en vez de hacerlo yo manualmente asi que es algo que le echare un vistazo. Si alguien esta interesado: https://github.com/GoogleContainerTools/jib

Lecherito

Hoy me he dedicado a hacer algo mas tranquilito, a;adir grupos de repositorios para hacer operaciones como build, clean y esas cosas. Todavia no tiene en cuenta las dependencias asi que tienen que estar en el orden correcto pero eso seria uno de los planes para el futuro

  "groups": [
    {
      "name": "ProjectBanker",
      "repositories": [
        "BankerModel",
        "Banker"
      ]
    }
  ],

Ejemplo: publish ProjectBanker

La verdad es que me mola tener tanta libertad de cosas para hacer, creia que iba a ser mas abrumador pero al final esta significado que no me aburro al estar haciendo siempre lo mismo.

Los malditos de Tink todavia no me han puesto premium y me da pereza que se reseteen los datos cada dia :(

Lecherito

Bueno, he a;adido el comando gitp que ejecuta un comando git en un proyecto, que viene a ser un repositorio o un conjunto de repositorios, bastante guay porque puedo ver el estado de un grupo instantaneamente.

Ademas he limpiado los repositorios de OpenBanking, e implementado mucho mejor el cliente de Banker, ya puedo hacer get y post de transacciones, estos proximos dos dias deberia tenerlo funcionando a falta de que me hagan premium jodeeeeeeeeeeeeeeer.

Por lo demas 10/10 sigue yendo bien la cosa

9 días después
Lecherito

Bueno, despues de la mudanza he podido seguir avanzando un poco. Ya tengo el premium de Tink y he de actualizar un poco la infrastructura para ir guardando los tokens en caso de que pase algo (algun crash) y no tener que ponerlos yo otra vez manualmente. Hice una prueba a ver como funcionaria el enviar los datos con el fetcher y esta funcionando con Revolut, pero hay muchas preguntas todavia en el aire, como por ejemplo:

  1. Como lidiar con transacciones repetidas?
  2. Como a;adir otro banco sin que sea hardcoded?

Tambien me dedique a probar jib y me dio casi mas problemas que soluciones pero al final lo deje mas o menos limpio (rescatando el diagrama de #64), ahora hay un repositorio nuevo "BankerDocker" que es un proyecto vacio que contiene una dependencia al servicio que quieres meter en docker y la peque;a configuracion de gradle para que genere un tar que luego se importa en docker.

plugins {
    java
    kotlin("jvm") version "1.3.70"
    id("com.google.cloud.tools.jib") version "2.4.0"
}

ocean {
    this.name = "BankerServiceDocker"
    this.version = 1.0
}

dependencies {
    src {
        Banker[1.0]
    }
}

jib {
    container {
        mainClass = "banker.service.Banker"
    }

    to {
        image = "bankerservice"
    }
}

De esta manera, tengo separado lo que es el deploy del servicio, asimismo configure gitlab para que cada vez que haga un push al servicio, se haga build del servicio y llame a la pipeline del repositorio de docker para que haga el deploy:

stages:
  - release
  - deploy

release:
  when: on_success
  stage: release
  image: gradle:6.5
  script:
    - gradle release

deploy:
  image: curlimages/curl
  when: on_success
  stage: deploy
  script:
    - "curl -X POST -F token=$TOKEN -F ref=master https://mygitlab.local/api/v4/projects/17/trigger/pipeline"

Asi que ahora se ha quedado de buena manera otra vez. Estuve mirando como hacer un webhook global (que es algo que hare tarde o temprano), para no tener que hacer todas estas cosas y poder hacerlo desde el webhook e incluso sin tener el repositorio de Docker, si no marcarlo de alguna manera (como por ejemplo en el plugin).

Fetcher

Respecto al fetcher, es bastante directo:

fun main() = runBlocking {
    val bankerClient = BankerClient("banker.local")

    val apiClientId = ApiClientId(
            id,
            secret
    )

    val httpClient = HttpClient(Apache) {
        install(JsonFeature) {
            serializer = GsonSerializer()
        }
    }
    val openBankingClient = OpenBankingTinkerClient(httpClient).also {
        it.auth(Gson().fromJson(File("test.txt").reader(), AccessTokenResponse::class.java))
    }

    val transactions = openBankingClient.transactions()
    println(transactions)

    transactions
            .map { it.toBankerTransaction(Bank.Revolut) }
            .forEach {
                bankerClient.transactions += it
            }
}

No es en paralelo ni nada por el estilo (tarda un minutico en transformar en insertar todas las transacciones (unas 2000) de Revolut, asi que no me importa. Lo siguiente aqui seria ponerlo en un scheduler para que cada 12 horas llame a los bancos configurados e inserte las nuevas transacciones.

1

Usuarios habituales

  • Lecherito
  • claroquesi
  • bLaKnI
  • marveen
  • HeXaN
  • JuAn4k4
  • Hipnos