<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>rengtech</title><link href="/" rel="alternate"/><link href="feeds/all.atom.xml" rel="self"/><id>/</id><updated>2026-03-31T00:00:00-06:00</updated><subtitle>Canal de Linux - Domina Linux a Tu Ritmo</subtitle><entry><title>Winboat: Windows dentro de Docker para Linux</title><link href="ruta/winboat-windows-dentro-de-docker-para-linux/" rel="alternate"/><published>2026-03-31T00:00:00-06:00</published><updated>2026-03-31T00:00:00-06:00</updated><author><name>rengtech</name></author><id>tag:None,2026-03-31:ruta/winboat-windows-dentro-de-docker-para-linux/</id><summary type="html">&lt;p&gt;Hoy tratamos el mayor problema que tenemos cuando queremos dar el salto a Linux o cuando ya estamos aquí y nos topamos con el muro del software privativo de Windows. Se llama Winboat, y básicamente es Windows ejecutándose dentro de Docker de una forma tan optimizada que el rendimiento es sorprendente.&lt;/p&gt;</summary><content type="html">&lt;hr&gt;
&lt;p&gt;Muy buenas tardes a todos y bienvenidos a otro vídeo para el canal. Hoy vamos a tratar el mayor problema que tenemos cuando queremos dar el salto a Linux o cuando ya estamos aquí y nos topamos con el muro del software privativo de Windows. Todos hemos pasado por ahí: te gusta el rendimiento de tu distro —en mi caso ya sabéis que le estoy dando caña a CachyOS—, pero de repente necesitas ese Excel con macros complejas, el Photoshop para algo puntual, o cualquier herramienta de ingeniería que solo corre en &lt;code&gt;.exe&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;¿Qué opciones tenemos? Pues hasta ahora era o pelearse con Wine y sus dependencias, o montar una máquina virtual pesada en VirtualBox que se come los recursos y te deja el PC tiritando. Pero hoy os traigo algo que funciona de una forma mucho más eficiente. Se llama &lt;strong&gt;Winboat&lt;/strong&gt;, y básicamente es Windows ejecutándose dentro de Docker de una forma tan optimizada que el rendimiento es sorprendente.&lt;/p&gt;
&lt;h2&gt;Qué es Winboat y cómo funciona&lt;/h2&gt;
&lt;p&gt;Lo primero que hay que entender es que Winboat no es una virtualización tradicional al uso. Si habéis usado VirtualBox o VMware, sabéis que el despliegue es un coñazo: descargar la ISO, configurar la BIOS virtual, instalar todo desde cero... es un proceso que se hace eterno. Winboat rompe con eso porque utiliza contenedores de Docker, o Podman si preferís, para levantar una instancia de Windows 11 Pro ya optimizada. Es lo que llamamos &lt;em&gt;Windows inside Docker&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Al usar una imagen ya preparada, te ahorras toda la parte aburrida de la instalación. La aplicación levanta el contenedor y, en cuestión de segundos, ya tienes un Windows 11 funcional.&lt;/p&gt;
&lt;h2&gt;Requisitos y configuración inicial&lt;/h2&gt;
&lt;p&gt;Para que esto funcione bien, solo necesitáis un par de cosas básicas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Virtualización habilitada en la BIOS&lt;/strong&gt;: si no tenéis eso, ninguna herramienta de este tipo va a tirar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docker instalado y configurado&lt;/strong&gt; en vuestra distro.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Una vez que lanzáis Winboat, la interfaz de configuración es súper directa, no tiene pérdida. Podéis asignar los núcleos de CPU que queréis, la RAM —os recomiendo al menos 8 GB si vais a usar Office pesado— y el espacio en disco. Lo bueno es que estos cambios se pueden ajustar después si veis que os habéis quedado cortos.&lt;/p&gt;
&lt;h2&gt;Passthrough USB y hardware serial&lt;/h2&gt;
&lt;p&gt;Aquí es donde Winboat destaca, porque uno de los mayores dolores de cabeza en Linux es trabajar con hardware que solo tiene drivers para Windows. Hablo de programadores de Arduino o sistemas que usen comunicación serial USB. A veces, pasar un puerto USB a una máquina virtual tradicional es una lotería: que si no lo reconoce, que si la latencia es demasiado alta...&lt;/p&gt;
&lt;p&gt;En Winboat el passthrough de dispositivos USB es sólido. Simplemente conectas el dispositivo, lo mapeas en la configuración de Winboat y listo. La comunicación serial funciona a la primera, lo que lo convierte en una herramienta de trabajo real para no perder el tiempo.&lt;/p&gt;
&lt;h2&gt;Integración de aplicaciones en el escritorio de Linux&lt;/h2&gt;
&lt;p&gt;Lo que realmente es interesante es la integración de las aplicaciones. No hace falta que estéis viendo el escritorio de Windows 11 con su barra de tareas si no queréis. Winboat utiliza un renderizado RDP de baja latencia que es totalmente transparente para el usuario. Podéis abrir Microsoft Excel o Photoshop, y la ventana aparecerá en vuestro escritorio de Linux como si fuera una aplicación más.&lt;/p&gt;
&lt;p&gt;Se integra con vuestro gestor de ventanas: podéis moverla y redimensionarla igual que haríais con vuestra terminal. La experiencia es fluida, no sientes que estás dentro de una máquina virtual, parece que tienes las aplicaciones nativas en Linux.&lt;/p&gt;
&lt;p&gt;Esto es un punto clave comparado con herramientas como &lt;strong&gt;WinApps&lt;/strong&gt;, que está bien pero la configuración es bastante más manual y a veces falla. Winboat simplifica esto para que no tengáis que preocuparos de lo que pasa en segundo plano.&lt;/p&gt;
&lt;h2&gt;Limitaciones actuales: sin GPU Passthrough&lt;/h2&gt;
&lt;p&gt;Ahora bien, no todo es perfecto y aquí es donde quiero que prestéis atención. A día de hoy, Winboat en la versión que estoy probando, la &lt;strong&gt;0.8.7 beta&lt;/strong&gt;, no tiene soporte para GPU Passthrough. ¿Qué significa esto? Pues que no tenéis aceleración gráfica por hardware.&lt;/p&gt;
&lt;p&gt;Si vuestra intención es instalar Winboat para jugar a títulos pesados o para hacer edición de vídeo 4K en Premiere, esta no es la herramienta. Para eso sigue siendo mejor una máquina virtual con KVM y una tarjeta dedicada.&lt;/p&gt;
&lt;p&gt;Pero para tareas intensivas de CPU, el rendimiento es espectacular. No hay latencia, el ratón se mueve fluido y las aplicaciones responden al instante. Incluso OneDrive, que suele dar problemas en Linux, aquí funciona sin complicaciones: puedes tener tus archivos sincronizados en segundo plano dentro del contenedor y listo.&lt;/p&gt;
&lt;h2&gt;Por qué tiene sentido usar Winboat&lt;/h2&gt;
&lt;p&gt;Al final, esto vuelve a lo que siempre buscamos: eficiencia y control. Usar Winboat es una forma de aislar a Windows en un contenedor para que no ensucie nuestro sistema principal. No tienes telemetría de Microsoft corriendo directamente en tu kernel ni actualizaciones forzosas que te cortan el ritmo de trabajo. Tienes un entorno controlado que puedes borrar o recrear en segundos si algo sale mal.&lt;/p&gt;
&lt;p&gt;Es una solución técnica elegante para un problema recurrente: aprovechar la potencia de Docker para facilitarnos la vida a los que usamos Linux pero que, por trabajo o necesidad, dependemos de un par de herramientas de Microsoft.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;En definitiva, Winboat es la forma más sencilla y estable que he probado de tener aplicaciones de Windows en Linux sin complicaciones. Si estáis cansados de que Wine os dé errores o de que VirtualBox os consuma demasiados recursos, dadle una oportunidad porque funciona realmente bien.&lt;/p&gt;
&lt;p&gt;Si os ha gustado el vídeo, dejádmelo abajo en los comentarios. No olvidéis suscribiros para más contenido sobre Linux y herramientas brutales como esta. ¡Hasta luego!&lt;/p&gt;</content><category term="Ruta"/><category term="ruta"/><category term="linux"/><category term="docker"/><category term="windows"/><category term="winboat"/><category term="virtualización"/><category term="contenedores"/></entry><entry><title>Por qué elegir Debian sobre Ubuntu</title><link href="ruta/por-que-elegir-debian-sobre-ubuntu/" rel="alternate"/><published>2025-02-16T00:00:00-06:00</published><updated>2025-02-16T00:00:00-06:00</updated><author><name>rengtech</name></author><id>tag:None,2025-02-16:ruta/por-que-elegir-debian-sobre-ubuntu/</id><summary type="html">&lt;p&gt;Muy buenas a todos y bienvenidos. Hoy hablamos de un tema que puede generar mucho debate: Debian o Ubuntu. Si estás pensando en dar el salto a Linux o llevas tiempo usando distribuciones Linux y buscas una experiencia más pura, quédate: te doy varias razones por las que Debian, en mi opinión, le da mil vueltas a Ubuntu.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Muy buenas a todos y bienvenidos. Hoy hablamos de un tema que puede generar mucho debate: &lt;strong&gt;Debian o Ubuntu&lt;/strong&gt;. Si estás pensando en dar el salto a Linux o llevas tiempo usando distribuciones Linux y buscas una experiencia más pura, quédate: te doy varias razones por las que Debian, en mi opinión, le da mil vueltas a Ubuntu.&lt;/p&gt;
&lt;p&gt;Todos sabemos que Ubuntu es la distribución de entrada de muchos usuarios al mundo de Linux: es fácil, intuitiva y tiene una gran comunidad detrás. Pero ¿a qué coste? Últimamente usar Ubuntu se siente como utilizar Windows 11 o Android en Linux. Canonical, la empresa detrás de Ubuntu, ha tomado un camino muy comercial y eso se nota. Te meten los snaps por los ojos aunque no los quieras. ¿Quieres utilizar Flatpak? Puedes, pero no viene habilitado por defecto; por defecto van a snaps. Y no olvidemos la telemetría, que parece sacada de Windows 10 o 11 al estilo Microsoft. ¿De verdad queremos escapar de Windows para meternos en algo parecido pero en Linux?&lt;/p&gt;
&lt;p&gt;Si buscas libertad y control, aquí van &lt;strong&gt;cinco razones&lt;/strong&gt; para elegir Debian sobre Ubuntu.&lt;/p&gt;
&lt;h2&gt;1. Olvídate de las imposiciones&lt;/h2&gt;
&lt;p&gt;En Debian ya no tienes una empresa forzándote a usar su tecnología. No hay snaps obligatorios, no hay telemetría extraña, no hay pop-ups constantes de "pásate a Ubuntu Pro". Debian es una distribución 100% libre y de la comunidad. Tú tienes el control total.&lt;/p&gt;
&lt;h2&gt;2. Estabilidad&lt;/h2&gt;
&lt;p&gt;Tienes una distribución con una estabilidad legendaria. ¿Cansado de que una actualización te rompa paquetes del sistema, de que te llenen los mismos &lt;code&gt;apt&lt;/code&gt; para instalar paquetes o de que te rompa cualquier tipo de compatibilidad? Debian es famoso por su estabilidad. Sus paquetes no son los más nuevos —están bastante atrasados—, pero están probados hasta la saciedad. Son versiones más antiguas, pero con la garantía de que van a funcionar al 100%. No es como Ubuntu LTS u otras donde cualquier actualización te puede romper algo. Con Debian tu sistema simplemente va a funcionar. Puede ser una distribución más "aburrida" en cuanto a novedades, pero es un sistema en el que puedes confiar para trabajar sin problemas, sabiendo que siempre va a arrancar y funcionar correctamente.&lt;/p&gt;
&lt;h2&gt;3. Minimalismo y personalización real&lt;/h2&gt;
&lt;p&gt;Ubuntu viene cargado de software que probablemente nunca vas a utilizar: consume recursos y espacio. Eso en inglés se llama &lt;em&gt;bloatware&lt;/em&gt;. Debian en cambio te da una base limpia, un lienzo en blanco. ¿Quieres un entorno de escritorio? Elige el que quieras. ¿Quieres construir tu sistema personalizado a tu gusto? Adelante. No tienes bloatware ni añadidos innecesarios: tienes los entornos de escritorio tal como los han hecho los desarrolladores, sin customización impuesta. Tú tienes la base de ese entorno (por ejemplo GNOME, Cinnamon, MATE o el que quieras) y puedes hacer lo que quieras sobre ello. En Ubuntu tienes la customización de GNOME hecha por Canonical; en Debian instalas GNOME y tienes GNOME por defecto, y haces con él lo que tú quieras.&lt;/p&gt;
&lt;h2&gt;4. Actualizaciones cuando tú quieras&lt;/h2&gt;
&lt;p&gt;Ubuntu te obliga a un ritmo de actualizaciones cada seis meses (abril y octubre): versiones nuevas con paquetes actualizados, etc. Con Debian el ciclo es más relajado: una nueva versión estable cada aproximadamente dos años y actualizaciones de mantenimiento. Eso te da una tranquilidad increíble; no tienes que estar constantemente preocupado por la siguiente gran actualización.&lt;/p&gt;
&lt;h2&gt;5. La base de todo&lt;/h2&gt;
&lt;p&gt;¿Sabías que Ubuntu está basado en Debian? Es un Debian con customización, software extra y demás hecho por Canonical. Entonces, ¿para qué usar algo tocado por una empresa cuando no aporta gran cosa? Si quieres la base, puedes usar la base y hacer con ella lo que tú quieras. ¿Por qué usar la copia modificada y comercial de Canonical cuando puedes usar la fuente? Usar Debian es entender verdaderamente la filosofía de Linux: libertad, control y una comunidad que ayuda a construir algo entre todos.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Y ojo: no estoy diciendo que Ubuntu sea una distribución horrible que no haya que tocar. Es una distribución que, al igual que Linux Mint u otras, está bien para empezar e introducirte en Linux. Pero si llevas un cierto tiempo en este mundo, has probado varias distribuciones y te molesta el enfoque tipo Microsoft de Canonical, dale una oportunidad a Debian. Si Debian no te convence, hay otras alternativas fantásticas: más fáciles como Linux Mint (también basada en Debian) con un enfoque muy amigable, o si quieres algo más avanzado tienes Fedora, openSUSE, Arch Linux (que ni siquiera es tan difícil de instalar actualmente con el script de instalación). Hay muchas distribuciones más allá de la realizada por Canonical.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;En resumen:&lt;/strong&gt; si buscas estabilidad, control y una experiencia 100% libre, Debian es una distribución muy interesante y la elección lógica si has probado Ubuntu o cualquier redistribución basada en Ubuntu y quieres pasar a una distribución de comunidad. Déjame saber en los comentarios qué opinas: si Ubuntu te parece bien, si crees que Debian está mejor o qué distribución usas. Nos vemos en el siguiente artículo. Hasta luego.&lt;/p&gt;</content><category term="Ruta"/><category term="ruta"/><category term="debian"/><category term="ubuntu"/><category term="linux"/><category term="distribuciones"/></entry><entry><title>Web Server Setup: Nginx and Apache</title><link href="ruta/web-server-setup/" rel="alternate"/><published>2025-01-28T00:00:00-06:00</published><updated>2025-01-28T00:00:00-06:00</updated><author><name/></author><id>tag:None,2025-01-28:ruta/web-server-setup/</id><summary type="html">&lt;p&gt;Ruta de aprendizaje rengtech — Linux y administración de sistemas.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Web servers are fundamental to hosting applications. Learn to configure and manage them effectively.&lt;/p&gt;
&lt;h2&gt;Nginx&lt;/h2&gt;
&lt;h3&gt;Installation&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;nginx&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;# Debian/Ubuntu&lt;/span&gt;
dnf&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;nginx&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="c1"&gt;# Red Hat&lt;/span&gt;
pacman&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;nginx&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="c1"&gt;# Arch&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Basic Configuration&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;listen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;server_name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;example.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;root&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/var/www/html&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;index&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;index.html&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;try_files&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$uri&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$uri/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Configuration Files&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;/etc/nginx/nginx.conf&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="c1"&gt;# Main config&lt;/span&gt;
/etc/nginx/sites-available/&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="c1"&gt;# Available sites&lt;/span&gt;
/etc/nginx/sites-enabled/&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="c1"&gt;# Enabled sites&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Management&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;nginx&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="c1"&gt;# Test configuration&lt;/span&gt;
systemctl&lt;span class="w"&gt; &lt;/span&gt;reload&lt;span class="w"&gt; &lt;/span&gt;nginx&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# Reload config&lt;/span&gt;
systemctl&lt;span class="w"&gt; &lt;/span&gt;restart&lt;span class="w"&gt; &lt;/span&gt;nginx&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Restart server&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Apache&lt;/h2&gt;
&lt;h3&gt;Installation&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;apache2&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="c1"&gt;# Debian/Ubuntu&lt;/span&gt;
dnf&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;httpd&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="c1"&gt;# Red Hat&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Virtual Hosts&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;VirtualHost&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;*:80&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;ServerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;example.com
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;DocumentRoot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sx"&gt;/var/www/html&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;Directory&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/var/www/html&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nb"&gt;AllowOverride&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;All&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nb"&gt;Require&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;all&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;granted
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/Directory&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/VirtualHost&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Management&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;apache2ctl&lt;span class="w"&gt; &lt;/span&gt;configtest&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c1"&gt;# Test config&lt;/span&gt;
systemctl&lt;span class="w"&gt; &lt;/span&gt;reload&lt;span class="w"&gt; &lt;/span&gt;apache2
a2ensite&lt;span class="w"&gt; &lt;/span&gt;site.conf&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="c1"&gt;# Enable site&lt;/span&gt;
a2dissite&lt;span class="w"&gt; &lt;/span&gt;site.conf&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="c1"&gt;# Disable site&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Reverse Proxy&lt;/h2&gt;
&lt;p&gt;Nginx as reverse proxy:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;proxy_pass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;http://localhost:3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;proxy_set_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;Host&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;proxy_set_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;X-Real-IP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Static File Serving&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/static/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;alias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/var/www/static/&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;expires&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;30d&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;add_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;Cache-Control&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;public,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;immutable&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Logs&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Nginx&lt;/span&gt;
tail&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;/var/log/nginx/access.log
tail&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;/var/log/nginx/error.log

&lt;span class="c1"&gt;# Apache&lt;/span&gt;
tail&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;/var/log/apache2/access.log
tail&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;/var/log/apache2/error.log
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Performance Tuning&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Enable gzip compression&lt;/li&gt;
&lt;li&gt;Use caching headers&lt;/li&gt;
&lt;li&gt;Optimize worker processes&lt;/li&gt;
&lt;li&gt;Monitor connection limits&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Web servers are the gateway to your applications.&lt;/p&gt;</content><category term="Ruta"/><category term="ruta"/></entry><entry><title>Text Processing with grep, sed, and awk</title><link href="ruta/text-processing/" rel="alternate"/><published>2025-01-27T00:00:00-06:00</published><updated>2025-01-27T00:00:00-06:00</updated><author><name/></author><id>tag:None,2025-01-27:ruta/text-processing/</id><summary type="html">&lt;p&gt;Ruta de aprendizaje rengtech — Linux y administración de sistemas.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Linux provides powerful tools for processing text. Master these, and you can manipulate data with incredible efficiency.&lt;/p&gt;
&lt;h2&gt;grep - Pattern Matching&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;grep&lt;/code&gt; searches for patterns in text:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;grep&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;error&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;logfile.txt
grep&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;pattern&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/path/to/dir&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Recursive search&lt;/span&gt;
grep&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;case&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;file.txt&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="c1"&gt;# Case insensitive&lt;/span&gt;
grep&lt;span class="w"&gt; &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;exclude&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;file.txt&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="c1"&gt;# Invert match&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;sed - Stream Editor&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;sed&lt;/code&gt; performs text transformations:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sed&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;s/old/new/g&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;file.txt&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="c1"&gt;# Replace all occurrences&lt;/span&gt;
sed&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;5,10p&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;file.txt&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="c1"&gt;# Print lines 5-10&lt;/span&gt;
sed&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/pattern/d&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;file.txt&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="c1"&gt;# Delete matching lines&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;awk - Pattern Processing&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;awk&lt;/code&gt; is a programming language for text processing:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;awk&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;{print $1}&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;file.txt&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="c1"&gt;# Print first field&lt;/span&gt;
awk&lt;span class="w"&gt; &lt;/span&gt;-F:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;{print $1}&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/passwd&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c1"&gt;# Use colon as delimiter&lt;/span&gt;
awk&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;$3 &amp;gt; 1000 {print $1}&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;file&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Conditional printing&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Combining Tools&lt;/h2&gt;
&lt;p&gt;The real power comes from combining these tools:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Find all error lines, extract timestamps, count occurrences&lt;/span&gt;
grep&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ERROR&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;app.log&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;awk&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;{print $1}&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sort&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;uniq&lt;span class="w"&gt; &lt;/span&gt;-c

&lt;span class="c1"&gt;# Replace IP addresses in config files&lt;/span&gt;
sed&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;s/192\.168\.1\.1/10.0.0.1/g&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;*.conf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Practical Examples&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Extract email addresses from a file&lt;/span&gt;
grep&lt;span class="w"&gt; &lt;/span&gt;-oE&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;file.txt

&lt;span class="c1"&gt;# Count lines in all Python files&lt;/span&gt;
find&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;-name&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;*.py&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-exec&lt;span class="w"&gt; &lt;/span&gt;wc&lt;span class="w"&gt; &lt;/span&gt;-l&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;+&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;awk&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;{sum+=$1} END {print sum}&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;These tools form the foundation of command-line text processing. Practice combining them!&lt;/p&gt;</content><category term="Ruta"/><category term="ruta"/></entry><entry><title>System Services and systemd</title><link href="ruta/system-services/" rel="alternate"/><published>2025-01-26T00:00:00-06:00</published><updated>2025-01-26T00:00:00-06:00</updated><author><name/></author><id>tag:None,2025-01-26:ruta/system-services/</id><summary type="html">&lt;p&gt;Ruta de aprendizaje rengtech — Linux y administración de sistemas.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Modern Linux distributions use systemd as the init system and service manager. Understanding it is essential for system administration.&lt;/p&gt;
&lt;h2&gt;Service Management&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;start&lt;span class="w"&gt; &lt;/span&gt;service&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="c1"&gt;# Start service&lt;/span&gt;
systemctl&lt;span class="w"&gt; &lt;/span&gt;stop&lt;span class="w"&gt; &lt;/span&gt;service&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="c1"&gt;# Stop service&lt;/span&gt;
systemctl&lt;span class="w"&gt; &lt;/span&gt;restart&lt;span class="w"&gt; &lt;/span&gt;service&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Restart service&lt;/span&gt;
systemctl&lt;span class="w"&gt; &lt;/span&gt;reload&lt;span class="w"&gt; &lt;/span&gt;service&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="c1"&gt;# Reload configuration&lt;/span&gt;
systemctl&lt;span class="w"&gt; &lt;/span&gt;status&lt;span class="w"&gt; &lt;/span&gt;service&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="c1"&gt;# Check status&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Service States&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;service&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="c1"&gt;# Enable on boot&lt;/span&gt;
systemctl&lt;span class="w"&gt; &lt;/span&gt;disable&lt;span class="w"&gt; &lt;/span&gt;service&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Disable on boot&lt;/span&gt;
systemctl&lt;span class="w"&gt; &lt;/span&gt;is-enabled&lt;span class="w"&gt; &lt;/span&gt;service&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Check if enabled&lt;/span&gt;
systemctl&lt;span class="w"&gt; &lt;/span&gt;is-active&lt;span class="w"&gt; &lt;/span&gt;service&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# Check if running&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Viewing Services&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;list-units&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="c1"&gt;# All units&lt;/span&gt;
systemctl&lt;span class="w"&gt; &lt;/span&gt;list-units&lt;span class="w"&gt; &lt;/span&gt;--type&lt;span class="o"&gt;=&lt;/span&gt;service&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# Only services&lt;/span&gt;
systemctl&lt;span class="w"&gt; &lt;/span&gt;list-unit-files&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# All unit files&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Service Files&lt;/h2&gt;
&lt;p&gt;Service files are located in:
- &lt;code&gt;/etc/systemd/system/&lt;/code&gt; - System services
- &lt;code&gt;/usr/lib/systemd/system/&lt;/code&gt; - Package-installed services
- &lt;code&gt;~/.config/systemd/user/&lt;/code&gt; - User services&lt;/p&gt;
&lt;h2&gt;Example Service File&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[Unit]&lt;/span&gt;
&lt;span class="na"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;My Custom Service&lt;/span&gt;
&lt;span class="na"&gt;After&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;network.target&lt;/span&gt;

&lt;span class="k"&gt;[Service]&lt;/span&gt;
&lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;simple&lt;/span&gt;
&lt;span class="na"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/bin/myprogram&lt;/span&gt;
&lt;span class="na"&gt;Restart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;always&lt;/span&gt;

&lt;span class="k"&gt;[Install]&lt;/span&gt;
&lt;span class="na"&gt;WantedBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;multi-user.target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Logs with journalctl&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;journalctl&lt;span class="w"&gt; &lt;/span&gt;-u&lt;span class="w"&gt; &lt;/span&gt;service&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="c1"&gt;# Service logs&lt;/span&gt;
journalctl&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="c1"&gt;# Follow logs&lt;/span&gt;
journalctl&lt;span class="w"&gt; &lt;/span&gt;--since&lt;span class="w"&gt; &lt;/span&gt;today&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="c1"&gt;# Since today&lt;/span&gt;
journalctl&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;err&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="c1"&gt;# Error level only&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Timers (Cron Alternative)&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;list-timers&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="c1"&gt;# List all timers&lt;/span&gt;
systemctl&lt;span class="w"&gt; &lt;/span&gt;status&lt;span class="w"&gt; &lt;/span&gt;timer&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;# Timer status&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;systemd provides a unified interface for managing system services and resources.&lt;/p&gt;</content><category term="Ruta"/><category term="ruta"/></entry><entry><title>System Monitoring and Performance</title><link href="ruta/system-monitoring/" rel="alternate"/><published>2025-01-25T00:00:00-06:00</published><updated>2025-01-25T00:00:00-06:00</updated><author><name/></author><id>tag:None,2025-01-25:ruta/system-monitoring/</id><summary type="html">&lt;p&gt;Ruta de aprendizaje rengtech — Linux y administración de sistemas.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Monitoring system resources helps you understand performance and identify bottlenecks before they become problems.&lt;/p&gt;
&lt;h2&gt;CPU Monitoring&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;top&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="c1"&gt;# Interactive CPU/memory viewer&lt;/span&gt;
htop&lt;span class="w"&gt;                   &lt;/span&gt;&lt;span class="c1"&gt;# Enhanced version&lt;/span&gt;
vmstat&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt;               &lt;/span&gt;&lt;span class="c1"&gt;# Virtual memory stats&lt;/span&gt;
mpstat&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt;               &lt;/span&gt;&lt;span class="c1"&gt;# CPU statistics&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Memory Monitoring&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;free&lt;span class="w"&gt; &lt;/span&gt;-h&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="c1"&gt;# Memory usage&lt;/span&gt;
cat&lt;span class="w"&gt; &lt;/span&gt;/proc/meminfo&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="c1"&gt;# Detailed memory info&lt;/span&gt;
ps&lt;span class="w"&gt; &lt;/span&gt;aux&lt;span class="w"&gt; &lt;/span&gt;--sort&lt;span class="o"&gt;=&lt;/span&gt;-%mem&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Processes by memory&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Disk I/O&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;iostat&lt;span class="w"&gt; &lt;/span&gt;-x&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="c1"&gt;# I/O statistics&lt;/span&gt;
iotop&lt;span class="w"&gt;                  &lt;/span&gt;&lt;span class="c1"&gt;# I/O by process&lt;/span&gt;
df&lt;span class="w"&gt; &lt;/span&gt;-h&lt;span class="w"&gt;                  &lt;/span&gt;&lt;span class="c1"&gt;# Disk space&lt;/span&gt;
du&lt;span class="w"&gt; &lt;/span&gt;-sh&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt;               &lt;/span&gt;&lt;span class="c1"&gt;# Directory sizes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Network Monitoring&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;netstat&lt;span class="w"&gt; &lt;/span&gt;-tulpn&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="c1"&gt;# Network connections&lt;/span&gt;
ss&lt;span class="w"&gt; &lt;/span&gt;-tulpn&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="c1"&gt;# Modern alternative&lt;/span&gt;
iftop&lt;span class="w"&gt;                  &lt;/span&gt;&lt;span class="c1"&gt;# Network traffic by host&lt;/span&gt;
nethogs&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="c1"&gt;# Network by process&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;System Load&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;uptime&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="c1"&gt;# Load averages&lt;/span&gt;
w&lt;span class="w"&gt;                      &lt;/span&gt;&lt;span class="c1"&gt;# Who and load&lt;/span&gt;
cat&lt;span class="w"&gt; &lt;/span&gt;/proc/loadavg&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="c1"&gt;# Load averages&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Process Monitoring&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ps&lt;span class="w"&gt; &lt;/span&gt;aux&lt;span class="w"&gt; &lt;/span&gt;--sort&lt;span class="o"&gt;=&lt;/span&gt;-%cpu&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# By CPU usage&lt;/span&gt;
ps&lt;span class="w"&gt; &lt;/span&gt;aux&lt;span class="w"&gt; &lt;/span&gt;--sort&lt;span class="o"&gt;=&lt;/span&gt;-%mem&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# By memory&lt;/span&gt;
pgrep&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;pattern&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="c1"&gt;# Find process IDs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Continuous Monitoring&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Watch command&lt;/span&gt;
watch&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;df -h&amp;#39;&lt;/span&gt;

&lt;span class="c1"&gt;# Custom monitoring script&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;true&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;free&lt;span class="w"&gt; &lt;/span&gt;-h&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;Mem&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;sleep&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Performance Tuning&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Identify resource bottlenecks&lt;/li&gt;
&lt;li&gt;Optimize based on monitoring data&lt;/li&gt;
&lt;li&gt;Set up alerts for thresholds&lt;/li&gt;
&lt;li&gt;Document baseline performance&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Regular monitoring helps maintain system health and performance.&lt;/p&gt;</content><category term="Ruta"/><category term="ruta"/></entry><entry><title>System Automation with Cron and systemd Timers</title><link href="ruta/system-automation/" rel="alternate"/><published>2025-01-24T00:00:00-06:00</published><updated>2025-01-24T00:00:00-06:00</updated><author><name/></author><id>tag:None,2025-01-24:ruta/system-automation/</id><summary type="html">&lt;p&gt;Ruta de aprendizaje rengtech — Linux y administración de sistemas.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Automation is key to efficient system administration. Linux provides multiple tools for scheduling and automating tasks.&lt;/p&gt;
&lt;h2&gt;Cron - Traditional Scheduler&lt;/h2&gt;
&lt;h3&gt;Crontab Format&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;command&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;│&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;│&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;│&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;│&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;│&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;│&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;│&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;└───&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Day&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;week&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Sunday&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;│&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;│&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;└─────&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Month&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;│&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;└───────&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Day&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;└─────────&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Hour&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;└───────────&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Minute&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;59&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Examples&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Edit crontab&lt;/span&gt;
crontab&lt;span class="w"&gt; &lt;/span&gt;-e

&lt;span class="c1"&gt;# Examples&lt;/span&gt;
&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;/path/to/backup.sh&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;# Daily at 2 AM&lt;/span&gt;
*/15&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;/path/to/check.sh&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="c1"&gt;# Every 15 minutes&lt;/span&gt;
&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;/path/to/monthly.sh&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="c1"&gt;# First day of month&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Special Strings&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;@reboot&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Run at boot&lt;/span&gt;
@daily&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="c1"&gt;# Once per day&lt;/span&gt;
@weekly&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Once per week&lt;/span&gt;
@monthly&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c1"&gt;# Once per month&lt;/span&gt;
@yearly&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Once per year&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;systemd Timers&lt;/h2&gt;
&lt;p&gt;Modern alternative to cron with better logging and dependencies:&lt;/p&gt;
&lt;h3&gt;Timer File&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[Unit]&lt;/span&gt;
&lt;span class="na"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Daily Backup Timer&lt;/span&gt;

&lt;span class="k"&gt;[Timer]&lt;/span&gt;
&lt;span class="na"&gt;OnCalendar&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;daily&lt;/span&gt;
&lt;span class="na"&gt;OnBootSec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;10min&lt;/span&gt;

&lt;span class="k"&gt;[Install]&lt;/span&gt;
&lt;span class="na"&gt;WantedBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;timers.target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Service File&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[Unit]&lt;/span&gt;
&lt;span class="na"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Daily Backup Service&lt;/span&gt;

&lt;span class="k"&gt;[Service]&lt;/span&gt;
&lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;oneshot&lt;/span&gt;
&lt;span class="na"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/path/to/backup.sh&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Management&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--now&lt;span class="w"&gt; &lt;/span&gt;backup.timer
systemctl&lt;span class="w"&gt; &lt;/span&gt;list-timers
systemctl&lt;span class="w"&gt; &lt;/span&gt;status&lt;span class="w"&gt; &lt;/span&gt;backup.timer
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Ansible for Automation&lt;/h2&gt;
&lt;p&gt;For complex automation across multiple systems:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Update packages&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;apt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;update_cache&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;yes&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;upgrade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;dist&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;become&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Best Practices&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Test scripts before scheduling&lt;/li&gt;
&lt;li&gt;Log all automated tasks&lt;/li&gt;
&lt;li&gt;Use systemd timers for new systems&lt;/li&gt;
&lt;li&gt;Document what each automation does&lt;/li&gt;
&lt;li&gt;Set up monitoring for automated tasks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Automation reduces manual work and ensures consistency across systems.&lt;/p&gt;</content><category term="Ruta"/><category term="ruta"/></entry><entry><title>SSL/TLS Certificates with Let's Encrypt</title><link href="ruta/ssl-certificates/" rel="alternate"/><published>2025-01-23T00:00:00-06:00</published><updated>2025-01-23T00:00:00-06:00</updated><author><name/></author><id>tag:None,2025-01-23:ruta/ssl-certificates/</id><summary type="html">&lt;p&gt;Ruta de aprendizaje rengtech — Linux y administración de sistemas.&lt;/p&gt;</summary><content type="html">&lt;p&gt;SSL/TLS certificates encrypt web traffic. Let's Encrypt provides free certificates with automated renewal.&lt;/p&gt;
&lt;h2&gt;Certbot Installation&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;certbot&lt;span class="w"&gt; &lt;/span&gt;python3-certbot-nginx&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Nginx&lt;/span&gt;
apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;certbot&lt;span class="w"&gt; &lt;/span&gt;python3-certbot-apache&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c1"&gt;# Apache&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Obtaining Certificates&lt;/h2&gt;
&lt;h3&gt;Nginx&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;certbot&lt;span class="w"&gt; &lt;/span&gt;--nginx&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;example.com&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;www.example.com
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Apache&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;certbot&lt;span class="w"&gt; &lt;/span&gt;--apache&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;example.com&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;www.example.com
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Standalone (Manual)&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;certbot&lt;span class="w"&gt; &lt;/span&gt;certonly&lt;span class="w"&gt; &lt;/span&gt;--standalone&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;example.com
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Certificate Files&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;/etc/letsencrypt/live/example.com/
├──&lt;span class="w"&gt; &lt;/span&gt;cert.pem&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="c1"&gt;# Certificate&lt;/span&gt;
├──&lt;span class="w"&gt; &lt;/span&gt;chain.pem&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="c1"&gt;# Chain&lt;/span&gt;
├──&lt;span class="w"&gt; &lt;/span&gt;fullchain.pem&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="c1"&gt;# Full chain&lt;/span&gt;
└──&lt;span class="w"&gt; &lt;/span&gt;privkey.pem&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="c1"&gt;# Private key&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Nginx SSL Configuration&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;listen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;ssl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;http2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;server_name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;example.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;ssl_certificate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/etc/letsencrypt/live/example.com/fullchain.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;ssl_certificate_key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/etc/letsencrypt/live/example.com/privkey.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;ssl_protocols&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;TLSv1.2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;TLSv1.3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;ssl_ciphers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;HIGH:!aNULL:!MD5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;ssl_prefer_server_ciphers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;HTTP to HTTPS Redirect&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;listen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;server_name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;example.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;301&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;https://&lt;/span&gt;&lt;span class="nv"&gt;$server_name$request_uri&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Auto-Renewal&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Test renewal&lt;/span&gt;
certbot&lt;span class="w"&gt; &lt;/span&gt;renew&lt;span class="w"&gt; &lt;/span&gt;--dry-run

&lt;span class="c1"&gt;# Manual renewal&lt;/span&gt;
certbot&lt;span class="w"&gt; &lt;/span&gt;renew

&lt;span class="c1"&gt;# Automatic renewal (systemd timer)&lt;/span&gt;
systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;certbot.timer
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Wildcard Certificates&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;certbot&lt;span class="w"&gt; &lt;/span&gt;certonly&lt;span class="w"&gt; &lt;/span&gt;--manual&lt;span class="w"&gt; &lt;/span&gt;--preferred-challenges&lt;span class="w"&gt; &lt;/span&gt;dns&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;*.example.com
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Certificate Information&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;openssl&lt;span class="w"&gt; &lt;/span&gt;x509&lt;span class="w"&gt; &lt;/span&gt;-in&lt;span class="w"&gt; &lt;/span&gt;cert.pem&lt;span class="w"&gt; &lt;/span&gt;-text&lt;span class="w"&gt; &lt;/span&gt;-noout
certbot&lt;span class="w"&gt; &lt;/span&gt;certificates
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Best Practices&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Enable auto-renewal&lt;/li&gt;
&lt;li&gt;Use strong ciphers&lt;/li&gt;
&lt;li&gt;Redirect HTTP to HTTPS&lt;/li&gt;
&lt;li&gt;Monitor certificate expiration&lt;/li&gt;
&lt;li&gt;Test renewal process&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;SSL/TLS is essential for secure web communication.&lt;/p&gt;</content><category term="Ruta"/><category term="ruta"/></entry><entry><title>Shell Scripting Fundamentals</title><link href="ruta/shell-scripting/" rel="alternate"/><published>2025-01-22T00:00:00-06:00</published><updated>2025-01-22T00:00:00-06:00</updated><author><name/></author><id>tag:None,2025-01-22:ruta/shell-scripting/</id><summary type="html">&lt;p&gt;Ruta de aprendizaje rengtech — Linux y administración de sistemas.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Shell scripts automate repetitive tasks and combine commands into powerful workflows.&lt;/p&gt;
&lt;h2&gt;Basic Script Structure&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c1"&gt;# This is a comment&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hello, World!&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Make it executable: &lt;code&gt;chmod +x script.sh&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Variables&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Linux&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Welcome to &lt;/span&gt;&lt;span class="nv"&gt;$NAME&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Current directory: &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Control Structures&lt;/h2&gt;
&lt;h3&gt;Conditionals&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;condition&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;commands
&lt;span class="k"&gt;elif&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;condition&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;commands
&lt;span class="k"&gt;else&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;commands
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Loops&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# For loop&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;file&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;*.txt&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Processing &lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;

&lt;span class="c1"&gt;# While loop&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;condition&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;commands
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Functions&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;greet&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hello, &lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

greet&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;World&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Input and Arguments&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Read from user&lt;/span&gt;
&lt;span class="nb"&gt;read&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Enter name: &amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;name

&lt;span class="c1"&gt;# Command-line arguments&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;First argument: &lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;All arguments: &lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Number of arguments: &lt;/span&gt;&lt;span class="nv"&gt;$#&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Error Handling&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-e&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="c1"&gt;# Exit on error&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-u&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="c1"&gt;# Exit on undefined variable&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;pipefail&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="c1"&gt;# Catch errors in pipes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Practical Example&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c1"&gt;# Backup script&lt;/span&gt;

&lt;span class="nv"&gt;BACKUP_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/backup&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;DATE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date&lt;span class="w"&gt; &lt;/span&gt;+%Y%m%d&lt;span class="k"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;!&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$BACKUP_DIR&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$BACKUP_DIR&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

tar&lt;span class="w"&gt; &lt;/span&gt;-czf&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$BACKUP_DIR&lt;/span&gt;&lt;span class="s2"&gt;/backup-&lt;/span&gt;&lt;span class="nv"&gt;$DATE&lt;/span&gt;&lt;span class="s2"&gt;.tar.gz&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/home/user
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Backup completed: backup-&lt;/span&gt;&lt;span class="nv"&gt;$DATE&lt;/span&gt;&lt;span class="s2"&gt;.tar.gz&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Shell scripting is the foundation of Linux automation. Start simple and build complexity gradually.&lt;/p&gt;</content><category term="Ruta"/><category term="ruta"/></entry><entry><title>Shell Basics and Navigation</title><link href="ruta/shell-basics/" rel="alternate"/><published>2025-01-21T00:00:00-06:00</published><updated>2025-01-21T00:00:00-06:00</updated><author><name/></author><id>tag:None,2025-01-21:ruta/shell-basics/</id><summary type="html">&lt;p&gt;Ruta de aprendizaje rengtech — Linux y administración de sistemas.&lt;/p&gt;</summary><content type="html">&lt;p&gt;The shell is your primary interface to Linux. Master it, and you unlock the true power of the system.&lt;/p&gt;
&lt;h2&gt;Understanding the Shell&lt;/h2&gt;
&lt;p&gt;The shell is a command-line interpreter that reads your commands and executes them. The most common shell is Bash (Bourne Again Shell).&lt;/p&gt;
&lt;h2&gt;Essential Commands&lt;/h2&gt;
&lt;h3&gt;Navigation&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="c1"&gt;# Print working directory&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/path&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="c1"&gt;# Change directory&lt;/span&gt;
ls&lt;span class="w"&gt; &lt;/span&gt;-la&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="c1"&gt;# List files with details&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;File Operations&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;dirname&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Create directory&lt;/span&gt;
touch&lt;span class="w"&gt; &lt;/span&gt;filename&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c1"&gt;# Create empty file&lt;/span&gt;
cp&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dest&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c1"&gt;# Copy file&lt;/span&gt;
mv&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dest&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c1"&gt;# Move/rename file&lt;/span&gt;
rm&lt;span class="w"&gt; &lt;/span&gt;filename&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="c1"&gt;# Remove file (careful!)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Viewing Files&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cat&lt;span class="w"&gt; &lt;/span&gt;filename&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="c1"&gt;# Display entire file&lt;/span&gt;
less&lt;span class="w"&gt; &lt;/span&gt;filename&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# View file page by page&lt;/span&gt;
head&lt;span class="w"&gt; &lt;/span&gt;filename&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# First 10 lines&lt;/span&gt;
tail&lt;span class="w"&gt; &lt;/span&gt;filename&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Last 10 lines&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Paths and Permissions&lt;/h2&gt;
&lt;p&gt;Understanding absolute vs relative paths is crucial:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/home/user/file&lt;/code&gt; - absolute path&lt;/li&gt;
&lt;li&gt;&lt;code&gt;./file&lt;/code&gt; - relative to current directory&lt;/li&gt;
&lt;li&gt;&lt;code&gt;../file&lt;/code&gt; - relative to parent directory&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;File permissions use a three-tier system: owner, group, and others. Each can have read (r), write (w), and execute (x) permissions.&lt;/p&gt;
&lt;h2&gt;Practice&lt;/h2&gt;
&lt;p&gt;Try navigating your system:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~
ls&lt;span class="w"&gt; &lt;/span&gt;-la
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/etc
ls&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;head&lt;span class="w"&gt; &lt;/span&gt;-5
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The shell is your gateway to everything. Master these basics before moving on!&lt;/p&gt;</content><category term="Ruta"/><category term="ruta"/></entry><entry><title>Linux Security Fundamentals</title><link href="ruta/security-basics/" rel="alternate"/><published>2025-01-20T00:00:00-06:00</published><updated>2025-01-20T00:00:00-06:00</updated><author><name/></author><id>tag:None,2025-01-20:ruta/security-basics/</id><summary type="html">&lt;p&gt;Ruta de aprendizaje rengtech — Linux y administración de sistemas.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Security is not optional. Understanding Linux security fundamentals protects your systems and data.&lt;/p&gt;
&lt;h2&gt;User Management&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;useradd&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;username&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="c1"&gt;# Create user&lt;/span&gt;
passwd&lt;span class="w"&gt; &lt;/span&gt;username&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="c1"&gt;# Set password&lt;/span&gt;
usermod&lt;span class="w"&gt; &lt;/span&gt;-aG&lt;span class="w"&gt; &lt;/span&gt;group&lt;span class="w"&gt; &lt;/span&gt;user&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c1"&gt;# Add to group&lt;/span&gt;
userdel&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;username&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="c1"&gt;# Delete user&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;File Permissions&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;chmod&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;755&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;file&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="c1"&gt;# Set permissions&lt;/span&gt;
chmod&lt;span class="w"&gt; &lt;/span&gt;u+x&lt;span class="w"&gt; &lt;/span&gt;file&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="c1"&gt;# User execute&lt;/span&gt;
chown&lt;span class="w"&gt; &lt;/span&gt;user:group&lt;span class="w"&gt; &lt;/span&gt;file&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Change ownership&lt;/span&gt;
chgrp&lt;span class="w"&gt; &lt;/span&gt;group&lt;span class="w"&gt; &lt;/span&gt;file&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="c1"&gt;# Change group&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Permission Numbers&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;4 = read&lt;/li&gt;
&lt;li&gt;2 = write&lt;/li&gt;
&lt;li&gt;1 = execute&lt;/li&gt;
&lt;li&gt;755 = rwxr-xr-x&lt;/li&gt;
&lt;li&gt;644 = rw-r--r--&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;SSH Security&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Disable password authentication&lt;/span&gt;
&lt;span class="c1"&gt;# Edit /etc/ssh/sshd_config&lt;/span&gt;
PasswordAuthentication&lt;span class="w"&gt; &lt;/span&gt;no
PubkeyAuthentication&lt;span class="w"&gt; &lt;/span&gt;yes

&lt;span class="c1"&gt;# Change default port&lt;/span&gt;
Port&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2222&lt;/span&gt;

&lt;span class="c1"&gt;# Restrict users&lt;/span&gt;
AllowUsers&lt;span class="w"&gt; &lt;/span&gt;user1&lt;span class="w"&gt; &lt;/span&gt;user2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Firewall Configuration&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# UFW example&lt;/span&gt;
ufw&lt;span class="w"&gt; &lt;/span&gt;default&lt;span class="w"&gt; &lt;/span&gt;deny&lt;span class="w"&gt; &lt;/span&gt;incoming
ufw&lt;span class="w"&gt; &lt;/span&gt;default&lt;span class="w"&gt; &lt;/span&gt;allow&lt;span class="w"&gt; &lt;/span&gt;outgoing
ufw&lt;span class="w"&gt; &lt;/span&gt;allow&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;22&lt;/span&gt;/tcp
ufw&lt;span class="w"&gt; &lt;/span&gt;allow&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;80&lt;/span&gt;/tcp
ufw&lt;span class="w"&gt; &lt;/span&gt;allow&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;443&lt;/span&gt;/tcp
ufw&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Fail2Ban&lt;/h2&gt;
&lt;p&gt;Protect against brute force attacks:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;fail2ban
systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;fail2ban
systemctl&lt;span class="w"&gt; &lt;/span&gt;start&lt;span class="w"&gt; &lt;/span&gt;fail2ban
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;SELinux/AppArmor&lt;/h2&gt;
&lt;p&gt;Mandatory Access Control:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# SELinux (Red Hat)&lt;/span&gt;
getenforce
setenforce&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;

&lt;span class="c1"&gt;# AppArmor (Debian/Ubuntu)&lt;/span&gt;
aa-status
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Updates&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;apt&lt;span class="w"&gt; &lt;/span&gt;update&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;upgrade&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Debian/Ubuntu&lt;/span&gt;
dnf&lt;span class="w"&gt; &lt;/span&gt;update&lt;span class="w"&gt;                   &lt;/span&gt;&lt;span class="c1"&gt;# Red Hat&lt;/span&gt;
pacman&lt;span class="w"&gt; &lt;/span&gt;-Syu&lt;span class="w"&gt;                  &lt;/span&gt;&lt;span class="c1"&gt;# Arch&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Best Practices&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Regular security updates&lt;/li&gt;
&lt;li&gt;Strong passwords or key-based auth&lt;/li&gt;
&lt;li&gt;Minimal installed software&lt;/li&gt;
&lt;li&gt;Regular security audits&lt;/li&gt;
&lt;li&gt;Encrypted sensitive data&lt;/li&gt;
&lt;li&gt;Backup and recovery plans&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Security is an ongoing process, not a one-time setup.&lt;/p&gt;</content><category term="Ruta"/><category term="ruta"/></entry><entry><title>Process Management and Job Control</title><link href="ruta/process-management/" rel="alternate"/><published>2025-01-19T00:00:00-06:00</published><updated>2025-01-19T00:00:00-06:00</updated><author><name/></author><id>tag:None,2025-01-19:ruta/process-management/</id><summary type="html">&lt;p&gt;Ruta de aprendizaje rengtech — Linux y administración de sistemas.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Understanding processes is essential for system administration. Every running program is a process, and Linux gives you powerful tools to manage them.&lt;/p&gt;
&lt;h2&gt;Viewing Processes&lt;/h2&gt;
&lt;h3&gt;ps - Process Status&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ps&lt;span class="w"&gt; &lt;/span&gt;aux&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="c1"&gt;# All processes with details&lt;/span&gt;
ps&lt;span class="w"&gt; &lt;/span&gt;-ef&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="c1"&gt;# Full format listing&lt;/span&gt;
ps&lt;span class="w"&gt; &lt;/span&gt;aux&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;nginx&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Find specific process&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;top and htop&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;top&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="c1"&gt;# Interactive process viewer&lt;/span&gt;
htop&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="c1"&gt;# Enhanced version (install separately)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Process Control&lt;/h2&gt;
&lt;h3&gt;Background and Foreground&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;command&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="c1"&gt;# Run in background&lt;/span&gt;
&lt;span class="nb"&gt;fg&lt;/span&gt;&lt;span class="w"&gt;                  &lt;/span&gt;&lt;span class="c1"&gt;# Bring to foreground&lt;/span&gt;
&lt;span class="nb"&gt;bg&lt;/span&gt;&lt;span class="w"&gt;                  &lt;/span&gt;&lt;span class="c1"&gt;# Resume in background&lt;/span&gt;
&lt;span class="nb"&gt;jobs&lt;/span&gt;&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="c1"&gt;# List background jobs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Signals&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;kill&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;PID&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="c1"&gt;# Send TERM signal&lt;/span&gt;
&lt;span class="nb"&gt;kill&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-9&lt;span class="w"&gt; &lt;/span&gt;PID&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="c1"&gt;# Force kill (SIGKILL)&lt;/span&gt;
killall&lt;span class="w"&gt; &lt;/span&gt;processname&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Kill by name&lt;/span&gt;
pkill&lt;span class="w"&gt; &lt;/span&gt;pattern&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="c1"&gt;# Kill by pattern&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Process Priorities&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;nice&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;command&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# Start with lower priority&lt;/span&gt;
renice&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;15&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;PID&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="c1"&gt;# Change priority of running process&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Systemd Services&lt;/h2&gt;
&lt;p&gt;Modern Linux uses systemd for service management:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;status&lt;span class="w"&gt; &lt;/span&gt;service&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Check service status&lt;/span&gt;
systemctl&lt;span class="w"&gt; &lt;/span&gt;start&lt;span class="w"&gt; &lt;/span&gt;service&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="c1"&gt;# Start service&lt;/span&gt;
systemctl&lt;span class="w"&gt; &lt;/span&gt;stop&lt;span class="w"&gt; &lt;/span&gt;service&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="c1"&gt;# Stop service&lt;/span&gt;
systemctl&lt;span class="w"&gt; &lt;/span&gt;restart&lt;span class="w"&gt; &lt;/span&gt;service&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c1"&gt;# Restart service&lt;/span&gt;
systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;service&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Enable on boot&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Monitoring&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Watch process in real-time&lt;/span&gt;
watch&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ps aux | grep process&amp;#39;&lt;/span&gt;

&lt;span class="c1"&gt;# Monitor resource usage&lt;/span&gt;
iostat&lt;span class="w"&gt; &lt;/span&gt;-x&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
vmstat&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Understanding process management helps you troubleshoot issues and optimize system performance.&lt;/p&gt;</content><category term="Ruta"/><category term="ruta"/></entry><entry><title>Package Management Systems</title><link href="ruta/package-management/" rel="alternate"/><published>2025-01-18T00:00:00-06:00</published><updated>2025-01-18T00:00:00-06:00</updated><author><name/></author><id>tag:None,2025-01-18:ruta/package-management/</id><summary type="html">&lt;p&gt;Ruta de aprendizaje rengtech — Linux y administración de sistemas.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Different Linux distributions use different package managers. Understanding them is crucial for system administration.&lt;/p&gt;
&lt;h2&gt;Debian/Ubuntu: apt&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;apt&lt;span class="w"&gt; &lt;/span&gt;update&lt;span class="w"&gt;                  &lt;/span&gt;&lt;span class="c1"&gt;# Update package lists&lt;/span&gt;
apt&lt;span class="w"&gt; &lt;/span&gt;upgrade&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="c1"&gt;# Upgrade all packages&lt;/span&gt;
apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;package&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="c1"&gt;# Install package&lt;/span&gt;
apt&lt;span class="w"&gt; &lt;/span&gt;remove&lt;span class="w"&gt; &lt;/span&gt;package&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="c1"&gt;# Remove package&lt;/span&gt;
apt&lt;span class="w"&gt; &lt;/span&gt;search&lt;span class="w"&gt; &lt;/span&gt;keyword&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="c1"&gt;# Search for packages&lt;/span&gt;
apt&lt;span class="w"&gt; &lt;/span&gt;show&lt;span class="w"&gt; &lt;/span&gt;package&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="c1"&gt;# Show package info&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Red Hat/CentOS: yum/dnf&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;dnf&lt;span class="w"&gt; &lt;/span&gt;update&lt;span class="w"&gt;                  &lt;/span&gt;&lt;span class="c1"&gt;# Update packages&lt;/span&gt;
dnf&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;package&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="c1"&gt;# Install package&lt;/span&gt;
dnf&lt;span class="w"&gt; &lt;/span&gt;remove&lt;span class="w"&gt; &lt;/span&gt;package&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="c1"&gt;# Remove package&lt;/span&gt;
dnf&lt;span class="w"&gt; &lt;/span&gt;search&lt;span class="w"&gt; &lt;/span&gt;keyword&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="c1"&gt;# Search&lt;/span&gt;
dnf&lt;span class="w"&gt; &lt;/span&gt;info&lt;span class="w"&gt; &lt;/span&gt;package&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="c1"&gt;# Package information&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Arch Linux: pacman&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pacman&lt;span class="w"&gt; &lt;/span&gt;-Syu&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="c1"&gt;# Sync and upgrade&lt;/span&gt;
pacman&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;package&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="c1"&gt;# Install&lt;/span&gt;
pacman&lt;span class="w"&gt; &lt;/span&gt;-R&lt;span class="w"&gt; &lt;/span&gt;package&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="c1"&gt;# Remove&lt;/span&gt;
pacman&lt;span class="w"&gt; &lt;/span&gt;-Ss&lt;span class="w"&gt; &lt;/span&gt;keyword&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="c1"&gt;# Search&lt;/span&gt;
pacman&lt;span class="w"&gt; &lt;/span&gt;-Qi&lt;span class="w"&gt; &lt;/span&gt;package&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="c1"&gt;# Info&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Building from Source&lt;/h2&gt;
&lt;p&gt;Sometimes you need to compile software:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;./configure
make
sudo&lt;span class="w"&gt; &lt;/span&gt;make&lt;span class="w"&gt; &lt;/span&gt;install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Snap and Flatpak&lt;/h2&gt;
&lt;p&gt;Universal package formats:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Snap&lt;/span&gt;
snap&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;package
snap&lt;span class="w"&gt; &lt;/span&gt;list

&lt;span class="c1"&gt;# Flatpak&lt;/span&gt;
flatpak&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;package
flatpak&lt;span class="w"&gt; &lt;/span&gt;list
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Best Practices&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Always update package lists before installing&lt;/li&gt;
&lt;li&gt;Use version pinning for production systems&lt;/li&gt;
&lt;li&gt;Keep systems updated for security&lt;/li&gt;
&lt;li&gt;Understand dependencies before removing packages&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Package management is a core skill for maintaining Linux systems.&lt;/p&gt;</content><category term="Ruta"/><category term="ruta"/></entry><entry><title>Networking Fundamentals</title><link href="ruta/networking-basics/" rel="alternate"/><published>2025-01-17T00:00:00-06:00</published><updated>2025-01-17T00:00:00-06:00</updated><author><name/></author><id>tag:None,2025-01-17:ruta/networking-basics/</id><summary type="html">&lt;p&gt;Ruta de aprendizaje rengtech — Linux y administración de sistemas.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Understanding networking is essential for system administration and troubleshooting connectivity issues.&lt;/p&gt;
&lt;h2&gt;Network Configuration&lt;/h2&gt;
&lt;h3&gt;IP Configuration&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ip&lt;span class="w"&gt; &lt;/span&gt;addr&lt;span class="w"&gt; &lt;/span&gt;show&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="c1"&gt;# Show IP addresses&lt;/span&gt;
ip&lt;span class="w"&gt; &lt;/span&gt;link&lt;span class="w"&gt; &lt;/span&gt;show&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="c1"&gt;# Show network interfaces&lt;/span&gt;
ip&lt;span class="w"&gt; &lt;/span&gt;route&lt;span class="w"&gt; &lt;/span&gt;show&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="c1"&gt;# Show routing table&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Traditional Commands&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ifconfig&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="c1"&gt;# Interface configuration (deprecated)&lt;/span&gt;
route&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="c1"&gt;# Routing table&lt;/span&gt;
netstat&lt;span class="w"&gt; &lt;/span&gt;-rn&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="c1"&gt;# Network statistics&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Network Interfaces&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Enable/disable interface&lt;/span&gt;
ip&lt;span class="w"&gt; &lt;/span&gt;link&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;eth0&lt;span class="w"&gt; &lt;/span&gt;up
ip&lt;span class="w"&gt; &lt;/span&gt;link&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;eth0&lt;span class="w"&gt; &lt;/span&gt;down

&lt;span class="c1"&gt;# Configure IP&lt;/span&gt;
ip&lt;span class="w"&gt; &lt;/span&gt;addr&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;192&lt;/span&gt;.168.1.10/24&lt;span class="w"&gt; &lt;/span&gt;dev&lt;span class="w"&gt; &lt;/span&gt;eth0
ip&lt;span class="w"&gt; &lt;/span&gt;addr&lt;span class="w"&gt; &lt;/span&gt;del&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;192&lt;/span&gt;.168.1.10/24&lt;span class="w"&gt; &lt;/span&gt;dev&lt;span class="w"&gt; &lt;/span&gt;eth0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;DNS Configuration&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cat&lt;span class="w"&gt; &lt;/span&gt;/etc/resolv.conf&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="c1"&gt;# DNS servers&lt;/span&gt;
host&lt;span class="w"&gt; &lt;/span&gt;example.com&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="c1"&gt;# DNS lookup&lt;/span&gt;
dig&lt;span class="w"&gt; &lt;/span&gt;example.com&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="c1"&gt;# Detailed DNS query&lt;/span&gt;
nslookup&lt;span class="w"&gt; &lt;/span&gt;example.com&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="c1"&gt;# Name server lookup&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Network Testing&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ping&lt;span class="w"&gt; &lt;/span&gt;host&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="c1"&gt;# Test connectivity&lt;/span&gt;
traceroute&lt;span class="w"&gt; &lt;/span&gt;host&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="c1"&gt;# Trace route&lt;/span&gt;
mtr&lt;span class="w"&gt; &lt;/span&gt;host&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="c1"&gt;# My traceroute (continuous)&lt;/span&gt;
curl&lt;span class="w"&gt; &lt;/span&gt;-I&lt;span class="w"&gt; &lt;/span&gt;url&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="c1"&gt;# HTTP request&lt;/span&gt;
wget&lt;span class="w"&gt; &lt;/span&gt;url&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="c1"&gt;# Download file&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Firewall Basics&lt;/h2&gt;
&lt;h3&gt;iptables&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;iptables&lt;span class="w"&gt; &lt;/span&gt;-L&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="c1"&gt;# List rules&lt;/span&gt;
iptables&lt;span class="w"&gt; &lt;/span&gt;-A&lt;span class="w"&gt; &lt;/span&gt;INPUT&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;tcp&lt;span class="w"&gt; &lt;/span&gt;--dport&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;22&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-j&lt;span class="w"&gt; &lt;/span&gt;ACCEPT
iptables&lt;span class="w"&gt; &lt;/span&gt;-A&lt;span class="w"&gt; &lt;/span&gt;INPUT&lt;span class="w"&gt; &lt;/span&gt;-j&lt;span class="w"&gt; &lt;/span&gt;DROP
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;firewalld (Red Hat)&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;firewall-cmd&lt;span class="w"&gt; &lt;/span&gt;--list-all
firewall-cmd&lt;span class="w"&gt; &lt;/span&gt;--add-port&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;80&lt;/span&gt;/tcp&lt;span class="w"&gt; &lt;/span&gt;--permanent
firewall-cmd&lt;span class="w"&gt; &lt;/span&gt;--reload
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;ufw (Ubuntu)&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ufw&lt;span class="w"&gt; &lt;/span&gt;status
ufw&lt;span class="w"&gt; &lt;/span&gt;allow&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;22&lt;/span&gt;/tcp
ufw&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;SSH&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ssh&lt;span class="w"&gt; &lt;/span&gt;user@host&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="c1"&gt;# Connect&lt;/span&gt;
ssh&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2222&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;user@host&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Custom port&lt;/span&gt;
ssh-keygen&lt;span class="w"&gt;               &lt;/span&gt;&lt;span class="c1"&gt;# Generate key pair&lt;/span&gt;
ssh-copy-id&lt;span class="w"&gt; &lt;/span&gt;user@host&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Copy public key&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Network Troubleshooting&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Check connectivity&lt;/span&gt;
ping&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;.8.8.8

&lt;span class="c1"&gt;# Check DNS&lt;/span&gt;
dig&lt;span class="w"&gt; &lt;/span&gt;@8.8.8.8&lt;span class="w"&gt; &lt;/span&gt;google.com

&lt;span class="c1"&gt;# Check listening ports&lt;/span&gt;
ss&lt;span class="w"&gt; &lt;/span&gt;-tulpn

&lt;span class="c1"&gt;# Monitor traffic&lt;/span&gt;
tcpdump&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;eth0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Understanding networking helps you configure, secure, and troubleshoot Linux systems.&lt;/p&gt;</content><category term="Ruta"/><category term="ruta"/></entry><entry><title>Log Analysis and Monitoring</title><link href="ruta/log-analysis/" rel="alternate"/><published>2025-01-16T00:00:00-06:00</published><updated>2025-01-16T00:00:00-06:00</updated><author><name/></author><id>tag:None,2025-01-16:ruta/log-analysis/</id><summary type="html">&lt;p&gt;Ruta de aprendizaje rengtech — Linux y administración de sistemas.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Logs are your window into system behavior. Learning to analyze them effectively is crucial for troubleshooting and monitoring.&lt;/p&gt;
&lt;h2&gt;Log Locations&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;/var/log/syslog&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="c1"&gt;# System logs&lt;/span&gt;
/var/log/auth.log&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;# Authentication logs&lt;/span&gt;
/var/log/nginx/&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="c1"&gt;# Web server logs&lt;/span&gt;
/var/log/apache2/&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;# Apache logs&lt;/span&gt;
/var/log/messages&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;# General messages&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Viewing Logs&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;tail&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;/var/log/syslog&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="c1"&gt;# Follow in real-time&lt;/span&gt;
less&lt;span class="w"&gt; &lt;/span&gt;/var/log/syslog&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="c1"&gt;# Browse interactively&lt;/span&gt;
grep&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;error&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/var/log/syslog&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="c1"&gt;# Search for errors&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;journalctl (systemd)&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;journalctl&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="c1"&gt;# Follow logs&lt;/span&gt;
journalctl&lt;span class="w"&gt; &lt;/span&gt;-u&lt;span class="w"&gt; &lt;/span&gt;service&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="c1"&gt;# Service-specific&lt;/span&gt;
journalctl&lt;span class="w"&gt; &lt;/span&gt;--since&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;1 hour ago&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# Time-based&lt;/span&gt;
journalctl&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;err&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="c1"&gt;# Error level&lt;/span&gt;
journalctl&lt;span class="w"&gt; &lt;/span&gt;-k&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="c1"&gt;# Kernel messages&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Common Analysis Tasks&lt;/h2&gt;
&lt;h3&gt;Find Errors&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;grep&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;error&lt;span class="w"&gt; &lt;/span&gt;/var/log/syslog&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;tail&lt;span class="w"&gt; &lt;/span&gt;-20
journalctl&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;err&lt;span class="w"&gt; &lt;/span&gt;--since&lt;span class="w"&gt; &lt;/span&gt;today
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Count Occurrences&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;grep&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;pattern&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;logfile&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;wc&lt;span class="w"&gt; &lt;/span&gt;-l
awk&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;{print $1}&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;logfile&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sort&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;uniq&lt;span class="w"&gt; &lt;/span&gt;-c
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Extract Timestamps&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;grep&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;pattern&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;logfile&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;awk&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;{print $1, $2, $3}&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Log Rotation&lt;/h2&gt;
&lt;p&gt;Logs are rotated to prevent disk fill:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;logrotate&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;/etc/logrotate.conf&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# Dry run&lt;/span&gt;
logrotate&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;/etc/logrotate.conf&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# Force rotation&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Monitoring Tools&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Watch logs in real-time&lt;/span&gt;
tail&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;/var/log/nginx/access.log&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;404&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;# Monitor multiple logs&lt;/span&gt;
multitail&lt;span class="w"&gt; &lt;/span&gt;/var/log/syslog&lt;span class="w"&gt; &lt;/span&gt;/var/log/auth.log
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Best Practices&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Regular log review&lt;/li&gt;
&lt;li&gt;Automated log analysis scripts&lt;/li&gt;
&lt;li&gt;Centralized logging for multiple systems&lt;/li&gt;
&lt;li&gt;Proper log retention policies&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Effective log analysis helps you catch issues early and understand system behavior.&lt;/p&gt;</content><category term="Ruta"/><category term="ruta"/></entry><entry><title>Kubernetes Fundamentals</title><link href="ruta/kubernetes-basics/" rel="alternate"/><published>2025-01-15T00:00:00-06:00</published><updated>2025-01-15T00:00:00-06:00</updated><author><name/></author><id>tag:None,2025-01-15:ruta/kubernetes-basics/</id><summary type="html">&lt;p&gt;Ruta de aprendizaje rengtech — Linux y administración de sistemas.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Kubernetes orchestrates containers at scale, managing deployment, scaling, and operations of containerized applications.&lt;/p&gt;
&lt;h2&gt;Core Concepts&lt;/h2&gt;
&lt;h3&gt;Pods&lt;/h3&gt;
&lt;p&gt;Smallest deployable unit. Contains one or more containers.&lt;/p&gt;
&lt;h3&gt;Services&lt;/h3&gt;
&lt;p&gt;Network abstraction providing stable IP and DNS name.&lt;/p&gt;
&lt;h3&gt;Deployments&lt;/h3&gt;
&lt;p&gt;Manages replica sets and rolling updates.&lt;/p&gt;
&lt;h3&gt;Namespaces&lt;/h3&gt;
&lt;p&gt;Virtual clusters for organizing resources.&lt;/p&gt;
&lt;h2&gt;Basic Commands&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;pods&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="c1"&gt;# List pods&lt;/span&gt;
kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;services&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="c1"&gt;# List services&lt;/span&gt;
kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;deployments&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="c1"&gt;# List deployments&lt;/span&gt;
kubectl&lt;span class="w"&gt; &lt;/span&gt;describe&lt;span class="w"&gt; &lt;/span&gt;pod&lt;span class="w"&gt; &lt;/span&gt;name&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="c1"&gt;# Pod details&lt;/span&gt;
kubectl&lt;span class="w"&gt; &lt;/span&gt;logs&lt;span class="w"&gt; &lt;/span&gt;pod-name&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="c1"&gt;# Pod logs&lt;/span&gt;
kubectl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-it&lt;span class="w"&gt; &lt;/span&gt;pod-name&lt;span class="w"&gt; &lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;/bin/sh&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# Execute in pod&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Deployment Example&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;apps/v1&lt;/span&gt;
&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Deployment&lt;/span&gt;
&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;myapp&lt;/span&gt;
&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;replicas&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;3&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;matchLabels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;myapp&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;myapp&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;containers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;myapp&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;myapp:latest&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;containerPort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;80&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Service Example&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;v1&lt;/span&gt;
&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Service&lt;/span&gt;
&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;myapp-service&lt;/span&gt;
&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;myapp&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;80&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;targetPort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;80&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;LoadBalancer&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Apply Configuration&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;apply&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;deployment.yaml
kubectl&lt;span class="w"&gt; &lt;/span&gt;apply&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;service.yaml
kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;all
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Scaling&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;scale&lt;span class="w"&gt; &lt;/span&gt;deployment&lt;span class="w"&gt; &lt;/span&gt;myapp&lt;span class="w"&gt; &lt;/span&gt;--replicas&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;
kubectl&lt;span class="w"&gt; &lt;/span&gt;autoscale&lt;span class="w"&gt; &lt;/span&gt;deployment&lt;span class="w"&gt; &lt;/span&gt;myapp&lt;span class="w"&gt; &lt;/span&gt;--min&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--max&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Updates&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;image&lt;span class="w"&gt; &lt;/span&gt;deployment/myapp&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;myapp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;myapp:v2
kubectl&lt;span class="w"&gt; &lt;/span&gt;rollout&lt;span class="w"&gt; &lt;/span&gt;status&lt;span class="w"&gt; &lt;/span&gt;deployment/myapp
kubectl&lt;span class="w"&gt; &lt;/span&gt;rollout&lt;span class="w"&gt; &lt;/span&gt;undo&lt;span class="w"&gt; &lt;/span&gt;deployment/myapp
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;ConfigMaps and Secrets&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;configmap&lt;span class="w"&gt; &lt;/span&gt;myconfig&lt;span class="w"&gt; &lt;/span&gt;--from-file&lt;span class="o"&gt;=&lt;/span&gt;config.properties
kubectl&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;secret&lt;span class="w"&gt; &lt;/span&gt;generic&lt;span class="w"&gt; &lt;/span&gt;mysecret&lt;span class="w"&gt; &lt;/span&gt;--from-literal&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;value
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Best Practices&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Use declarative configuration&lt;/li&gt;
&lt;li&gt;Version control all manifests&lt;/li&gt;
&lt;li&gt;Use namespaces for organization&lt;/li&gt;
&lt;li&gt;Set resource limits&lt;/li&gt;
&lt;li&gt;Implement health checks&lt;/li&gt;
&lt;li&gt;Use secrets for sensitive data&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kubernetes is the foundation of modern container orchestration.&lt;/p&gt;</content><category term="Ruta"/><category term="ruta"/></entry><entry><title>Getting Started with Linux</title><link href="ruta/getting-started/" rel="alternate"/><published>2025-01-14T00:00:00-06:00</published><updated>2025-01-14T00:00:00-06:00</updated><author><name/></author><id>tag:None,2025-01-14:ruta/getting-started/</id><summary type="html">&lt;p&gt;Ruta de aprendizaje rengtech — Linux y administración de sistemas.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Welcome to your Linux exploration journey! This path serves as the foundation for everything that follows.&lt;/p&gt;
&lt;h2&gt;What is Linux?&lt;/h2&gt;
&lt;p&gt;Linux is a free and open-source operating system kernel that powers everything from smartphones to supercomputers. Unlike proprietary operating systems, Linux gives you complete control over your computing environment.&lt;/p&gt;
&lt;h2&gt;Why Explore Linux?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Freedom&lt;/strong&gt;: Complete control over your system&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Learning&lt;/strong&gt;: Deep understanding of how computers work&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Power&lt;/strong&gt;: Access to powerful command-line tools&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Community&lt;/strong&gt;: Thriving ecosystem of developers and users&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What You'll Learn&lt;/h2&gt;
&lt;p&gt;Throughout these paths, you'll discover:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Command-line mastery&lt;/li&gt;
&lt;li&gt;System administration&lt;/li&gt;
&lt;li&gt;Networking and security&lt;/li&gt;
&lt;li&gt;Development environments&lt;/li&gt;
&lt;li&gt;Automation and scripting&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Choose your next path based on what interests you most. You can always return to explore different branches!&lt;/p&gt;</content><category term="Ruta"/><category term="ruta"/></entry><entry><title>File System Hierarchy</title><link href="ruta/file-system-exploration/" rel="alternate"/><published>2025-01-13T00:00:00-06:00</published><updated>2025-01-13T00:00:00-06:00</updated><author><name/></author><id>tag:None,2025-01-13:ruta/file-system-exploration/</id><summary type="html">&lt;p&gt;Ruta de aprendizaje rengtech — Linux y administración de sistemas.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Linux organizes everything as files in a hierarchical tree structure. Understanding this structure is fundamental to system administration.&lt;/p&gt;
&lt;h2&gt;The Root Directory&lt;/h2&gt;
&lt;p&gt;Everything starts at &lt;code&gt;/&lt;/code&gt; (root). Unlike Windows, Linux has a single unified file system.&lt;/p&gt;
&lt;h2&gt;Key Directories&lt;/h2&gt;
&lt;h3&gt;&lt;code&gt;/bin&lt;/code&gt; and &lt;code&gt;/usr/bin&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Essential user binaries and programs. &lt;code&gt;/bin&lt;/code&gt; contains critical system binaries, while &lt;code&gt;/usr/bin&lt;/code&gt; holds most user applications.&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;/etc&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Configuration files for system-wide settings. This is where you'll find most configuration files.&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;/home&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;User home directories. Each user has a subdirectory here.&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;/var&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Variable data files. Logs, caches, and temporary files that change during system operation.&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;/tmp&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Temporary files. Usually cleared on reboot.&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;/opt&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Optional software packages. Third-party applications often install here.&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;/usr/local&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Locally installed software. This is where you'd install software manually.&lt;/p&gt;
&lt;h2&gt;Special Files&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/dev&lt;/code&gt; - Device files representing hardware&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/proc&lt;/code&gt; - Virtual filesystem showing process information&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/sys&lt;/code&gt; - System information and configuration&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Exploring the Structure&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# See the structure&lt;/span&gt;
tree&lt;span class="w"&gt; &lt;/span&gt;-L&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/

&lt;span class="c1"&gt;# Check disk usage&lt;/span&gt;
df&lt;span class="w"&gt; &lt;/span&gt;-h

&lt;span class="c1"&gt;# Find large files&lt;/span&gt;
du&lt;span class="w"&gt; &lt;/span&gt;-sh&lt;span class="w"&gt; &lt;/span&gt;/var/*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sort&lt;span class="w"&gt; &lt;/span&gt;-h
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Understanding the file system hierarchy helps you know where to find things and where to put new software.&lt;/p&gt;</content><category term="Ruta"/><category term="ruta"/></entry><entry><title>CI/CD and Deployment Pipelines</title><link href="ruta/deployment-pipelines/" rel="alternate"/><published>2025-01-12T00:00:00-06:00</published><updated>2025-01-12T00:00:00-06:00</updated><author><name/></author><id>tag:None,2025-01-12:ruta/deployment-pipelines/</id><summary type="html">&lt;p&gt;Ruta de aprendizaje rengtech — Linux y administración de sistemas.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Continuous Integration and Deployment automate testing and deployment, reducing errors and speeding up releases.&lt;/p&gt;
&lt;h2&gt;GitLab CI/CD&lt;/h2&gt;
&lt;h3&gt;.gitlab-ci.yml&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;stages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;build&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;test&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;deploy&lt;/span&gt;

&lt;span class="nt"&gt;build&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;stage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;build&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;docker build -t myapp:$CI_COMMIT_SHA .&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;docker tag myapp:$CI_COMMIT_SHA myapp:latest&lt;/span&gt;

&lt;span class="nt"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;stage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;test&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;docker run myapp:latest npm test&lt;/span&gt;

&lt;span class="nt"&gt;deploy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;stage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;deploy&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;docker-compose up -d&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;only&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;main&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;GitHub Actions&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Deploy&lt;/span&gt;

&lt;span class="nt"&gt;on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;push&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;branches&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;

&lt;span class="nt"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;deploy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;runs-on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ubuntu-latest&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;actions/checkout@v3&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Deploy&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;|&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="no"&gt;docker build -t myapp .&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="no"&gt;docker-compose up -d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Jenkins&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;pipeline&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;any&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;stages&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Build&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;steps&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="n"&gt;sh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;docker build -t myapp .&amp;#39;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Test&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;steps&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="n"&gt;sh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;docker run myapp npm test&amp;#39;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Deploy&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;steps&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="n"&gt;sh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;docker-compose up -d&amp;#39;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Deployment Strategies&lt;/h2&gt;
&lt;h3&gt;Blue-Green Deployment&lt;/h3&gt;
&lt;p&gt;Run two identical environments, switch traffic between them.&lt;/p&gt;
&lt;h3&gt;Rolling Deployment&lt;/h3&gt;
&lt;p&gt;Gradually replace old instances with new ones.&lt;/p&gt;
&lt;h3&gt;Canary Deployment&lt;/h3&gt;
&lt;p&gt;Deploy to small subset, monitor, then roll out fully.&lt;/p&gt;
&lt;h2&gt;Best Practices&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Automate everything&lt;/li&gt;
&lt;li&gt;Test in staging first&lt;/li&gt;
&lt;li&gt;Use version tags&lt;/li&gt;
&lt;li&gt;Rollback plan ready&lt;/li&gt;
&lt;li&gt;Monitor deployments&lt;/li&gt;
&lt;li&gt;Document procedures&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CI/CD transforms software delivery from manual to automated.&lt;/p&gt;</content><category term="Ruta"/><category term="ruta"/></entry><entry><title>Containerization with Docker</title><link href="ruta/containerization/" rel="alternate"/><published>2025-01-11T00:00:00-06:00</published><updated>2025-01-11T00:00:00-06:00</updated><author><name/></author><id>tag:None,2025-01-11:ruta/containerization/</id><summary type="html">&lt;p&gt;Ruta de aprendizaje rengtech — Linux y administración de sistemas.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Containers package applications with their dependencies, making deployment consistent across environments.&lt;/p&gt;
&lt;h2&gt;Docker Basics&lt;/h2&gt;
&lt;h3&gt;Installation&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Ubuntu/Debian&lt;/span&gt;
curl&lt;span class="w"&gt; &lt;/span&gt;-fsSL&lt;span class="w"&gt; &lt;/span&gt;https://get.docker.com&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;get-docker.sh
sh&lt;span class="w"&gt; &lt;/span&gt;get-docker.sh

&lt;span class="c1"&gt;# Arch Linux&lt;/span&gt;
pacman&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;docker
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Basic Commands&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;docker&lt;span class="w"&gt; &lt;/span&gt;ps&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="c1"&gt;# Running containers&lt;/span&gt;
docker&lt;span class="w"&gt; &lt;/span&gt;ps&lt;span class="w"&gt; &lt;/span&gt;-a&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="c1"&gt;# All containers&lt;/span&gt;
docker&lt;span class="w"&gt; &lt;/span&gt;images&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="c1"&gt;# List images&lt;/span&gt;
docker&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;image&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="c1"&gt;# Download image&lt;/span&gt;
docker&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;image&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="c1"&gt;# Run container&lt;/span&gt;
docker&lt;span class="w"&gt; &lt;/span&gt;stop&lt;span class="w"&gt; &lt;/span&gt;container&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;# Stop container&lt;/span&gt;
docker&lt;span class="w"&gt; &lt;/span&gt;rm&lt;span class="w"&gt; &lt;/span&gt;container&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="c1"&gt;# Remove container&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Dockerfile&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;ubuntu:22.04&lt;/span&gt;
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;update&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;nginx
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;index.html&lt;span class="w"&gt; &lt;/span&gt;/var/www/html/
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;80&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;nginx&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;-g&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;daemon off;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Building&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;docker&lt;span class="w"&gt; &lt;/span&gt;build&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;myapp:latest&lt;span class="w"&gt; &lt;/span&gt;.
docker&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8080&lt;/span&gt;:80&lt;span class="w"&gt; &lt;/span&gt;myapp:latest
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Docker Compose&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;3.8&amp;#39;&lt;/span&gt;
&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;web&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;build&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;.&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;8000:80&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;db&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;postgres:15&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;POSTGRES_DB&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;mydb&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;docker-compose&lt;span class="w"&gt; &lt;/span&gt;up&lt;span class="w"&gt; &lt;/span&gt;-d
docker-compose&lt;span class="w"&gt; &lt;/span&gt;down
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Volume Management&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;docker&lt;span class="w"&gt; &lt;/span&gt;volume&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;myvolume
docker&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;myvolume:/data&lt;span class="w"&gt; &lt;/span&gt;container
docker&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;/host/path:/container/path&lt;span class="w"&gt; &lt;/span&gt;container
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Networking&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;docker&lt;span class="w"&gt; &lt;/span&gt;network&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;mynetwork
docker&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;--network&lt;span class="w"&gt; &lt;/span&gt;mynetwork&lt;span class="w"&gt; &lt;/span&gt;container
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Best Practices&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Use specific image tags, not &lt;code&gt;latest&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Minimize image layers&lt;/li&gt;
&lt;li&gt;Use multi-stage builds&lt;/li&gt;
&lt;li&gt;Don't run as root in containers&lt;/li&gt;
&lt;li&gt;Keep images small&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Containers revolutionize how we deploy and manage applications.&lt;/p&gt;</content><category term="Ruta"/><category term="ruta"/></entry><entry><title>Backup Strategies and Recovery</title><link href="ruta/backup-strategies/" rel="alternate"/><published>2025-01-10T00:00:00-06:00</published><updated>2025-01-10T00:00:00-06:00</updated><author><name/></author><id>tag:None,2025-01-10:ruta/backup-strategies/</id><summary type="html">&lt;p&gt;Ruta de aprendizaje rengtech — Linux y administración de sistemas.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Backups are your safety net. Without them, data loss is permanent. Learn to implement robust backup strategies.&lt;/p&gt;
&lt;h2&gt;Backup Types&lt;/h2&gt;
&lt;h3&gt;Full Backup&lt;/h3&gt;
&lt;p&gt;Complete copy of all data. Most comprehensive but storage-intensive.&lt;/p&gt;
&lt;h3&gt;Incremental Backup&lt;/h3&gt;
&lt;p&gt;Only changed files since last backup. Faster and uses less space.&lt;/p&gt;
&lt;h3&gt;Differential Backup&lt;/h3&gt;
&lt;p&gt;All changes since last full backup. Balance between full and incremental.&lt;/p&gt;
&lt;h2&gt;Backup Tools&lt;/h2&gt;
&lt;h3&gt;tar&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Create backup&lt;/span&gt;
tar&lt;span class="w"&gt; &lt;/span&gt;-czf&lt;span class="w"&gt; &lt;/span&gt;backup-&lt;span class="k"&gt;$(&lt;/span&gt;date&lt;span class="w"&gt; &lt;/span&gt;+%Y%m%d&lt;span class="k"&gt;)&lt;/span&gt;.tar.gz&lt;span class="w"&gt; &lt;/span&gt;/path/to/backup

&lt;span class="c1"&gt;# Extract&lt;/span&gt;
tar&lt;span class="w"&gt; &lt;/span&gt;-xzf&lt;span class="w"&gt; &lt;/span&gt;backup-20250131.tar.gz

&lt;span class="c1"&gt;# List contents&lt;/span&gt;
tar&lt;span class="w"&gt; &lt;/span&gt;-tzf&lt;span class="w"&gt; &lt;/span&gt;backup-20250131.tar.gz
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;rsync&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Sync directories&lt;/span&gt;
rsync&lt;span class="w"&gt; &lt;/span&gt;-avz&lt;span class="w"&gt; &lt;/span&gt;/source/&lt;span class="w"&gt; &lt;/span&gt;/destination/

&lt;span class="c1"&gt;# Remote backup&lt;/span&gt;
rsync&lt;span class="w"&gt; &lt;/span&gt;-avz&lt;span class="w"&gt; &lt;/span&gt;-e&lt;span class="w"&gt; &lt;/span&gt;ssh&lt;span class="w"&gt; &lt;/span&gt;/local/&lt;span class="w"&gt; &lt;/span&gt;user@remote:/backup/

&lt;span class="c1"&gt;# Dry run&lt;/span&gt;
rsync&lt;span class="w"&gt; &lt;/span&gt;-avzn&lt;span class="w"&gt; &lt;/span&gt;/source/&lt;span class="w"&gt; &lt;/span&gt;/destination/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;dd&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Disk image&lt;/span&gt;
dd&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/sda&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/backup/disk.img&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;bs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4M&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;progress

&lt;span class="c1"&gt;# Restore&lt;/span&gt;
dd&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/backup/disk.img&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/sda&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;bs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4M&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;progress
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Database Backups&lt;/h2&gt;
&lt;h3&gt;PostgreSQL&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pg_dump&lt;span class="w"&gt; &lt;/span&gt;database&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;backup.sql
pg_restore&lt;span class="w"&gt; &lt;/span&gt;backup.sql
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;MySQL&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mysqldump&lt;span class="w"&gt; &lt;/span&gt;database&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;backup.sql
mysql&lt;span class="w"&gt; &lt;/span&gt;database&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;&lt;span class="w"&gt; &lt;/span&gt;backup.sql
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Automated Backups&lt;/h2&gt;
&lt;h3&gt;Cron Script&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nv"&gt;BACKUP_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/backup&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;DATE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date&lt;span class="w"&gt; &lt;/span&gt;+%Y%m%d&lt;span class="k"&gt;)&lt;/span&gt;
tar&lt;span class="w"&gt; &lt;/span&gt;-czf&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$BACKUP_DIR&lt;/span&gt;&lt;span class="s2"&gt;/backup-&lt;/span&gt;&lt;span class="nv"&gt;$DATE&lt;/span&gt;&lt;span class="s2"&gt;.tar.gz&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/important/data
find&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$BACKUP_DIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-name&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;backup-*.tar.gz&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-mtime&lt;span class="w"&gt; &lt;/span&gt;+30&lt;span class="w"&gt; &lt;/span&gt;-delete
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Offsite Backups&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Cloud storage (S3, Backblaze)&lt;/li&gt;
&lt;li&gt;Remote server via SSH&lt;/li&gt;
&lt;li&gt;Physical media rotation&lt;/li&gt;
&lt;li&gt;Multiple locations&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Backup Verification&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Test restore&lt;/span&gt;
tar&lt;span class="w"&gt; &lt;/span&gt;-tzf&lt;span class="w"&gt; &lt;/span&gt;backup.tar.gz&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/dev/null&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;OK&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;FAILED&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;# Compare checksums&lt;/span&gt;
md5sum&lt;span class="w"&gt; &lt;/span&gt;original&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;checksum.txt
md5sum&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;checksum.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Recovery Testing&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Regularly test restore procedures&lt;/li&gt;
&lt;li&gt;Document recovery steps&lt;/li&gt;
&lt;li&gt;Know recovery time objectives (RTO)&lt;/li&gt;
&lt;li&gt;Know recovery point objectives (RPO)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Best Practices&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;3-2-1 rule: 3 copies, 2 media types, 1 offsite&lt;/li&gt;
&lt;li&gt;Automate backups&lt;/li&gt;
&lt;li&gt;Verify backups regularly&lt;/li&gt;
&lt;li&gt;Encrypt sensitive backups&lt;/li&gt;
&lt;li&gt;Document procedures&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Backups are worthless if you can't restore from them. Test regularly!&lt;/p&gt;</content><category term="Ruta"/><category term="ruta"/></entry></feed>