### 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.