Description
gmid est un serveur Gemini, disponible en tant que paquet sous OpenBSD, supportant toutes les fonctionnalités du protocol Gemini, et utilisant les “verroux” de sécurité disponible sur OpenBSD.
Son propos est de servir des fichiers statiques… mais il peut aussi servir de proxy CGI.
La configuration respecte la syntaxe riche que l’on retrouve sous OpenBSD, tel que celles des autres services, comme httpd, relayd, etc…
Le service gmid s’utilise comme tout autre service sous OpenBSD et est géré par l’outil rcctl et ses différentes options. Il faudra activer puis démarrer le service ad hoc, une fois la configuration faite.
Le projet fournit aussi un client gemini, délicatement nommé gg, un client pour le protocole Titan, nommé idéalement titan.
- Site web officiel : https://gmid.omarpolo.com/
Installation
Installez
le paquet gmid.
- version : 2.1.1
- OpenBSD : 7.9
Lors de l’installation seront créés :
- un utilisateur
_gmid, sans login, et sans répertoire personnel. - un script rc.d
gmid, permettant l’utilisation en tant que service - un fichier de configuration d’exemple dans le répertoire
/etc
Système
Au cas où l’installation ne l’aura pas fait, il faudra créer le répertoire /var/gemini.
Laissez les droits root:wheel dessus !
Ensuite créer les répertoires nécessaires à la gestion de vos domaines, dans le répertoire parent dédié, et n’oubliez pas d’attribuer dessus les droits à l’utilisateur _gmid, tel que :
:$ doas mkdir /var/gemini/domaine1.tld
:$ doas chown _gmid:_gmid /var/gemini/domaine1.tld
Configuration
- Le fichier de configuration principal :
/etc/gmid.conf
Bien sûr, il est possible de le nommer autrement, mais dans ce cas il faudra le préciser dans les options de lancement, avec l’option -c.
Je n’aborde pas la configuration d’un seul serveur ; l’exemple créé et fourni par défaut parle de soit, vraiment.
Multi-hosting
Voici un fichier exemple :
user "_gmid"
chroot "/var/gemini"
dir_certs = "/etc/letsencrypt/live"
log {
access "/logs/access.log"
style combined
syslog off
}
types {
include "/usr/share/misc/mime.types"
}
server "domaine1.tld" {
listen on * port 1965
cert $dir_certs "/domaine1.tld/fullchain.pem"
key $dir_certs "/domaine1.tld/privkey.pem"
root "/domaine1.tld"
lang "en"
log on
}
server "fr.domaine1.tld" {
listen on * port 1965
cert $dir_certs "/fr.domaine1.tld/fullchain.pem"
key $dir_certs "/fr.domaine1.tld/privkey.pem"
root "/sous-dom.domaine1.tld"
lang "fr"
log off
}
server "domaine2.tld" {
listen on * port 1965
cert $dir_certs "/domaine2.tld/fullchain.pem"
key $dir_certs "/domaine2.tld/privkey.pem"
root "/domaine2"
lang "en,fr"
log on
location "/en/*" {
lang "en"
}
location "/fr/*" {
lang "fr"
}
}
Explications :
⇒ Dans la directive globale :
-
la variable
dir_certsest en réalité une macro ; elle est dans cet exemple utilisée dans les directivescertetkeypour spécifier le chemin vers le répertoire principale des certificats TLS — dans ce cas, générés aveccertbot. - cf: Macros -- Si vous utilisez
acmepour générer vos certificats TLS, préciser le chemin du répertoire/etc/ssl/acme, par exemple.
- Si vous utilisez
-
la directive
logspermet de spécifier les options de journalisation - cf: log -- la directive
accessest le chemin relatif depuis le chroot du futur fichier de log. Cela peut directement dans le répertoire du chroot, tel que/access.log, ou dans tout autre répertoire dédié. - la directive
stylepermet de modifier le style de journalisation ; par défaut, le formatlegacyest très simple de lecture - la directive
syslogautorise ou non l’enregistrement dans les journaux systèmes. Par défaut, sa valeur eston; utiliseroffdésactive l’enregistrement dans les journaux/var/log/daemonet `/var/log/messages
- la directive
-
la directive
typespermet de spécifier les mimes types ; soit en les spécifiant manuellement, soit en ciblant le fichier système. Les deux peuvent être utilisés. - cf: Types -
Toutes ces options sont facultatives !
⇒ Dans les directives server :
-
la directive
listenécoute toutes les adresses IPv4 et IPv6 disponibles, de par l’utilisation du symbole*; il est possible d’écrire la règle en précisant l’adresse IPv(4|6) - dans le cas de l’adresse IPv6, il ne faut pas l’encadrer des symboles[,]. -
la directive
rootcible le répertoire lié au domaine, c’est un chemin relatif au chroot ; il n’est pas obligé de porter le nom du domaine ; par convention, faites-le. -
un dernier détail à-propos de la directive
lang: elle peut être utilisée de manière globale dans la directiveserveret/ou spécifiquement dans des directiveslocationsciblant des répertoires linguistiques.
Voilà !
En quelques minutes une configuration fonctionnelle pour du multi-hébergements de caspule Gemini sous OpenBSD…
Et n’oubliez pas de lire les man pages dédiés, disponible autant sur le système dès lors l’installation faite, que depuis le site officiel, dont les liens sont écrits dans la section Documentation ci-dessous.
PF
Voici un exemple de règles minimalistes à ajouter à PF :
host = adresse_ipv4
host6 = adresse_ipv6
pass in quick on egress proto tcp from any to { $host $host6 } port 1965
Logs
Il peut être utile de modifier le fichier /etc/newsyslog pour générer une rotation des logs, tel que - exemple à confirmer - :
/var/gemini/logs/access.log root:_gmid 644 4 * $W0 Z "pkill -USR1 -u root -U root -x gmid"
Documentation
⇒ les man pages officiels, disponible sur HTTP :
- https://gmid.omarpolo.com/gmid.8.html - gestion du serveur
- https://gmid.omarpolo.com/gmid.conf.5.html - gestion du fichier de configuration
- https://gmid.omarpolo.com/gg.1.html - utilisation du client Gemini
gg - https://gmid.omarpolo.com/titan.1.html - utilisation du client
titan