Old PC → Proxmox Media Server

Stack you’ll build: Proxmox on the old PC → a Debian/Ubuntu VM → Docker → Emby (media on a NAS over SMB).

I wrote this so you can skim and ship. It’s practical, friendly, and based on a very normal home setup (media lives on a NAS, the VM just streams it). (if you choose Emby to use keep in mind you’ll have to pay for a subscription)


What you’re building (in plain English)

  • Your old PC becomes a Proxmox host (the “manager”).
  • Inside Proxmox, you run a small Linux VM that holds your apps.
  • Inside that VM, you use Docker to run Emby (or Jellyfin) cleanly.
  • Your NAS stays the source of truth for movies/TV. The VM mounts it over SMB.

Why this path? It’s reliable, easy to back up, and future‑proof. If you ever nuke the app VM, your files are still safe on the NAS. If you want to add more apps later, they’re just more containers.


TL;DR (two minutes)

  1. Install Proxmox on the old PC.
  2. Make a Debian 12 or Ubuntu 24.04 VM (2 vCPU / 4–8 GB RAM / 32–64 GB disk).
  3. Mount your NAS at /mnt/media inside the VM with SMB.
  4. Install Docker + docker compose.
  5. Start Emby with a tiny docker-compose.yml.
  6. Point Emby to /mnt/media/Movies and /mnt/media/TV.
  7. Optional: remote access (Tailscale/Cloudflare), reverse proxy, or GPU transcode.

Hardware reality check

  • CPU: Any 4‑core from the last decade is fine (e.g., A8‑6600K).
  • GPU: Not required unless you want hardware transcoding.
  • RAM: 8–16 GB is plenty.
  • Disk: An SSD for Proxmox + the VM (32–64 GB is fine). Your media stays on the NAS.
  • Network: Wired gigabit if you can.

Pro tip: An SSD for the OS/VMs makes everything feel snappy and avoids weird slowdowns.


0) Before you start

  • In BIOS, enable AMD‑V/SVM (virtualization).
  • Plug the box into Ethernet. Consider a DHCP reservation for clean, stable IPs.

1) Install Proxmox on the old PC

  1. Write the Proxmox ISO to a USB (Rufus/BalenaEtcher), boot it, install.
  2. Set a hostname (e.g., pve.local) and password.
  3. After reboot, open the web UI: https://<PROXMOX_IP>:8006 (login as root).

Host housekeeping:

apt update && apt -y full-upgrade
reboot

2) Make your Linux VM (Debian or Ubuntu)

Pick one: Debian 12 (Bookworm) or Ubuntu Server 24.04 LTS.

Suggested VM sizing:

  • CPU: 2 vCPU (add more if you transcode a lot)
  • RAM: 4–8 GB
  • Disk: 32–64 GB on SSD storage
  • NIC: virtio bridged to vmbr0
  • QEMU Guest Agent: enable in Proxmox and install in the VM

During OS install, include OpenSSH so you can SSH in later.

Inside the VM (first boot):

sudo apt update && sudo apt -y upgrade
sudo apt install -y qemu-guest-agent
sudo systemctl enable --now qemu-guest-agent
sudo timedatectl set-timezone America/Mexico_City  # adjust if needed

Give the VM a DHCP reservation in your router so its IP never changes. Life gets easier.


3) Mount your NAS (SMB) inside the VM

We’ll mount your share at /mnt/media and keep credentials private.

sudo apt install -y cifs-utils
sudo mkdir -p /mnt/media

sudo bash -c 'cat > /root/.smbcred <<EOF
username=YOUR_NAS_USER
password=YOUR_NAS_PASS
domain=YOUR_DOMAIN_OR_WORKGROUP
EOF'
sudo chmod 600 /root/.smbcred

Edit /etc/fstab and add one line (tweak IP/share, UID/GID, and SMB version):

//192.168.1.10/MediaShare  /mnt/media  cifs  credentials=/root/.smbcred,uid=1000,gid=1000,iocharset=utf8,vers=3.0,_netdev,nofail  0  0

Apply it now:

sudo mount -a && ls -la /mnt/media

Suggested folders:

/mnt/media/
  Movies/
  TV/
  Music/

If your NAS negotiates only SMB 2.1, change vers=3.0vers=2.1.


4) Install Docker + compose

# prereqs
sudo apt update
sudo apt install -y ca-certificates curl gnupg

# Docker repo
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo $ID)/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \ 
https://download.docker.com/linux/$(. /etc/os-release; echo $ID) \ 
$(. /etc/os-release; echo $VERSION_CODENAME) stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# (optional) allow your user to run docker
sudo usermod -aG docker $USER
newgrp docker

docker --version && docker compose version

5) Emby with Docker Compose (minimal)

We’ll use the LinuxServer.io image so permissions are easy.

mkdir -p ~/apps/emby/config
nano ~/apps/emby/docker-compose.yml

Paste:

services:
  emby:
    image: lscr.io/linuxserver/emby:latest
    container_name: emby
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=America/Mexico_City
    volumes:
      - ./config:/config
      - /mnt/media/Movies:/data/movies:ro
      - /mnt/media/TV:/data/tv:ro
    ports:
      - "8096:8096"
    restart: unless-stopped

Bring it up:

cd ~/apps/emby
docker compose up -d

Open http://<VM_IP>:8096 and point Emby at /data/movies and /data/tv.

Aim for Direct Play first (store files in codecs/containers your client supports). It’s quieter on the CPU and avoids GPU complexity.


6) Prefer Jellyfin? (FOSS option)

Swap Emby for Jellyfin with this compose file:

mkdir -p ~/apps/jellyfin/{config,cache}
nano ~/apps/jellyfin/docker-compose.yml

Paste:

services:
  jellyfin:
    image: jellyfin/jellyfin:latest
    container_name: jellyfin
    user: "1000:1000"
    environment:
      - TZ=America/Mexico_City
    volumes:
      - ./config:/config
      - ./cache:/cache
      - /mnt/media/Movies:/media/movies:ro
      - /mnt/media/TV:/media/tv:ro
    ports:
      - "8097:8096"
    restart: unless-stopped

Then:

cd ~/apps/jellyfin && docker compose up -d

Browse to http://<VM_IP>:8097.


7) Remote access (the safe & simple ways)

  • Tailscale (mesh VPN): dead‑simple private access from anywhere, no ports exposed.
  • Cloudflare Tunnel: public URL with free TLS, no inbound firewall rules.
  • Reverse proxy (Caddy/Traefik/SWAG): classic domain + port‑forward approach.

Caddy (LAN only) example:

services:
  caddy:
    image: caddy:latest
    container_name: caddy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - ./data:/data
      - ./config:/config
    restart: unless-stopped

Caddyfile:

emby.local {
  reverse_proxy 10.0.0.50:8096
}

Change 10.0.0.50 to your VM IP. Add a local DNS/hosts entry for emby.local.


8) Optional: NVIDIA hardware transcode (advanced)

Your GTX 750 Ti can do NVENC. If you really need transcoding:

  1. GPU passthrough in Proxmox (enable IOMMU, use VFIO, attach the card to the VM).
  2. Install NVIDIA drivers + NVIDIA Container Toolkit inside the VM.
  3. Add GPU bits to Emby compose and enable hardware acceleration in Emby.

Reality check: Emby Premiere is required for NVENC, and a 750 Ti won’t do tons of concurrent streams. Prefer Direct Play when possible.


9) Care & feeding (backups, updates)

  • Back up Emby config: your ./config folder is the brain—copy it to the NAS on a schedule.
  • Update containers:
cd ~/apps/emby && docker compose pull && docker compose up -d
  • VM backups: use Proxmox scheduled VM backups to a NAS target.
  • Media safety: that’s your NAS’s job—RAID + backup.

10) Troubleshooting quick hits

  • SMB won’t mount on boot: add _netdev,nofail, confirm NAS is up, check journalctl -b | grep CIFS.
  • Permission errors: make sure PUID/PGID match your user (usually 1000:1000) and the NAS share has read perms.
  • Buffering/stutter: check if the client is transcoding—optimize for Direct Play or enable hardware accel.
  • Container can’t see files: verify /mnt/media is mounted before docker compose up.
  • Can’t reach Emby: docker ps, confirm port 8096, check Proxmox firewall.

11) Security basics

  • Use a normal user for SSH; key‑auth preferred.
  • Don’t expose the Proxmox UI (port 8006) to the internet.
  • Keep VM and containers updated monthly.
  • Give the VM a static lease and sensible names (/data/movies, /data/tv).

You’re done

This layout keeps your media safe on the NAS, your apps tidy in Docker, and your hardware humming along without drama. If you ever want to add more services (Sonarr/Radarr/Overseerr, etc.), just drop in more compose files and keep rolling.

Leave a Reply

Your email address will not be published. Required fields are marked *

© 2025 TooBrokeToQuit