MINISFORUM Mini PC UN100L

Performance seems good. Plex transcode performance after sorting out QuickSync in my plex docker container is great, CPU usage went from around 55% with CPU-only transcode to around 20% with QuickSync enabled.

MINISFORUM Mini PC UN100L
Small server is small.

Quick write up of moving my homelab server from a Lenovo TS140 to a Minisforum UN100L. I'd been looking to upgrade/sidegrade since the TS140 was getting a bit long in the tooth, chewed a bit of power as a 24/7 unit and had no support for QuickSync - for Plex transcoding. Other than that it's been a great home server, GPU mined a bit of ETH in it's time and carried a butt-tonne of hard-disks. The TS140 will be up for sale soon if anyone's interested...

Anticipating the move, I shifted the drives out of the TS140, and into a £120 JBOD a few months back which surprisingly (since I'd used UUID's in my /etc/fstab) just worked when I plugged it in, making it the least dramatic H/W migration I've ever carried out.

The recommendations for small home servers recently has pointed to anything with the Intel N100 CPU in it. It's small, efficient, supports QuickSync and will probably drive whatever you need - I run around 34 docker containers, and zero virtual machines so assumed this would do the job. Minisforum have a good rep for build quality and support so the new Minisforum UN100L looked great. Ordered from Amazon, £200 on offer, next day delivered. Bosh.

As an Amazon Associate I earn from qualifying purchases on the above links.

iPhone12 for scale, I'm fresh out of bananas

The UN100L came with Windows 11 Home already on it, so I ran through the setup and checked it was activated, just to see how it looked. Fine. Then got Ubuntu Server on it - a mate of mine suggested TrueNas, but it seems pretty restrictive and I'm a tinkerer. I don't run ZFS (I'm ext4 with MergerFS, danger's my middle name) and I know what I'm getting with Ubuntu. Would recommend it.

I've now migrated all my data (well, fstab content and plugged in the JBOD) and my 34 containers over to it, and all appears well. I had 2 or 3 containers fail because they were built locally on the old server rather than in a docker repo, that'll teach me to keep my stuff in repos.

Performance seems good. Plex transcode performance after sorting out QuickSync in my plex docker container is great, CPU usage went from around 55% with CPU-only transcode to around 20% with QuickSync enabled.

With all my docker containers running, and no plex streams total usage is literally next to nothing. If you're running Home Assistant in a VM I guess that would push this little box a bit more, but for my use-case it seems really good. Future expansion into a multi-UN100L's Kubernetes cluster to run all this stuff could also be a possibility, but I'd have to be tremendously bored.

Here are my migration notes in case it helps future generations; or most likely, future me.

Bravo -> Charlie Migration Notes

Stuff on bravo (old server, TS140)

Still on dhcp address of 192.168.0.3...

Moved plex from local install to docker mostly with this guide: [https://tcude.net/migrating-plex-to-docker/]

Tested overnight, appears to be working OK. Disabled local install of plex.service

Stuff on charlie (new server, UN100L)

Installed ubuntu-server with HWE kernel for newer hardware support.

Set up with dhcp allocated addr of 192.168.0.4

Manual installs

# DOCKER
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Add the repository to Apt sources:
echo   "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" |   sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo usermod -a -G docker ${USER}

sudo apt install python3-update-manager update-manager-core # force install of held back packages

lspci -v -s $(lspci | grep VGA | cut -d" " -f 1) # confirmed h/w transcode available

/etc/fstab

# *** OS specific stuff here ***

# JBOD DRIVES
UUID="fab7f104-ce7d-4050-a70c-5aeb901a148d" /mnt/standalone-drive ext4 defaults 0 0
UUID="923e9e4f-a51e-44f4-be8b-910d59ab36d8" /mnt/data-01 ext4 defaults 0 0
UUID="bf19ba1c-fe4c-4c25-be95-14518af3dbcb" /mnt/data-02 ext4 defaults 0 0
UUID="5da3ab1c-a02d-47a4-8c3f-1cd3055aa385" /mnt/ext18tbdrive ext4 defaults 0 0

#UUID="efdb5a36-3984-49fe-8e64-98c20aab9362" /mnt/data-03 ext4 defaults 0 0 old-3tb-drive, no longer useful, but still internally fitted in bravo

# MergerFS - pool the media drives
 /mnt/data-*:/mnt/ext18tbdrive /mnt/media-mountain fuse.mergerfs allow_other,nonempty,use_ino,cache.files=partial,dropcacheonclose=true,category.create=mfs,fsname=mergerFS 0 0

Manual Migration, the scary bit

  • Shutdown both servers.
  • Moved old server (bravo) from 192.168.0.3 to 192.168.0.6 in dhcp config.
  • Moved new server (charlie) from 192.168.0.4 to 192.168.0.3 in dhcp config.
  • Plugged in JBOD.
  • Power up new server (charlie).

Updated /etc/fstab

sudo mount -a # failed, forgot to make drivepaths

sudo -i
mkdir /mnt/data-01
mkdir /mnt/data-01
mkdir /mnt/ext18tbdrive
mkdir /mnt/media-mountain

mount -a # failed, forgot to install mergerfs
apt install mergerfs
mount -a # now working

Other minor tweaks

# add soft-links to docker and docker-dev
ln -s /mnt/standalone-drive/docker docker
ln -s /mnt/standalone-drive/docker-dev docker-dev

# deploy docker things
cd docker
./update.sh # hit issues with local built images

# note update.sh is a shell script which just does `docker compose -f ~/docker/docker-compose.yml up -d --remove-orphans` because of lazy reasons

Outstanding Issues

  • Unable to get all my custom local hosted images (hudson, weather-scraper). Balls, forgot about that.
    [TODO] move these to my own docker repo, added to separate profile for now to stop them interfering with other compose startups. See if I can do in container.
  • [TODO] sort out docker exporter for prometheus metrics.
  • [DONE] Node Exporter, host metrics - added as docker container.
  • [TODO] weather exporter, temp metrics