- Common Lisp 98.4%
- Shell 1.6%
| .gitignore | ||
| build.sh | ||
| config.toml | ||
| germinal.asd | ||
| germinal.service | ||
| LICENSE.md | ||
| README.org | ||
| server.lisp | ||
Germinal, a Gemini Protocol server
Germinal is a server for the Gemini Protocol, written in Common Lisp.
It is named after the early 20th century Yiddish-language anarchist newspaper Germinal. I wanted to name it after an anarchist publication to convey the idea of people sharing information and ideas with each other, in contrast to the way the web is used to push advertising from corporations to people. And it happened that Germinal shares some sounds with Gemini.
Features
Current
- Serves any type of document with an appropriate mime type.
- Serves .gmi files as text/gemini, the gemini mapfile format.
- Serves index.gml as a directory listing, if it exists
- Serves a simple directory listing for directories without index.gml
- Serves only world-readable content, much like Gophernicus.
Planned
- Configuration by environment variables, command-line, or config file
- Keep up to date with protocol changes
- Logging (though not too much logging)
Maybe
- authentication by client certificate
- cgi-bin support
Installation
This is still a bit of a hack, and if you don't have a working Common Lisp
development environment, you will probably have trouble getting it running.
The included build.sh will build a single executable, but unfortunately it
depends on a shared library that will be somewhere in your ~/.cache folder…
Germinal has been tested on SBCL and ECL. It runs fine on both, but I haven't been able to build a working binary distribution on ECL.
You will need OpenSSL headers and libraries installed to build the cl+ssl dependency. On Debian this is the libssl-dev package; on Fedora it is OpenSSL-devel. It may be something else on your platform. You'll also need gcc, for the binary dependencies that quicklisp will build.
You also need to generate a self-signed cert and key. Currently these need to be named cert.pem and key.pem and be stored in the working directory germinal will be run from. This will improve in the future when I write the configuration parts. You can generate the cert like this:
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
Usage
Run germinal. It will listen on port 1965 on all interfaces, and serve
content from /var/gemini/. It will only serve world-readable files,
regardless of what user it is running as. Or germinal --help to get the
list of command-line arguments to change the interface, port, or root.