Building my seedbox (in Dutch)

I originally wrote this for the wiki of the linux space i frequent. I wanted to have it on my blog as well, so here it is. It was originally written in Dutch, and i decided to not do the effort of translating it myself.The article, as is the default on here, is under a CC BY-SA 4.0 license, so feel free to make (and, if you so wish, distribute with attribution and under the same license) translations, or other adaptions, yourself.

This seedbox is used to host free-to-share movies and other free-to-share media, and can be considered an integral part of the MovieLounge project.

Doel

BitTorrent is een protocol om peer-2-peer bestanden te delen. Je kan van een set bestanden een zogenaamd torrent bestand maken. Dit bestand heeft informatie over de betreffende bestanden. Een torrent client zal over het netwerk proberen anderen te zoeken die dezelfde torrent hebben. Wanneer meerdere torrent clients elkaar op die manier vinden, kan men de bestanden delen met elkaar. Een groep van mensen met dezelfde torrent die elkaar op die manier hebben gevonden, wordt ook wel een “zwerm” genoemd, de verschillende deelnemers in de zwerm worden de “peers” genoemd. Een peer die de volledige set van bestanden heeft, en die nog verder deelt met de andere peers, wordt een “seed” genoemd. Praktisch zal iemand dus een torrent maken van een set van één of meer bestanden, en dan het torrent bestand, die zeer klein is, delen. Anderen kunnen dan het bestandje downloaden. Hun client zal anderen zoeken, en uiteindelijk de persoon vinden die de bestanden heeft. Ze kunnen dan vragen om stukjes van de bestanden te krijgen. Eens ze stukjes hebben, kunnen ze die zelf ook versturen naar anderen. Op die manier wordt bandbreedte gedeeld over de verschillende mensen die de bestanden delen. Ook kan het bestand blijven gedeeld worden zolang alle stukjes van de bestanden beschikbaar zijn in de zwerm. Zelfs nadat de oorspronkelijke seed de bestanden niet meer ter beschikking stelt.

Het doel van dit project is om een seedbox te maken. Dit is een klein servertje waar we een torrent client op zetten die we over het netwerk kunnen bereiken, torrents toevoegen, en bestanden met de wereld te delen.

Benodigd
  • Om correct te werken, moet de seedbox rechtstreeks aan te spreken zijn. Je hebt dus een internet verbinding nodig met liefst minimum één open poort die je kan door verwijzen naar je servertje.
  • Als server gebruiken we een Single-board computer, meer specifiek een A20 OLinuXino LIME. Als operating systeem gebruiken we de Debian based A20-OLinuXino-bullseye-minimal. Het OS installeren we op een 16GB micro SD kaartje. We hebben ook een toetsenbord en scherm nodig om initieel wat werk op het SBC’tje te doen. Je kan uiteraard ook iets anders gebruiken als servertje, maar krachtig moet het niet zijn, terwijl het wel de bedoeling is dat je het laat aanstaan. Neem dus best iets die niet te veel verbruikt.
  • Om de bestanden op te slaan, gebruiken we een oude laptop harde schijf van 500GB dat we uit afbraak hebben.
  • De bittorrent-client dat we gaan gebruiken is Transmission. Een andere optie is qBittorrent, maar we kiezen hier voor Transmission.
  • Uiteraard hebben we ook de nodige bekabeling nodig, meer bepaald voor voeding voor de SBC, kabels om de harde schijf aan te steken en een ethernet kabel.
Hoe doen we het
De opstart

We downloaden de Debian image van de Olimex website en flashen die. Normaal kunnen we het root paswoord ook wel vinden, maar je kan ook de hash verwijderen uit het ./etc/hosts bestand nadat je de image geflasht hebt[1].

Vervolgens steken we het SD kaartje in onze SBC, connecteren we dat aan het netwerk, en starten we op. Inloggen doen we met root, een wachtwoord is normaal niet nodig gezien we de paswoordhash verwijderd hebben. Uiteindelijk gaan we willen inloggen via SSH, dus zetten we een paswoord met passwd. We kijken ook dat de optie PermitRootLogin yes in het configuratie bestand /etc/ssh/sshd_config staat. Indien nodig zetten we het lijntje er bij[2] en herstarten we de ssh deamon met systemctl restart shhd. Dan kijken we welk lokaal ip adres we hebben met hostname -I. Dan kunnen we vanaf een pc op het lokale netwerk inloggen over ssh. Bijvoorbeeld als je ip adres 192.0.2.51 is, kan je inloggen met ssh root@192.0.2.51. Op zich moeten we niet inloggen via ssh, we kunnen ook rechtstreeks vanaf het SBC’tje werken, maar via pc is vaak wel wat handiger. De rest van deze tekst verondersteld dat we, al dan niet via ssh, op de server werken.

Pro Tip: In plaats van eerst op het servertje te werken, kan je ook op het SD kaartje een paswoordhash instellen in plaats van die te verwijderen. Je kan bvb uit je lokale /etc/shadow een hash nemen van een paswoord dat je kent. Je moet dan ook ./etc/ssh/sshd_config op het SD-kaartje aanpassen. Om het ip adres te achterhalen, ga je vindingrijker moeten zijn. Mogelijks heb je toegang tot je router, dan vind je daar normaal het ip adres eens het servertje is opgestart. Eens binnen, kun je dan het paswoord alsnog aan passen.

Pro Tip 2: Je kan uiteraard ook al andere zaken aanpassen. Ik pas bvb al de host aan in /etc/hostname. Als je mdns kan gebruiken, kan je straks die hostname gebruiken in plaats van het ip adres.

Pro Tip 3: In mijn geval zie ik dat er ook een olimex user is. Ik heb hier geen nood aan, dus ik verwijder die met deluser --remove-home --remove-all-files olimex && reboot.

Transmission installeren

We installeren Transmission met apt-get install transmission-daemon, eens geïnstalleerd stoppen we het met systemctl stop transmission-daemon zodat we eerst de instellingen kunnen aanpassen.

Normaal start Transmission met een eigen user. systemctl status transmission-daemon toont normaal de service file. Met cat kunnen we dan de inhoud zien, bv cat /lib/systemd/system/transmission-daemon.service. Daar zien we met welke user het wordt gestart, bv User=debian-transmission. Cool, we willen dat het met een eigen user start. De home folder van de user kunnen we zien met echo ~debian-transmission, ik zie hier /var/lib/transmission-daemon/.

Laat ons eerst de instellingen nazien met nano /var/lib/transmission-daemon/info/settings.json. Normaal zie je hier nu al wat zaken staan. We kijken ook wat de peer-port is. In mijn geval 51413. We gaan later een port forward vanuit onze router willen instellen naar deze port op de seedbox. We willen ook de poort weten waarop de webinterface staat, rpc-port, nu 9091. Eventueel kan je de poorten of andere zaken aanpassen. Dit is hetgeen dat ik veranderde:

"download-dir": "/var/lib/transmission-daemon/downloads",
"incomplete-dir": "/var/lib/transmission-daemon/downloads",
"rpc-authentication-required": false,
"rpc-whitelist": "192.168.*.* 127.0.0.1",
"rpc-host-whitelist-enabled": false,
"rpc-port": 5330,

Eens aangepast, kunnen we transmission opnieuw starten met systemctl start transmission-daemon. Nu moet we op de webinterface kunnen via vanaf het lokaal netwerk met 192.0.2.51:5330.

Harde schijf klaar maken

Transmission werkt nu wel, maar we willen dat Transmission de harde schijf gebruikt voor opslag in plaats van het SD kaartje. We gaan de harde schijf moeten formateren en een bestandssysteem op zetten. Om te beginnen sluiten we de schijf dus aan. Doe eerst eens ls /dev/. Daarmee zien we de zogenaamde block-devices die momenteel zijn aangesloten. Daarna koppel je de harde schijf aan en doe je opnieuw ls /dev/. Normaal zie je nu één of meerdere zaken extra. In mijn geval had ik sda, sda1, sda2 en sda5. De harde schijf zelf is sda, de rest zijn de partities op de schijf. We willen alles op één grote partitie, dus beginnen we met de schijf te formateren. Hiervoor gebruiken we fdisk.

Doe fdisk /dev/sda. Maak dat je zeker de juiste block device kiest, en dat je zeker bezig bent op je server! Dit programma’tje werkt interactief. Eerst verwijderen we de partities met d, en verwijderen we de partities één voor één. Vervolgens maken we een nieuwe partitie met n en kiezen we voor een primaire partitie met p. We kiezen voor partitienummer 1 en dan de de default waardes voor start en eind sector. De aanpassingen schrijven we met w.

Dan moeten we op de partitie een filesysteem zetten. Als je ext4 wil gebruiken, kan je mkfs.ext4 /dev/sda1 doen. Als je een ander filesysteem wil gebruiken, moet je het betreffende commando daarvoor gebruiken. Om eens fancy te doen, probeer ik eens btrfs. Eerst installeer ik de nodige tools met apt install btrfs-progs, en dan doe ik mkfs.btrfs /dev/sda1.

Harde schijf mounten

Nu moeten we de harde schijf mounten op ons file systeem. Ik besluit om hiervoor een nieuwe map aan te maken /media/500G. Ik neem ook alle permissies weg zodat er zeker niet per ongeluk naar geschreven wordt wanneer de schijf niet aangekoppeld is.

mkdir -p /media/500G
ls -ld /media/500G
#drwxr-xr-x 2 root root 4096 Nov 18 08:08 500G
chmod 000 /media/500G
ls -ld /media/500G
#d--------- 2 root root 4096 Nov 18 08:08 500G

Voor btrfs plaats ik volgend lijntje op het einde met nano /etc/fstab en sla het bestand op

/dev/sda1 /media/500G btrfs nofail,x-systemd.device-timeout=30

Voor ext4 zal het eerder iets zijn als

/dev/sda1 /media/500G ext4 default,nofail,x-systemd.device-timeout=30 0 2

De nofail zorgt ervoor dat de server toch zal opstarten, ook al kan het voor één of andere reden de schijf niet vinden. De timeout optie zegt dat er 30s moet geprobeerd worden om de schijf te vinden vooraleer verder te gaan. De reden dat ik dit doe, is omdat ik liever heb dat de server start, en Transmission niet, dan dat de server helemaal ook niet start en ik zelfs geen troubleshooting kan doen.

Probeer nu de schijven te mounten en kijk dat het inderdaad lukt. Vervolgens rebooten we en moet het nog steeds OK zijn.

df -h
# Je zal vanalles zien, oa de mount points
mount -a
df -h
# Je moet nu de block device /dev/sda1 zien op eenzelfde lijn met het mount point /media/500G
reboot
df -h
# Je moet nog steeds de block device /dev/sda1 zien op eenzelfde lijn met het mount point /media/500G
# Merk op dat we ge reboot hebben, dus je zal eventueel opnieuw moeten inloggen met ssh

Vervolgens zetten we de bestanden van de Transmission home folder over en maken we een symbolische link naar de nieuwe map op onze schijf.

systemctl stop transmission-daemon
mkdir /media/500G/transmission
cd ~debian-transmission
pwd
# /var/lib/transmission-daemon
mv * /media/500G/transmission
mv .* /media/500G/transmission
# you'll get an error bc `.` and `..` can't be moved, that's normal
# In the next command `.` and `..` are the only folders we should still see
ls -a
# . ..
cd ..
rm -r transmission-daemon
ln -s /media/500G/transmission /var/lib/transmission-daemon
chown debian-transmission:debian-transmission -R /media/500G/transmission
ls -ld transmission-daemon
# lrwxrwxrwx 1 root root 18 Nov 17 05:32 transmission-daemon -> /media/500G/transmission
systemctl start transmission-daemon
Finishing up

Nu moeten we nog een port-forward opzetten naar onze seedbox. Dat is afhankelijk van je router en internet provider, dus zal je zelf moeten uitzoeken.

Ik definieerde ook nog enkele handige aliassen met nano /root/.profile. Dan kan de root user die gebruiken. Om die te laden moet je ofwel opnieuw inloggen met de root user, ofwel . /root/.profile doen.

##
# Custom aliasses for seedbox
##

alias "t-cd-home"="cd ~debian-transmission"

alias "t-stop"="systemctl stop transmission-daemon"
alias "t-start"="systemctl start transmission-daemon"
alias "t-restart"="systemctl restart transmission-daemon"
alias "t-status"="systemctl status transmission-daemon"

alias "t-change-settings"="systemctl stop transmission-daemon; nano ~debian-transmission/.config/transmission-daemon/settings.json; systemctl start transmission-daemon"

Vervolgens kan je torrents laden. Je kan dit via de webinterface, of door ze in de info/torrents folder te steken en transmission te herstarten. Als je de torrents al had, kan je eventueel de bestanden eerst naar downloads kopieren en via de webinterface dan kiezen voor “Verify Local Data”.

Succes!

Pro Tip: Gezien we schrijven naar de harde schijf, en gezien een SD kaartje gelimiteerd is in aantal writes, kan je het root systeem eventueel read-only maken. Je kan dan een extra alias definieren om opnieuw schrijfbaar te maken. In /etc/fstab heb ik daarvoor nu

UUID=513999af-8a13-4364-862e-d3e5ad269880 /               ext4    defaults,noatime,nodiratime,commit=600,ro       0        1
/dev/sda1 /media/500G btrfs nofail,x-systemd.device-timeout=30

In /root/.profile heb ik twee extra aliassen.

alias "t-mount-fs-rw"="mount -o remount,rw /"
alias "t-upgrade-system"="mount -o remount,rw / && apt-get update && apt-get upgrade && reboot"
Noten

[1] Eerst moet je dan het SD kaartje mounten, vanaf die locatie open je dan de map etc, en dan het bestand shadow. Daar moet er een lijntje staan als root:\$84IoS1c/flw87J2GlBm64ps+JgYsbEVTl0DljDb6piOnZoWQdNmvJ34agTKsha0N25/Nl947P8J8:19667:0:99999:7:::. Daar verwijder je het stukje vanaf en met de $ tot aan het eerste dubbelpunt :, laat het dubelpunt wel staan. Dus root::19667:0:99999:7:::.

[2] Later heb ik beseft dat het niet zo verstandig is dit bestand aan te passen, want het kan problemen geven bij upgrades. Beter is bv echo 'PermitRootLogin yes' > /etc/ssh/sshd_config.d/permit_root_login.conf.

Updates
2024-06-23

I wanted a banner before and after login.

t-mount-fs-rw
# First I add a message to show before login
# The first line creates the messages, the second one activates it
echo 'MESSAGE TO SHOW BEFORE LOGIN' > /etc/ssh/sshd-banner
echo 'Banner /etc/ssh/sshd-banner' >  /etc/ssh/sshd_config.d/show-pre-login-banner.conf

# This is the message after login
# It was already activated, I just added some lines to it
nano /etc/motd
# I added the following lines
#
#For commands specific to the seedbox, use `t-` and do tab for autocomplete,
#or `cat /media/500G/.aliasses` to see the implementation.

# We want the filesystem to be read-only again, so we reboot
# If not rebooting, you have to at least restart the ssh deamon `systemctl restart sshd`
reboot