# sr-71, a small web server ```ASCII art of an SR-71 Blackbird , dMb, ,dMMMMb, ,, ,dMMMMMMMMMb, eeee8888" ,mMMm!!!!XXXXMMMMM""" ,d!!XXMMXX88888888W" `MX88dMM8888WWWMMMMMMb, '""MMMMMMMMMMMMMMMMb MMMMMMMMMMMMMMMMMMb, dMMMMMMMMMMMMMMMMMMMMb,, _,dMMMMMMMMMMXXXX!!!!!!!!!!!!!!XXXXXMP _,dMMXX!!!!!!!!!!!!!!!!!!XXXXX888888888WWC _,dMMX!!!MMMM!!!!!!!!XXXXXX888888888888WWMMMMMb, dMMX!!!!!MMM!XXXXXX88888888888888888WWMMMMMMMMMMMb dMMXXXXXX8MMMM88888888888888888WWWMMMMMMMMMMMMMMMMMb ,d8 MMMMWW888888MMMMM8888888WWMMMMMMMMMMMMMMMMMMMMMMMMMMM,d88P' YMMMMMWW888888WWMMMMMMMMMMP"""' `"YMMMMMMMMMMMXMMMMMP `""YMMMMMMMMMMMMMP""' mMMMm!XXXXX8888888e, ,d!!XXMM888888888888WW "MX88dMM888888WWWMMMMMMb """``'"YMMMMMMMYMMM `"YMMMMM `"YMP ``` The last airplane designed without the use of electronic calculators, the SR-71 was developed from concept to first flight in just over 2 years. It flew higher and faster than any jet of its time holding the speed record to this day, and pioneered low-observability (stealth) characteristics. This sr-71 project is a small web server, able to host your pages on the gemini, gopher, spartan, nex, and finger protocols. ## Getting it sr-71 is a single-package go project, so using the go toolchain installing is as simple as: ```shell command to install sr-71 go install tildegit.org/tjp/sr-71@latest ``` Currently binaries are not made available for download, so the go command is a requirement. ## Running it sr-71 requires a configuration file, the path of which is provided as the only command-line argument. ```shell command to start an sr-71 server sr-71 /path/to/sr71.conf ``` ## Highlights sr-71 isn't just a multi-protocol static file server. It also features: * virtualhosting on protocols which support it * SNI support when virtualhosting with TLS * CGI * extensions to the gophermap format borrowed from gophernicus * automatic generation of atom resources from subscribable gemini pages * privilege dropping * client TLS certificate authentication * support for titan (the gemini "write" companion protocol) with separately-configurable auth * git repository viewers with overridable templates * user-specific paths for shared hosting environments ## Configuration File The format of the config file is designed to be straightforward, and human-readable and -writable. Here's a simple configuration that would get you off the ground: ```example of an sr-71 config file systemuser nobody gemini { host myhostname.com, gemini.myhostname.com servertls key /path/to/tls/keyfile cert /path/to/tls/certfile static /var/gemini at / with dirdefault index.gmi, dirlist } gopher { host myhostname.com static /var/gopher at / with dirdefault gophermap, dirlist, extendedgophermap } spartan { host myhostname.com static /var/spartan at / with dirdefault index.gmi, dirlist } finger { static ~/.finger } ``` With the above configuration, sr-71 will: * drop privileges to the "nobody" user * respond to any gemini requests to the domains myhostname.com or gemini.myhostname.com by reading files out of /var/gemini * for gemini directory requests, it will first look for an index.gmi file, then fall back to listing the directory's contents in gemtext * serve gopher by reading out of /var/gopher * for gopher directory requests, it will look for a file called "gophermap", then fall back to listing the contents as gopher menu * for any gopher files, it will apply the "extended gophermap" parsing (see REFERENCE.gmi) * serve spartan by reading files from /var/spartan (perhaps imagine this being a symlink to /var/gemini) * serve spartan directory requests by looking for index.gmi and falling back to a directory listing * serve finger requests by reading a ".finger" file in the requested user's home directory => ./REFERENCE.gmi More information is in the reference documentation