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.
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.
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!
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.
La configuración de NPM es aún menos misteriosa.
En cuanto al certificado:
¡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:
Voy a tratar de la instalación y uso del primero, 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
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.
Sigamos con la estrucutura de gempost.
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
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"
¡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!