alberto@barrahome:~$ https://www.barrahome.org Escribo sobre tecnología, programación, sistemas operativos, servidores web y otros temas. Red Hat, Open Source, el Debate https://www.barrahome.org/red-hat-open-source-el-debate <p>La historia de Red Hat no es precisamente un cuento de recién salidos. Hace más de 25 años, Bob Young y Marc Ewing echaron a andar este gigante con una misión bien clara: llevar el software libre y de código abierto a las empresas. Su nombre, de hecho, viene del sombrero rojo que Ewing solía lucir en la universidad. Desde sus inicios modestos vendiendo CDs con compilaciones de software de código abierto, Red Hat se dio maña para transformarse en una de las empresas líderes en software de código abierto del mundo.</p> Mon, 03 Jul 2023 00:00:00 +0000 Integración de Fail2ban con tu propia API en Python https://www.barrahome.org/integracion-fail2ban-api-python <p>¡Hola! En este artículo, exploraremos cómo integrar Fail2ban con tu propia API en Python para proteger tu servidor de direcciones IP sospechosas. Implementar la integración de Fail2ban con tu API te permitirá actuar rápidamente contra las direcciones IP sospechosas. Sin embargo, en esta ocasión nos centraremos en la integración con Fail2ban, sin explorar otras herramientas como Prometheus por el momento.</p> Sat, 01 Jul 2023 00:00:00 +0000 Cómo Configurar el Out-of-Memory Killer en Linux https://www.barrahome.org/como-configurar-el-out-of-memory-killer-en-linux <p>Cuando un servidor que soporta una base de datos o un servidor de aplicaciones se cae, a menudo es una carrera para conseguir que los servicios críticos vuelvan a estar operativos, especialmente si se trata de un sistema de producción importante. Al intentar determinar la causa raíz después del triaje inicial, a menudo es un misterio por qué la aplicación o la base de datos dejaron de funcionar de repente. En ciertas situaciones, la causa raíz del problema puede rastrearse hasta el sistema que se quedó sin memoria y tuvo que matar un proceso importante para seguir operativo.</p> <p>El kernel de Linux asigna memoria a demanda de las aplicaciones que se ejecutan en el sistema. Debido a que muchas aplicaciones asignan su memoria de antemano y a menudo no utilizan la memoria asignada, el kernel fue diseñado con la capacidad de comprometer más memoria de la que realmente tiene físicamente disponible. Este modelo de sobrecompromiso permite al kernel asignar más memoria de la que realmente tiene disponible físicamente. Si un proceso realmente utiliza la memoria que se le asignó, el kernel entonces proporciona estos recursos a la aplicación. </p> <p>Cuando demasiadas aplicaciones comienzan a utilizar la memoria que se les asignó, el modelo de sobrecompromiso a veces se convierte en un problema y el kernel debe comenzar a matar procesos para seguir operativo. El mecanismo que el kernel utiliza para recuperar memoria en el sistema se conoce como el asesino de memoria insuficiente o asesino OOM por sus siglas en inglés.</p> Tue, 06 Jun 2023 00:00:00 +0000 Sobre AI https://www.barrahome.org/sobre-ai <p>Desde que el hombre comenzó a plantearse la idea de crear un ser mecánico, ha jugado a ser Dios, buscando crear inteligencias superiores para complacernos de una forma u otra. Desde un robot en la fábrica hasta alguien que te responde lo que buscas en tiempo real, esta es nuestra realidad.</p> <p>Sin embargo, algo que no hemos considerado es que, al ser humanos, todo lo que enseñamos está afectado por nuestra percepción, personalidad y emociones, o es incompleto, dependiendo del área. Esto se debe a que todos tenemos, al escribir, distintos puntos de vista. Si bien una fórmula matemática puede ser exacta, programar un modelo con datos de distintas fuentes puede ser algo caótico.</p> <p>Aquí podemos argumentar modelos existentes que “arreglan A o B”, pero al final del día, como todo modelo, tienen sus virtudes y defectos. Por tanto:</p> Sat, 03 Jun 2023 00:00:00 +0000 Usar gevent cuando Gunicorn está esperando datos https://www.barrahome.org/usar-gevent-con-gunicorn-esperando-datos <p>Si estás utilizando gunicorn y realizas llamadas a API externas en tus vistas, es recomendable utilizar gevent para mejorar el rendimiento de tu aplicación. La clase gevent permite que el worker de gunicorn maneje múltiples solicitudes de forma asíncrona cuando está esperando los datos de una API externa. Algo similar a Nginx o Apache con mod_event.</p> <p>Para usar gevent como worker en gunicorn, ejecuta el siguiente comando:</p> <div class="codehilite"><pre><span></span><code>gunicorn<span class="w"> </span>--worker-class<span class="o">=</span>gevent<span class="w"> </span>mysite:app </code></pre></div> <p>Supongamos que estás desarrollando un sitio web y necesitas mostrar artículos en una página. Para obtener los datos de los artículos, realizas una llamada a una función que maneja la lista de artículos en formato markdown y otros procesamientos. Sin embargo, debido a que te encuentras en México y el servidor de preparación de la API se encuentra en Canadá, la solicitud puede llevar tiempo en completarse. Como resultado, la página de artículos tarda en cargarse.</p> Sun, 28 May 2023 00:00:00 +0000 Comprendiendo el uso de memoria en Linux una mirada al comando free https://www.barrahome.org/comprendiendo-el-uso-de-memoria-en-linux-una-mirada-al-comando-free <p>El sistema operativo Linux tiene una serie de comandos útiles y poderosos para monitorear y gestionar el uso de los recursos del sistema. Uno de estos comandos es free, que proporciona información sobre el uso de la memoria física y de intercambio (swap) en el sistema. Pero, ¿qué significan realmente los datos que muestra este comando?</p> Mon, 15 May 2023 00:00:00 +0000 Entendiendo y Usando vm.drop_caches en Linux https://www.barrahome.org/entendiendo-y-usando-vm-drop-caches-en-linux <p><a href="https://www.kernel.org/doc/Documentation/sysctl/vm.txt"><code>vm.drop_caches</code></a> es una función especial en el núcleo de Linux que permite a los administradores liberar la memoria caché del sistema. Aunque pueda parecer un método efectivo para liberar memoria no utilizada y potencialmente mejorar el rendimiento del sistema, su uso requiere una comprensión cuidadosa de cómo Linux gestiona la memoria y el papel de la memoria caché.</p> <h2>¿Cómo funciona <code>vm.drop_caches</code>?</h2> <p><code>vm.drop_caches</code> permite liberar diferentes tipos de memoria caché escribiendo valores específicos en el archivo <code>/proc/sys/vm/drop_caches</code>:</p> <ul> <li><code>echo 1 &gt; /proc/sys/vm/drop_caches</code>: Libera la caché de páginas.</li> <li><code>echo 2 &gt; /proc/sys/vm/drop_caches</code>: Libera los inodos y las entradas dentry.</li> <li><code>echo 3 &gt; /proc/sys/vm/drop_caches</code>: Libera la caché de páginas, los inodos y las entradas dentry.</li> </ul> Mon, 15 May 2023 00:00:00 +0000 Gestión automática de memoria en Linux https://www.barrahome.org/gestión-automática-de-memoria-en-linux <p>La gestión automática de memoria es una característica fundamental de Linux y de muchos otros sistemas operativos modernos. A grandes rasgos, Linux utiliza una serie de técnicas y algoritmos para administrar la memoria del sistema de manera eficiente, asegurando que los recursos sean asignados y liberados según sea necesario. A continuación, se detallan algunos aspectos clave de la gestión de memoria en Linux:</p> Mon, 15 May 2023 00:00:00 +0000 FreeIPA4 en una aplicación PHP utilizando Web App Authentication https://www.barrahome.org/integrando-la-autenticación-de-freeipa4-en-una-aplicación-php-utilizando-web-app-authentication <p>En el universo digital en el que nos movemos hoy día, es vital que nos aseguremos de que nuestras aplicaciones web están a salvo y protegidas. ¿Y sabes qué? FreeIPA4 es nuestro superhéroe en este aspecto. Este no es un simple sistema de gestión de identidades y políticas, es un verdadero guardián que ofrece funciones estupendas como autenticación centralizada, control de acceso y supervisión de políticas de seguridad. En las siguientes líneas, vamos a explorar cómo podemos hacer que FreeIPA4 se convierta en el defensor de nuestra aplicación web PHP. Usaremos el protocolo Web App Authentication y otros módulos como los que estan listados aqui:</p> <ul> <li>mod_auth_gssapi</li> <li>mod_auth_kerb </li> <li>mod_authnz_pam</li> <li>mod_intercept_form_submit</li> <li>mod_lookup_identity.</li> </ul> Tue, 09 May 2023 00:00:00 +0000 Como tener el menú contextual de Windows 10 en Windows 11 https://www.barrahome.org/como-tener-el-menú-contextual-de-windows-10-en-windows-11 <p>En Windows 11, el menú contextual (también conocido como menú de clic derecho) se ha actualizado y se ha simplificado en comparación con el de Windows 10. Sin embargo, todavía es posible acceder a algunas opciones adicionales en el menú contextual de Windows 10 que no se encuentran en el de Windows 11.</p> <p>Si deseas utilizar el menú contextual de Windows 10 en Windows 11, puedes hacer lo siguiente:</p> Sun, 16 Apr 2023 00:00:00 +0000 Condiciones lógicas OR y AND de Apache con SetEnvIf. https://www.barrahome.org/condiciones-lógicas-or-y-and-de-apache-con-setenvif <p>Desafortunadamente, el módulo Apache SetEnvIf no admite condiciones lógicas, como OR y AND. Específicamente, no es posible establecer una variable solo si se verifican condition1 Y/O condition2.</p> <p>Por ejemplo, para registrar todas las consultas POST realizadas desde la interfaz de bucle local en un archivo de registro separado, no se puede hacer esto:</p> <div class="codehilite"><pre><span></span><code><span class="w"> </span>CustomLog<span class="w"> </span>/var/log/apache2/loopback_posts.log<span class="w"> </span>combined<span class="w"> </span><span class="nv">env</span><span class="o">=</span>posting_myself <span class="w"> </span>SetEnvIf<span class="w"> </span>Remote_Addr<span class="w"> </span><span class="s2">&quot;^127\.0\.0\.1</span>$<span class="s2">&quot;</span><span class="w"> </span>AND<span class="w"> </span>Request_Method<span class="w"> </span><span class="s2">&quot;POST&quot;</span><span class="w"> </span>posting_myself </code></pre></div> <p>La primera línea es válida, solicita al servidor que registre todas las solicitudes en el archivo mencionado, solo si la variable de entorno posting_myself está establecida. La segunda línea intenta establecer la variable posting_myself si se cumplen dos condiciones (uso de un AND lógico), lo cual no es una sintaxis admitida. </p> Sun, 09 Apr 2023 00:00:00 +0000 CDN con Varnish, Nginx y Minio https://www.barrahome.org/cdn-con-varnish-nginx-y-minio <p>El artículo describe cómo crear un CDN (Content Delivery Network) utilizando Varnish, Nginx y Minio. Un CDN es una red de servidores distribuidos geográficamente que almacenan contenido web estático y lo entregan al usuario final desde el servidor más cercano. </p> <p>Utilizando Varnish como caché de nivel superior y Minio como almacenamiento de objetos, podemos construir un CDN escalable y de alto rendimiento. </p> <p>Nginx se utiliza como servidor web para servir el contenido estático y manejar la conexión SSL. El artículo proporciona una guía paso a paso para configurar cada uno de estos componentes y conectarlos para crear un CDN funcional.</p> Fri, 07 Apr 2023 00:00:00 +0000 Slowloris con Nginx https://www.barrahome.org/slowloris-con-nginx <p>Slowloris es un tipo de ataque DDoS que intenta agotar los recursos del servidor web manteniendo varias conexiones HTTP abiertas simultáneamente, pero sin completarlas. Si tu servidor web utiliza Nginx, puedes tomar medidas para protegerlo contra este tipo de ataque.</p> <p>Una forma de detener un ataque de Slowloris con Nginx es limitando el número máximo de conexiones por IP. Puedes hacerlo agregando las siguientes líneas al archivo de configuración de Nginx (/etc/nginx/nginx.conf):</p> Fri, 07 Apr 2023 00:00:00 +0000 Terraform con Proxmox Virtual Environment (PVE) https://www.barrahome.org/terraform-con-proxmox-virtual-environment-pve <p>Terraform es una herramienta de infraestructura como código (IaC) que permite a los desarrolladores y administradores de sistemas describir y crear infraestructura en la nube de manera automatizada y reproducible. Con Terraform, es posible definir toda la infraestructura necesaria para una aplicación o servicio, incluyendo recursos como instancias de máquinas virtuales, bases de datos, balanceadores de carga y más, todo ello como código.</p> <p>La creación de un módulo propio en Terraform es una de las mejores prácticas recomendadas para una gestión óptima del código. Un módulo es un conjunto de recursos que se combinan para ofrecer una funcionalidad común. Por ejemplo, un módulo puede contener los recursos necesarios para configurar un clúster de Kubernetes. Estos recursos pueden incluir instancias de máquinas virtuales, grupos de seguridad, reglas de firewall y más.</p> <p>Para crear un módulo propio en Terraform, se deben seguir los siguientes pasos:</p> Fri, 07 Apr 2023 00:00:00 +0000 Qué es mod_reqtimeout? https://www.barrahome.org/qué-es-mod-reqtimeout <p>"mod_reqtimeout" es un módulo de Apache que ayuda a prevenir ataques de denegación de servicio (DoS) y otros problemas relacionados con el tiempo de espera en el servidor. Este módulo se encarga de establecer límites de tiempo en las peticiones (requests) que llegan al servidor, de manera que si una petición tarda demasiado tiempo en procesarse, se cancela automáticamente.</p> Fri, 07 Apr 2023 00:00:00 +0000 Análisis literario, Martín Fierro por José Hernández. https://www.barrahome.org/el-martín-fierro-es-un-poema-épico-escrito-por-josé-hernán <p>"El Martín Fierro", compuesto por José Hernández en 1872, es un poema épico que narra las tribulaciones y desafíos de un gaucho argentino, Martín Fierro. Convocado para luchar contra los indígenas en la frontera, Fierro es forzado a dejar a su esposa e hijo en un ambiente desolado y hostil. Mientras enfrenta la soledad y la injusticia, Fierro mantiene firme su determinación por proteger a su familia y a su comunidad.</p> <p>El poema destaca temas como la soledad y la relación del gaucho con la naturaleza. Fierro, solo en la vasta pampa, enfrenta la adversidad del viento y el sol, pero al mismo tiempo, establece una conexión profunda y respetuosa con el entorno natural. En este sentido, la naturaleza no solo se presenta como un personaje omnipresente y desafiante, sino también como una entidad embellecedora. Un ejemplo de esto se observa en versos como "Los más grandes regalos / de los cielos abiertos / que el pobre tiene en la vida: / sol, viento y resolana".</p> Sun, 15 Jan 2023 00:00:00 +0000 NoSQL Pastebin basado en PHP. https://www.barrahome.org/nosql-pastebin-basado-en-php <p>Estuve dando vueltas por medio Internet, buscaba un servicio amigable de <a href="https://es.wikipedia.org/wiki/Pastebin">Pastebin</a> el cual no tuviera demasiados requerimientos. </p> <p>Al parecer, esto ultimo no es sencillo y todo lo existente requiere que altere mi instalación actual, por suerte <a href="https://github.com/LaisRast/cmdpb">existe</a> algo en PHP y MySQL, lo cual solo agrega como requerimiento lo ultimo mencionado.</p> <p>Aunque no me gusto inicialmente (Todo tiende a ser muy complicado o demasiado sencillo) pero decidí que seria bueno portar la implementación de dicho proyecto a una base de datos NoSQL o en este caso <a href="https://github.com/Lazer-Database/Lazer-Database">Lazer Database</a>, una base de datos <a href="https://en.wikipedia.org/wiki/Flat-file_database">Flat-File</a>.</p> <p>El proyecto puede ser clonado desde <a href="https://github.com/bet0x/bpaste">aquí</a>. Las instrucciones de como utilizar la aplicación están disponibles en el archivo <a href="https://github.com/bet0x/bpaste/blob/main/README.md">README.md</a>.</p> Sat, 24 Dec 2022 00:00:00 +0000 VMware ESXi 6.7 wget https://www.barrahome.org/vmware-esxi-6-7-wget <p>Cuando intente descargar la imagen iso de Red Hat Enterprise Linux me encontré con un error: </p> <div class="codehilite"><pre><span></span><code><span class="w"> </span>wget:<span class="w"> </span>error<span class="w"> </span>getting<span class="w"> </span>response:<span class="w"> </span>Interrupted<span class="w"> </span>system<span class="w"> </span>call </code></pre></div> <p>Dicho error se debe a la implementacion de busybox en VMware ESXi, el mismo se resuelve de una forma sencilla:</p> <p>Habilitamos <strong>httpClient</strong> con el siguiente comando:</p> Sat, 29 Oct 2022 00:00:00 +0000 Netplan, Ubuntu y como cambiar DHCP a Estático https://www.barrahome.org/netplan-ubuntu-y-como-cambiar-dhcp-a-estático <p>Esta es una receta rápida y fácil de implementar. Estos últimos días en los cuales he estado impartiendo capacitación uso mayormente una instalación de VMware ESXI y para las maquinas virtuales mayormente Ubuntu. </p> <p>Algo que no he tomado en cuenta y ahora con cada reboot es un problema fue la configuración de red. Por cuando ahora he decidido acomodar un poco mi red. Si bien podría utilizar algo liviano y simple como <a href="https://manpages.ubuntu.com/manpages/jammy/es/man8/dnsmasq.8.html">dnsmasq</a> he preferido configurar todo mediante <a href="https://manpages.ubuntu.com/manpages/jammy/en/man5/netplan.5.html">Netplan</a>. </p> <p>Sin mas preámbulos, aquí la receta simplificada de como configurar todo en menos de 5 minutos.</p> Wed, 26 Oct 2022 00:00:00 +0000 Apache Virtual Hosts con mod_macro https://www.barrahome.org/apache-virtual-hosts-con-mod-macro <p>Esta semana estuvo entretenida, una de mis búsquedas estuvo referida a la optimización de Virtual Hosts en Apache (1000+). La idea es no repetir código, que se pueda leer, que al buscar un Virtual Host este este presente mediante la ejecución de httpd -S. </p> <p>Y entre todas mis lecturas me encontré con <a href="https://httpd.apache.org/docs/2.4/mod/mod_macro.html">este</a> modulo. Básicamente, <strong>mod_macro</strong> nos permite: Proporciona macros dentro de los archivos de configuración de tiempo de ejecución de Apache httpd, para facilitar el proceso de creación de numerosos bloques de configuración similares. Cuando se inicia el servidor, las macros se expanden utilizando los parámetros proporcionados y el resultado se procesa junto con el resto del archivo de configuración.</p> Sat, 08 Oct 2022 00:00:00 +0000 Una vista rapida a ngx_http_headers_module https://www.barrahome.org/una-vista-rapida-a-ngx-http-headers-module <p>El modulo de <strong><a href="https://nginx.org/en/docs/http/ngx_http_headers_module.html">ngx_http_headers_module</a></strong> nos permite agregar la cabecera de <strong>Expires</strong> y <strong>Cache-Control</strong> y otros campos arbitrarios a una cabecera de respuesta.</p> <p>Para controlar las hojas de estilo, JavaScript, images y otros utilizo el siguiente código: </p> <div class="codehilite"><pre><span></span><code><span class="w"> </span><span class="c1"># Expires map</span> <span class="w"> </span>map<span class="w"> </span><span class="nv">$sent_http_content_type</span><span class="w"> </span><span class="nv">$expires</span><span class="w"> </span><span class="o">{</span> <span class="w"> </span>default<span class="w"> </span>off<span class="p">;</span> <span class="w"> </span>text/css<span class="w"> </span>30d<span class="p">;</span> <span class="w"> </span>application/javascript<span class="w"> </span>30d<span class="p">;</span> <span class="w"> </span>application/font-woff<span class="w"> </span>30d<span class="p">;</span> <span class="w"> </span>application/font-woff2<span class="w"> </span>30d<span class="p">;</span> <span class="w"> </span>application/font-ttf<span class="w"> </span>30d<span class="p">;</span> <span class="w"> </span>font/opentype<span class="w"> </span>30d<span class="p">;</span> <span class="w"> </span>image/apng<span class="w"> </span>30d<span class="p">;</span> <span class="w"> </span>image/avif<span class="w"> </span>30d<span class="p">;</span> <span class="w"> </span>image/gif<span class="w"> </span>30d<span class="p">;</span> <span class="w"> </span>image/jpeg<span class="w"> </span>30d<span class="p">;</span> <span class="w"> </span>image/png<span class="w"> </span>30d<span class="p">;</span> <span class="w"> </span>image/svg+xml<span class="w"> </span>30d<span class="p">;</span> <span class="w"> </span>image/webp<span class="w"> </span>30d<span class="p">;</span> <span class="w"> </span><span class="o">}</span> </code></pre></div> Sat, 08 Oct 2022 00:00:00 +0000 Nginx y Apache Security Headers https://www.barrahome.org/nginx-y-apache-security-headers <p>Security Headers para Apache y Nginx actualizados, una breve reseña de los mismos. Este breve articulo no es mas que una nota o cheatsheet de los security headers a utilizar y requeridos en su mayoría. Si desean leer sobre el tema pueden seguir el <a href="https://owasp.org/www-project-secure-headers/">siguiente enlace.</a></p> <div class="codehilite"><pre><span></span><code><span class="w"> </span>add_header<span class="w"> </span>X-Frame-Options<span class="w"> </span><span class="s2">&quot;SAMEORIGIN&quot;</span><span class="w"> </span>always<span class="p">;</span> <span class="w"> </span>add_header<span class="w"> </span>X-Permitted-Cross-Domain-Policies<span class="w"> </span><span class="s2">&quot;none&quot;</span><span class="w"> </span>always<span class="p">;</span> <span class="w"> </span>add_header<span class="w"> </span>Feature-Policy<span class="w"> </span><span class="s2">&quot;microphone none;camera none;geolocation none;&quot;</span><span class="p">;</span> <span class="w"> </span>add_header<span class="w"> </span>X-XSS-Protection<span class="w"> </span><span class="s2">&quot;1; mode=block&quot;</span><span class="w"> </span>always<span class="p">;</span> <span class="w"> </span>add_header<span class="w"> </span>X-Content-Type-Options<span class="w"> </span><span class="s2">&quot;nosniff&quot;</span><span class="w"> </span>always<span class="p">;</span> <span class="w"> </span>add_header<span class="w"> </span>Referrer-Policy<span class="w"> </span><span class="s2">&quot;no-referrer-when-downgrade&quot;</span><span class="w"> </span>always<span class="p">;</span> <span class="w"> </span>add_header<span class="w"> </span>Content-Security-Policy<span class="w"> </span><span class="s2">&quot;default-src * data: &#39;unsafe-eval&#39; &#39;unsafe-inline&#39;&quot;</span><span class="w"> </span>always<span class="p">;</span> <span class="w"> </span>add_header<span class="w"> </span>Strict-Transport-Security<span class="w"> </span><span class="s2">&quot;max-age=31536000; includeSubDomains; preload&quot;</span><span class="w"> </span>always<span class="p">;</span> <span class="w"> </span>add_header<span class="w"> </span>Expect-CT<span class="w"> </span><span class="s2">&quot;max-age=31536000; report-uri=https://www.barrahome.org/contact&quot;</span><span class="p">;</span> <span class="w"> </span>add_header<span class="w"> </span>Access-Control-Allow-Origin<span class="w"> </span><span class="s2">&quot;*&quot;</span><span class="w"> </span>always<span class="p">;</span> </code></pre></div> <p>El equivalente para Apache seria utilizando algo como esto:</p> <div class="codehilite"><pre><span></span><code><span class="w"> </span>&lt;IfModule<span class="w"> </span>mod_headers.c&gt; <span class="w"> </span>Header<span class="w"> </span>always<span class="w"> </span><span class="nb">set</span><span class="w"> </span>X-XSS-Protection<span class="w"> </span><span class="s2">&quot;1; mode=block&quot;</span> <span class="w"> </span>&lt;IfModule<span class="w"> </span>mod_headers.c&gt; </code></pre></div> <p>Pueden observar los resultados aplicados en este blog visitando el sitio de <a href="https://www.serpworx.com/check-security-headers/?url=https%3A%2F%2Fwww.barrahome.org%2F">Serpworx</a>.</p> Wed, 05 Oct 2022 00:00:00 +0000 Apache con ExecCGI y FPM https://www.barrahome.org/apache-con-execcgi-y-fpm <p>Una simple receta con notas de como se debe configurar un Virtual Host con Apache para que ejecute CGIs y PHP.</p> <p>Esta configuración de Apache se realizo bajo Ubuntu 22.04 con el modulo de <strong>proxy_fcgi</strong> , <strong>setenvif</strong> y <strong>cgid</strong>. El modulo <strong>cgid</strong> se habilita cuando nuestro MPM es <strong>event</strong> mientras que cuando ejecutamos <strong>prefork</strong> el modulo a utilizar es <strong>cgi</strong>. </p> <p><em>En Ubuntu se habilita o deshabilita el modulo mediante el comando:</em> <strong>a2enmod cgi{d}</strong> dependiendo del MPM a utilizar. Para conocer mas sobre estos comandos <strong>a2enmod/a2dismod</strong> pueden visitar el siguiente <a href="https://manpages.ubuntu.com/manpages/bionic/man8/a2enmod.8.html">enlace</a>. Para PHP-FPM puede que deban ejecutar <strong>a2enconf</strong> y pueden leer mas sobre esto en este otro <a href="https://manpages.ubuntu.com/manpages/trusty/man8/a2enconf.8.html">enlace</a>.</p> Thu, 22 Sep 2022 00:00:00 +0000 post-merge con Python en Linux https://www.barrahome.org/post-merge-con-python-en-linux <p>Actualizando mi blog con Github, Gitup via post-merge con un backend en Flask (Python) en Linux. Voy a utilizar y modificar la siguiente implementación para el hook de <a href="https://git-scm.com/docs/githooks#_post_merge">post-merge</a> en git. </p> <div class="codehilite"><pre><span></span><code><span class="w"> </span><span class="c1">#!/usr/bin/env bash</span> <span class="w"> </span><span class="c1"># MIT © Sindre Sorhus - sindresorhus.com</span> <span class="w"> </span><span class="c1"># git hook to run a command after `git pull` if a specified file was changed</span> <span class="w"> </span><span class="c1"># Run `chmod +x post-merge` to make it executable then put it into `.git/hooks/`.</span> <span class="w"> </span><span class="nv">changed_files</span><span class="o">=</span><span class="s2">&quot;</span><span class="k">$(</span>git<span class="w"> </span>diff-tree<span class="w"> </span>-r<span class="w"> </span>--name-only<span class="w"> </span>--no-commit-id<span class="w"> </span>ORIG_HEAD<span class="w"> </span>HEAD<span class="k">)</span><span class="s2">&quot;</span> <span class="w"> </span>check_run<span class="o">()</span><span class="w"> </span><span class="o">{</span> <span class="w"> </span><span class="nb">echo</span><span class="w"> </span><span class="s2">&quot;</span><span class="nv">$changed_files</span><span class="s2">&quot;</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>grep<span class="w"> </span>--quiet<span class="w"> </span><span class="s2">&quot;</span><span class="nv">$1</span><span class="s2">&quot;</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="nb">eval</span><span class="w"> </span><span class="s2">&quot;</span><span class="nv">$2</span><span class="s2">&quot;</span> <span class="w"> </span><span class="o">}</span> <span class="w"> </span><span class="c1"># Example usage</span> <span class="w"> </span><span class="c1"># In this example it&#39;s used to run `npm install` if package.json changed</span> <span class="w"> </span>check_run<span class="w"> </span>*website/content*<span class="w"> </span><span class="s2">&quot;systemctl reload barrahome&quot;</span> </code></pre></div> Mon, 19 Sep 2022 00:00:00 +0000 Gitup Barrahome https://www.barrahome.org/gitup-barrahome <p>Guía rápida de como utilizar Gitup para actualizar mi blog automáticamente. </p> <p>Instalamos Gitup:</p> <div class="codehilite"><pre><span></span><code><span class="w"> </span>sudo<span class="w"> </span>pip3<span class="w"> </span>install<span class="w"> </span>gitup </code></pre></div> <p>Habilitamos el repositorio el cual actualizaremos:</p> <div class="codehilite"><pre><span></span><code><span class="w"> </span>gitup<span class="w"> </span>--add<span class="w"> </span>~/barrahome-flask </code></pre></div> <p>Creamos una entrada de cron:</p> <div class="codehilite"><pre><span></span><code><span class="w"> </span>crontad<span class="w"> </span>-e </code></pre></div> <p>Agregamos la siguiente entrada:</p> <div class="codehilite"><pre><span></span><code><span class="w"> </span>*/5<span class="w"> </span>*<span class="w"> </span>*<span class="w"> </span>*<span class="w"> </span>*<span class="w"> </span>gitup<span class="w"> </span>--update </code></pre></div> <p>Si deseamos listar los repositorios que tenemos para actualizar podemos ejecutar lo siguiente:</p> <div class="codehilite"><pre><span></span><code><span class="w"> </span>gitup<span class="w"> </span>--list </code></pre></div> <p>Nos dará como salida algo como esto:</p> <div class="codehilite"><pre><span></span><code><span class="w"> </span><span class="o">[</span>alberto@barrahome<span class="w"> </span>barrahome-flask<span class="o">]</span>$<span class="w"> </span>gitup<span class="w"> </span>--list <span class="w"> </span>gitup:<span class="w"> </span>the<span class="w"> </span>git-repo-updater <span class="w"> </span>Current<span class="w"> </span>bookmarks: <span class="w"> </span>/home/alberto/barrahome-flask <span class="w"> </span><span class="o">[</span>alberto@barrahome<span class="w"> </span>barrahome-flask<span class="o">]</span>$ </code></pre></div> Sun, 18 Sep 2022 00:00:00 +0000 Gunicorn reload Systemd https://www.barrahome.org/gunicorn-reload-systemd <p>Recargar la configuración o cambios de Gunicorn mediante Systemd.</p> <p>Se agregan estas las lineas <strong>ExecReload</strong> y <strong>ExecStop</strong> al "unit" de systemd.</p> <p>El <a href="/gunicorn-flask-systemd">siguiente</a> articulo describe la utilización y otros temas:</p> <div class="codehilite"><pre><span></span><code><span class="w"> </span><span class="o">[</span>alberto@barrahome<span class="w"> </span>barrahome-flask<span class="o">]</span>$<span class="w"> </span>cat<span class="w"> </span>/etc/systemd/system/barrahome.service <span class="w"> </span><span class="o">[</span>Unit<span class="o">]</span> <span class="w"> </span><span class="nv">Description</span><span class="o">=</span>Barrahome<span class="w"> </span>web<span class="w"> </span>application <span class="w"> </span><span class="nv">After</span><span class="o">=</span>network.target <span class="w"> </span><span class="o">[</span>Service<span class="o">]</span> <span class="w"> </span><span class="nv">User</span><span class="o">=</span>alberto <span class="w"> </span><span class="nv">Group</span><span class="o">=</span>alberto <span class="w"> </span><span class="nv">WorkingDirectory</span><span class="o">=</span>/home/alberto/barrahome-flask <span class="w"> </span><span class="nv">ExecStart</span><span class="o">=</span>/usr/bin/python3<span class="w"> </span>/usr/bin/gunicorn<span class="w"> </span>--bind<span class="w"> </span><span class="m">127</span>.0.0.1:8000<span class="w"> </span>website:app<span class="w"> </span>--pid<span class="o">=</span>barrahome.pid <span class="w"> </span><span class="nv">ExecReload</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>/bin/kill<span class="w"> </span>-s<span class="w"> </span>HUP<span class="w"> </span><span class="nv">$MAINPID</span> <span class="w"> </span><span class="nv">ExecStop</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>/bin/kill<span class="w"> </span>-s<span class="w"> </span>TERM<span class="w"> </span><span class="nv">$MAINPID</span> <span class="w"> </span><span class="o">[</span>Install<span class="o">]</span> <span class="w"> </span><span class="nv">WantedBy</span><span class="o">=</span>multi-user.target <span class="w"> </span><span class="o">[</span>alberto@barrahome<span class="w"> </span>barrahome-flask<span class="o">]</span>$ </code></pre></div> <p>Luego ejecutamos:</p> <div class="codehilite"><pre><span></span><code><span class="w"> </span><span class="o">[</span>alberto@barrahome<span class="w"> </span>barrahome-flask<span class="o">]</span>$<span class="w"> </span>sudo<span class="w"> </span>systemctl<span class="w"> </span>daemon-reload <span class="w"> </span><span class="o">[</span>alberto@barrahome<span class="w"> </span>barrahome-flask<span class="o">]</span>$<span class="w"> </span>sudo<span class="w"> </span>systemctl<span class="w"> </span>reload<span class="w"> </span>barrahome </code></pre></div> Sun, 18 Sep 2022 00:00:00 +0000 Problemas con particiones en USB usando DD https://www.barrahome.org/problemas-con-particiones-en-usb-usando-dd <p>Un error que al parecer es común, luego de usar dd es que nuestro USB queda funcionando mal… al punto que formatearlo con gparted u otras herramientas es un problema, se quejara del inicio de sectores 2048, dará algún mensaje de invalido o:</p> <div class="codehilite"><pre><span></span><code><span class="w"> </span>physical<span class="w"> </span>block<span class="w"> </span>size<span class="w"> </span>is<span class="w"> </span><span class="m">512</span><span class="w"> </span>bytes,<span class="w"> </span>but<span class="w"> </span>Linux<span class="w"> </span>says<span class="w"> </span>it<span class="w"> </span>is<span class="w"> </span><span class="m">2048</span><span class="w"> </span>bytes </code></pre></div> <p>Esto se puede arreglar fácilmente con los siguientes comandos:</p> <div class="codehilite"><pre><span></span><code><span class="w"> </span>sudo<span class="w"> </span>parted<span class="w"> </span>/dev/sde<span class="w"> </span>mklabel<span class="w"> </span>msdos <span class="w"> </span>sudo<span class="w"> </span>parted<span class="w"> </span>-a<span class="w"> </span>none<span class="w"> </span>/dev/sde<span class="w"> </span>mkpart<span class="w"> </span>primary<span class="w"> </span>fat32<span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">2048</span> <span class="w"> </span>sudo<span class="w"> </span>mkfs.vfat<span class="w"> </span>-n<span class="w"> </span><span class="s2">&quot;Disk&quot;</span><span class="w"> </span>/dev/sde1 </code></pre></div> <p>Ahora podremos abrir fdisk o gparted y no tendremos el error de bloques inválidos.</p> Mon, 10 May 2021 00:00:00 +0000 DNS personalizado con Systemd y Ubuntu o CentOS https://www.barrahome.org/dns-personalizado-con-systemd-y-ubuntu-o-centos <p>Para los que no saben… y para mi que suelo olvidarme, no se puede editar resolv.conf como si nada, ahora debemos cambiar las DNS en otro fichero… para esto me creo esta entrada, a modo de recordatorio.</p> <p>Configuramos las direcciones DNS en el archivo ubicado en /etc/systemd/resolved.conf, luego modificamos el parámetro comentado DNS y agregar los valores deseados:</p> Tue, 16 Feb 2021 00:00:00 +0000 Centos Apache SELinux https://www.barrahome.org/centos-apache-selinux <p>Guía rápida de como habilitar SELinux con Apache en Centos 7/8 utilizando directorio personal y otros características.</p> <p>Esto es ciertamente muy básico pero útil y practico. Tener en cuenta que hay pasos los cuales me salte dado que cualquiera leyendo esto tiene una noción básica de lo que estoy escribiendo.</p> <p>Luego de instalar Apache con dnf o yum pasamos a permitir Apache con el siguiente comando:</p> <div class="codehilite"><pre><span></span><code><span class="w"> </span>sudo<span class="w"> </span>setsebool<span class="w"> </span>-P<span class="w"> </span>httpd_can_network_connect<span class="w"> </span><span class="m">1</span> <span class="w"> </span>sudo<span class="w"> </span>setsebool<span class="w"> </span>-P<span class="w"> </span>httpd_enable_homedirs<span class="w"> </span><span class="m">1</span> </code></pre></div> <p>Si quieren saber que otras opciones existen en el contexto de httpd pueden ejecutar esta variante:</p> <div class="codehilite"><pre><span></span><code><span class="w"> </span>sudo<span class="w"> </span>getsebool<span class="w"> </span>-a<span class="w"> </span><span class="p">|</span><span class="w"> </span>grep<span class="w"> </span><span class="s2">&quot;httpd_can&quot;</span> </code></pre></div> Sun, 15 Nov 2020 00:00:00 +0000 Como mover AppData en Microsoft Windows y no morir en el intento https://www.barrahome.org/como-mover-appdata-en-microsoft-windows-y-no-morir-en-el-intento <p>Algo que me molesta de las plataformas de Microsoft es lo poco dinámicas que son a la hora de querer acomodar los datos según la preferencia del usuario, no existe tal opción mas allá de los “hacks” manuales, con este procedimiento el cual quiero enseñar podemos mover el perfil de un usuario o la totalidad de la carpeta de usuarios a otra partición y no tener problemas, ahorrando quizás espacio o velocidad, según la necesidad del administrador.</p> <p>Se que uno u otro recomendara particiones remotas, pero no todos usan un servidor de directorio y esta solución es para el “día a día”.</p> <p>En mi caso, el equipo el cual tiene instalado Microsoft Windows usa dos discos, uno SSD de 128 GB para la unidad C:\ y un disco secundario de 2 TB WD Caviar Black para storage. Esta configuración servirá para cualquier instalación de Microsoft Windows 7 y es bastante simple.</p> Tue, 10 Nov 2020 00:00:00 +0000 Gunicorn Flask Systemd https://www.barrahome.org/gunicorn-flask-systemd <p>Instalación rápida de Gunicorn utilizando Systemd</p> <h2>Introducción</h2> <p>Creamos un servicio, en este caso se llamara como mi blog.</p> <div class="codehilite"><pre><span></span><code><span class="w"> </span><span class="o">[</span>alberto@barrahome<span class="w"> </span>barrahome-flask<span class="o">]</span>$<span class="w"> </span>sudo<span class="w"> </span>nano<span class="w"> </span>/etc/systemd/system/barrahome.service </code></pre></div> <p>Agregamos el siguiente contenido:</p> <div class="codehilite"><pre><span></span><code><span class="w"> </span><span class="o">[</span>Unit<span class="o">]</span> <span class="w"> </span><span class="nv">Description</span><span class="o">=</span>Barrahome<span class="w"> </span>web<span class="w"> </span>application <span class="w"> </span><span class="nv">After</span><span class="o">=</span>network.target <span class="w"> </span><span class="o">[</span>Service<span class="o">]</span> <span class="w"> </span><span class="nv">User</span><span class="o">=</span>alberto <span class="w"> </span><span class="nv">Group</span><span class="o">=</span>alberto <span class="w"> </span><span class="nv">WorkingDirectory</span><span class="o">=</span>/home/alberto/barrahome-flask <span class="w"> </span><span class="nv">ExecStart</span><span class="o">=</span>/usr/bin/python3<span class="w"> </span>/usr/bin/gunicorn<span class="w"> </span>--bind<span class="w"> </span><span class="m">0</span>.0.0.0:8000<span class="w"> </span>boot:app <span class="w"> </span><span class="o">[</span>Install<span class="o">]</span> <span class="w"> </span><span class="nv">WantedBy</span><span class="o">=</span>multi-user.target </code></pre></div> Thu, 05 Nov 2020 00:00:00 +0000 Deshabilitar actualizaciones forzadas en Windows 10 https://www.barrahome.org/deshabilitar-actualizaciones-forzadas-en-windows-10 <p>Si bien esto en ambientes de producción y con manejo de información delicada no es recomendable lo he hecho en mi laptop y así no tener que sufrir esos GB de descarga con 3 MB DSL. Sugiero armar alguna aplicación la cual active e inicie el servicio y fuerce la consulta de las actualizaciones de forma programada. Ahí veremos si la creo en algún futuro.</p> <p>Esta pequeña entrada sale a la luz porque decidí usar Windows 10 pero me he topado con muchos problemas relacionados a las actualizaciones constantes y la imposibilidad de limitar realmente el ancho de banda.</p> <p>Y sin más preámbulos, comenzaré con la breve explicación.</p> Fri, 10 Jul 2020 00:00:00 +0000 Como desinstalar la actualización KB3035583 de Windows 7 https://www.barrahome.org/como-desinstalar-la-actualización-kb3035583-de-windows-7 <p>Un amigo me pregunto si era posible des-instalar la notificación para actualizar a Windows 10, aquí les dejo un comando simple rápido y efectivo para no tener que andar buscándola a mano. Se que ya no se debería usar Windows 7, pero cada quien con lo que tiene o puede.</p> <p>Para los que no saben, ejecutan lo siguiente en la consola (cmd.exe) esta debe tener permisos de administrador, por cuanto iniciaremos cmd.exe como administrador usando la siguiente sentencia:</p> <div class="codehilite"><pre><span></span><code><span class="w"> </span>runas<span class="w"> </span>/noprofile<span class="w"> </span>/user:Administrator<span class="w"> </span>cmd.exe </code></pre></div> <p>Nos pedirá autorización, y luego en la consola de administrador ejecutamos finalmente esto:</p> <div class="codehilite"><pre><span></span><code><span class="w"> </span>wusa<span class="w"> </span>/uninstall<span class="w"> </span>/kb:3035583 </code></pre></div> Tue, 10 Oct 2017 00:00:00 +0000