[{"content":"Hacía tiempo que tenía ganas de montar una infraestructura doméstica con la que poder experimentar, aprender y disponer de servicios propios sin depender constantemente de soluciones externas.\nLa idea inicial era sencilla: aprovechar una Raspberry Pi para centralizar servicios de red, mejorar la seguridad de mi conexión doméstica, monitorizar los dispositivos y disponer de acceso remoto cuando estuviera fuera de casa.\nLo que empezó como una instalación de Pi-hole ha terminado convirtiéndose en un pequeño Homelab basado en Docker, Debian, Tailscale y Cloudflare.\nEn este artículo voy a documentar la arquitectura, las decisiones técnicas y los principales componentes de la infraestructura.\nRaspberry Pi 4 con 4 GB de RAM: el punto de partida de mi Homelab.\n1. Hardware y sistema operativo El equipo principal es una Raspberry Pi 4 con 4 GB de RAM.\nNo es una máquina especialmente potente, pero resulta suficiente para ejecutar varios servicios ligeros en contenedores Docker.\nComponente Configuración Hardware Raspberry Pi 4 Memoria 4 GB RAM Sistema operativo Debian 13 (Trixie) Arquitectura ARM64 Contenedores Docker Engine Orquestación Docker Compose Red Ethernet Dirección IP Estática He optado por Debian 13 para mantener el sistema ligero y reservar los recursos para los servicios.\n2. Arquitectura general La idea es separar las responsabilidades:\nLa Raspberry ejecuta los servicios. Docker proporciona aislamiento y facilita el mantenimiento. Pi-hole gestiona el DNS y el bloqueo de publicidad. Homepage centraliza el acceso a los servicios. Uptime Kuma comprueba su disponibilidad. Glances proporciona información sobre los recursos del sistema. Cloudflare Tunnel permite establecer conectividad remota sin abrir puertos. Tailscale proporciona una VPN privada y permite utilizar la Raspberry como salida a Internet. La arquitectura queda representada en el siguiente diagrama.\nArquitectura lógica del Homelab: servicios Docker, conectividad, acceso remoto y monitorización.\nTailscale se ejecuta directamente en Debian, mientras que los servicios de aplicación están contenerizados.\nEsta separación es intencionada: la conectividad de red de la propia Raspberry no debe depender de que un contenedor VPN esté funcionando.\n3. Docker como base de la infraestructura He elegido Docker Compose para gestionar los servicios.\nCada servicio tiene su propio directorio, con su configuración y su fichero compose.yaml.\n~/docker/ ├── pihole/ │ └── compose.yaml ├── homepage/ │ ├── compose.yaml │ └── config/ ├── uptime-kuma/ │ └── compose.yaml ├── glances/ │ └── compose.yaml ├── dockerproxy/ │ └── compose.yaml └── cloudflared/ ├── compose.yaml └── secrets/ Esta organización facilita actualizar, detener, reconstruir y respaldar cada servicio de forma independiente.\n4. Pi-hole: control DNS y bloqueo de publicidad El primer servicio que instalé fue Pi-hole.\nPi-hole funciona como servidor DNS de la red doméstica y permite bloquear dominios asociados a publicidad, rastreadores y otros contenidos no deseados.\nSu funcionamiento es relativamente sencillo:\nUn dispositivo solicita resolver un dominio. La petición llega a Pi-hole. Pi-hole comprueba sus listas de bloqueo. Si el dominio está bloqueado, devuelve una respuesta que impide su resolución. Si está permitido, consulta el DNS ascendente. Pi-hole permite consultar las peticiones DNS, los dominios bloqueados y la actividad de los dispositivos.\nLa interfaz de administración está disponible en:\nhttp://IP_DE_LA_RASPBERRY:8091/admin/ El DNS utiliza el puerto 53 TCP/UDP.\nUna de las ventajas de tener Pi-hole centralizado es que no es necesario configurar un bloqueador individual en cada dispositivo.\nConfigurando el DNS de la red doméstica para utilizar Pi-hole, todos los dispositivos compatibles pueden beneficiarse del filtrado.\n5. Homepage: un panel centralizado Con varios servicios funcionando, necesitaba un punto de entrada desde el que acceder a todos ellos.\nPara eso he utilizado Homepage.\nHomepage es un dashboard autohospedado que permite organizar servicios, accesos directos e información de monitorización.\nEn mi caso, la idea es separar visualmente dos grandes áreas:\nInfraestructura: servicios que forman parte del propio Homelab. Proyectos: aplicaciones, webs y otros desarrollos personales que no pertenecen directamente a la infraestructura. Homepage centraliza los accesos a los servicios y proyectos.\nEstá disponible en:\nhttp://IP_DE_LA_RASPBERRY:3000 Además, Homepage puede integrar widgets de otros servicios, como Glances y Uptime Kuma.\n6. Uptime Kuma: monitorización de disponibilidad El siguiente componente es Uptime Kuma.\nSu función es comprobar periódicamente que los servicios siguen disponibles.\nPermite monitorizar diferentes protocolos y servicios:\nHTTP y HTTPS. TCP. DNS. Ping. Otros servicios mediante integraciones específicas. Uptime Kuma permite consultar el estado y el historial de disponibilidad de los servicios.\nEn este Homelab lo utilizo para centralizar la supervisión de los servicios principales.\nLa interfaz está disponible en:\nhttp://IP_DE_LA_RASPBERRY:3001 Una de las mejoras que quiero incorporar es monitorizar también la disponibilidad de Tailscale y Cloudflare Tunnel, de manera que pueda detectar problemas de conectividad y no solamente caídas de las aplicaciones web.\n7. Glances: monitorización del sistema Uptime Kuma comprueba si los servicios responden, pero también necesito conocer el estado de la propia Raspberry.\nPara ello utilizo Glances.\nGlances permite consultar información como:\nUso de CPU. Memoria RAM. Espacio en disco. Procesos. Carga del sistema. Actividad de red. Información de sensores cuando están disponibles. Glances ofrece una visión general del estado y consumo de recursos de la Raspberry Pi.\nSu interfaz web está disponible en:\nhttp://IP_DE_LA_RASPBERRY:61208 La integración con Homepage permite consultar información del sistema desde el panel centralizado.\n8. Docker Socket Proxy: limitar el acceso a Docker Homepage puede obtener información de los contenedores Docker.\nSin embargo, montar directamente el socket de Docker en una aplicación tiene implicaciones de seguridad importantes.\nEl socket de Docker proporciona un nivel de control muy elevado sobre el motor de contenedores.\nPor eso he incorporado un Docker Socket Proxy.\nLa idea es ofrecer a las aplicaciones únicamente las operaciones de consulta que necesitan, evitando exponer directamente el socket completo.\nEl proxy permanece dentro de la red interna de Docker y no publica su puerto de administración en la red doméstica.\n9. Acceso remoto: el problema del CGNAT Una de las partes más interesantes del proyecto ha sido conseguir acceder a los servicios desde fuera de casa.\nInicialmente pensé en utilizar el clásico port forwarding del router.\nSin embargo, al revisar la configuración de la conexión descubrí que la dirección WAN del router pertenecía al rango 100.64.0.0/10.\nEsto es una señal de que la conexión está detrás de CGNAT.\nCon CGNAT, el router no dispone de una dirección IPv4 pública directamente asignada que permita recibir conexiones entrantes mediante el port forwarding tradicional.\nPor tanto, necesitaba otra solución.\nHe terminado utilizando dos tecnologías complementarias:\nCloudflare Tunnel. Tailscale. 9.1 Cloudflare Tunnel Cloudflare Tunnel permite establecer una conexión saliente desde la infraestructura doméstica hacia la red de Cloudflare.\nEl componente cloudflared se ejecuta en un contenedor Docker.\nLa conexión se establece desde casa hacia Cloudflare, por lo que no necesito abrir puertos entrantes en el router.\nEn este proyecto he utilizado una ruta privada para acceder a la red doméstica.\nLa red configurada es:\nRED_DOMESTICA/24 Esto permite acceder a los recursos privados de la red mediante la infraestructura de Cloudflare Zero Trust y WARP.\n9.2 Tailscale como VPN privada Para disponer de una VPN que permita tanto acceder a los servicios domésticos como utilizar la conexión de casa para navegar, he incorporado Tailscale.\nTailscale se instala directamente en Debian, fuera de Docker.\nUna vez autenticada la Raspberry, he configurado dos funciones:\nExit Node. Subnet Router. La primera permite enviar el tráfico general de Internet a través de la Raspberry.\nLa segunda permite acceder a la red doméstica RED_DOMESTICA/24.\nLa configuración básica para anunciar la Raspberry como Exit Node es:\nsudo tailscale set --advertise-exit-node Y para anunciar la red doméstica:\nsudo tailscale set --advertise-routes=RED_DOMESTICA/24 Después es necesario autorizar las opciones correspondientes desde la consola de administración de Tailscale.\nEn Android he instalado Tailscale y seleccionado la Raspberry como Exit Node.\nEl resultado es que, cuando estoy fuera de casa:\nPuedo navegar utilizando la conexión de Internet doméstica. Puedo acceder a los servicios de la Raspberry. Puedo acceder a otros dispositivos de la red doméstica mediante la ruta anunciada. Esta combinación ha sido especialmente interesante porque resuelve dos necesidades diferentes con un único nodo doméstico.\n10. Pi-hole y DNS cuando estoy fuera de casa Una de las mejoras que quiero consolidar es utilizar Pi-hole también cuando accedo desde fuera de casa mediante Tailscale.\nLa arquitectura permite que el DNS remoto pueda resolverse utilizando el servidor Pi-hole de la red doméstica, siempre que el cliente tenga configurado ese servidor DNS y la conectividad esté correctamente establecida.\nLa dirección DNS de referencia sería:\nIP_DE_LA_RASPBERRY En la administración de Tailscale se puede configurar un nameserver global o una configuración DNS adecuada para los clientes.\nEs importante comprobar desde el móvil que las consultas llegan realmente a Pi-hole. Tener conectividad VPN no garantiza por sí solo que el cliente esté utilizando el DNS deseado.\n11. Seguridad: firewall y exposición de servicios Una infraestructura doméstica también necesita medidas de seguridad.\nEn este proyecto he utilizado UFW como firewall del sistema y reglas específicas de Docker para controlar el tráfico reenviado.\nLa política general es:\nDenegar conexiones entrantes por defecto. Permitir SSH únicamente desde la red doméstica. Permitir DNS desde los segmentos autorizados. Limitar el acceso a las interfaces web a la red doméstica. Controlar el tráfico que llega a los contenedores. No publicar servicios internos innecesariamente. Evitar exponer el Docker Socket Proxy. También he mantenido las reglas necesarias para que Tailscale pueda gestionar el tráfico de la VPN y el encaminamiento de la red doméstica.\nUna consideración importante: Docker puede modificar las reglas de iptables y el tratamiento del tráfico puede diferir del tráfico que atraviesa directamente UFW.\nPor eso es necesario revisar las reglas de Docker y UFW conjuntamente, en lugar de asumir que una regla de UFW controla automáticamente todos los puertos publicados por Docker.\nNo conviene desactivar el firewall para solucionar un problema de conectividad sin entender antes por dónde circulan los paquetes.\n12. Copias de seguridad automatizadas Otro aspecto importante es disponer de una forma de recuperar la infraestructura.\nHe preparado un script de backup que recopila la configuración y los datos persistentes de los servicios.\nEl sistema utiliza:\nUn script de backup. Un temporizador de systemd. Ejecución diaria a las 03:00. Validación del archivo generado. Retención de las últimas siete copias. La idea es que, si una actualización rompe un servicio o tengo que reinstalar el sistema, pueda recuperar su configuración sin empezar desde cero.\nNo se trata únicamente de guardar los ficheros Compose. Los datos persistentes y las configuraciones también deben formar parte de la estrategia de recuperación.\nLas copias de seguridad deberían mantenerse también fuera de la Raspberry para protegerse frente a un fallo físico del dispositivo o del almacenamiento.\n13. ¿Qué tenemos actualmente? Servicio Tecnología Función Pi-hole Docker DNS y bloqueo Homepage Docker Dashboard Uptime Kuma Docker Disponibilidad Glances Docker Monitorización Docker Socket Proxy Docker Acceso limitado a Docker Cloudflared Docker Túnel privado Tailscale Debian VPN, Exit Node y Subnet Router UFW Debian Firewall systemd Debian Automatización de backups 14. Próximos pasos El Homelab todavía tiene recorrido. Algunas de las mejoras que me gustaría incorporar son:\nConfigurar notificaciones de Uptime Kuma, por ejemplo mediante Telegram. Terminar de integrar todos los servicios y estados en Homepage. Verificar y consolidar el uso remoto de Pi-hole como DNS mediante Tailscale. Añadir almacenamiento externo para copias de seguridad. Incorporar métricas históricas de rendimiento. Estudiar la posibilidad de distribuir servicios entre varias Raspberry Pi. Mejorar la automatización de actualizaciones y mantenimiento. La idea no es instalar servicios por instalarlos, sino construir una infraestructura que sea útil, segura y fácil de mantener.\nConclusión Este proyecto me ha servido para experimentar con tecnologías que normalmente encontramos en infraestructuras profesionales, pero trasladadas a un entorno doméstico.\nDocker, DNS, VPN, túneles privados, firewall, monitorización y automatización son piezas que también forman parte del día a día de cualquier plataforma tecnológica.\nUna Raspberry Pi 4 con 4 GB de RAM no sustituye a un servidor empresarial, pero es una plataforma fantástica para aprender, probar arquitecturas y construir servicios propios.\nY lo mejor es que el proyecto puede crecer poco a poco, incorporando nuevos servicios sin tener que rediseñar toda la infraestructura.\nSeguiremos ampliando el Homelab.\nReferencias Raspberry Pi Debian Docker Pi-hole Homepage Uptime Kuma Glances Cloudflare Tunnel Tailscale UFW Hugo ","permalink":"https://javier-rodriguez.com/post/2026-11-14-montando-homelab-raspberry-pi-4/","summary":"\u003cp\u003eHacía tiempo que tenía ganas de montar una infraestructura doméstica con la que poder experimentar, aprender y disponer de servicios propios sin depender constantemente de soluciones externas.\u003c/p\u003e\n\u003cp\u003eLa idea inicial era sencilla: aprovechar una Raspberry Pi para centralizar servicios de red, mejorar la seguridad de mi conexión doméstica, monitorizar los dispositivos y disponer de acceso remoto cuando estuviera fuera de casa.\u003c/p\u003e\n\u003cp\u003eLo que empezó como una instalación de Pi-hole ha terminado convirtiéndose en un pequeño Homelab basado en Docker, Debian, Tailscale y Cloudflare.\u003c/p\u003e","title":"Montando mi propio Homelab con Raspberry Pi 4: Docker, Pi-hole, Tailscale y Cloudflare"},{"content":"Hace menos un año me invitaron a moderar una mesa en el CToSummit de Geekshubs, la verdad que fue todo un placer de compartir mesa con Alica Alcaide David Lluna y Pedro Díaz, la mesa fue muy interesante donde debatimos sobre DevOps, SRE, diferencias, buenas práctias, etc. No es un vídeo muy largo pero por si te interesa verlo aquí dejo el enlace.\nY sobre todo dar las gracias Geekshubs y CToSummit por esta oportunidad.\nNos vemos en otro post!!!\n","permalink":"https://javier-rodriguez.com/post/2021-12-14-mesa-redonda-ctosummit/","summary":"\u003cp\u003eHace menos un año  me invitaron a moderar una mesa  en el \u003ca href=\"https://ctosummit.geekshubs.com/\"\u003eCToSummit\u003c/a\u003e de Geekshubs, la verdad que fue todo un placer de compartir mesa con \u003ca href=\"https://www.linkedin.com/in/aalcalded/\"\u003eAlica Alcaide\u003c/a\u003e  \u003ca href=\"https://www.linkedin.com/in/davidlluna/\"\u003eDavid Lluna\u003c/a\u003e y \u003ca href=\"https://www.linkedin.com/in/pedro-d%C3%ADaz-7a80a452/\"\u003ePedro Díaz\u003c/a\u003e, la mesa fue muy interesante donde debatimos sobre DevOps, SRE, diferencias, buenas práctias, etc.\nNo es un vídeo muy largo pero por si te interesa verlo aquí dejo el \u003ca href=\"https://www.youtube.com/watch?v=vS2HegazBRY\"\u003eenlace\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eY sobre todo dar las gracias \u003ca href=\"https://www.geekshubs.com\"\u003eGeekshubs\u003c/a\u003e y CToSummit por esta oportunidad.\u003c/p\u003e\n\u003cp\u003eNos vemos en otro post!!!\u003c/p\u003e","title":"Mesa Redonda CTO Summit."},{"content":"Este proyecto lo cree como base para desarrollo de aplicaciones internas dentro de Geekshubs, con el objetivo de disponer de un entorno rápido de desarrollo e intentado acercar ciertas características de otros lenguajes a JavaScript enfocada a la programación orientada a objetos, por ejemplo la disponibilidad de Interfaces, tipado, etc.\nAdemás incluye como ORM, TypeOrm que nos permite disponer de diversas conexiones a diferentes tipos de Persistencia, tanto BD relacionales como no relacional y además con Inversify que nos permite disponer de un Contenedor de dependencias donde poder inyectar allí donde nos hace falta.\nEs otro proyecto que me gustaría actualizar, dado que tiene 12 meses incluyendo nuevas funcionalidades, y adaptándolo a la última versión de typescript e inversify, haciéndolo crecer y disponer de una estructura base donde poder desarrollar apps con una estructura establecida.\nAquí tenéis un vídeo de como poner en marcha el proyecto y su funcionamiento. Y en este repo de Github el proyecto para que podáis descargarlo, así como enviar las PR que creáis conveniente, me ayudáis?\n","permalink":"https://javier-rodriguez.com/post/2021-12-11-skeletor-typescript-ddd/","summary":"\u003cp\u003eEste proyecto lo cree como base para desarrollo de aplicaciones internas dentro de Geekshubs, con el objetivo de disponer de un entorno rápido de desarrollo e intentado acercar ciertas características de otros lenguajes a JavaScript enfocada a la programación orientada a objetos, por ejemplo la disponibilidad de Interfaces, tipado, etc.\u003c/p\u003e\n\u003cp\u003eAdemás incluye como ORM, \u003ca href=\"https://typeorm.io/#/\"\u003eTypeOrm\u003c/a\u003e que nos permite disponer de diversas conexiones a diferentes tipos de Persistencia, tanto BD relacionales como no relacional y además con \u003ca href=\"https://inversify.io/\"\u003eInversify\u003c/a\u003e que nos permite disponer de un Contenedor de dependencias donde poder inyectar allí donde nos hace falta.\u003c/p\u003e","title":"Skeletor for node inversify and typescript apps"},{"content":"Este paquete lo desarrolle para un proyecto de un cliente que requería realizar diversas tareas asíncronas , pero también aquellas que requería respuesta por parte del consumidor de la cola, para ello explotamos la propiedad RPC que dispone RabbitMQ. El patrón es el que describe el tutorial de RPC de RabbitMQ. La lógica es sencilla el cliente realiza una petición y se adjunta a la cabecera una propiedad denominada correlation_id, el cliente espera a recibir de vuelta el mensaje con el correlation_id enviado también adjuntado a la cabecera del mensaje. Por ejemplo imaginemos que queremos recibir el número de factura desde otro servicio lo podríamos realizar de la siguiente manera:\n$this-\u0026gt;result = $this-\u0026gt;rabbitMQ-\u0026gt;requestRpc( $id, \u0026#34;billing\u0026#34;, \u0026#34;billing_return\u0026#34;, \u0026#34;command.billing\u0026#34;, \u0026#34;billing.1.query.income.getNextIncomeInvoiceNumber\u0026#34;, json_encode($json) ); El cliente que debe emitir la respuesta, quedaría de la siguiente manera,.\npublic function handle(IncomeGotNextInvoiceNumberEvent $incomeGotNextInvoiceNumberEvent) { $incomeNextInvoiceNumber = json_encode($incomeGotNextInvoiceNumberEvent-\u0026gt;incomeNextInvoiceNumber()); $msg = $incomeGotNextInvoiceNumberEvent-\u0026gt;message(); $this-\u0026gt;rabbitMQ-\u0026gt;responseRpc($incomeGotNextInvoiceNumberEvent-\u0026gt;incomeNextInvoiceNumber(), $msg); } El correlation_id va encapsulado dentro del $msg, por tanto el cliente que solicita se queda a la espera de recibir un mensaje con ese correlation_id, en la cola y el exchange correspondiente.\nPodeís encontrar el paquete en el siguiente enlace de github El proyecto también está subido en packagist para su uso con más de 1000 descargas. Y aquí os dejo un vídeo de explicación de como funciona internamente. Y en este otro repo de github el código utilizado en el ejemplo del vídeo. Lo cierto es que lo tengo abandonado pero quiero retomarlo y os animo a que me ayudéis a mejorarlo y ampliar funcionalidades, con las últimas mejoras incluidas por RabbitMQ, como puede ser los streams.\nNos vemos en un próximo post.\n","permalink":"https://javier-rodriguez.com/post/2021-12-10-rabbitmq/","summary":"\u003cp\u003eEste paquete lo desarrolle para un proyecto de un cliente que requería realizar diversas tareas asíncronas , pero también aquellas que requería respuesta por parte del consumidor de la cola, para ello explotamos la propiedad RPC que dispone RabbitMQ.\nEl patrón es el que describe el \u003ca href=\"https://www.rabbitmq.com/tutorials/tutorial-six-python\"\u003etutorial de RPC de RabbitMQ\u003c/a\u003e.\nLa lógica es sencilla el cliente realiza una petición y se adjunta a la cabecera una propiedad denominada correlation_id, el cliente espera a recibir de vuelta el mensaje con el correlation_id enviado también adjuntado a la cabecera del mensaje.\nPor ejemplo imaginemos que queremos recibir el número de factura desde otro servicio  lo podríamos realizar de la siguiente manera:\u003c/p\u003e","title":"RabbitMQ"},{"content":"Hola a todos, Después de mucho tiempo sin escribir nada me apetecía volver a las andadas y escribir de nuevo en el blog, la realidad es que durante estos últimos meses he tenido mucho trabajo entre cambio de empresa, cuestiones familiares, etc. me ha tenido apartado y centrado en otros proyectos. Lo últimos 3 años han sido de mucho trabajo y de aprendizaje como CTO tanto en Geekshubs como en Widitrade, lo que me ha llevado a querer volver a la base y regresar de nuevo como programador, necesito volver a picar, y creo que el blog es un buen medio para seguir avanzando y aprendiendo así como dejar parte de este proceso de aprendizaje para que otros puedan si quieren nutrirse de él. También he cambiado el blog, pasando de utilizar react-blog-pages un proyecto a priori bastante interesante , a utilizar hugo con github pages los motivos básicamente es por utilizar github como PaaS y despreocuparme de tener subido algún otro servicio la web. Recuperaré los posts antiguos y los iré también subiendo para que no se pierdan, e ir nutriendo el blog con diferentes temas no sólo técnico, sino de mi experiencia como CTO, y aquellas cosas que me llamen la atención, libros, vídeos, etc..\nMuchas gracias, por leerme y espero que lo disfrutes.\nFuente Imágenes: https://www.pexels.com/\n","permalink":"https://javier-rodriguez.com/post/2021-12-09-blog-reloaded/","summary":"\u003cp\u003eHola a todos,\nDespués de mucho tiempo sin escribir nada me apetecía volver  a las andadas y escribir de nuevo en el blog,  la realidad es que durante estos últimos meses he tenido mucho trabajo entre cambio de empresa, cuestiones familiares, etc. me ha tenido apartado  y centrado en otros proyectos.\nLo últimos 3 años han sido de mucho trabajo y de aprendizaje como CTO tanto en \u003ca href=\"https://www.geekshubs.com\"\u003eGeekshubs\u003c/a\u003e como en \u003ca href=\"https://widitrade.com\"\u003eWiditrade\u003c/a\u003e, lo que me ha llevado a querer volver a la base y regresar de nuevo como programador, necesito volver a picar, y creo que el blog es un buen medio para seguir avanzando y aprendiendo así como dejar parte de este proceso de aprendizaje para que otros puedan si quieren nutrirse de él.\nTambién he cambiado el blog, pasando de utilizar \u003ca href=\"https://github.com/saadpasta/react-blog-github\"\u003ereact-blog-pages\u003c/a\u003e un proyecto a priori bastante interesante , a utilizar \u003ca href=\"https://gohugo.io/\"\u003ehugo\u003c/a\u003e con \u003ca href=\"https://gohugo.io/hosting-and-deployment/hosting-on-github/\"\u003egithub pages\u003c/a\u003e los motivos básicamente es por utilizar github como \u003cstrong\u003ePaaS\u003c/strong\u003e y despreocuparme de tener subido algún otro servicio la web.\nRecuperaré los posts antiguos y los iré también subiendo para que no se pierdan, e ir nutriendo el blog con diferentes temas no sólo técnico, sino de mi experiencia como \u003cstrong\u003eCTO\u003c/strong\u003e, y aquellas cosas que me llamen la atención, libros, vídeos, etc..\u003c/p\u003e","title":"Blog reloaded"},{"content":"Aquí va otro post de opinión, pero desde la perspectiva de la experiencia ya que he trabajado durante los últimos proyectos en PHP, en algunos casos con Laravel y en otros con Symfony. Tampoco quiero centrarme tanto en los frameworks sino más bién en el lenguaje y el ecosistema que lo envuelve que es bastante interesante. Un poco de historia. Php ya es un lenguaje que lleva varias décadas entre nosotros, la primera vez que apareció fue en el año 1995. Pero desde mi punto de vista hay varios factores que han conseguido que este lenguaje interpretado sea bastante interesante.\nEl primero punto interesante, que ya conocéis todos es la adopción de la POO que el lenguaje a llevado a cabo desde ya hace unos años ya que las versiones anteriores a la 5 no implementaban este paradigma, así como la implementación de ciertas características que hacen que se acerque a otros tipos de lenguajes de alto nivel como puede ser Java, C# etc.\nEn el momento de escribir este post la versión más recientes es la 7.4 donde el lenguaje ya tiene bastante madurez e incorpora aspectos tales como la posibilidad de declarar arrow functions, o que las propiedades de un objeto puedan ser tipadas, disponer de un operador array spread, y un largo etc.\nPero hay otros aspectos que hacen que el lenguaje en si sea bastante interesante y es el ecosistema que hay alrededor de el, donde lo más destacable es el PHP-FIG\nEsta es una asociación de diversos fabricantes de software así como de mantenedores de lenguaje que se creo con la intención de establecer un estándar en el desarrollo de software, y en su momento estaba conformada por grandes compañías como Zend Software, Symfony, Laravel, Magento, aunque en estos dos últimos años, parece que ha habido algún tipo de desacuerdo que ha producido la salida de Symfony y Laravel de dicho grupo.\nSus especificaciones o PSR\u0026rsquo;s siguen vigentes en el mercado de las cuales yo destacaría sobre todo dos que han hecho que el lenguaje y su ecosistema haya avanzado de forma muy considerable:\nPSR-04: Nos permite la posibilidad de crear y establecer namespaces, y poder realizar autoload, lo cual abre muchas posibilidades al lenguaje como a los proyectos y la interoperatividad, hoy en día en un proyecto php puedes portar por ejemplo un componente de Symfony como puede ser Forms e incorporarlo siguiendo las reglas que establece dicho PSR, sin necesidad de instalar a priori Symfony\nPSR-11: Este psr en particular ha abierto muchas puertas dentro de los frameworks actuales ya que define una interfaz para crear y gestionar contenedores de dependencias, de esta manera poder realizar inyección de las mismas y abrir la posibilidad por ejemplo de realizar composición, o permitirnos desacoplar las diversas capas de nuestra aplicación para poder testear. Este punto nos podría dar otro post por entero.\nDisponemos también de una herramienta que nos facilita la vida composer que además de ser un gestor de dependencias también nos ayuda a mantener nuestro autoload de librerías en orden.\nY por último la cantidad de componentes y librerías disponibles que podemos comprobar en packagist\nEntre las que destacaría.\nPhp-di Una librería que nos permite crear y gestionar un contenedor de dependencias. Doctrine El ORM de Symfony. Fast-Route Un gestor de rutas para php bastante completo. etc. Todas estas herramientas nos permiten generar nuestro proyecto sin mayor complejidad y evitando el php clásico de código espagueti donde no existía ni siquiera división por capas.\nTampoco nos podríamos olvidar la cantidad de aplicaciones super conocidas basadas en este lenguaje:\nWordpress. Drupal. Magento. SugarCrm. etc. A la vez dispone de una gran diversidad de frameworks donde podemos elegir uno u otro en función de nuestras necesidades.\nSymfony Laminas. Laravel. Yii. CakePhp. Phalcon. etc. El futuro de php La verdad es que la versión actual tendrá soporte como mínimo durante 2 años más hasta el 2022 , pero ya hace unos meses han anunciado el inicio de desarrollo de php 8, donde en algunos lugares ya han dejado entrever las nuevas features que aportaran al lenguaje.\nY yo destacaría sobre todo disponer de JIT(Just in time) el cual permitiría compilar partes de código en tiempo real, ellos dicen:\nThink of it like a \u0026ldquo;cached version\u0026rdquo; of the interpreted code, generated at runtime.\nSerá interesante ver como se materializa, pero de ser así dará un salto cualitativo al lenguaje.\nConclusión. Por todo lo visto anteriormente y muchas cosas más, para mí Php es un lenguaje molón, que todavía tiene mucho \u0026ldquo;dar que hablar\u0026rdquo;, y aunque ya es mayor de edad, sigue siendo una seria alternativa real y actual a otros lenguajes, o stacks más modernos, en el entorno web\nNos vemos en un próximo post!!!!\n","permalink":"https://javier-rodriguez.com/post/2020-12-09-php-es-molon/","summary":"\u003cp\u003eAquí va otro post de \u003cstrong\u003eopinión\u003c/strong\u003e, pero desde la perspectiva de la experiencia ya que he trabajado durante los últimos proyectos en PHP, en algunos casos con \u003ca href=\"https://laravel.com/\"\u003eLaravel\u003c/a\u003e y en otros con \u003ca href=\"https://symfony.com/\"\u003eSymfony.\u003c/a\u003e\nTampoco quiero centrarme tanto en los frameworks sino más bién en el lenguaje y el ecosistema que lo envuelve que es bastante interesante.\n\u003cimg alt=\"Logotipo de PHP\" loading=\"lazy\" src=\"/img/php/php-logo.svg\"\u003e\u003c/p\u003e\n\u003ch2 id=\"un-poco-de-historia\"\u003eUn poco de historia.\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://es.wikipedia.org/wiki/PHP\"\u003ePhp\u003c/a\u003e ya es un lenguaje que lleva varias décadas entre nosotros, la primera vez que apareció fue en el año 1995. Pero desde mi punto de vista hay varios factores que han conseguido que este lenguaje interpretado sea bastante interesante.\u003c/p\u003e","title":"Php es Molón?"},{"content":"Corría un verano de los 90 cuando en un videoclub de mi pueblo Catarroja empezó a disponer de un sistema de alquiler de cd\u0026rsquo;s de música, aquello me pareció todo una revolución dado que hasta ahora sólo tenían películas en VHS Y BETA, posteriormente empezaron también con el alquiler de videojuegos. Pues bien cuando fui ha pagar el alquiler tenía un ordenador sobre el mostrador y no la caja con las tarjetas de asociados a las que estaba acostumbrado. Vi que el dependiente cuando le daba la tarjeta de asociado, introdujo en pantalla el número en un formulario tipo MS-DOS y de repente aparecieron los datos de mi padre, posteriormente introdujo el código que habían pegado en la carcasa de la película y le aparecían los datos de la película y así iniciaba el proceso de alquiler. Bien aquello me pareció toda una revolución fue mi primer acercamiento de la informática dentro del mundo real, aunque también me lleve algún disgusto de alguna película que devolví fuera de plazo XDDD, un par de años más tarde estaba en el videoclub cuando llegó un \u0026ldquo;técnico\u0026rdquo; para instalar una nueva versión de la aplicación y hablaba con el dueño sobre un problema que habían encontrado y sobre algunas novedades de clipper. Bien clipper fue un lenguaje de programación procedural e imperativo que apareció en el año 1985, era un compilador para dBase III, lo que le daba la potencia de disponer en un mismo entorno la BD y el sistema para añadir la lógica necesaria para implementar cualquier aplicación . Durante unos años muchas aplicaciones se desarrollaron con clipper, y fue muy popular en videoclubs, etc. De hecho el lenguaje fue evolucionando incorporando características de otros productos del mercados, como XBase, FoxPro, etc. sacando nuevas versiones hasta alcanzar la versión 5.3b allá por el año 97. Como características principales:\nDisponía de un sistema propio para manejar la memoria virtual, y memoria extendida, ya que MS-DOS tenía el límite de los 640 kb de barrera de base, lo que permitía crear aplicaciones que consumiesen más memoría. Disponía ya de un tipo \u0026ldquo;lazy loaded\u0026rdquo;, ya que permitia cargar las bibliotecas sólo cuando eran necesarias y descargarlas de la ram cuando ya no se usaban. No existía límite de registros en tablas, excepto el límite del soporte en disco donde se almacenaban. Permitía un desarrollo con arquitectura cliente-servidor Además permitía ampliar la funcionalidad de la aplicación mediante la creación de bibliotecas programadas en C , asm e incluso en pascal. En definitiva tenía todos los elementos para este tipo de desarrollos que incluso al día de hoy se mantienen activos, como contrapartida se debía recompilar y enlazar cada vez que había un error en el código fuente, y esto hacía que la depuración de aplicaciones fuera muy muy lenta.\n¿Pero que ocurrió con clipper?, básicamente la evolución de dbase, la aparición de Xbase y la propía evolución de la programación orientada objetos así como los nuevos lenguajes enfocados a este paradigma acompañadas de las versiones de windows en detrimento del uso de la consola, conllevaron al abandono de este lenguaje por otros que se encontraban en auge bajo windows como puede ser visual basic, Foxpro, etc.\nEl proyecto sigue vivo mediante el proyecto Harbour Project un compilador 32/64 de xBase\n// Typical welcome message function Main() ? \u0026#34;Hello world!\u0026#34; return nil En fin cosillas de viejales, pero que forma parte de la evolución de los lenguajes y la formas de trabajar hoy en día.\nNos vemos.\nFuentes:\nhttps://www.kalimero.es\nhttps://es.wikipedia.org/wiki/Wikipedia:Portada\nhttps://www.xtof.info/\nhttp://www.harbour-project.org/\n","permalink":"https://javier-rodriguez.com/post/2020-09-01-clipper/","summary":"\u003cp\u003eCorría un verano  de los 90 cuando en un videoclub de mi pueblo \u003cstrong\u003eCatarroja\u003c/strong\u003e empezó a disponer de un sistema de alquiler de cd\u0026rsquo;s de música, aquello me pareció todo una revolución dado que hasta ahora sólo tenían películas en VHS Y BETA, posteriormente empezaron también con el alquiler de videojuegos. Pues bien cuando fui ha pagar el alquiler  tenía un ordenador sobre el mostrador y no la caja con las tarjetas de asociados a las que estaba acostumbrado.\nVi que el dependiente cuando le daba la tarjeta de asociado, introdujo en pantalla el número  en un formulario tipo MS-DOS y de repente aparecieron los datos de mi padre, posteriormente introdujo el código que habían pegado en la carcasa de la película y le aparecían los datos de la película y así iniciaba el proceso de alquiler.\nBien aquello me pareció toda una revolución fue mi primer acercamiento de la informática dentro del mundo real, aunque también me  lleve algún disgusto de alguna película que devolví fuera de plazo XDDD, un par de años más tarde estaba en el videoclub cuando llegó un \u0026ldquo;técnico\u0026rdquo; para instalar una nueva versión de la aplicación y hablaba con el dueño sobre un problema que habían encontrado y sobre algunas novedades de \u003cstrong\u003eclipper\u003c/strong\u003e.\nBien clipper fue un lenguaje de programación procedural e imperativo que apareció en el año 1985, era un compilador para \u003ca href=\"https://es.wikipedia.org/wiki/DBase\"\u003edBase III\u003c/a\u003e, lo que le daba la potencia de disponer en un mismo entorno la BD y el sistema para añadir la lógica necesaria para implementar cualquier aplicación .\nDurante unos años muchas aplicaciones se desarrollaron con clipper, y fue muy popular en videoclubs, etc.\nDe hecho el lenguaje fue evolucionando incorporando características de otros productos del mercados, como XBase, FoxPro, etc. sacando nuevas versiones hasta alcanzar la versión 5.3b allá por el año 97.\nComo características principales:\u003c/p\u003e","title":"Clipper"},{"content":"Hace tiempo que quería meterme en el mundo de los emuladores y la verdad es que siempre me han llamado bastante la atención. Por la complejidad técnica que conlleva tanto conocer el sistema que quieres emular, como por el desarrollo en sí.\nAdemás ya que tengo cierta edad, siempre me cae alguna lagrimita al ver una fotografía del CPC 464 de Amstrad. Con el que empecé mis pinitos con 12 años y me inició en el mundo de la programación ya que con este equipo le acompañaba un libro de Basic. Al final del libro siempre había juegos escritos para que lo portaras a tu equipo.\nAntes de nada indicar que no soy especialista de ello, simplemente en éste post recojo información sobre emulación para poder entender los conceptos básicos, así que voy a ello.\n¿Qué es un emulador? Si nos vamos a la definición de la Wikipedia:\nEn informática, un emulador es un software que permite ejecutar programas o videojuegos en una plataforma (sea una arquitectura de hardware o un sistema operativo) diferente de aquella para la cual fueron escritos originalmente. A diferencia de un simulador, que solo trata de reproducir el comportamiento del programa, un emulador trata de modelar de forma precisa el dispositivo de manera que este funcione como si estuviese siendo usado en el aparato original.\nLo primero que hay que tener en cuenta que un Emulador no es un Simulador y por tanto debemos intentar programar el funcionamiento interno de la forma más fidedigna de aquello que queremos emular, comportamiento de la cpu llamadas a memoria, etc.\n¿Cómo funciona un emulador? Para entender como funciona un Emulador debemos saber que este se encargará de traducir las instrucciones para que un sistema para el que no fue pensado originalmente, pueda entender y ejecutar esa lista de instrucciones que son los programas o juegos a emular.\nPara ello Emularará el sistema original ejecutando las instrucciones opCodes de la cpu\n¿Tipos de emulación? Podemos encontrarnos con diferentes clasificaciones de emuladores :\nEmulación a bajo nivel o LLE se define cuando emulamos todos los componentes del sistema, cpu, memoría, etc. Emulación a alto nivel o HLE se podría definir emulación de alto como una simulación, los volcados de BIOS y otros códigos específicos de la máquina sin entrar a emular al detalle todos los procesos del sistema. Entre las ventajas de la emulación HLE, principalmente está la capacidad de utilizar el hardware del host mucho mejor y más fácilmente, la capacidad de optimizar los resultados a medida que mejoran el código y el hardware.\nEL progreso de las implementaciones también es mucho más independiente de la documentación detallada del hardware, en lugar de depender solo de la lista de posibles funciones disponibles para el programador.\nLas desventajas incluyen una dependencia mucho mayor en la estandarización entre las aplicaciones de destino y la presencia de mecanismos suficientemente de alto nivel en las plataformas emuladas. Si no existe tal mecanismo, o si las aplicaciones no lo utilizan de una de las formas ya admitidas, no funcionarán correctamente.\n¿Por donde empezar? En un principio quería lanzarme a lo grande y empezar por la emulación de un Spectrum ZX para los viejos del lugar sabrán que fue un equipo que nos quito muchas horas de sueño, por los juegos y por los procesos de carga. XDDD\nPero revisando la documentación, y sin tener idea sobre emulación, etc, decidir bajar a la tierra y empezar por algo más sencillo para posteriormente escalar. Y que además nos ayude a entender todo el proceso y el funcionamiento de la emulación. Así que he decidido empezar por el CHIP-8 que contiene un juego de opCodes que me permitirá jugar y conocer todo el proceso de funcionamiento interno.\n¿Cómo lo voy hacer? Pues utilizando un lenguaje que cada vez me sorprende más Go. Así que en un próximo post hablaremos más en detalle del CHIP-8 y empezaremos a estructurar el proyecto.\nHasta pronto.\n","permalink":"https://javier-rodriguez.com/post/2020-08-15-emuladores/","summary":"\u003cp\u003eHace tiempo que quería meterme en el mundo de los emuladores y la verdad es que siempre me han llamado bastante la atención.  Por la complejidad técnica que conlleva tanto conocer el sistema que quieres emular, como por el desarrollo en sí.\u003c/p\u003e\n\u003cp\u003eAdemás ya que tengo cierta edad, siempre me cae alguna lagrimita al ver una fotografía del \u003ca href=\"https://es.wikipedia.org/wiki/Amstrad_CPC_464\"\u003eCPC 464 de Amstrad\u003c/a\u003e.\nCon el que empecé mis pinitos con 12 años y me inició en el mundo de la programación  ya que con este equipo le acompañaba un  \u003ca href=\"http://www.cpcmania.com/Docs/Manuals/Manual%20de%20Usuario%20Amstrad%20CPC%20464.pdf\"\u003elibro\u003c/a\u003e de \u003ca href=\"https://es.wikipedia.org/wiki/BASIC\"\u003eBasic\u003c/a\u003e.\nAl final del libro siempre había juegos escritos para que lo portaras a tu equipo.\u003c/p\u003e","title":"Emuladores"},{"content":"Bueno vamos a acceder ahora al servidor cliente para poder enviarle métricas de nuestro servidor para ello vamos a utiliza telegraph Configuramos nginx comprobamos si los módulos para geo y status de nginx estan activados. Añadimos el ćodigo suficiente para poder comprobar el status de nginx, para ello nos dirigimos a la carpeta\n$\u0026gt; /etc/ningx/status Creamos un archivo denominado status.conf\nserver { listen 127.0.0.1:9090; location /nginx_status { stub_status on; access_log off; allow 127.0.0.0/24; } } Comprobamos que funciona mediante el siguiente comando.\n$\u0026gt; curl 127.0.0.1:9090/nginx_status Nos devolverá información .\nPara la geolocalización crearemos un directorio dentro de nginx denominado geoip, en la siguiente localización:\n$\u0026gt; /etc/nginx/geoip Nos descargamos los siguientes archivos\n$\u0026gt; wget https://web.archive.org/web/20181119091911/http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz $\u0026gt; wget https://web.archive.org/web/20181119091911/http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz Una vez descargados los descomprimimos con:\n$\u0026gt; gunzip GeoIP.dat.gz $\u0026gt; gunzip GeoLiteCity.dat.gz Ahora vamos activar la geolocalización en nuestro nginx, para ello debemos modificar el nginx.conf Modificamos los siguientes parámetros\nlog_format vhosts \u0026#39;$remote_addr - $remote_user [$time_local] \u0026#34;$request\u0026#34; $status $body_bytes_sent \u0026#34;$http_referer\u0026#34; \u0026#34;$http_user_agent\u0026#34; \u0026#34;$request_time\u0026#34; \u0026#34;$upstream_connect_time\u0026#34; \u0026#34;$geoip_city\u0026#34; \u0026#34;$geoip_city_country_code\u0026#34;\u0026#39;; access_log /var/log/nginx/access.log vhosts; error_log /var/log/nginx/error.log; # Add GEO IP support geoip_country /etc/nginx/geoip/GeoIP.dat; # the country IP data geoip_city /etc/nginx/geoip/GeoLiteCity.dat; # the city IP data Y si en nuestros host debemos comentar los comentarios para ello nos dirigimos sites-enabled y comentamos las líneas de los logs\n#access_log /var/log/nginx/access.log; #error_log /var/log/nginx/error.log; 1º paso es instalar telegraph en nuestro server, vamos a utilizar los repositorios de influx data para ello ejecutaremos.\n$\u0026gt; wget -qO- https://repos.influxdata.com/influxdb.key | sudo apt-key add - source /etc/lsb-release $\u0026gt; echo \u0026#34;deb https://repos.influxdata.com/${DISTRIB_ID,,} ${DISTRIB_CODENAME} stable\u0026#34; | sudo tee /etc/apt/sources.list.d/influxdb.list 2º E instalamos telegraph\n$\u0026gt; sudo apt-get update \u0026amp;\u0026amp; sudo apt-get install telegraf $\u0026gt; sudo service telegraf start 3º Comprobamos que telegraph se encuentra levantado.\n$\u0026gt; service telegraf status Nos debería indicar que se encuentra en funcionamiento.\n4º Vamos a configurar telegraph para que envíe las meicas de forma adecuada a nuestro grafana, para ello nos dirigimos al directorio\n$\u0026gt;/etc/telegraph Y editamos el archivo telegraf.conf añadiendo al final las siguientes líneas. Debemos sustituir:\nUrls la ip de nuestra máquina bastión. username: el username que tengamos configurado. password: el password que hayamos configurado. Una vez realizado sólo tenemos que reiniciar el servicio mediante.\n$\u0026gt;service telegraf restart Y ya podemos comprobar en grafana en el dashboard previamente instalado si ya nos llegan los datos de esta máquina.\n","permalink":"https://javier-rodriguez.com/post/2020-08-01-monitorizando-con-grafana-influx-telegraph/","summary":"\u003cp\u003eBueno vamos a acceder ahora al servidor cliente para poder enviarle métricas de nuestro servidor para ello vamos a utiliza telegraph\nConfiguramos nginx comprobamos si los módulos para geo y status de nginx estan activados.\nAñadimos el ćodigo suficiente para poder comprobar el status de nginx, para ello nos dirigimos a la carpeta\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$\u0026gt; /etc/ningx/status\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCreamos un archivo denominado status.conf\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eserver { \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  listen 127.0.0.1:9090;  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  location /nginx_status {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        stub_status on;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        access_log off;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        allow 127.0.0.0/24;  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eComprobamos que funciona mediante el siguiente comando.\u003c/p\u003e","title":"Monitorizando nuestro servidores con Grafana, Influx Telegraph"},{"content":"Bueno muchas veces tenemos que monitorizar diveras apps, y para no estar pasando de un pantalla a otra nos interesa tenerlo centralizado en un único punto.\nEn la máquina Bastión\n1º Creamos un directiorio dentro de:\n$\u0026gt;\\opt\\monitoring En el crearemos el siguiente script para docker-compose\nversion: \u0026#34;2\u0026#34; services: grafana: image: grafana/grafana container_name: grafana restart: always ports: - 3000:3000 networks: - monitoring volumes: - grafana-volume:/var/lib/grafana influxdb: image: influxdb container_name: influxdb restart: always ports: - 8086:8086 networks: - monitoring volumes: - influxdb-volume:/var/lib/influxdbnetworks: monitoring:volumes: grafana-volume: external: true influxdb-volume: external: true El cual nos crea dos contenedores uno con grafana y otro con influxdb.\nAhora debemos crear la red y los volúmenes donde vamos a compartir nuestros datos del contenedor y que se mantengan persistentes.\n$\u0026gt; docker network create monitoring $\u0026gt; docker volume create grafana-volume $\u0026gt; docker volume create influxdb-volume Podemos comprobar si se ha creado los volúmenes ejecutando:\n$\u0026gt; docker volume ls Y la creación del la red interna.\n$\u0026gt; docker network ls Ok en este momento vamos a inicializar los contenedores y los volúmenes para parsear los datos de acceso, una vez creados los contenedores automáticamente se eliminarán.\n$\u0026gt; docker run --rm \\ -e INFLUXDB_DB=telegraf -e INFLUXDB_ADMIN_ENABLED=true \\ -e INFLUXDB_ADMIN_USER=admin \\ -e INFLUXDB_ADMIN_PASSWORD=supersecretpassword \\ -e INFLUXDB_USER=telegraf -e INFLUXDB_USER_PASSWORD=secretpassword \\ -v influxdb-volume:/var/lib/influxdb \\ influxdb /init-influxdb.sh Y por último una ya podemos lanzar nuestro servicio con docker-compose.\n$\u0026gt; docker-compose up Podemos comprobar si está todo correcto si nos dirigimos a: http://[ip de nuestra máquina]:3000 Y comprobamos que tenemos acceso a Grafana. Los datos de acceso son\nusername:admin password:admin Nos pedirá que cambiemos los datos de acceso: Ok una vez dentro lo primero que debemos configurar es nuestra fuente de datos que en nuestro aso será influxdb. Para ello seleccionaremos añadir una fuente de datos. Seleccionamos InfluxDB y configuramos los siguientes campos:\nURL: https://influxdb:8086 Database: telegraf User: telegraf Password: secretpassword Cuando ya tengamos los datos, pulsamos sobre el botón save/test, si todo ha ido bién debería aparecer un mensaje como el siguiente: Bueno vamos a instalar nuestro primer dashboard predefenido para obtener los datos de las máquinas. Para ello vamos a descarganos un dashboard ya creado desde la propia web de grafana, para ello nos dirigiremos a: https://grafana.com/grafana/dashboards/928 E importaremos este dashboard a nuestro grafana, en la pantalla principal pulsamos importar e indicamos el id del dashboard Una vez importado debemos seleccionar la fuente en nuestro caso influxdb. ","permalink":"https://javier-rodriguez.com/post/2020-07-01-monitorizando-con-grafana-influx-telegraph/","summary":"\u003cp\u003eBueno muchas veces tenemos que monitorizar diveras apps, y para no estar pasando de un pantalla a otra nos interesa tenerlo centralizado en un único punto.\u003c/p\u003e\n\u003cp\u003eEn la máquina Bastión\u003c/p\u003e\n\u003cp\u003e1º  Creamos un directiorio dentro de:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$\u0026gt;\u003cspan class=\"se\"\u003e\\o\u003c/span\u003ept\u003cspan class=\"se\"\u003e\\m\u003c/span\u003eonitoring\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEn el crearemos el siguiente script para docker-compose\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eversion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;2\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eservices\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003egrafana\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egrafana/grafana  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003econtainer_name\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egrafana  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erestart\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ealways  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eports\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"m\"\u003e3000\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"m\"\u003e3000\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003enetworks\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003emonitoring  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003evolumes\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003egrafana-volume:/var/lib/grafana influxdb\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003einfluxdb  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003econtainer_name\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003einfluxdb  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erestart\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ealways  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eports\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"m\"\u003e8086\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"m\"\u003e8086\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003enetworks\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003emonitoring  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003evolumes\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003einfluxdb-volume:/var/lib/influxdbnetworks\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003emonitoring:volumes\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003egrafana-volume\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eexternal\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003einfluxdb-volume\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eexternal\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEl cual nos crea dos contenedores uno con grafana y otro con influxdb.\u003c/p\u003e","title":"Monitorizando nuestro servidores con Grafana, Influx Telegraph"},{"content":"¿Qué es un DevOps? Primero nos vamos a centrar a una definición, veamos lo que dice la Wikipedia\n\u0026ldquo;DevOps es un acrónimo inglés de development (desarrollo) y operations (operaciones), que se refiere a una metodología de desarrollo de software que se centra en la comunicación, colaboración e integración entre desarrolladores de software y los profesionales de sistemas en las tecnologías de la información (IT)\u0026rdquo;.*DevOps es una respuesta a la interdependencia del desarrollo de software y las operaciones IT. Su objetivo es ayudar a una organización a producir productos y servicios software más rápidamente, de mejor calidad y a un coste menor.\nLas empresas con entregas (releases) muy frecuentes podrían requerir conocimientos de DevOps. Flickr desarrolló un sistema DevOps para cumplir un requisito de negocio de diez despliegues diarios. A este tipo de sistemas se les conoce como despliegue continuo (continuous deployment) o entrega continua (continuous delivery), y suelen estar asociados a metodologías lean startup. Grupos de trabajo, asociaciones profesionales y blogs usan el término desde 2009\u0026quot;.\nPodemos ver la fuente de esto con los mismos desarrolladores de Flickr en una charla que los mismos John Allspawh y Paul Hammond daban sus primeras pinceladas a lo que debería ser la integración y el despliegue continuo y entender la necesidad de tratar la infraestructura como código ya por el año 2009\nLa verdad es que un año antes en el 2008 ya se empezó hablar por parte de Patrick Debois\n“Agile Operations and Infraestructure: How Infra-gile are you?\nEn la conferencia Agile del 2008 en Toronto. Tal y como podemos observar la idea ya lleva rondando alrededor de 10 años y durante este tiempo, las empresas han aplicado en función de sus necesidades, o bien tal y como lo han interpretado.\n¿Pero entonces que es un DevOps? Si tomamos otra definición más reciente como la que nos proporciona Microsoft\nEl término DevOps, que es una combinación de los términos ingleses development (desarrollo) y operations (operaciones), designa la unión de personas, procesos y tecnología para ofrecer valor a los clientes de forma constante. ¿Qué significa DevOps para los equipos? DevOps permite que los roles que antes estaban aislados (desarrollo, operaciones de TI, ingeniería de la calidad y seguridad) se coordinen y colaboren para producir productos mejores y más confiables. Al adoptar una cultura de DevOps junto con prácticas y herramientas de DevOps, los equipos adquieren la capacidad de responder mejor a las necesidades de los clientes, aumentar la confianza en las aplicaciones que crean y alcanzar los objetivos empresariales en menos tiempo.\nTal y como podemos observar en ninguna de las dos definiciones anteriores deja claro realmente lo que es , ¿ Es un puesto, es una filosofía, o es un mono tocando la pandereta? Google también tiene su definición del mismo.\nDevOps es un movimiento organizativo y cultural que tiene como objetivo aumentar la velocidad de entrega de software, mejorar la confiabilidad de los servicios y crear una propiedad compartida entre las partes interesadas en el software. Aprende a mejorar la velocidad, estabilidad, disponibilidad y seguridad de tu capacidad de entrega de software.\nY aquí Google da desde mi punto de vista una idea clarificante:\nDevOps es un movimiento organizativo y cultural que tiene como objetivo aumentar la velocidad de entrega de software\nDesde luego concuerda mucho con la charla de Carlos Buenos Vinos en el ctosummit que celebramos el año pasado en Valencia en Geekshubs, que el tituló deliveritis aguda\nY como él mismo marcaba en la charla:\nDelibery first es una actitud.\n¿Para mí que es DevOps? Bueno pues es hora de mojarse, desde mi punto de vista DevOps es una filosofía o actitud, que nos permita entregar cuanto antes nuestro software, y que nos añada valor a todo el proceso de desarrollo en un proyecto.\nBien pero alguien tiene que realizar esas tareas, y aquí es donde añado un poco más a la definición, la empresa que haga o aplique \u0026ldquo;DevOps\u0026rdquo; debería tener una persona o rol que también sea un facilitador, y cuando digo un facilitador me refiero una persona que pueda ayudar con las herramientas suficientes para conseguir dicho objetivo, y sobre todo sea capaz de poner a tierra las necesidades reales del proyecto para evitar sobre-ingeniería que complique todo el proceso y la vida de los desarrolladores.\nAhora mismo tal y como esta todo éste mundillo la verdad es que el que quiera aplicar DevOps no lo tienen nada fácil en estos últimos años con la evolución del cloud sólo hay que darse una vuelta por la web de la Cloud Native Computing Foundation para darse cuenta la cantidad de tecnologías que disponemos. Por eso es importante que junto con el equipo de desarrollo, el contexto del proyecto y la situación del mismo poder decidir que aplicar y que no, a veces simplemente con una virtualización con ayuda de Vagrant o [Docker](https://www.docker.com/ que nos permita homogeneizar los diferentes entornos de desarrollo, aplicar o utilizar Git, y la integración de alguna herramienta externa como Travis-ci o Circle-ci, puede ayudar a dar un paso exponencial en la puesta a valor de nuestro producto, a la detección de errores, y en definitiva a la calidad de nuestro proyecto.\nA otras soluciones más complejas simplemente por ser tecnologías más tendentes o la moda del momento.\nEn fin es mi modesta opinión, y espero que ayude a clarificar un poco la ideas. De todos los modos os dejo un enlace sobre el Bootcamp de Devops que realizamos en Geekshubs Academy, por si alguien quiere aprender un poco más sobre el tema.\nBueno en otro post hablaremos sobre la función del SRE Site Reliability Engineering .\nHasta pronto.\n","permalink":"https://javier-rodriguez.com/post/2020-06-01-devops/","summary":"\u003ch2 id=\"qué-es-un-devops\"\u003e¿Qué es un DevOps?\u003c/h2\u003e\n\u003cp\u003ePrimero nos vamos a centrar a una definición, veamos lo  que dice la \u003cstrong\u003eWikipedia\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026ldquo;DevOps es un acrónimo inglés de development (desarrollo) y operations (operaciones), que se refiere a una metodología de desarrollo de software que se centra en la comunicación, colaboración e integración entre desarrolladores de software y los profesionales de sistemas en las tecnologías de la información (IT)\u0026rdquo;.*\u003cem\u003eDevOps es una respuesta a la interdependencia del desarrollo de software y las operaciones IT. Su objetivo es ayudar a una organización a producir productos y servicios software más rápidamente, de mejor calidad y a un coste menor.\u003c/em\u003e\u003c/p\u003e\n\u003c/blockquote\u003e","title":"Que es DevOps?"},{"content":"Hola, soy Javier Rodríguez, aunque todos me llaman Xavi. Este es mi blog, donde hablo de los temas que me apetecen. Soy padre de familia de dos preciosas hijas y vivo en Burjassot (Valencia).\nLlevo metido en el mundo de la informática desde los 14 años, cuando hice mis primeros pinitos con un Amstrad CPC 464. Aunque mis derroteros me han llevado a otras líneas profesionales, nunca he dejado de frikear ni de seguir aprendiendo, tanto en desarrollo de software como en distintas tecnologías.\nMe encanta la ciencia ficción en todas sus modalidades, el manga y los ensayos. También soy apasionado del universo Marvel y DC y de los videojuegos.\nHe sido CTO de GeeksHubs y Widitrade, y ahora vuelvo a centrarme en la parte de desarrollo e infraestructura: DevOps, homelab y todo lo que se pueda automatizar.\nSi quieres contactar conmigo, tienes los enlaces a mis redes en la portada. Nos vemos.\n","permalink":"https://javier-rodriguez.com/about/","summary":"\u003cp\u003eHola, soy Javier Rodríguez, aunque todos me llaman Xavi. Este es mi blog, donde hablo de los temas que me apetecen. Soy padre de familia de dos preciosas hijas y vivo en \u003ca href=\"https://es.wikipedia.org/wiki/Burjasot\"\u003eBurjassot\u003c/a\u003e (Valencia).\u003c/p\u003e\n\u003cp\u003eLlevo metido en el mundo de la informática desde los 14 años, cuando hice mis primeros pinitos con un \u003ca href=\"https://es.wikipedia.org/wiki/Amstrad_CPC\"\u003eAmstrad CPC 464\u003c/a\u003e. Aunque mis derroteros me han llevado a otras líneas profesionales, nunca he dejado de frikear ni de seguir aprendiendo, tanto en desarrollo de software como en distintas tecnologías.\u003c/p\u003e","title":"Sobre mí"}]