!HOW DO YOU SET UP A GOPHER SERVER?
                                             
A guide written on February 7th 2021 by Dio9sys 
________________________________________________



When I tried to set up my gopherhole, I ran into a lot of pitfalls with
getting the server to work.  Unfortunately, a lot of the guides I found
pretty much said "install pygopherd on an LTS ubuntu server and then it
will automagically work," which isn't useful for cases where it does
not work out that easy, or for cases where you're using something other
than Ubuntu or pygopherd.

My gopherhole is hosted on a Fedora 33 server, and is served by a
security-centered gopher server called Gophernicus. I chose this
server, both for its security features and because it was one of
the first ones I found that had a package for rpm-based distros.

I'll talk about the package later.  First, let's talk about how I set
this server up in terms of infrastructure.



HOW DID YOU SET UP THE BACK END FOR THIS THING?!
________________________________________________



My server is hosted on linode, running the $10/month plan.  If I get
so much traffic that I need to upgrade then I will but, with how small
the packets are when working with gopher protocol, I think $10 will be
more than enough. I chose Fedora 33 because this linode is my
experimental machine.  I use it to study linux filesystems and
admin tasks, and figured it would be fun to use something where I didn't
mind if I broke something so I could just roll it back.  Don't worry;
I make backups before I do anything drastic!

In order to get a custom domain for my gopherhole, I bought a domain on
namecheap.  They give a cheap base rate for the first couple of years,
so I figured I'd buy 2 years of my domain for $10 total and, when the
time comes for renewal, I'll be know how often I actually use the domain
and will get an idea for how much I like namecheap or if I want to use a
different service.

After setting up a machine and buying a domain, I confirmed my info with
ICANN and then went into namecheap and told them to use a custom DNS
server.  I then wrote in the 5 urls that linode uses for DNS servers.
I then went into linode and added a new domain, entered dio9sys.fun and
pointed it at my machine.  Waited about 15 minutes and found that I could
ping dio9sys.fun and it would return the IP address for my machine.  Nice!




INSTALLING GOPHERNICUS - FAILED FIRST ATTEMPT
_____________________________________________

Okay, so now that my node was set up and ready to go, it was just time to
install a gopher server.

I did a search for "gopher server fedora 33" to see if there were any guides
to help out.  There were not any specific to fedora, and pygopherd didn't
have a dnf package to choose from.  However, I did find the gregw/gopher copr
that had, among other things, gophernicus as a gopher server.  I decided that
that would be the server I would use and installed it.

It installed, it had a test page in /var/gopher and.........nothing.

Any time I would try to connect I got "connection refused."

I know for a fact that the connection refused error can mean multiple things:
1. It may mean that the server isn't listening on the right port
2. It may mean that the server is being blocked from listening by the firewall

I figured that, being as how I did the easy thing and installed from a package,
surely it was listening on the right port and set everything up for me!

That was a mistake, but first let's talk about the firewall rules I added.

Firewall rules are pretty easy if you know what to look for.  In Fedora, they
are handled using a service called firewalld.  In order to change firewall
settings, you simply run firewall-cmd with some parameters.

Gopher runs on TCP port 70.  Just to be safe, I tried allowing traffic on both
TCP and UDP port 70 just because a lot of modern services run on both.

In order to do this, I ran the following commands:
sudo firewall-cmd --add-port=70/TCP
sudo firewall-cmd --add-port=70/UDP
sudo firewall-cmd --runtime-to-permanent

The first two commands tell the firewall to open up port 70 to both TCP and UDP
traffic.  The third command tells the firewall to take the settings currently
applied to the firewall and make them permanent.

Of course, before being able to run sudo at all you'll need your user to be in
wheel group, but this is a gopher guide, not a fedora guide, and I trust you
in your ability to learn how to use sudo :)

Okay, firewall changed and....still nothing.  What's going on?

I did some looking and found old support threads from people talking about
having to change settings in their inet.d file to get their gopher server of
choice to listen on port 70.  Only problem is that modern versions of Fedora
run on systemd, not inetd or xinetd.





SUCCESSFUL SECOND TRY - COMPILING GOPHERNICUS FROM SOURCE
_________________________________________________________

Okay, so now that you have seen all the things I did that DIDN'T work, let's
talk about what I did that DID work.

After getting frustrated that I couldn't find modern documentation anywhere
for preinstalled gopher packages, I remembered that the gophernicus github
page has specific instructions for compiling the server from source.

"What the heck," I said to myself.  "This will give me the latest version
anyway and, right now, I'm just spinning my wheels trying to make something
work with no documentation.  What's the worst that could happen?"

WORD TO THE WISE - ALWAYS INSTALL GOPHERNICUS FROM SOURCE

Installing from source was quick.  Installing from source was easy.

Most of all, installing from source gave me the right commands to get
the server listening on port 70.

You see, when you compile you set a flag for what listening service your
computer uses.  In this case I selected systemd.  The make script is
smart and, based on the flags you set, will tell you what commands to run
to get the service started.

In the case of systemd, run the following commands:

sudo systemctl enable gophernicus.socket
sudo systemctl start gophernicus.socket

These two commands will first ENABLE gophernicus to start on startup,
and then will START the service during this session.

After compiling, installing and starting the Gophernicus service, I tried
once more to connect.

Into the web proxy I was using for testing I entered gopher://dio9sys.fun

and.....

"Welcome to Gophernicus!"

IT WORKED!

BUT WHY DOES IT WORK???
---------------------------------------------

This works because systemd communicates with firewalld and, even if
you have a port open, you need a socket to handle the connection.

If you go to /usr/lib/systemd/system/ you'll see a number of socket
files.  gophernicus.socket is a socket file that shows the
description of the service and which ports to listen to.

Fun fact: this is useful for every service.  I copied this socket
file, renamed it and edited it to work for gemini protocol and
that's how I got my gemini capsule up and running!

When you enable the socket file, it creates a system link in
/etc/systemd/system/sockets.target.wants/ and then running the
start command invokes the file so it can actually listen on the port.

If you run into firewall problems, check to make sure you have a socket
file! 



So, to recap....





WHAT TO TRY IF YOUR GOPHER SERVER ISN'T WORKING
_______________________________________________

1. Uninstall the package you installed and compile from source
2. Make sure your system is listening on port 70 for gopher traffic
3. Check your firewall; make sure it's not blocking port 70 traffic
4. Check your sockets files; make a socket file and enable if if you
   don't have one.
5. Make sure you have some kind of file in /var/gopher/ so you can see if
   the server is working.
6. If you find that you can't view the files you're hosting, make sure the 
   permissions are set right.  I find that running chmod 644 on anything
   that doesn't load works, as it gives you universal read without giving
   universal write.
7. Keep trying.  You'll get there!

Okay, now that it's working...




WHERE TO GO FROM HERE? - HOW TO MAKE A COOL GOPHERHOLE
______________________________________________________

Honestly, this is something I'm still working on.  An easy first step
is to look up the standards for the gophermap file.  That can turn your
text files into full pages with interactive links and formatting.

I found a basic guide on wikipedia to gophermap formatting and then,
for a more in-depth guide, there's a great file on baud.baby that goes
over it. You can find that here:

gopher://baud.baby:70/0/phlog/fs20181102.txt


So, what are you waiting for?  Go out there, spend $20 on a server and a domain
and go show the world what you're made of!