Joakim Melin
Pappa, poddare, Volvoman, chipsentusiast

Teknikstack 2025


Publicerad 19 maj 2025. Lästid 6 minuter.

En gång i tiden bodde jag i ett hus. Med en källare. I den källaren hade jag ett rack, med nätverksutrustning, brandväggar, servrar, ett fibre channel-anslutet SAN, UPS-enhet, och så vidare. Det var trevligt, och fint. Men det var snart fem år sedan och efter det har jag på olika sätt testat att köra en liten tystare och enklare driftmiljö hemma för diverse experiment. Ett tag körde jag det hela på tre stycken små HP Microserver, därefter körde jag ett kluster med fyra Raspberry Pi 4 med 8GB RAM vardera och efter det hyrde jag en server i Finland ett år.

Det jag hela tiden har velat göra är att försöka minimera elförbrukning och värmeutveckling, hitta sätt att minimera hur mycket tid jag måste lägga på att underhålla en hemmabaserad driftplattform och, givetvis, göra om saker ibland mest för att det faktiskt kan vara roligt och lärorikt.

Borta är som bekant de dagar då man kunde skaffa sig en eller ett par Mac mini och ett operativsystem från Apple som faktiskt innehöll serverfunktioner, så numera är det öppen källkod som gäller. Det roliga där är ju att det finns mycket att välja på när man vill göra det riktigt komplicerat för sig, vilket i sig inte heller är särskilt tråkigt.

Jag tänkte att det kunde vara kul att nörda ned sig på allvar. Att bygga en komplex, kraftfull, skalbar och ändå ekonomiskt försvarbar hemmadrift av en bunt publika webbsajter och tjänster. Utöver denna webbsajt kör jag också en Mastodoninstans, webbsajten för podden jag är med i varje vecka, ett filarkiv för gamla datorer, en Matrix-server, och så vidare Jag gör allt detta på en enkel PC, med fyra två-terabyte SSD-hårddiskar (uppsatta i en RAID-Z1 via zfs), en åtta-kärnorsprocessor av modell Ryzen 5 2400G, 64 gigabyte internminne, Proxmox för att virtualisera det hela och ett rätt stort chassi att ha det hela i. Det stora chassit medger stora, långsamma, fläktar vilket håller nere ljudvolymen.

Tidigare körde jag ett kluster med tre HP Prodesk-datorer av modell mindre vilket var trevligt, men de klarade endast 32 gigabyte internminne vardera och kunde inte hantera snabbare nätverkskort än 1 gigabit per sekund. Så nu har jag det du ser på bilden ovan under skrivbordet. Den stora fyrkanten till höger är servern som skickade dig den här webbsidan, längt bak in mot väggen är min TrueNAS-server och till vänster om den min speldator som fortfarande fungerar så fint så, även om den inte används så ofta.

Vad har jag byggt då?

Jag funderade länge på vad jag skulle bygga den här gången. Jag tänkte att jag skulle replikera en del av den setup jag körde för sex-sju år sedan vilket fungerade bra. Dock ville jag göra vissa justeringar och ändra på saker jag inte var helt nöjd med då. Jag ville fortfarande basera mitt hemmalabb på Proxmox. Utöver det ville jag använda Haproxy, som är en programvara jag kan relativt väl. Nginx som webbserver känns alltid rätt och varför inte blanda Linux med FreeBSD? Det senare uppför sig numera riktigt bra under Proxmox (mycket tack vare att FreeBSD numera har en qemu-guest-agent som fungerar och också fungerar utmärkt med enheter som hanteras av virtio) varför det fick bli så.

Jag gillar FreeBSD mer än jag gillar Linux. Pakethanteringen är enklare och mer logisk, man slipper systemd och det är inte voodoo varje gång man vill göra ändringar i systemet.

Ett exempel: ta en titt på hur du sätter en statisk IP-adress i FreeBSD:

I filen /etc/rc.conf sätter man följande rader:

ifconfig_vtnet0=“inet 10.0.2.243 netmask 255.255.255.0”
defaultrouter=“10.0.2.1”

Här är samma manöver fast från Ubuntu Server 24.04lts:

Redigera filen /etc/netplan/00-installer-config.yaml(just det - en YAML-fil!) och lägg in följande info:

network:
ethernets:
ens18:
addresses:
- 10.0.2.28/24
nameservers:
addresses:
- 10.0.2.10
search:
- joacim.net
routes:
- to: default
via: 10.0.2.1
version: 2

Ett annat exempel? Vill jag exempelvis starta demonen för ntp-klienten vid boot så lägger jag in följande i /etc/rc.conf: ntpd_enable=“YES”

Vill jag göra det på en Linuxdistribution med systemd?
systemctl start ntpd && systemctl enable ntpd

Detta är vansinne. En enklare Unix är så mycket roligare att arbeta med än en överkomplicerad LInux, och samtidigt är FreeBSD minst lika kraftfullt som Linux är. Så det så. (och jodå - jag vet att det finns Linuxdistributioner utan systemd men jag gillar FreeBSD bättre ändå. Detta är sannolikt den myrstack jag kommer dö relativt ensam på men låt gå för det - en man måste ha principer.)

Hur som helst - åter till bygget. En systemskiss över det hela ser ut ungefär här:

Trafikflödet till mitt webbkluster, som är ämnet för denna artikel, går som följer: Från Internet går trafiken till min brandvägg. Därefter går trafiken vidare till min reverse proxy, som körs med HaProxy som i skrivande stund körs på Rocky Linux 8. Där termineras certifikat (från Let’s Encrypt) och sedan fördelas den inkommande webbtrafiken ut beroende på var den skall (Mastodon, Matrix, webbsidor, och så vidare). Trafiken går därefter i klartext till tre backend-servrar som körs på FreeBSD 14, Nginx och PHP-FPM.

Allt statiskt content serveras från en NFS-server som körs på Rocky Linux 8, och alla databaser hanteras av en central server för detta som körs på Rocky Linux 8 och MariaDB.

Eftersom jag också hanterar sajter som körs med PHP, exempelvis Wordpress, krävs det att sessionsdatat för olika sajter delas i en central punkt vilket jag sköter med Memcached som körs på samma server som Haproxy och som sedan lagts in i /usr/local/etc/php.ini på de tre webbnoderna som körs med FreeBSD:

session.save_handler = memcached
session.save_path = “10.0.2.37:11211”

Webbnoderna har också en bunt PHP-moduler installerade som php-fpm sedan använder sig av. Dessa äro: bcmath
Core
ctype
curl
date
dom
exif
fileinfo
filter
gd
gmp
hash
iconv
imagick
intl
json
libxml
mbstring
memcached
mysqli
mysqlnd
openssl
pcre
PDO
pdo_mysql
random
Reflection
session
SPL
standard
xml
zip

Optimeringar

Jag har lagt en hel del tid på att optimera denna plattform. Processorn har ett antal år på nacken och är inte den snabbaste, det ska erkännas, men den hänger med bra och håller sig relativt sval och drar dessutom väldigt lite el.

Till att börja med så har jag justerat parametrarna för hur jag monterar de olika ytorna för exempelvis logghantering eller content i /etc/fstab:

nfs:/nfsserver /web nfs rw nfsvers=3,auto,nofail,noatime,nolock,intr,tcp,rsize=131072,wsize=131072,actimeo=1800 0 0

NFS-servern har också fått sig en omgång. I /etc/sysctl.conf har jag lagt in följande rader för att få upp prestanda på filsystemet:

vm.vfs_cache_pressure=50
vm.swappiness=10
vm.dirty_ratio=20
vm.dirty_background_ratio=10
vm.dirty_expire_centisecs=4000
vm.dirty_writeback_centisecs=500

I filen /etc/sysctl.d/02-netIO.conf på NFS-servern har jag lagt in följande rader för att öka hastigheten på nätverksstacken:

net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 16777216
net.core.wmem_default = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 87380 16777216
net.ipv4.tcp_mem = 1638400 1638400 1638400

Summering

Det finns mycket mer att berätta än vad jag orkar göra här just nu. Kanske skriver jag en separat artikel som förklarar ACL:erna i Haproxy, vilka hade förändrats ganska radikalt sedan jag höll på med detta sist, eller så kanske jag pratar vidare om cachelösningar vilket jag håller på gräver ganska djupt i just nu.

Ytterligare läsning:


Senast uppdaterad: 2025-05-19 kl. 15:07

© 2000 - 2025 Joakim Melin.

Prenumerera på bloggen via Mastodon.