New Server: GMKtec NucBox G3 Setup
I got a new server: the tiny, affordable GMKtec NucBox G3. It replaces the Raspberry Pi 3B I’ve had for what feels like an eternity. I installed Ubuntu 25.04 on it, and so here’s a recording of how I set it up.
This post is a part of my Homelab Series. See the index here.
System Stuff
Static IP
Instructions are stolen from this article.
Check if cloud-init
is installed:
apt-cache pkgnames | grep cloud-init
If you get an output, you have ‘cloud-init’ installed.
Now, to disable could-init, create a new file inside /etc/cloud/cloud.cfg.d
directory:
sudoedit /etc/cloud/cloud.cfg.d/99-disable-cloud-init.cfg
Add the following line to it:
network: {config: disabled}
Reboot the system: sudo reboot now
and afterwards, create a new config file:
sudoedit /etc/netplan/00-installer-config.yaml
With the following content:
network:
ethernets:
enp3s0:
dhcp4: no
addresses:
- 192.168.1.199/24
gateway4: 192.168.1.1
nameservers:
addresses: [1.1.1.1, 8.8.8.8]
version: 2
sudo netplan apply
Check if it worked: hostname -I
Disable WiFi
sudo nmcli radio wifi off
SSH without Password
Mount External Drives
Samba Sharing
Apps
Same as on Pi
For several pieces, I was able to follow the same procedures as in my previous Raspberry Pi setup:
- Syncthing (or simply follow the official documentation)
- Docker (or follow the official documentation)
- Portainer
- Tailscale
- Transmission
- Plex Media Server
And then, we have new goodies!!
Borg Backup with Borgmatic
TBD
Watchtower
This keeps containers updated automatically. First, install Shoutrrr to make sending Watchtower notifications easy:
sudo snap install shoutrrr
And then pop this into Portainer:
version: "3.3"
services:
watchtower:
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment: WATCHTOWER_NOTIFICATION_URL=pushover://shoutrrr:[TOKEN_APP]@[TOKEN_USER]/
image: beatkind/watchtower
MusicBrainz Picard
I tried hard to like Lidarr but realized I didn’t need all the complexity and maintenance it required. I’m not a hoarder, I’m rather intentional as far as music is concerned, so I don’t need to any automation for music downloads. And what is quite important to me: Picard gives me full control over the tagging process, whereas in Lidarr it was automated and rather opaque to me.
version: "3.3"
services:
picard:
ports:
- 5800:5800
volumes:
- /home/pe8er/docker/picard:/config:rw
- /home/pe8er/Downloads:/downloads:rw
- /mnt/ssd-sandisk/Music:/music:rw
image: mikenye/picard:latest
And my file rename script (or grab the gist):
%albumartist%/\($if(%originalyear%,%originalyear%,$if(%date%,$left(%date%,4),0000))\) %album%/$if($gt(%totaldiscs%,1),%discnumber%-)$num(%tracknumber%,2) $if2(%albumartist%,%artist%) - %title%
Radarr
Radarr manages movie grabbing and management. I prefer this way to grab new movies instead of manual search because it’s much faster and less cognitively intensive for me.
---
services:
radarr:
image: lscr.io/linuxserver/radarr:latest
container_name: radarr
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Warsaw
volumes:
- /home/pe8er/docker/radarr:/config
- /home/pe8er:/data
ports:
- 7878:7878
restart: unless-stopped
Prowlarr
I need this to easily add indexers to *arr apps. It replaces Jackett.
---
services:
prowlarr:
image: lscr.io/linuxserver/prowlarr:latest
container_name: prowlarr
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Warsaw
volumes:
- /home/pe8er/docker/prowlarr:/config
- /home/pe8er/:/data
ports:
- 9696:9696
restart: unless-stopped
Immich
A self-hosted photo library / backup app with pretty solid UX. Solid Docker instructions on Immich website.
Homepage
A simple web app dashboard which I use as a visual bookmark for all my server apps. Website.
services:
homepage:
image: ghcr.io/gethomepage/homepage:latest
container_name: homepage
ports:
- 3000:3000
volumes:
- /home/pe8er/docker/homepage:/app/config
- /var/run/docker.sock:/var/run/docker.sock
environment:
HOMEPAGE_ALLOWED_HOSTS: gethomepage.dev,*
JDownloader2
A handy download manager.
version: '3'
services:
jdownloader-2:
image: jlesage/jdownloader-2
ports:
- "666:5800"
volumes:
- "/home/pe8er/docker/jdownloader2:/config:rw"
- "/home/pe8er/Downloads:/output:rw"
environment:
- WEB_AUTHENTICATION_USERNAME=pe8er
- WEB_AUTHENTICATION_PASSWORD=[PASSWORD]
- MYJDOWNLOADER_DEVICE_NAME=jdownloader2
And JDownloader2 should be available at:
http://[SERVER IP]:666