### Setting up a gopher server on a RaspberryPi B+ ###
Until now, my gopher was running on a full-blown Debian server (that was also
tasked with a few other things). I decided to terminate this server due to
maintenance cost, and pondered about shutting down the gopher service as well,
after 12 years of solid service. But before doing so, I thought I'd try
running it at home on some cheap RPi box. If it proves not to be too flaky
or time consuming, I might leave it on for another 12 years or so.
I have a few RPis laying around. For this gopher hosting task, I decided to
go with the oldest one: a Raspberry Pi B+ from 2014. I chose this one mostly
out of concern for power consumption - according to benchmarks found on the
internet, all newer RPis have a higher consumption, even at idle time.
Besides, gopher being a tech from the '90, it needs no CPU power anyway.
I downloaded the latest available Raspbian release (took the "lite" variant,
in the hope it was indeed light - but it was not). The image I downloaded was
dated August 2020 and nicknamed "Buster" (/etc/debian_version says "10.4").
I made some minor changes to the boot/config.txt file:
arm_freq=100 (sets CPU speed to 100 MHz, should keep it cool and low-power)
gpu_mem=16 (limits GPU memory to minimum, 16 MB, so OS can use the rest)
I also created an empty "ssh" file in the boot partition of the SD card, for
enabling out-of-the-box ssh support.
Powered the RPi and... yes, it actually booted and allowed me to log in via
ssh using the default "pi" account.
Then, I tweaked the ssh and IP configuration:
/etc/ssh/sshd.conf -> enabled root login, disable password auth (and PAM)
/etc/dhcpcd.conf -> set up a static IP address
Since the distribution, despite claiming to be "lite", is kind of bloated, I
removed (apt-get purge) "some" packages that I didn't feel useful to me:
bluez bluez-firmware avahi-daemon dphys-swapfile dc logrotate libx11-6 ed
libx11-data libxau6 libxcb1 libxdmcp6 bind9-host geoip-database libdaemon0
libavahi-common-data libavahi-common3 libavahi-core7 libbind9-161 libdns1104
libfstrm0 libgeoip1 libisc1100 libisccc161 libisccfg163 liblmdb0 liblwres161
libprotobuf-c1 avahi-daemon bluez bluez-firmware libnss-mdns pi-bluetooth
firmware-atheros firmware-realtek firmware-libertas g++ lua5.1 luajit nano
manpages manpages-dev ncdu ntfs-3g parted pigz rpcbind rsync triggerhappy
alsa-utils fuse g++-8 libasound2 libasound2-data libbabeltrace1 libc6-dbg gdb
libdw1 libevent-2.1-6 libfftw3-single3 libfuse2 libluajit-5.1-2 libtirpc3
libluajit-5.1-common libnfsidmap2 libntfs-3g883 libparted2 libpython3.7 iw
libsamplerate0 libstdc++-8-dev libtirpc-common rsyslog curl wpasupplicant
xkb-data console-setup-linux libcurl4 libnghttp2-14 libnl-route-3-200 dbus
libpcsclite1 librtmp1 libssh2-1 man-db htop netcat-openbsd netcat-traditional
rfkill unzip wireless-tools wireless-regdb libiw30 zlib1g-dev libfreetype6
libdbus-1-3 v4l-utils libnl-3-200 libnl-genl-3-200 libpng-tools libpng16-16
libpolkit-agent-1-0 libpolkit-backend-1-0 libpolkit-gobject-1-0 libncursesw5
python3-urllib3 python3-six python3-requests python3-idna openresolv libv4l-0
libjpeg62-turbo libv4l2rds0 libv4lconvert0 python3-certifi python3-chardet
python3-pkg-resources libraspberrypi-doc gcc-5-base gcc-6-base gcc-7-base
libboost-iostreams1.58.0 libfastjson4 liblognorm5
And proceeded with a minor upgrade:
apt-get update
apt-get upgrade
apt-get dist-upgrade
Once all was done, the OS was taking about 1 GiB of SD space... Still way too
much to my taste, but I will leave it as it is for the time being. I can't
fight progress forever.
When configuring the network, I had set up the static IP by editing the
/etc/dhcpcd.conf file, as advised by Debian. Weird idea to configure a static
IP through a DHCP client if you ask me, but whatever works, right? Well, I
then noticed that the DHCP daemon was still listening on a UDP/68 socket:
root@raspberrypi:~# netstat -anup
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
udp 0 0 0.0.0.0:68 0.0.0.0:* 280/dhcpcd
Not cool!
So I ended up doing it the good old way by adding a configuration file named
/etc/network/interfaces.d/eth0, and removed all DHCP clients:
apt-get purge isc-dhcp-client isc-dhcp-common dhcpcd5
Next, I downloaded the latest version of the Motsognir gopher server, built
it (make), configured it and copied all my gopher content to the RPi.
Finally, added a tmpfs-based /tmp in fstab and switched the partitions into
read-only mode to forbid the system to wear off the SD card.
Mounting / as read-only requires to pass a "ro" argument through the
/boot/cmdline.txt file. I added there "fastboot" as well, to disable boot-time
fsck checks (useless, since partitions are read-only anyway).
Final reboot. Done. Let's see how stable this setup will be.