DEV Community

Cover image for Deploying Plex Home Media Streaming on Ubuntu 24.04
Sanskriti Harmukh for Vultr

Posted on with Aashish Chaurasiya • Originally published at docs.vultr.com

Deploying Plex Home Media Streaming on Ubuntu 24.04

Plex is a personal media server that organizes and streams your movies, TV shows, music, and photos to clients on every major platform, with metadata, transcoding, and remote access built in. This guide deploys Plex using Docker Compose with Traefik handling automatic HTTPS, claimed against your Plex account at first run. By the end, you'll have a Plex Media Server streaming securely at your domain.

Prerequisite: Get a Plex claim token from plex.tv/claim. It's valid for 4 minutes, so generate it just before starting the stack.


Set Up the Directory Structure

1. Create the project directory structure:

$ mkdir -p ~/plex-media-server/{config,transcode,media}
$ cd ~/plex-media-server
Enter fullscreen mode Exit fullscreen mode

2. Create the environment file:

$ nano .env
Enter fullscreen mode Exit fullscreen mode
TZ=YOUR_TIMEZONE
PLEX_CLAIM=YOUR_PLEX_CLAIM_TOKEN
DOMAIN=plex.example.com
LETSENCRYPT_EMAIL=admin@example.com
Enter fullscreen mode Exit fullscreen mode

Deploy with Docker Compose

1. Create the Docker Compose manifest:

$ nano docker-compose.yaml
Enter fullscreen mode Exit fullscreen mode
services:
  traefik:
    image: traefik:v3.6
    container_name: traefik
    command:
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--entrypoints.web.http.redirections.entrypoint.to=websecure"
      - "--entrypoints.web.http.redirections.entrypoint.scheme=https"
      - "--certificatesresolvers.letsencrypt.acme.httpchallenge=true"
      - "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
      - "--certificatesresolvers.letsencrypt.acme.email=${LETSENCRYPT_EMAIL}"
      - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - "letsencrypt:/letsencrypt"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
    restart: unless-stopped

  plex:
    image: plexinc/pms-docker:latest
    container_name: plex
    hostname: plex
    expose:
      - "32400"
    volumes:
      - "./config:/config"
      - "./transcode:/transcode"
      - "./media:/data"
    environment:
      - TZ=${TZ}
      - PLEX_CLAIM=${PLEX_CLAIM}
      - ADVERTISE_IP=https://${DOMAIN}:443/
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.plex.rule=Host(`${DOMAIN}`)"
      - "traefik.http.routers.plex.entrypoints=websecure"
      - "traefik.http.routers.plex.tls.certresolver=letsencrypt"
      - "traefik.http.services.plex.loadbalancer.server.port=32400"
    restart: unless-stopped

volumes:
  letsencrypt:
Enter fullscreen mode Exit fullscreen mode

2. Start the services:

$ docker compose up -d
Enter fullscreen mode Exit fullscreen mode

3. Verify the services are running:

$ docker compose ps
$ docker compose logs
Enter fullscreen mode Exit fullscreen mode

Configure Plex Media Server

  1. Open https://plex.example.com in a browser.
  2. Sign in with the Plex account that generated the claim token.
  3. Name the server and add libraries pointing to folders under /data (your ./media mount).
  4. Let Plex scan and fetch metadata. Install client apps on your devices to start streaming.

Next Steps

Plex is running and streaming securely over HTTPS. From here you can:

  • Add Movies, TV, Music, and Photos libraries with custom agents and scanners
  • Enable hardware-accelerated transcoding with a Plex Pass subscription
  • Set up managed users and parental controls for shared access

For the full guide with additional tips, visit the original article on Vultr Docs.

Top comments (0)