2 minute read

g3!

Image credit: GMKtec

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

Same as on Pi

Mount External Drives

Same as on Pi

Samba Sharing

Same as on Pi

Apps

Same as on Pi

For several pieces, I was able to follow the same procedures as in my previous Raspberry Pi setup:

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