-- Leo's gemini proxy

-- Connecting to srlobo.gorritodeplata.xyz:1965...

-- Connected

-- Sending request

-- Meta line: 20 text/gemini;lang=es-ES

Instalación y configuración de un servidor Gemini


Partimos de la idea que te interesa tener tu propia cápsula gemini y que no estas interesado/a en usar uno de los servidores públicos que ofrecen servicio gemini (eres valiente).

En las siguientes lineas, veremos como montar de forma rápida y fácil un servidor gemini usando el servidor "Agate".

Agate es un servidor escrito en lenguaje RUST el cual proporciona directamente binarios para diferentes plataformas (incluido Windows..) y que tiene un consumo de recursos practicamente nulo.


Cápsula gemini del servidor Agate


Por otro lado, necesitaras donde ejecutar tu flamante cápsula, por lo que debes dispober de lo siguiente:


Un servidor: puede ser un pc en tu casa o bien un servidor en algún proveedor de cloud (VPS)

Un nombre en internet: algo que apunte siempre a tu servidor en casa o bien un dominio asociado a tu servidor VPS (floresdeprimavera.com o salchichasgrandes.es, por ejemplo)


Tenemos que tener presente que nuesta cápsula gemini necesita de este nombre "fijo" debido a que tenemos que generar un certificado TLS asociado, si no cumplimos este punto, los clientes que quieran acceder a nuestra cápsula pueden tener problemas.


Instalación del servidor Agate

Esta es una de las multiples maneras en las que puedes ejecutar/instalar el servidor, yo comparto la que se ajustaba mejor a mis necesidades pero no quiere decir que sea la mejor.


En nuestro ejemplo, utilizaremos un servidor basado en sistema debian.

Una vez tengamos lista nuestra plataforma, es recomendable crear un usuario no administrador con el cual ejecutar nuestro servicio gemini:


> adduser paquito -m && passwd paquito


Generaremos una estructura de carpetas donde alojar todo lo relacionado con la instalación:


> mkdir /home/paquito/agate

> cd /home/paquito/agate

> mkdir bin blog logs ssl


Aunque los nombres de carpeta son bastante descriptivos, vamos a repasar su función:


/bin: Reside el binario pre-compilado para nuestra plataforma

/blog: Raiz de los documentos de gemini, los que conoceis como funciona un servidor web, es el equivalente al webroot.

/ssl: Certificados de nuestro servidor.

/logs: Almacen de logs del servicio.


Una vez tenemos la estructura de carpetas lista, procederemos a descargar el binario para linux (en el momento de redactar este articulo, la versión 2.5.3) en nuestra carpeta /bin:

> cd ./bin && wget https://github.com/mbrubeck/agate/releases/download/v2.5.3/agate.x86_64-unknown-linux-gnu.gz


Procederemos a descomprimir el fichero y a marcarle el atributo de "ejecutable":

> gunzip agate.x86_64-unknown-linux-gnu.gz && chmod +x agate.x86_64-unknown-linux-gnu


Llegados a este punto, ya podriamos ejecutar nuestro servidor Agate simplemente ejecutando el binario anterior junto a los parametros que queramos especificar:


>Usage: ./agate.x86_64-unknown-linux-gnu [options]

>

>Options:

> --content DIR Root of the content directory (default ./content/)

> --cert FILE TLS certificate PEM file (default ./cert.pem)

> --key FILE PKCS8 private key file (default ./key.rsa)

> --addr IP:PORT Address to listen on (default 0.0.0.0:1965 and

> [::]:1965; muliple occurences means listening on

> multiple interfaces)

> --hostname NAME Domain name of this Gemini server (default is not

> checking hostname or port; multiple occurences means

> basic vhosts)

> --lang LANG RFC 4646 Language code for text/gemini documents

> -s, --silent Disable logging output

> -h, --help Print this help menu and exit.

> -V, --version Print version information and exit.

> -3, --only-tls13 Only use TLSv1.3 (default also allows TLSv1.2)

> --serve-secret Enable serving secret files (files/directories

> starting with a dot)

> --log-ip Output IP addresses when logging

> -C, --central-conf Use a central .meta file in the content root

> directory.


Aún siendo esto posible, no nos interesa ya que el proceso morira en cuanto cerremos la sesión o bien reiniciemos nuestro servidor y lo que buscamos es lo contrario.


Configuración de un servicio para Agate

De nuevo, existen varias maneras de proceder con este punto pero os comparto la que yo use.


Generar certificados

Gemini se basa en certificados TLS para su funcionamiento. Hay todo un debate entre usar certificados de un tercero o bien autogenerarlos. Por una serie de cuestiones, se recomienda generar certificados autofirmados para su uso con TOFU.

Siguiendo esta recomendación, generaremos los certificados correspondientes los cuales ubicaremos en la carpeta "ssl" que creamos anteriormente:


> openssl req -x509 -newkey rsa:4096 -keyout key.rsa -out cert.pem -days 3650 -nodes -subj "/CN=paquito.chocolatero.xyz"


Destacar que debe coincidir el nombre común (CN) con el de tu cápsula gemini.


Crear un script

En mi caso, me decante por un script que lanza el binario de agate junto a los parametros que me interesaban:


> nano agate.service.sh

>#!/bin/bash

>

>content_dir="/home/paquito/agate/blog"

>cert="/home/paquito/agate/ssl/"

>bindip="0.0.0.0"

>port="1965"

>nombre="paquito.chocolatero.xyz"

>idioma="es-ES"

>

>/home/paquito/agate/bin/agate.x86_64-unknown-linux-gnu \

>--content $content_dir \

>--cert "$cert/cert.pem" \

>--key "$cert/key.rsa" \

>--addr $bindip:$port \

>--hostname $nombre \

>--lang $idioma \

>--log-ip \

>--serve-secret


El hecho de hacerlo de este modo es que no queria estar modificando el servicio a posteriori, esto lo veremos ahora cuando configuremos el servicio en systemd.

Este script no tiene ningún misterio, simplemente creamos una serie de variables para que sea más comodo modificarlo si fuera el caso.


Crear el servicio


Siguiendo el procedimiento para generar servicios en systemd, crearemos el fichero de configuración del servicio:


> nano /lib/systemd/system/agate.service

>

>[Unit]

>Description=Gemini Agate Server

>After=network.target

>StartLimitIntervalSec=0

>

>[Service]

>Type=simple

>Restart=always

>RestartSec=1

>User=srlobo

>ExecStart=/home/paquito/agate/agate.service.sh

>StandardOutput=syslog

>StandardError=syslog

>SyslogIdentifier=agateservice

>

>[Install]

>WantedBy=multi-user.target


El fichero de configuración del servicio tampoco tiene grandes configuraciones, si destacar el parametro "SyslogIdentifier" que nos va a servir para la configuración de los logs.


Configuración de los logs


Esto es totalmente opcional pero me gusto la idea de integrar los logs de agate dentro del propio syslog del sistema. Si revisamos de nuevo el fichero del servicio, veremos que le indicamos que se usara syslog.

Lo podriamos dejar así pero, que los logs de agate se mezclen con todo lo demás, puede ser dificil de seguir. Para evitar esto crearemos un fichero de configuración que gestionara la configuración del servicio de logs.

Generaremos el siguiente fichero de configuración:

>nano /etc/rsyslog.d/agateservice.conf


En este fichero, configuraremos la ruta donde queremos alojar los logs de la aplicación. Notese que aprovecharemos el parametro "SyslogIdentifier" antes informado:


>if $programname == 'agateservice' then /home/paquito/agate/logs/agate.log

>& stop


Es necesario permitir a syslog que modifique el fichero de logs modificando el propietario del mismo:

>chown syslog:adm /home/paquito/agate/logs/agate


Ya solo queda reiniciar el servicio de syslog:

> systemctl restart rsyslog


Levantamos el chiringuito

Ya solo nos queda activar el servicio de agate y comprobar que inicia de forma correcta, para ello ejecutaremos:


>systemctl daemon-reload

>systemctl enable agate.service

>systemctl start agate.service


Podremos ver el estado del servicio ejecutando los siguiente:


>systemctl status agate.service

>● agate.service - Gemini Agate Server

> Loaded: loaded (/lib/systemd/system/agate.service; enabled; vendor preset: enabled)

> Active: active (running) since Mon 2021-03-01 14:52:31 CET; 5h 8min ago

> Main PID: 31454 (agate.service.s)

> Tasks: 3 (limit: 469)

> Memory: 3.2M

> CGroup: /system.slice/agate.service

> ├─31454 /bin/bash /home/paquito/agate/agate.service.sh

> └─31455 /home/paquito/agate/agate.x86_64-unknown-linux-gnu --content /home/paquito/agate/blog --cert /home>



Listo! Ahora queda crear tu fichero índice "index.gmi" en la carpeta raíz y empezar a contruir tu sitio.


¡A disfrutar de tu cápsula gemini!



NOTA: Actualización del binario agate (cortesia de c3po.aljadra.xyz)

>Para actualizar el servidor al salir nueva versión de agate solo tienes que descargar el nuevo archivo dentro del directorio bin, borrar el anterior archivo, descomprimir el nuevo, volverlo ejecutable (todo lo mismo que hiciste al principio al montar el servidor) y reiniciar el servidor con:

> systemctl restart agate

>

>O pararlo y volverlo a iniciar y activar, como ya hiciste anteriormente.



VOLVER AL INICIO.

-- Response ended

-- Page fetched on Thu Apr 25 02:08:08 2024