💾 Archived View for srlobo.gorritodeplata.xyz › gemini › instalar.gmi captured on 2023-09-08 at 15:51:24. Gemini links have been rewritten to link to archived content
⬅️ Previous capture (2021-11-30)
-=-=-=-=-=-=-
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:
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.
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:
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.
De nuevo, existen varias maneras de proceder con este punto pero os comparto la que yo use.
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.
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.
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.
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
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.