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)
- Install Proxmox on the old PC.
- Make a Debian 12 or Ubuntu 24.04 VM (2 vCPU / 4–8 GB RAM / 32–64 GB disk).
- Mount your NAS at
/mnt/media
inside the VM with SMB. - Install Docker + docker compose.
- Start Emby with a tiny
docker-compose.yml
. - Point Emby to
/mnt/media/Movies
and/mnt/media/TV
. - 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
- Write the Proxmox ISO to a USB (Rufus/BalenaEtcher), boot it, install.
- Set a hostname (e.g.,
pve.local
) and password. - After reboot, open the web UI:
https://<PROXMOX_IP>:8006
(login asroot
).
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.0
→vers=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:
- GPU passthrough in Proxmox (enable IOMMU, use VFIO, attach the card to the VM).
- Install NVIDIA drivers + NVIDIA Container Toolkit inside the VM.
- 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, checkjournalctl -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 beforedocker 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.