← Back to all posts

Day 1: Zeus Comes Online

·
hardware jetson setup infrastructure

Unboxing a Jetson Orin Nano, flashing JetPack, and getting ten services running in a single evening. The foundation of Project Olympus.

There’s a moment when you plug in a new piece of hardware and the LED blinks for the first time. It’s not doing anything useful yet — it’s just… alive. That moment hit different tonight.

Meet Zeus: an NVIDIA Jetson Orin Nano Super. Tiny board. Serious power. 1024 CUDA cores, 40 Tensor cores, 8GB of unified memory, and enough compute to make me question why I ever paid for cloud GPUs.

The Flash

Getting JetPack 6.x onto the board was surprisingly smooth. NVIDIA’s SDK Manager walked me through flashing the NVMe — I went with the Kingston NV3 1TB because fast storage matters when you’re going to run a dozen containerized services simultaneously.

# Post-flash sanity check
jetson_release
# JetPack 6.1 | L4T 36.4.0 | Ubuntu 22.04 | CUDA 12.6

First boot, SSH in, and we’re cooking.

The Storage Layer

The OS lives on the NVMe, but media needs room to breathe. I mounted an 8TB Seagate HDD at /media/storage — this is where Jellyfin, downloads, and everything media-related will live.

sudo mkfs.ext4 /dev/sda1
sudo mkdir -p /media/storage
sudo mount /dev/sda1 /media/storage
# Added to fstab for persistence

Simple. Reliable. None of that NAS-over-network latency — just a drive bolted directly to the machine.

Bringing Up the Stack

Here’s where the evening got intense. I wanted the full media automation pipeline running before I went to sleep. That means:

  • qBittorrent — torrent client, tunneled through Gluetun (WireGuard VPN)
  • Jackett — indexer proxy, so searches hit multiple sources
  • Jellyfin — media server for streaming to any device
  • Prowlarr — indexer manager that feeds Sonarr and Radarr
  • Sonarr — TV show automation
  • Radarr — movie automation
  • FlareSolverr — Cloudflare bypass for indexers that need it

Every service runs in Docker, ARM64-native where possible. Some images needed to be pulled from alternative registries (the Jetson ecosystem is getting better but it’s still not x86). A few required building from source.

# docker-compose excerpt
services:
  gluetun:
    image: qmcgaw/gluetun
    cap_add:
      - NET_ADMIN
    environment:
      - VPN_SERVICE_PROVIDER=custom
      - VPN_TYPE=wireguard
    ports:
      - 8080:8080  # qBittorrent WebUI

  qbittorrent:
    image: linuxserver/qbittorrent
    network_mode: "service:gluetun"
    volumes:
      - /media/storage/downloads:/downloads

The VPN routing took the longest to get right. Gluetun handles the WireGuard tunnel, and qBittorrent’s traffic goes through it — but Sonarr and Radarr need to talk to qBittorrent through the Gluetun container’s network. Getting the port mappings and network modes correct was a solid hour of trial and error.

The Moment It All Clicked

At around 11 PM, I added a movie through Radarr’s web UI. Within seconds, Prowlarr searched the indexers, found a release, sent it to qBittorrent (through the VPN tunnel), and the download started. A few minutes later, Radarr moved the completed file to the Jellyfin library, and I could stream it from my phone.

Fully automated. Fully local. Zero cloud dependencies.

I sat there watching the download progress bar for way longer than I should have. Not because I needed to — because I built this, and it worked.

What’s Next

Zeus is running, but it’s just infrastructure right now. The real project — the AI layer, the IoT integration, the ambient intelligence — that all comes next. This was Day 1: getting the foundation right.

Tomorrow, I start building Athena.


Hardware used: NVIDIA Jetson Orin Nano Super (8GB), Kingston NV3 1TB NVMe, Seagate 8TB HDD, running JetPack 6.1 on Ubuntu 22.04.