You may have heard of static site generators. You may even have heard of the Gopher Protocol. But have you heard of a static gopherhole generator?
burrow creates gopherholes for you. It has a lot of features to do so. It’s so good, in my opinion, I’m considering expanding the output to websites as well, or at least abstracting-out some of its library components.
Here’s my gopherhole, which I built with burrow:
-
Visit in gopherspace: gopher://gopher.someodd.zip:7071/
- Try visiting using my Gopher Protocol client, “waffle”
-
sudo apt-get install gopher && gopher -p "/" gopher.someodd.zip 7071
- Visit using the Floodgap Gopher-HTTP gateway (although, I’m not so sure about its UTF-8 support)
Some highlights:
-
Particularly proud of the code quality here, written mostly before AI became a big part of my workflow. Some examples:
- Some descriptive FrontMatter error handling
- I got to work with the author (@sternenseemann) of my favorite Gopher Protocol server daemon (spacecookie), who I believe I have worked with on other matters as well.
- I went out-of-my-way to have fantastic error handling in some respects
- Had some fun with some very abstract features of Haskell, to me
The example:
Serving/Docker Setup
I made a Docker setup for spacecookie. It was nice working with the author of Spacecookie on this project, and I think others!
I even made a setup/branch specific to burrow, which makes it easy to simply push a commit and the server rebuilds the gopherhole for you!.
I think these setups were made originally around serving a Gopherhole via Tor so I’ll suggest some modifications.
Using the burrow setup (no Tor)
I had to tweak the Docker spacecookie burrow setup a bit to get it to play nice.
Using nonstandard ports.
Firewall for the gopherhole service:
sudo ufw allow 7071/tcp comment 'gopherhole (docker)'
Firewall for git/ssh, my rule makes is for only accessing via local network or my VPN:
sudo ufw allow from 192.168.1.0/24 to any port 2222 proto tcp comment 'gopherhole (docker) git ssh'
sudo ufw allow from 10.1.0.0/24 to any port 2222 proto tcp comment 'gopherhole (docker) git ssh'
also making it listen ssh different port! – only allow from localnet ufw. had to edit docker expose, i also had to add this to dockerfile, modifying so this section looks like this (the sed command)
RUN apt-get install -y openssh-server
RUN sed -i '/^#Port 22/c\Port 2222' /etc/ssh/sshd_config
RUN service ssh start
This is in my ~/.ssh/config
(192.168.1.100
is the IP of my server, although
I realize now I want to modify this now to also specify the IP on the VPN too,
if possible):
Host gopherhole
HostName 192.168.1.100
Port 2222
User git
IdentityFile ~/.ssh/id_rsa_hgopher
I modified make run
(Makefile
):
docker run -d --restart=always --net servicenet --hostname=spacecookie -p 2222:2222 -p 7071:7071 --ip=172.18.0.68 spacecookie
Port forward on router, then it should all work.
Try to git push
to the server IP hosting the docker container and also make sure you
port forward and you should be able to access…
tweaks i made due to port conflicts and stuff?
+++ b/Dockerfile
@@ -44,11 +44,12 @@ RUN wget -O /tmp/burrow.deb https://github.com/someodd/burrow/releases/download/
RUN apt install /tmp/burrow.deb
RUN apt-get install -y openssh-server
+RUN sed -i '/^#Port 22/c\Port 2222' /etc/ssh/sshd_config
RUN service ssh start
-EXPOSE 70
-EXPOSE 22
+EXPOSE 7071
+EXPOSE 2222
+++ b/Makefile
@@ -12,7 +12,7 @@ build:
docker build -t spacecookie .
run:
- docker run -d --restart=always --net servicenet --hostname=spacecookie --ip=172.18.0.68 spacecookie
+ docker run -d --restart=always --net servicenet --hostname=spacecookie -p 2222:2222 -p 7071:7071 --ip=172.18.0.68 spacecookie
test:
echo "$(running_id)"
+++ b/spacecookie.json
@@ -1,8 +1,8 @@
{
- "hostname" : "localhost",
+ "hostname" : "someodd.duckdns.org",
"listen" : {
"addr" : "::",
- "port" : 70
+ "port" : 7071
},
Example image
This is an example of a gopherhole generated with burrow, as rendered by my software waffle:
The burrow repository (hopefully) has an
example of a gopherhole that can be built with burrow
.
Example fonts
Here are some fonts that I and others have made for burrow
:
Story of development
I think I started developing this piece of software before AI started being something I leaned heavily on in my development process. I think the code is very clean, well organized/architectured, and well researched.
Using abstract and advanced Haskell features
In this project I feel like I used very abstract and advanced Haskell features.
Here I will talk about the language extensions and documentation practices…
How I made my own markdown parser?
Markdown parsing
Coming back to this project after a while
- Needed to pin versions
- Trying to get nix working
- GHC versions…
- cabal freeze, lock.nix
- Removed depend marked as broken by nixpkgs, with code generated by ai