-- Leo's gemini proxy
-- Connecting to gmi.noulin.net:1965...
-- Connected
-- Sending request
-- Meta line: 20 text/gemini
date: 2021-07-05 19:34:47
categories: gemini
firstPublishDate: 2021-02-14 13:32:57
is a simple protocol and markup for transmitting text pages on the internet. It is similar to http/html and improves on gopher.
With
, one can surf gemini pages with a web browser.
I use gemini for the following reasons:
the documents don't execute code
there is minimal tracking (only ip address)
the clients are lightweight and will that way
the servers are lightweight
I don't need to get a certificate from let's encrypt for my personal sites
I can write my own server
On my phone, I tried:
Elaho: iOS, good
Deedum: iOS and Android, good
On the terminal, I used ncat:
apt-get install ncat echo -ne 'gemini://gemini.circumlunar.space/\r\n'|ncat --ssl gemini.circumlunar.space 1965
The
is also good.
I tried
, to install it, run:
apt-get install python3-pip pip3 install md2gemini
To convert a markdown file, run:
md2gemini file.md > file.gmi
I chose to run the
gemini server, because it is lightweight and simple to build. It only depends on the openssl library.
I run the following commands:
git clone https://git.sr.ht/~sircmpwn/gmnisrv sudo apt-get install libssl-dev cd gmnisrv mkdir build cd build ../configure make sudo make install
I keep the default configuration, so everything is installed in `/usr/local/`
I create a home directory for gmnisrv:
mkdir -p /home/user/gemini/certs /home/user/gemini/root
I generate a gemtext file with md2gemini:
md2gemini README.md > ~/gemini/root/index.gmi
I copy the default configuration file:
sudo cp /usr/local/share/gmnisrv/gmnisrv.ini /usr/local/etc/gmnisrv.ini
I edit the config file:
sudo vi /usr/local/etc/gmnisrv.ini
The default config file looks like this:
# Space-separated list of hosts listen=0.0.0.0:1965 [::]:1965 [:tls] # Path to store certificates on disk store=/var/lib/gemini/certs # Optional details for new certificates organization=gmnisrv user [localhost] root=/srv/gemini
I change the tls store path, the virtual server(to my local ip address) and the root for the virtual server:
# Space-separated list of hosts listen=0.0.0.0:1965 [::]:1965 [:tls] # Path to store certificates on disk store=/home/user/gemini/certs # Optional details for new certificates organization=gmnisrv user [192.168.0.2] root=/home/user/gemini/root
gmnisrv sets the mine types looking at file extensions according to `/etc/mime.types`, I add JPG images:
image/jpeg jpeg jpg jpe jfif JPG
Then I start the server and test it:
gmnisrv echo -ne 'gemini://192.168.0.2\r\n'|ncat --ssl 192.168.0.2 1965
I also tried the
, there is no need for a configuration file. The program takes certificate, key and document root in arguments.
Here is how to build it in debian bullseye:
apt-get install libmagic-dev libssl-dev liblua5.4-dev cmake git clone https://git.sr.ht/~panda-roux/MoonGem cd MoonGem && mkdir build && cd build cmake .. make
It doesn't generate a certificate automatically, so I generate one with the command (replace 'URL' with the server DNS address):
openssl req -new -x509 -days 365 -nodes -out cert -keyout key -subj "/CN=URL" -newkey rsa:4096 -addext "subjectAltName = DNS:URL"
To start the server, run:
./moongem cert key .
The
gemini server works fine but it doesn't send the images on my gemini pages.
Here's the basics of how text works in Gemtext:
Long lines get wrapped by the client to fit the screen
Short lines *don't* get joined together
Write paragraphs as single long lines
Blank lines are rendered verbatim
You get three levels of heading:
# Heading ## Sub-heading ### Sub-subheading
You get one kind of list and you can't nest them:
* Mercury * Gemini * Apollo
Here's a quote from Maciej Cegłowski:
> I contend that text-based websites should not exceed in size the major works of Russian literature.
Lines which start with ``` will cause clients to toggle in and out of ordinary rendering mode and preformatted mode. In preformatted mode, Gemtext syntax is ignored so links etc. will not be rendered, and text will appear in a monospace font.
Write links like this:
=> URL Title => gemini://gmi.noulin.net Remy Noulin's Homepage
This section shows an example setup of cgi scripts, for more information read the man for `gmnisrvini` (install the `scdoc` package to convert `gmnisrvini.scd` to roff: `scdoc < gmnisrvini.scd > gmnisrvini.roff && man -l gmnisrvini.roff`)
Create a route `example.com` for storing the gemtexts where cgi is off. The files in `/srv/gemini/example.com` are served according to their mime types.
Create a route `example.com/cgi` for the executable programs where cgi is on. The files in `/srv/gemini/example.com/cgi` are executed and everyting printed to stdout is sent as a response to the client.
Start `gmnisrv`
[example.com] root=/srv/gemini/example.com [example.com:/cgi] root=/srv/gemini/example.com cgi=on
Create the `example.sh` script and make the script executable with `chmod 755 example.sh`:
echo "20 text/gemini\r\n" echo "PATH_INFO " $PATH_INFO echo "QUERY_STRING " $QUERY_STRING echo "SERVER_NAME " $SERVER_NAME echo "REMOTE_USER " $REMOTE_USER
`example.sh` print the environment variables set by `gmnisrv`.
Now it is possible to call `example.sh`:
echo -ne 'gemini://example.com/cgi/example.sh\r\n'|ncat --ssl example.com 1965 echo -ne 'gemini://example.com/cgi/example.sh?Text%201024%20Bytes%20Max\r\n'|ncat --ssl example.com 1965 echo -ne 'gemini://example.com/cgi/example.sh/hello?world\r\n'|ncat --ssl example.com 1965
On the first request, `PATH_INFO` and `QUERY_STRING` are empty strings
On the second request, `PATH_INFO` is an empty strings and `QUERY_STRING` equals to `Text 1024 Bytes Max`. The `%20` strings in the query string are converted to space characters.
On the third request, `PATH_INFO` is set to `hello` and `QUERY_STRING` is set to `world`.
To receive an input from client, the script should respond with `10 Enter your text:\r\n` instead of `20 text/gemini\r\n`.
When the client sends the input, the script is called again and `QUERY_STRING` is the input from the client. Eventually the script responds with `20 text/gemini\r\n`+gemtext to show the result of the client request.
To make a gemcall to an input endpoint (for example: `example.com/cgi/submit`), run this:
echo -ne 'gemini://example.com/cgi/submit?My%20input\r\n'|ncat --ssl example.com 1965
hashtags: #gemini
-- Response ended
-- Page fetched on Tue May 21 10:51:42 2024