Installing Debian 13 on Mini Server
Last Friday night, I stayed up really late just to install Debian 13 as the main OS for my mini server.
Choosing a new Installation Disk
But before that process, I wanted to use the Lexar SSD that is kept in my cupboard which was used as the main OS in the second hand PC I bought previously. I did manage to get it up and that very old Windows booted. I wanted to format it. In the midst of that, I thought why not also reapply the thermal paste so to fix that damn temperature issue.
The SSD cable was a non-standard type. It was just a ribbon cable with contact points. I had no idea how to remove it and I kinda broke some of the pins, therefore rendering it unusable. Which also means I can’t use the Lexar SSD any longer. So with that said, Plan B is to install it onto the PNY 2TB M.2 SSD.
Applying New Thermal Paste
Then, I removed the chassis, took out the board and the fan and the heatsink. I had a bit of trouble midway but all was solved. Applied thermal paste, put it back together, boot it up and checking the temperatures on BIOS, it has dropped by half!!
Began installing Debian 13 and the process was quick and hassle free. With all the knowledge that I had built up over the last few years on self hosting and Linux, I mounted my Zorin OS 16 and begin transferring everything and configuring all.
Monitor Woes
Up till a point halfway, the PRISM+ monitor that I used started behaving erracticly. The signal kept going off and I made use of a different HDMI cable but to no avail. In the end, it’s the port on the monitor that is broken.
ZFS Installation
I found out that ZFS license is not compatible with Linux kernel and it had to be built/installed separately. zfs-dkms
is the core that builds. It installs but I noticed the module isn’t loaded into the kernel due to secure boot. This was resolved by enrolling the mok key into the BIOS/kernel. The module then loads after the next reboot and I can import my ZFS pool.
Then, it was up within the 5 hours that I spent midnight but that was only the bare minimum of the services I need from my Docker installations.
ZFS Hurdles
The next day, I noticed ZFS isn’t auto importing my pools on reboot. It was a tough one. I thought there was some issue with the installation. Some links showed me that it was due to zfs-cache
and AI didn’t help. But in the end it was the main service being disabled. I didn’t know which one and the one I thought it is was zfs.target
. But because it has the target
keyword, I always understood it was just a folder. I didn’t realised that could be enabled with systemctl enable zfs.target
. So basically the commands below were what made it import on boot:
sudo systemctl enable zfs.target
sudo systemctl enable zfs-import.target
Download Clients
I setup my torrent clients with deluge being a bitch because of its weird configuration location and user based requirements. I tried using the systemd
unit my previous Zorin OS but it didn’t go so well. I use its default configuration with the user chown
to debian-deluged
but that caused my downloads not to start due to permission issue. I fixed it by adding myself into the debian-deluged
group but the folder of new torrents that gets written is owned by debian-deluged
. That is going to cause a lot of issue with my Docker services. In the end I had no choice but I modified the systemd
unit to run as myself instead ofdebian-deluged
and set the configuration location to load from~/.config/deluge
instead of /var/lib/deluged/config
which is the default. That is basically the configuration from before. Transmission was a no brainer but the application that came from apt
did not have minimize to tray as it is built against GTK4 and APIs were missing so I had to built one against GTK3 for that function to be usable.
Jellyfin Configuration
Next issue I found out is that when Radarr or Sonarr imports video file into my respective locations, Jellyfin’s real-time monitoring of the library (inotify
based) did not trigger. The debugging was a pain because there quite a bit of linkage from Jellyseerr to Radarr/Sonarr to Jellyfin. In the end I found out that because I was using mergerfs
for Jellyfin but individual location for Radarr and Sonarr, the inotify
only listens on the mount that is merged, not the individual location itself (or rather inotify
did not propagate). It’s strange as I thought this was working on Zorin OS. It might be due to kernel or it might be actually it was not working all along but it wasn’t prominent due to not many downloads. I solved this by using webhook to trigger Jellyfin library refresh API on import instead. I think this might be better since less threads are spawned, although insignificant.
TLDR;
- Broke SSD Cable
- Wanted to install on Lexar SSD but instead on PNY M.2 because (below above)
- Installed Debian 13
- Stupid monitor behaving like a child during configuration
- Had issues installing ZFS due to Secure Boot, made it work by enrolling
mok.pub
key usingmokutil --import /var/lib/dkms/mok.pub
- Had issues with ZFS auto importing pool on boot. Fixed it by enabling main ZFS service
zfs.target
withsystemctl enable zfs.target
followed bysystemctl enable zfs-import.target
- Had issues getting deluge to run properly but fixed with changing user and config location
- Had issues with Jellyfin not refreshing library on import but fixed using webhook