<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title>El blog de fedi.ovh</title>
	<subtitle>Blog estatico minimo gestionado con sh.</subtitle>
	<link href="https://fedi.ovh/blog/"/>
	<link rel="self" href="https://fedi.ovh/blog/atom.xml"/>
	<id>https://fedi.ovh/blog/</id>
	<updated>2026-05-31T20:36:05Z</updated>
	<author><name>fedi</name></author>
	<entry>
		<title>hola</title>
		<link href="https://fedi.ovh/blog/posts/hola.html"/>
		<id>https://fedi.ovh/blog/posts/hola.html</id>
		<updated>2026-05-25T00:00:00Z</updated>
		<published>2026-05-25T00:00:00Z</published>
		<author><name>fedi</name></author>
		<content type="html">&lt;p&gt;Escribe aqui el post.
&lt;/p&gt;</content>
	</entry>
	<entry>
		<title>otro</title>
		<link href="https://fedi.ovh/blog/posts/otro.html"/>
		<id>https://fedi.ovh/blog/posts/otro.html</id>
		<updated>2026-05-25T00:00:00Z</updated>
		<published>2026-05-25T00:00:00Z</published>
		<author><name>fedi</name></author>
		<summary>mi prueba de descripcion</summary>
		<content type="html">&lt;p&gt;# Esto es una prueba
&lt;/p&gt;&lt;h2&gt;Esto es una prueba&lt;/h2&gt;
&lt;h3&gt;Esto es una prueba&lt;/h3&gt;
&lt;h4&gt;Esto es una prueba&lt;/h4&gt;


&lt;ul&gt;&lt;li&gt;Esto es una prueba&lt;/li&gt;
&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;esto es una prueba&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr&gt;

&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;ls -all 
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;ps aux
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Esto es la &lt;em&gt;prueba&lt;/em&gt;
&lt;br&gt;Esto es la &lt;strong&gt;prueba&lt;/strong&gt;
&lt;br&gt;Esto es la &lt;em&gt;prueba&lt;/em&gt;
&lt;br&gt;Esto es la &lt;em&gt;prueba&lt;/em&gt;
&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://google.com&quot;&gt;texto&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;mailto:email@email.com&quot;&gt;email&lt;/a&gt;
&lt;/p&gt;</content>
	</entry>
	<entry>
		<title>Publicar el sitio en produccion</title>
		<link href="https://fedi.ovh/blog/posts/publicar-sitio.html"/>
		<id>https://fedi.ovh/blog/posts/publicar-sitio.html</id>
		<updated>2026-05-18T00:00:00Z</updated>
		<published>2026-05-18T00:00:00Z</published>
		<author><name>fedi</name></author>
		<summary>Como pasar de localhost al dominio real con un servidor estatico minimo.</summary>
		<content type="html">&lt;p&gt;Una vez el blog se ve bien en local, llevarlo a produccion es trivial porque public/ es solo HTML, CSS y SVG. No hay backend que provisionar, ni base de datos, ni servicios sistema que mantener.
&lt;/p&gt;
&lt;p&gt;El esquema usado aqui:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flujo:
  fuente -&amp;gt; build -&amp;gt; public/ -&amp;gt; servidor estatico -&amp;gt; dominio publico
componentes:
  servidor estatico   : BusyBox httpd en una instancia Alpine
  proxy externo       : Pangolin con TLS Let's Encrypt
  dominio             : blog.fedi.ovh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;En el servidor Alpine se ejecuta exactamente el mismo blog.sh build que en local. La unica diferencia es que el comando que mantiene el servidor en marcha no es serve sino httpd ejecutado como servicio:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;httpd -f -p 80 -h /var/www/blog/public
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O lanzado bajo supervisor: supervise-daemon, openrc-service, o un tmux/screen persistente. En esta instancia se usa supervise-daemon para que httpd se reinicie solo si cae.
&lt;/p&gt;
&lt;p&gt;El proxy externo (Pangolin) termina TLS en blog.fedi.ovh y reenvia HTTP plano a la instancia. La instancia no necesita certificados ni configuracion HTTPS propia.
&lt;/p&gt;
&lt;p&gt;Para actualizar el blog tras editar un post, basta con sincronizar el repositorio en el servidor y ejecutar build:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git pull
./blog.sh build
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;httpd sirve los HTML directamente del disco, no hace falta reiniciarlo. El proximo request ya ve la version nueva.
&lt;/p&gt;</content>
	</entry>
	<entry>
		<title>Parar el servidor</title>
		<link href="https://fedi.ovh/blog/posts/parar-servidor.html"/>
		<id>https://fedi.ovh/blog/posts/parar-servidor.html</id>
		<updated>2026-05-17T00:00:00Z</updated>
		<published>2026-05-17T00:00:00Z</published>
		<author><name>fedi</name></author>
		<summary>Como parar el servidor de desarrollo de forma limpia.</summary>
		<content type="html">&lt;p&gt;El servidor que lanza blog.sh serve corre en primer plano. La forma normal de pararlo es pulsar Ctrl+C en el mismo terminal donde lo arrancaste.
&lt;/p&gt;
&lt;p&gt;Internamente blog.sh ejecuta httpd (o python) con exec, asi que el proceso del script se reemplaza por el del servidor. Eso significa que matar el servidor mata el script: no quedan procesos residuales.
&lt;/p&gt;
&lt;p&gt;Si por alguna razon el terminal se perdio (cerraste la ventana, se desconecto la sesion SSH) y el servidor sigue ejecutandose, puedes encontrarlo y matarlo manualmente:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pgrep httpd
kill &amp;lt;PID&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O bien para todos los httpd en marcha:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;killall httpd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;En sistemas donde se uso python como fallback se sustituye httpd por python3 en los comandos anteriores.
&lt;/p&gt;
&lt;p&gt;Tras parar el servidor, si quieres dejar el directorio public/ limpio:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;./blog.sh clean
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Esto borra todos los HTML, el atom y los assets generados. Las fuentes (posts, pages, templates, style.css, assets) quedan intactas.
&lt;/p&gt;</content>
	</entry>
	<entry>
		<title>Iniciar el servidor de desarrollo</title>
		<link href="https://fedi.ovh/blog/posts/iniciar-servidor.html"/>
		<id>https://fedi.ovh/blog/posts/iniciar-servidor.html</id>
		<updated>2026-05-16T00:00:00Z</updated>
		<published>2026-05-16T00:00:00Z</published>
		<author><name>fedi</name></author>
		<summary>Como arrancar el blog en local para previsualizar los cambios.</summary>
		<content type="html">&lt;p&gt;Para previsualizar el blog en local:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;./blog.sh serve
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;El comando hace dos cosas en orden:
&lt;/p&gt;
&lt;p&gt;Primero ejecuta un build limpio para regenerar public/ desde cero.
&lt;/p&gt;
&lt;p&gt;Despues arranca un servidor HTTP estatico en el puerto 8000 sirviendo el contenido de public/. La salida confirma el directorio servido:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;serving /home/usuario/simple-blog/public on 0.0.0.0:8000 (Ctrl+C para parar)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;El servidor detecta automaticamente que herramienta usar segun lo que este instalado. Preferencia: httpd de BusyBox primero, python3 despues, python como ultimo recurso. En Alpine usa httpd; en un portatil con Python instalado usa python3.
&lt;/p&gt;
&lt;p&gt;Para acceder al blog se abre el navegador en http://localhost:8000/.
&lt;/p&gt;
&lt;p&gt;Cualquier cambio en el codigo fuente (posts, pages, plantillas, CSS) requiere parar el servidor y volver a ejecutar serve, ya que el build solo se ejecuta al inicio.
&lt;/p&gt;</content>
	</entry>
	<entry>
		<title>Estructura de un post</title>
		<link href="https://fedi.ovh/blog/posts/estructura-post.html"/>
		<id>https://fedi.ovh/blog/posts/estructura-post.html</id>
		<updated>2026-05-15T00:00:00Z</updated>
		<published>2026-05-15T00:00:00Z</published>
		<author><name>fedi</name></author>
		<summary>Que campos acepta el frontmatter y como se renderiza el cuerpo.</summary>
		<content type="html">&lt;p&gt;Cada post es un fichero de texto plano dividido en dos partes: el frontmatter (metadatos) y el cuerpo (contenido).
&lt;/p&gt;
&lt;p&gt;El frontmatter va al principio y termina con la primera linea en blanco. Los campos disponibles son:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;title       : titulo visible de la entrada
date        : fecha en formato YYYY-MM-DD
slug        : identificador para la URL, opcional
category   : una sola categoria
tags        : lista separada por comas
description : resumen corto, sale en el listado y en el Atom
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Si no especificas slug, se genera a partir del titulo. La categoria genera una pagina dedicada en categorias/, y cada tag genera una pagina dedicada en tags/.
&lt;/p&gt;
&lt;p&gt;El cuerpo es texto normal. Lineas separadas por una linea en blanco forman parrafos. Para bloques de codigo se usan tres backticks como delimitador, opcionalmente con el nombre del lenguaje:
&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;for f in posts/*.txt; do
    echo &quot;procesando $f&quot;
done
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;El renderizador esta escrito en awk y mantiene el formato a proposito minimal: parrafos y bloques de codigo. Nada de markdown completo, nada de extensiones.
&lt;/p&gt;</content>
	</entry>
	<entry>
		<title>Escribir una nueva entrada</title>
		<link href="https://fedi.ovh/blog/posts/escribir-entrada.html"/>
		<id>https://fedi.ovh/blog/posts/escribir-entrada.html</id>
		<updated>2026-05-14T00:00:00Z</updated>
		<published>2026-05-14T00:00:00Z</published>
		<author><name>fedi</name></author>
		<summary>Como crear una entrada nueva con el comando new y el formato del frontmatter.</summary>
		<content type="html">&lt;p&gt;Para crear una entrada nueva se usa el comando new pasando el titulo entre comillas:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;./blog.sh new &quot;Titulo del post&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Esto genera un fichero en posts/ con el nombre del dia mas el slug del titulo, por ejemplo posts/2026-05-14-titulo-del-post.txt, y deja dentro una plantilla lista para rellenar:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;title: Titulo del post
date: 2026-05-14
slug: titulo-del-post
category:
tags:
description:

Escribe aqui el post.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;El bloque de cabecera se llama frontmatter y termina con la primera linea en blanco. Todo lo que va por debajo es el cuerpo del post.
&lt;/p&gt;
&lt;p&gt;A partir de ahi solo hay que editar el fichero con cualquier editor de texto y guardar. El proximo build lo convertira a HTML y lo añadira al indice automaticamente.
&lt;/p&gt;</content>
	</entry>
</feed>
