HomeLab Side-Quest #1
With one Pi online, the first thing you want is another Pi
After setting up my "gateway" homelab raspberry pi and keeping it in relatively good uptime for a few months a few things became clear to me:
Adding features that are already production-ready containers is easy! I've added audiobookshelf, nextcloud, freshrss, all kinds of containers!
Messing around with code on the bare metal of the Pi or messing with the DietPi OS is a great way to kill the reverse proxy and restarts are annoying.
The natural conclusion here is obvious, dev and prod servers are separated for good reason!
An extremely limited dev server
I was going through a box of spare parts and found 2 Raspberry Pi Zero's, and one 3B, not including the Zero-2w I was using as a fileserver. I wanted a server to write golang on without fear that I would accidentally stop important services on the gateway, and after the briefest investigation running my OLED status screen (as described in Step One) took up about 15% CPU and running hello world for the first time in go took over 3 minutes. So I knew I needed to use the 3B for this task, and I'll put off my plans to use it for Home Assistant.
And one more interesting thing, that OLED I put on the gateway is already showing signs of age. I knew OLEDs burn, but I was surprised at the speed so I looked up some more about it and of course there is a very insightful Hackaday post on the topic. Turns out, you're supposed to dim, cycle, turn off, or screen-save these little displays. That should have been obvious to me, but I happily followed the tutorials that come up when you search "raspberry pi oled monitor" and once the lights started blinken I left it on a shelf.
Flipping the screen to an inverted status is all I have done so far, so at least now the pixels will burn relatively evenly. I like the way of changing screens in the Luma.OLED example. Instead of keeping track of any states in this simple python script, just do a modulo on system time and do one of two things.
SSD1306_NORMALDISPLAY = 0xA6
SSD1306_INVERTDISPLAY = 0xA7
...
screen_flip = oled_serial.SSD1306_INVERTDISPLAY
screen_flop = oled_serial.SSD1306_NORMALDISPLAY
...
def invert_oled(device, interval):
flopper = datetime.now().second % (interval * 2)
if flopper < interval:
#flip
device.command(screen_flip)
else:
#flop
device.command(screen_flop)
With that fun diversion handled, it's time to install Go and take care of one back burner item i had been putting off for a long time, a version control system. Both of them are completely trivial to bring in with dietpi-software
:
For a long time I had avoided running a version control server in my homelab because the scripts I was using are always so small I thought it wasn't necessary to keep track of them in that level of detail, or big enough I kept them offsite on a 'real' git provider.
But that is not the spirit of homelab! So I installed Forgejo just because I read an article about their fork from Gitea (which was briefly on the original homelab).
Now I should have really committed to this and put it on the gateway pi with a real subdomain and behind the reverse proxy. I wasn't sure yet how I would like Forgejo and I wanted to work out a "polite" and terse system of SSH keys to protect access to the repos so this is the path of moderate commitment. If I rework this to be a container on the gateway pi I'll definitely write an article on the subject because I have already seen a few posts that combining a reverse proxy and ssh keys and git urls is fine balance.
Back burner: PaaS the Pi
There are 2 major projects to run your own heroku-style PaaS on the Raspberry Pi:
Dokku
More feature complete, even though the best features like web interface are behind a hefty license fee.
Requires at least 1GB RAM. Not a whole lot in this day and age, but more than the 3B can provide, so this got back-burner'ed indefinitely
Piku
Runs light and lean since it was made with the Pi as it's primary platform
Doesn't use docker or heroku tools because when the project originated, these ports to aarch64/arm64 were immature.
Runs on python.
Requires a fresh debian install that you feel comfortable modifying because there is no uninstall plan.
Overall, these were a fun distraction to research but since none of my go scripts are mature enough that I want them highly available and automatically updating. Plus as this user posted you can just make checking version control a part of your make build, or part of a shell script that starts things up.
Since DietPi dietpi-autostart
and dietpi-cron
supervisors are useful enough and more importantly super light and included in the image... I have no reason to install a PaaS on this wimpy Pi.
So this side-quest is complete. I have a place to learn Go and it doesn't need to be overcomplicated any further.