<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
    <title>Nezzontli - OpenBSD</title>
    <subtitle>Bitácora personal de Alejandro B.E.: tecnología, física, sistemas resilientes y fotografía analógica.</subtitle>
    <link rel="self" type="application/atom+xml" href="https://nezzontli.xyz/es/tags/openbsd/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://nezzontli.xyz"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-02-03T00:00:00+00:00</updated>
    <id>https://nezzontli.xyz/es/tags/openbsd/atom.xml</id>
    <entry xml:lang="es">
        <title>Uso de OpenBSD para hospedaje de página web</title>
        <published>2026-02-03T00:00:00+00:00</published>
        <updated>2026-02-03T00:00:00+00:00</updated>
        
        <author>
          <name>
            B.E. Alejandro
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://nezzontli.xyz/es/blog/web/"/>
        <id>https://nezzontli.xyz/es/blog/web/</id>
        
        <content type="html" xml:base="https://nezzontli.xyz/es/blog/web/">&lt;h2 id=&quot;contexto-y-motivacion&quot;&gt;Contexto y motivación&lt;&#x2F;h2&gt;
&lt;p&gt;Decidí migrar el hospedaje de mi página web a OpenBSD como un ejercicio deliberado de control, simplicidad y seguridad.&lt;br &#x2F;&gt;
No fue una decisión basada en rendimiento, escalabilidad comercial ni automatización extrema, sino en comprensión total del sistema.&lt;&#x2F;p&gt;
&lt;p&gt;OpenBSD obliga a entender cada archivo de configuración, cada servicio activo y cada permiso. No oculta complejidad: la expone. Ese fue el motivo central de esta migración.&lt;&#x2F;p&gt;
&lt;p&gt;El objetivo era claro: un servidor auditable, predecible y mínimo.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;infraestructura-y-vm&quot;&gt;Infraestructura y VM&lt;&#x2F;h2&gt;
&lt;p&gt;El servidor corre en una máquina virtual alquilada (VPS) de bajo costo, suficiente para contenido estático y servicios mínimos.&lt;&#x2F;p&gt;
&lt;p&gt;Características generales de la VM:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;1 vCPU&lt;&#x2F;li&gt;
&lt;li&gt;1–2 GB de RAM&lt;&#x2F;li&gt;
&lt;li&gt;Almacenamiento SSD&lt;&#x2F;li&gt;
&lt;li&gt;IP pública dedicada&lt;&#x2F;li&gt;
&lt;li&gt;Acceso root inicial para bootstrap&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;El proveedor no es relevante: OpenBSD no depende de features del host. El sistema se mantiene portable y reproducible.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;eleccion-del-stack&quot;&gt;Elección del stack&lt;&#x2F;h2&gt;
&lt;p&gt;El stack fue elegido conscientemente para reducir superficie de ataque:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Sistema operativo: OpenBSD&lt;&#x2F;li&gt;
&lt;li&gt;Servidor web: httpd (nativo)&lt;&#x2F;li&gt;
&lt;li&gt;HTTPS: acme-client (Let’s Encrypt)&lt;&#x2F;li&gt;
&lt;li&gt;Generador estático: Zola&lt;&#x2F;li&gt;
&lt;li&gt;Tema: Duckquill (modificado)&lt;&#x2F;li&gt;
&lt;li&gt;Repositorio: Git + GitHub&lt;&#x2F;li&gt;
&lt;li&gt;Acceso remoto: SSH con YubiKey (OpenPGP)&lt;&#x2F;li&gt;
&lt;li&gt;Servicio oculto: Tor (mirror .onion)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;No hay nginx, no hay docker, no hay paneles web, no hay Node en producción. Solo binarios del sistema base y archivos de texto.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;migracion-a-openbsd&quot;&gt;Migración a OpenBSD&lt;&#x2F;h2&gt;
&lt;p&gt;La migración incluyó:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Instalación limpia de OpenBSD&lt;&#x2F;li&gt;
&lt;li&gt;Configuración manual de red y DNS&lt;&#x2F;li&gt;
&lt;li&gt;Creación explícita de usuarios&lt;&#x2F;li&gt;
&lt;li&gt;Uso exclusivo de doas (sin sudo)&lt;&#x2F;li&gt;
&lt;li&gt;Servicios deshabilitados por defecto&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Separación clara entre: sistema (&#x2F;etc), contenido (&#x2F;var&#x2F;www), claves (&#x2F;etc&#x2F;ssl, &#x2F;etc&#x2F;acme). Nada se dejó “por default” sin entenderlo.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;servidor-web-con-httpd&quot;&gt;Servidor web con httpd&lt;&#x2F;h2&gt;
&lt;p&gt;El servidor web se configuró usando httpd nativo, sin módulos externos.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Configuración base simplificada:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;server &amp;quot;nezzontli.xyz&amp;quot; {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    listen on * port 80
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    root &amp;quot;&#x2F;htdocs&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    location &amp;quot;&#x2F;.well-known&#x2F;acme-challenge&#x2F;*&amp;quot; {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        root &amp;quot;&#x2F;acme&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        request strip 2
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    }
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;server &amp;quot;nezzontli.xyz&amp;quot; {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    listen on * tls port 443
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    root &amp;quot;&#x2F;htdocs&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    tls {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        certificate &amp;quot;&#x2F;etc&#x2F;ssl&#x2F;nezzontli.xyz.fullchain.pem&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        key &amp;quot;&#x2F;etc&#x2F;ssl&#x2F;private&#x2F;nezzontli.xyz.key&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    }
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;https-con-acme-client&quot;&gt;HTTPS con acme-client&lt;&#x2F;h2&gt;
&lt;p&gt;OpenBSD incluye acme-client en base, lo que elimina dependencias externas.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Flujo real:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Configurar httpd solo en HTTP&lt;&#x2F;li&gt;
&lt;li&gt;Resolver DNS correctamente (A records apuntando a la VM)&lt;&#x2F;li&gt;
&lt;li&gt;Ejecutar: &lt;code&gt;doas acme-client -v nezzontli.xyz&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Verificar creación de certificados en &#x2F;etc&#x2F;ssl&lt;&#x2F;li&gt;
&lt;li&gt;Habilitar TLS en httpd&lt;&#x2F;li&gt;
&lt;li&gt;Reiniciar servicio&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;No se usan scripts externos. La renovación se maneja vía cron del sistema.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;problemas-encontrados-y-soluciones&quot;&gt;Problemas encontrados (y soluciones)&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;1-error-404-en-acme-challenge&quot;&gt;1. Error 404 en ACME challenge&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Causa:&lt;&#x2F;strong&gt; httpd no estaba sirviendo correctamente &#x2F;var&#x2F;www&#x2F;acme.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Solución:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;doas&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; mkdir&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;p&lt;&#x2F;span&gt; &#x2F;var&#x2F;www&#x2F;acme&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;doas&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; chown&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;R&lt;&#x2F;span&gt; web:web &#x2F;var&#x2F;www&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;2-dns-no-propagado&quot;&gt;2. DNS no propagado&lt;&#x2F;h3&gt;
&lt;p&gt;Durante el primer intento, el dominio resolvía a múltiples IPs antiguas: &lt;code&gt;dig nezzontli.xyz +short&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Solución:&lt;&#x2F;strong&gt; Esperar propagación completa y eliminar registros conflictivos.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;3-confusion-con-dnssec&quot;&gt;3. Confusión con DNSSEC&lt;&#x2F;h3&gt;
&lt;p&gt;DNSSEC no es requisito para Let’s Encrypt HTTP-01. DNSSEC es independiente de TLS. No se activó en esta etapa.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;generacion-del-sitio-con-zola&quot;&gt;Generación del sitio con Zola&lt;&#x2F;h2&gt;
&lt;p&gt;El sitio es 100% estático.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Flujo básico:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;zola&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; build&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;doas&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; rsync&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;a&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; --&lt;&#x2F;span&gt;delete&lt;&#x2F;span&gt; public&#x2F; &#x2F;var&#x2F;www&#x2F;htdocs&#x2F;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;No hay generación en runtime. No hay escritura desde el servidor web.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;mirror-tor-onion&quot;&gt;Mirror Tor (.onion)&lt;&#x2F;h2&gt;
&lt;p&gt;Se configuró un Hidden Service de Tor como mirror del sitio.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;&#x2F;etc&#x2F;tor&#x2F;torrc:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;HiddenServiceDir &#x2F;var&#x2F;tor&#x2F;hidden_service&#x2F;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;HiddenServicePort 80 127.0.0.1:80
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;httpd escucha solo en localhost para Tor:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;server &amp;quot;*&amp;quot; {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    listen on 127.0.0.1 port 80
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    root &amp;quot;&#x2F;tor&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Build específico para Tor:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;zola&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; build&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; --&lt;&#x2F;span&gt;base-url&lt;&#x2F;span&gt; http:&#x2F;&#x2F;&lt;span class=&quot;z-keyword z-operator z-assignment z-redirection z-shell&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;onion&lt;span class=&quot;z-keyword z-operator z-assignment z-redirection z-shell&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;.onion&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;doas&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; rsync&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;a&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; --&lt;&#x2F;span&gt;delete&lt;&#x2F;span&gt; public&#x2F; &#x2F;var&#x2F;www&#x2F;tor&#x2F;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Integración Tor Browser (Onion-Location):&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;html&quot; class=&quot;language-html z-code&quot;&gt;&lt;code class=&quot;language-html&quot; data-lang=&quot;html&quot;&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;&lt;span class=&quot;z-meta z-tag z-inline z-any z-html&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag z-begin z-html&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-inline z-any z-html&quot;&gt;meta&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-attribute-with-value z-html&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name z-html&quot;&gt;http-equiv&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value z-html&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-html&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-html&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;onion-location&lt;span class=&quot;z-punctuation z-definition z-string z-end z-html&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-attribute-with-value z-html&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name z-html&quot;&gt;content&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value z-html&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-html&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-html&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;http:&#x2F;&#x2F;&amp;lt;onion&amp;gt;.onion&lt;span class=&quot;z-punctuation z-definition z-string z-end z-html&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag z-end z-html&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;automatizacion-del-despliegue&quot;&gt;Automatización del despliegue&lt;&#x2F;h2&gt;
&lt;p&gt;Script único para clearnet + Tor:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-begin z-shell&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;!&#x2F;bin&#x2F;sh&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-set z-shell&quot;&gt;set&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt;-&lt;&#x2F;span&gt;e&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-assignment z-shell&quot;&gt;ONION_URL&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment z-shell&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-unquoted z-shell&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;http:&#x2F;&#x2F;&amp;lt;onion&amp;gt;.onion&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;git&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; pull&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;zola&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; build&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;doas&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; rsync&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;a&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; --&lt;&#x2F;span&gt;delete&lt;&#x2F;span&gt; public&#x2F; &#x2F;var&#x2F;www&#x2F;htdocs&#x2F;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;zola&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; build&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; --&lt;&#x2F;span&gt;base-url&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;ONION_URL&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;doas&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; rsync&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;a&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; --&lt;&#x2F;span&gt;delete&lt;&#x2F;span&gt; public&#x2F; &#x2F;var&#x2F;www&#x2F;tor&#x2F;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Instalado en: &lt;code&gt;&#x2F;usr&#x2F;local&#x2F;bin&#x2F;update-site&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;control-de-acceso-ssh-yubikey&quot;&gt;Control de acceso: SSH + YubiKey&lt;&#x2F;h2&gt;
&lt;p&gt;Acceso remoto sin contraseñas persistentes:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Clave OpenPGP en YubiKey&lt;&#x2F;li&gt;
&lt;li&gt;PIN + touch físico&lt;&#x2F;li&gt;
&lt;li&gt;gpg-agent como SSH agent&lt;&#x2F;li&gt;
&lt;li&gt;ssh-ed25519&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;La clave privada nunca toca el disco.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;control-de-versiones-y-firmas&quot;&gt;Control de versiones y firmas&lt;&#x2F;h2&gt;
&lt;p&gt;Repositorio alojado en GitHub:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Git puro&lt;&#x2F;li&gt;
&lt;li&gt;Commits firmados&lt;&#x2F;li&gt;
&lt;li&gt;Modelo de confianza por defecto&lt;&#x2F;li&gt;
&lt;li&gt;Sin CI obligatorio&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;El servidor no compila desde hooks remotos: el despliegue es consciente y manual.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;estructura-del-proyecto&quot;&gt;Estructura del proyecto&lt;&#x2F;h2&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;site&#x2F;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;├── config.toml
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;├── content&#x2F;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;├── templates&#x2F;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;├── static&#x2F;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;├── public&#x2F;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;└── scripts&#x2F;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;En servidor:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;&#x2F;var&#x2F;www&#x2F;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;├── htdocs&#x2F;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;├── tor&#x2F;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;└── acme&#x2F;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;que-falta-por-hacer&quot;&gt;Qué falta por hacer&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Pendientes reales:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Hardening adicional de httpd&lt;&#x2F;li&gt;
&lt;li&gt;Documentar bootstrap completo desde cero&lt;&#x2F;li&gt;
&lt;li&gt;Monitoreo mínimo (sin agentes invasivos)&lt;&#x2F;li&gt;
&lt;li&gt;Publicar configs como referencia reproducible&lt;&#x2F;li&gt;
&lt;li&gt;Auditoría de headers de seguridad&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;idea-central&quot;&gt;Idea central&lt;&#x2F;h2&gt;
&lt;p&gt;Este proyecto no busca conveniencia ni velocidad de desarrollo.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Busca:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Comprensión&lt;&#x2F;li&gt;
&lt;li&gt;Control&lt;&#x2F;li&gt;
&lt;li&gt;Auditabilidad&lt;&#x2F;li&gt;
&lt;li&gt;Reducción de estados implícitos&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;OpenBSD no acelera el trabajo. Elimina errores silenciosos. Ese es el valor.&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
