Protocolo Gemini (NO Google Gemini AI), por que, cuando, como, y otras preguntas

Enero 2, 2025 - Tiempo de lectura: 579 minutos

Protocolo Gemini, gemtext. Nace de una necesidad que conocemos todos: la web se está convirtiendo en mierda. Se trata de un protocolo tipo HTTP, pero mucho más ligero. Minimalista. No hay trackers, no hay JavaScript. Solo texto, es aún más sencillo que el formato Markdown.

Obviamente, como todas esas tecnologías "hippies", a día de hoy tiene poco bombo. Pero aquí estoy, en lugar de quejarme de ello, vengo a aportar mi granito de arena.

Como para cualquier movimiento tecnológico, creo que es más importante la motivación que las especificaciones. Pero bueno, aquí están. Es un proyecto que empezó 2019, así que es aún joven. Y por eso, hay que poner de nuestra parte para que crezca como se lo merece.

Para empezar: mi cápsula Gemini ("cápsula" es web): gemini://capsula.labaudric.net, o su proxy en web: https://gemini.labaudric.net

Vamos por partes, como dijo Jack el destripador. No te va el primer enlace, ¿verdad? Gemini es otro protcolo como dijé, entonces.. "out of the box", seguramente el navegador desde donde estés leyendo este blog: no entiende Gemini.

Sigue leyendo para una breve descripción sobre el protocolo, así como para saber como alojar tu propia capsula, gemlog, y proxy de tu cápsula a http.

¿Como acceder a gemini?

Desde tu ordenador y android: navegador Lagrange.

Si usas firefox y te da pereza instalarte otro navegador solo para esto: extensión Geminize. Esto, lo "único" que hace es usar un proxy gemini a http. Pues, como cualquier protocolo propio, necesita un proxy si se quiere acceder desde otro.

La idea es que se tenga una experiencia "propia" de Gemini, y no andar tirando de proxies. Es como si te dijera, toma prueba Android, y te mando a utilizar un emulador de Android.. La experiencia, pues, no es la misma.

Pero con ese mismo ejemplo / argumento: antes que invertir al menos 200 euros o algo en un dispositivo para palpar ese Android: querrás tener una vista previa que no suponga ese esfuerzo.

En el caso de gemini, estamos hablando de instalar un navegador, gratuito encima. Pero aún así, es un esfuerzo. Mínimo, pero un esfuerzo supongo. Por eso considero la existencia de proxies geminis a http, justificada.

Valiosos enlaces de interés:

https://github.com/kr1sp1n/awesome-gemini esto es básicamente la biblia. Fijaros que por ahora, solo he mencionado "cápsula", "navegador" y "proxy". Pero Gemini, al ser un protocolo, ¡alberga mucho más! Si os interesa el tema, realmente os animo a mirar la lista de arriba a abajo. Hay muchas joyas. ¿O debería decir Gemas?

https://dystopic.world/ esta es la web de sl1200, la persona que sin lugar a dudas: me ha motivado e inspirado en meterme en este mundo. Su cápsula es gemini://sl1200.dystopic.world

Ahora. Entremos en la materia. ¡A hacer una cápsula!

Crea tu cápsula en docker detrás de Nginx proxy manager

Uso ese stack bueno porque me parece poderoso y sencillo. Para el servidor, no uso el más famoso agate, sencillamente porque no he logrado hacerlo funcionar detrás de NPM. Sin embargo, con "Gemini" de "a-h" me ha funcionado sin problemas. Así que palante.

El docker compose que utilizo para hostear la capsula gemini es:

name: geminicapsule
services:
gemini:
volumes:
- /home/[usuario]/docker/gemini_capsule/certs:/certs
- /home/[usuario]/docker/gemini_capsule/content/public:/content
environment:
- PORT=1965
- DOMAIN=capsula.labaudric.net
ports:
- 1965:1965
image: adrianhesketh/gemini:latest

Para una comunicación servidor-cliente cifrada, Gemini, al igual que cualquier otro protocolo, necesita unos certificados. En la carpeta /certs, pon los archivos resultantes de estos comandos, server.key y server.crt:

openssl ecparam -genkey -name secp384r1 -out server.key
openssl req -new -x509 -sha256 -key server.key -out server.crt -days 3650

En relación con el segundo volumen, es la carpeta de la cápsula, lo que va a estar expuesto a internet. En el servidor web http Apache, la carpeta equivalente es htdocs.

Puerto, 1695 es el por defecto para Gemini, y dominio; la dirección que quieras que tenga tu cápsula. No olvides hacer lo necesario en tu hosting / registrar de dominio, apuntar el dominio en cuestión a la ip del servidor donde estes ejecutando eso.

NGINX Proxy Manager

La configuración de NPM es aún menos misteriosa.

  • Nombre del dominio, el mismo que hemos puesto en el docker compose del servidor de la cápsula
  • HTTP, O HTTPS; ambos funcionan
  • La ip del servidor
  • El puerto 1965 si no lo hemos cambiado.
  • Cache assests, yo nunca lo recomiendo (salvo para páginas pesadas, que necesitan cache. De otra forma, y sobre todo si son sujetas a ser "trasteadas" a menudo, como suelen ser los sujetos de auto alojamiento.. Mejor que las cookies no nos hagan jugadas)
  • A diferencia de Block common exploits, que si lo recomiendo siempre. No es que como tu página es sencilla... Hasta inútil como la mía, que por tener poco tráfico que no van a ser sujeto de un ataque. La mayoría de los ataques, no son personales, sino que rastrean la red con crawlers, y servicio que ven abierto, servicio al cual intentar entrar y a ver que se puede robar dentro..
  • Para terminar, Websockets Support, la verdad es que no he notado ninguna diferencia activado que desactivado

En cuanto al certificado:

  • Pides uno nuevo desde LetsEncrypt, o tu propia CA, que apunte al dominio
  • Forzar SSL para asegurar que solo se accede al servidor de forma cifrada
  • Y lo demás: sinceramente creo que da igual, porque juraría que son exclusivas de HTTP(S) y no tienen ningún impacto en Gemini. Juraría, no lo sé a ciencia exacta.

¡Tachán!

Bien, ahora hablemos del contenido, y la forma de gestionarlo. Gracias a dios, pese a que el protocolo sea joven, ya dispone de algunas herramientas. Hablo de "Gemlogs", que sería el equivalente a Content Management System en la web tradicional. No hablo de sistemas avanzados como Joomla, o sistemas de eCommerce con carrito etc... Recordemos que hablamos de Gemini: "webs" radicalmente sencillas y planas. Por lo tanto los gemlogs son "bloggers" super sencillo. Hay bastantes, pero destacan cuatro:

  1. Gempost
  2. Gloggery
  3. gssg
  4. kiln

Voy a tratar de la instalación y uso del primero, Gempost

Gempost

Para esta herramienta, no uso docker. No encuentro contenedor existente, no le veo la necesidad. No expone nada a la red, y es trivialmente básico. Solo depende de Rust, difícilmente va a romper dependencias. Se puede debatir sobre seguridad... Pero no soy un experto en la materia. Por lo tanto: lo instalo el host de docker. En mi caso, es un Ubuntu 24.04 (es lo que usa la imagen de servidor Docker)

Paso 1: instalar Rust

Existen varias formas de instalar Rust, incluso en la misma distribución. En mi caso, opto por fiarme de APT y sus repositorios oficiales:

sudo apt install cargo

Existen más formas de instalarlo.

Instalar Gempost es cosa de sencilla de solo otro comando, sin ningún parámetro ni nada:

cargo install gempost

Una vez hecho, nos ponemos en el directorio donde tenemos intención de alojar la cápsula, la que pusimos en el segundo volumen del docker compose del servidor gemini. Pero la carpeta madre de esta, capsule y no public. Más adelante explico la crucial diferencia entre ambas carpetas.

Para crear un gemlog (esqueleto), o para iniciar gemlog, lanzamos el siguiente comando desde la terminal dentro de la carpeta raíz (public mencionada anteriormente no, la padre de esa. Sino, vas a encontrarte con este problema). En este caso, capsule:

gempost init ./nombre_carpeta_padre_de_public

Eso no crea la estructura siguiente:

capsule/
├── gempost.yaml
├── posts/
│   ├── hello-world.gmi
│   └── hello-world.yaml
├── static/
│   └── index.gmi
└── templates/
    ├── index.tera
    └── post.tera

  • gempost.yaml: archivo de la configuración del gempost
  • public_dir: lo que ya he mencionado dos veces hasta ahora. Es lo que se va a entregar al servidor web. Los demás archivos, el visitante no necesita acceso a ello. Es el Gemlog / CMS en cuestión, el panel de administrador.
  • static_dir: donde estarán los artículos estáticos (a diferencias de entradas de log), como el típico "Acerca de..", "Contacto", etc.
  • index_template_file: ubicación del archivo de template para las páginas que NO son entradas de log, los índices.
  • post_template_file: lo mismo que lo anterior pero para SI las entradas de log.
  • post_path: la estructura de la "url" para las entradas de blog. A diferencia del valor por defecto, yo le añadí la fecha.
  • index_path: la dirección, el documento que aparece cuando accedes a tu cápsula.
  • title: el título / nombre de la cápsula.
  • url: la dirección de la cápsula.
  • subtitle: el "slogan" del sitio.
  • rights: el copyright. Puedes hacer que aparezca en el footer (por ejemplo) de la cápsula.
  • author: al igual que lo anterior, es por si quieres que aparezca en el template en alguna parte de la cápsula.

En Posts, tenemos nuestras entradas de blogs. Ojo: por cada entrada hay dos archivos. Uno de datos (el actual documento), y otro el de metadatos, .yaml.

post.gmi se redacta en Gemtext. El HTML de Gemini.

Igual de importante que es ese archivo, es el de sus metadatos.

  • El id se genera de forma automática.
  • title es obvio.
  • published y updated time son las fechas de creación y modificación del artículo, si ha sido editado.
  • Y los metadatos del author, si los necesitas en el template de post.
  • Asegúrate de rellenar también los metadatos del artículo después de escribirlo y antes de publicarlo

Sigamos con la estrucutura de gempost.

  • En static, pondremos lás páginas estáticas que comentábamos antes. "Acerca de", "contacto", etc.
  • En templates, pondremos nuestros templates para tanto índices como posts. Los detallamos abajo:

index.tera: Ahí tenemos un ejemplo de las variables de fecha de modificación de artículo. Sujeto a un if. Si el artículo no ha sido modificado, no va a salir ningún error ni "date no available" ni historias raras.

post.tera: template para las entradas. Lo único que añadí, es nombre y email del autor debajo del texto.

Podéis ver templates del propio desarrollador de los cuales me inspiré aquí.

Para crear un artículo, desde la terminal (en la raíz de capsule) lanza el comando:

gempost new nombre_articulo

Una vez hecho eso, cambiate al directorio de los artículos:

cd posts

Y ahí escribe / edita con el editor que más te guste. Personalmente, es nano. Pero vale cualquiera.

nano nombre_articulo.gmi

Y ahí, en formato Gemtext, redacta. Luego, lo mismo con el archivo de metadatos.

Importante: para que nuevos artículos / modificaciones / cambios en template y o configuración, es necesario lanzar el comando (en la raíz capsule) (fue por cierto motivo para mi en abrir este ticket):

gempost build

Es precisamente en el proceso de build, que se construye la carpeta public. Acto seguido, procedemos un reinicio del contenedor docker. De no hacerlo, los navegadores darán un error del recurso.

Et voila!

Y por último, y como extra, vamos a hablar del

Proxy gemini-http

Como he comentado antes, tener proxy de tu cápsula, es interesante para compartila con esas personas de tu alrededor que no sean tan frikis como tu. ¡Ellos se lo pierden!

Para el proxy, al igual que el servidor: no uso el más famoso, Kineto. Nada personal, pero de nuevo: no logré hacerlo funcionar detrás de Nginx Proxy manager. En mi caso, utilizo September.

Para este proceso, al igual que alojar el servidor, hago uso de docker compose.

services:
  september:
    ports:
      - "8081:80"
    environment:
      - "ROOT=gemini://capsula.labaudric.net"
      # - "CSS_EXTERNAL=https://example.com/style.css"
      # - "KEEP_GEMINI_EXACT=gemini://fuwn.me/skills"
      # - "KEEP_GEMINI_DOMAIN=fuwn.me"
      - "PROXY_BY_DEFAULT=true"
    image: "fuwn/september:latest"
  • ports: Puerto host / puerto contenedor, como siempre. Internamente, september se lanza en 80 HTTP.
  • root: tu cápsula que quieres proxiear
  • css: si quieres renderizarla con una hoja CSS en particular
  • keep_gemini_exact y _domain: ni idea sinceramente. Y no lo veo explicado en el readme.md de github...
  • proxy_by_default si en false, supongo que viene a ser lo mismo que si el contenedor esta apagado..
  • y la imagen

¡Tachán!

Y bueno. Una nota final... Si quieres tu propia capsula, pero no tienes servidor, no quieres auto alojar, no quieres toda esta mierda... Tranquilo, que hay alternativas. Existen servicios de hosting gemini:

Y eso es todo por ahora. ¡Feliz aventura por Gemini!