Compare commits

..

No commits in common. "master" and "1.32.8.7639-fb6452ebf-ls202" have entirely different histories.

34 changed files with 814 additions and 1269 deletions

View file

@ -1,49 +0,0 @@
name: Build and push image
on:
push:
branches: [master]
schedule:
- cron: '0 4 * * *' # daily, picks up LSIO base image updates
workflow_dispatch:
jobs:
build:
runs-on: docker
steps:
- name: Checkout
uses: actions/checkout@v4
with:
ref: master
fetch-depth: 0
token: ${{ secrets.PUSH_TOKEN }}
- name: Merge upstream
run: |
git config user.name "forgejo-runner"
git config user.email "runner@forge.jannis.wtf"
git fetch origin master
git reset --hard origin/master
git remote add upstream https://github.com/linuxserver/docker-plex
git fetch upstream
git merge upstream/master --no-edit
git push origin master
- name: Set up Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Forgejo registry
uses: docker/login-action@v3
with:
registry: forge.jannis.wtf
username: ${{ secrets.REGISTRY_USER }}
password: ${{ secrets.REGISTRY_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: |
forge.jannis.wtf/fej/plex-wireguard:latest
forge.jannis.wtf/fej/plex-wireguard:${{ github.sha }}

View file

@ -6,7 +6,7 @@
* Read, and fill the Pull Request template * Read, and fill the Pull Request template
* If this is a fix for a typo (in code, documentation, or the README) please file an issue and let us sort it out. We do not need a PR * If this is a fix for a typo (in code, documentation, or the README) please file an issue and let us sort it out. We do not need a PR
* If the PR is addressing an existing issue include, closes #\<issue number>, in the body of the PR commit message * If the PR is addressing an existing issue include, closes #\<issue number>, in the body of the PR commit message
* If you want to discuss changes, you can also bring it up in [#dev-talk](https://discordapp.com/channels/354974912613449730/757585807061155840) in our [Discord server](https://linuxserver.io/discord) * If you want to discuss changes, you can also bring it up in [#dev-talk](https://discordapp.com/channels/354974912613449730/757585807061155840) in our [Discord server](https://discord.gg/YWrKVTn)
## Common files ## Common files
@ -105,10 +105,10 @@ docker build \
-t linuxserver/plex:latest . -t linuxserver/plex:latest .
``` ```
The ARM variants can be built on x86_64 hardware and vice versa using `lscr.io/linuxserver/qemu-static` The ARM variants can be built on x86_64 hardware using `multiarch/qemu-user-static`
```bash ```bash
docker run --rm --privileged lscr.io/linuxserver/qemu-static --reset docker run --rm --privileged multiarch/qemu-user-static:register --reset
``` ```
Once registered you can define the dockerfile to use with `-f Dockerfile.aarch64`. Once registered you can define the dockerfile to use with `-f Dockerfile.aarch64`.

View file

@ -1,7 +1,7 @@
blank_issues_enabled: false blank_issues_enabled: false
contact_links: contact_links:
- name: Discord chat support - name: Discord chat support
url: https://linuxserver.io/discord url: https://discord.gg/YWrKVTn
about: Realtime support / chat with the community and the team. about: Realtime support / chat with the community and the team.
- name: Discourse discussion forum - name: Discourse discussion forum

View file

@ -67,10 +67,10 @@ body:
- type: textarea - type: textarea
attributes: attributes:
description: | description: |
Provide a full docker log, output of "docker logs plex" Provide a full docker log, output of "docker logs linuxserver.io"
label: Container logs label: Container logs
placeholder: | placeholder: |
Output of `docker logs plex` Output of `docker logs linuxserver.io`
render: bash render: bash
validations: validations:
required: true required: true

View file

@ -8,9 +8,6 @@ on:
pull_request_review: pull_request_review:
types: [submitted,edited,dismissed] types: [submitted,edited,dismissed]
permissions:
contents: read
jobs: jobs:
manage-project: manage-project:
permissions: permissions:

View file

@ -4,9 +4,6 @@ on:
- cron: '33 12 * * *' - cron: '33 12 * * *'
workflow_dispatch: workflow_dispatch:
permissions:
contents: read
jobs: jobs:
stale: stale:
permissions: permissions:

View file

@ -3,42 +3,26 @@ name: External Trigger Main
on: on:
workflow_dispatch: workflow_dispatch:
permissions:
contents: read
jobs: jobs:
external-trigger-master: external-trigger-master:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4.1.1 - uses: actions/checkout@v3.1.0
- name: External Trigger - name: External Trigger
if: github.ref == 'refs/heads/master' if: github.ref == 'refs/heads/master'
env:
SKIP_EXTERNAL_TRIGGER: ${{ vars.SKIP_EXTERNAL_TRIGGER }}
run: | run: |
printf "# External trigger for docker-plex\n\n" >> $GITHUB_STEP_SUMMARY if [ -n "${{ secrets.PAUSE_EXTERNAL_TRIGGER_PLEX_MASTER }}" ]; then
if grep -q "^plex_master_" <<< "${SKIP_EXTERNAL_TRIGGER}"; then echo "**** Github secret PAUSE_EXTERNAL_TRIGGER_PLEX_MASTER is set; skipping trigger. ****"
echo "> [!NOTE]" >> $GITHUB_STEP_SUMMARY echo "Github secret \`PAUSE_EXTERNAL_TRIGGER_PLEX_MASTER\` is set; skipping trigger." >> $GITHUB_STEP_SUMMARY
echo "> Github organizational variable \`SKIP_EXTERNAL_TRIGGER\` contains \`plex_master_\`; will skip trigger if version matches." >> $GITHUB_STEP_SUMMARY
elif grep -q "^plex_master" <<< "${SKIP_EXTERNAL_TRIGGER}"; then
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
echo "> Github organizational variable \`SKIP_EXTERNAL_TRIGGER\` contains \`plex_master\`; skipping trigger." >> $GITHUB_STEP_SUMMARY
exit 0 exit 0
fi fi
echo "> [!NOTE]" >> $GITHUB_STEP_SUMMARY echo "**** External trigger running off of master branch. To disable this trigger, set a Github secret named \"PAUSE_EXTERNAL_TRIGGER_PLEX_MASTER\". ****"
echo "> External trigger running off of master branch. To disable this trigger, add \`plex_master\` into the Github organizational variable \`SKIP_EXTERNAL_TRIGGER\`." >> $GITHUB_STEP_SUMMARY echo "External trigger running off of master branch. To disable this trigger, set a Github secret named \`PAUSE_EXTERNAL_TRIGGER_PLEX_MASTER\`" >> $GITHUB_STEP_SUMMARY
printf "\n## Retrieving external version\n\n" >> $GITHUB_STEP_SUMMARY echo "**** Retrieving external version ****"
EXT_RELEASE=$(curl -s "https://plex.tv/api/downloads/5.json" | jq -r '. | .computer.Linux.version') EXT_RELEASE=$(curl -s "https://plex.tv/api/downloads/5.json" | jq -r '. | .computer.Linux.version')
echo "Type is \`custom_json\`" >> $GITHUB_STEP_SUMMARY
if grep -q "^plex_master_${EXT_RELEASE}" <<< "${SKIP_EXTERNAL_TRIGGER}"; then
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
echo "> Github organizational variable \`SKIP_EXTERNAL_TRIGGER\` matches current external release; skipping trigger." >> $GITHUB_STEP_SUMMARY
exit 0
fi
if [ -z "${EXT_RELEASE}" ] || [ "${EXT_RELEASE}" == "null" ]; then if [ -z "${EXT_RELEASE}" ] || [ "${EXT_RELEASE}" == "null" ]; then
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY echo "**** Can't retrieve external version, exiting ****"
echo "> Can't retrieve external version, exiting" >> $GITHUB_STEP_SUMMARY
FAILURE_REASON="Can't retrieve external version for plex branch master" FAILURE_REASON="Can't retrieve external version for plex branch master"
GHA_TRIGGER_URL="https://github.com/linuxserver/docker-plex/actions/runs/${{ github.run_id }}" GHA_TRIGGER_URL="https://github.com/linuxserver/docker-plex/actions/runs/${{ github.run_id }}"
curl -X POST -H "Content-Type: application/json" --data '{"avatar_url": "https://cdn.discordapp.com/avatars/354986384542662657/df91181b3f1cf0ef1592fbe18e0962d7.png","embeds": [{"color": 16711680, curl -X POST -H "Content-Type: application/json" --data '{"avatar_url": "https://cdn.discordapp.com/avatars/354986384542662657/df91181b3f1cf0ef1592fbe18e0962d7.png","embeds": [{"color": 16711680,
@ -46,43 +30,25 @@ jobs:
"username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }} "username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }}
exit 1 exit 1
fi fi
EXT_RELEASE_SANITIZED=$(echo ${EXT_RELEASE} | sed 's/[~,%@+;:/]//g') EXT_RELEASE=$(echo ${EXT_RELEASE} | sed 's/[~,%@+;:/]//g')
echo "Sanitized external version: \`${EXT_RELEASE_SANITIZED}\`" >> $GITHUB_STEP_SUMMARY echo "**** External version: ${EXT_RELEASE} ****"
echo "Retrieving last pushed version" >> $GITHUB_STEP_SUMMARY echo "External version: ${EXT_RELEASE}" >> $GITHUB_STEP_SUMMARY
echo "**** Retrieving last pushed version ****"
image="linuxserver/plex" image="linuxserver/plex"
tag="latest" tag="latest"
token=$(curl -sX GET \ token=$(curl -sX GET \
"https://ghcr.io/token?scope=repository%3Alinuxserver%2Fplex%3Apull" \ "https://ghcr.io/token?scope=repository%3Alinuxserver%2Fplex%3Apull" \
| jq -r '.token') | jq -r '.token')
multidigest=$(curl -s \ multidigest=$(curl -s \
--header "Accept: application/vnd.docker.distribution.manifest.v2+json" \
--header "Accept: application/vnd.oci.image.index.v1+json" \
--header "Authorization: Bearer ${token}" \
"https://ghcr.io/v2/${image}/manifests/${tag}")
if jq -e '.layers // empty' <<< "${multidigest}" >/dev/null 2>&1; then
# If there's a layer element it's a single-arch manifest so just get that digest
digest=$(jq -r '.config.digest' <<< "${multidigest}")
else
# Otherwise it's multi-arch or has manifest annotations
if jq -e '.manifests[]?.annotations // empty' <<< "${multidigest}" >/dev/null 2>&1; then
# Check for manifest annotations and delete if found
multidigest=$(jq 'del(.manifests[] | select(.annotations))' <<< "${multidigest}")
fi
if [[ $(jq '.manifests | length' <<< "${multidigest}") -gt 1 ]]; then
# If there's still more than one digest, it's multi-arch
multidigest=$(jq -r ".manifests[] | select(.platform.architecture == \"amd64\").digest?" <<< "${multidigest}")
else
# Otherwise it's single arch
multidigest=$(jq -r ".manifests[].digest?" <<< "${multidigest}")
fi
if digest=$(curl -s \
--header "Accept: application/vnd.docker.distribution.manifest.v2+json" \ --header "Accept: application/vnd.docker.distribution.manifest.v2+json" \
--header "Accept: application/vnd.oci.image.manifest.v1+json" \
--header "Authorization: Bearer ${token}" \ --header "Authorization: Bearer ${token}" \
"https://ghcr.io/v2/${image}/manifests/${multidigest}"); then "https://ghcr.io/v2/${image}/manifests/${tag}" \
digest=$(jq -r '.config.digest' <<< "${digest}"); | jq -r 'first(.manifests[].digest)')
fi digest=$(curl -s \
fi --header "Accept: application/vnd.docker.distribution.manifest.v2+json" \
--header "Authorization: Bearer ${token}" \
"https://ghcr.io/v2/${image}/manifests/${multidigest}" \
| jq -r '.config.digest')
image_info=$(curl -sL \ image_info=$(curl -sL \
--header "Authorization: Bearer ${token}" \ --header "Authorization: Bearer ${token}" \
"https://ghcr.io/v2/${image}/blobs/${digest}") "https://ghcr.io/v2/${image}/blobs/${digest}")
@ -94,54 +60,45 @@ jobs:
IMAGE_RELEASE=$(echo ${image_info} | jq -r '.Labels.build_version' | awk '{print $3}') IMAGE_RELEASE=$(echo ${image_info} | jq -r '.Labels.build_version' | awk '{print $3}')
IMAGE_VERSION=$(echo ${IMAGE_RELEASE} | awk -F'-ls' '{print $1}') IMAGE_VERSION=$(echo ${IMAGE_RELEASE} | awk -F'-ls' '{print $1}')
if [ -z "${IMAGE_VERSION}" ]; then if [ -z "${IMAGE_VERSION}" ]; then
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY echo "**** Can't retrieve last pushed version, exiting ****"
echo "Can't retrieve last pushed version, exiting" >> $GITHUB_STEP_SUMMARY
FAILURE_REASON="Can't retrieve last pushed version for plex tag latest" FAILURE_REASON="Can't retrieve last pushed version for plex tag latest"
curl -X POST -H "Content-Type: application/json" --data '{"avatar_url": "https://cdn.discordapp.com/avatars/354986384542662657/df91181b3f1cf0ef1592fbe18e0962d7.png","embeds": [{"color": 16711680, curl -X POST -H "Content-Type: application/json" --data '{"avatar_url": "https://cdn.discordapp.com/avatars/354986384542662657/df91181b3f1cf0ef1592fbe18e0962d7.png","embeds": [{"color": 16711680,
"description": "**Trigger Failed** \n**Reason:** '"${FAILURE_REASON}"' \n"}], "description": "**Trigger Failed** \n**Reason:** '"${FAILURE_REASON}"' \n"}],
"username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }} "username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }}
exit 1 exit 1
fi fi
echo "Last pushed version: \`${IMAGE_VERSION}\`" >> $GITHUB_STEP_SUMMARY echo "**** Last pushed version: ${IMAGE_VERSION} ****"
if [ "${EXT_RELEASE_SANITIZED}" == "${IMAGE_VERSION}" ]; then echo "Last pushed version: ${IMAGE_VERSION}" >> $GITHUB_STEP_SUMMARY
echo "Sanitized version \`${EXT_RELEASE_SANITIZED}\` already pushed, exiting" >> $GITHUB_STEP_SUMMARY if [ "${EXT_RELEASE}" == "${IMAGE_VERSION}" ]; then
echo "**** Version ${EXT_RELEASE} already pushed, exiting ****"
echo "Version ${EXT_RELEASE} already pushed, exiting" >> $GITHUB_STEP_SUMMARY
exit 0 exit 0
elif [ $(curl -s https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-plex/job/master/lastBuild/api/json | jq -r '.building') == "true" ]; then elif [ $(curl -s https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-plex/job/master/lastBuild/api/json | jq -r '.building') == "true" ]; then
echo "New version \`${EXT_RELEASE}\` found; but there already seems to be an active build on Jenkins; exiting" >> $GITHUB_STEP_SUMMARY echo "**** New version ${EXT_RELEASE} found; but there already seems to be an active build on Jenkins; exiting ****"
echo "New version ${EXT_RELEASE} found; but there already seems to be an active build on Jenkins; exiting" >> $GITHUB_STEP_SUMMARY
exit 0 exit 0
else else
if [[ "${artifacts_found}" == "false" ]]; then echo "**** New version ${EXT_RELEASE} found; old version was ${IMAGE_VERSION}. Triggering new build ****"
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY echo "New version ${EXT_RELEASE} found; old version was ${IMAGE_VERSION}. Triggering new build" >> $GITHUB_STEP_SUMMARY
echo "> New version detected, but not all artifacts are published yet; skipping trigger" >> $GITHUB_STEP_SUMMARY response=$(curl -iX POST \
FAILURE_REASON="New version ${EXT_RELEASE} for plex tag latest is detected, however not all artifacts are uploaded to upstream release yet. Will try again later." https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-plex/job/master/buildWithParameters?PACKAGE_CHECK=false \
curl -X POST -H "Content-Type: application/json" --data '{"avatar_url": "https://cdn.discordapp.com/avatars/354986384542662657/df91181b3f1cf0ef1592fbe18e0962d7.png","embeds": [{"color": 9802903, --user ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_TOKEN }} | grep -i location | sed "s|^[L|l]ocation: \(.*\)|\1|")
"description": "**Trigger Failed** \n**Reason:** '"${FAILURE_REASON}"' \n"}], echo "**** Jenkins job queue url: ${response%$'\r'} ****"
"username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }} echo "**** Sleeping 10 seconds until job starts ****"
else sleep 10
printf "\n## Trigger new build\n\n" >> $GITHUB_STEP_SUMMARY buildurl=$(curl -s "${response%$'\r'}api/json" | jq -r '.executable.url')
echo "New sanitized version \`${EXT_RELEASE_SANITIZED}\` found; old version was \`${IMAGE_VERSION}\`. Triggering new build" >> $GITHUB_STEP_SUMMARY buildurl="${buildurl%$'\r'}"
if [[ "${artifacts_found}" == "true" ]]; then echo "**** Jenkins job build url: ${buildurl} ****"
echo "All artifacts seem to be uploaded." >> $GITHUB_STEP_SUMMARY echo "Jenkins job build url: ${buildurl}" >> $GITHUB_STEP_SUMMARY
fi echo "**** Attempting to change the Jenkins job description ****"
response=$(curl -iX POST \ curl -iX POST \
https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-plex/job/master/buildWithParameters?PACKAGE_CHECK=false \ "${buildurl}submitDescription" \
--user ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_TOKEN }} | grep -i location | sed "s|^[L|l]ocation: \(.*\)|\1|") --user ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_TOKEN }} \
echo "Jenkins [job queue url](${response%$'\r'})" >> $GITHUB_STEP_SUMMARY --data-urlencode "description=GHA external trigger https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" \
echo "Sleeping 10 seconds until job starts" >> $GITHUB_STEP_SUMMARY --data-urlencode "Submit=Submit"
sleep 10 echo "**** Notifying Discord ****"
buildurl=$(curl -s "${response%$'\r'}api/json" | jq -r '.executable.url') TRIGGER_REASON="A version change was detected for plex tag latest. Old version:${IMAGE_VERSION} New version:${EXT_RELEASE}"
buildurl="${buildurl%$'\r'}" curl -X POST -H "Content-Type: application/json" --data '{"avatar_url": "https://cdn.discordapp.com/avatars/354986384542662657/df91181b3f1cf0ef1592fbe18e0962d7.png","embeds": [{"color": 9802903,
echo "Jenkins job [build url](${buildurl})" >> $GITHUB_STEP_SUMMARY "description": "**Build Triggered** \n**Reason:** '"${TRIGGER_REASON}"' \n**Build URL:** '"${buildurl}display/redirect"' \n"}],
echo "Attempting to change the Jenkins job description" >> $GITHUB_STEP_SUMMARY "username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }}
curl -iX POST \
"${buildurl}submitDescription" \
--user ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_TOKEN }} \
--data-urlencode "description=GHA external trigger https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" \
--data-urlencode "Submit=Submit"
echo "**** Notifying Discord ****"
TRIGGER_REASON="A version change was detected for plex tag latest. Old version:${IMAGE_VERSION} New version:${EXT_RELEASE_SANITIZED}"
curl -X POST -H "Content-Type: application/json" --data '{"avatar_url": "https://cdn.discordapp.com/avatars/354986384542662657/df91181b3f1cf0ef1592fbe18e0962d7.png","embeds": [{"color": 9802903,
"description": "**Build Triggered** \n**Reason:** '"${TRIGGER_REASON}"' \n**Build URL:** '"${buildurl}display/redirect"' \n"}],
"username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }}
fi
fi fi

View file

@ -5,44 +5,41 @@ on:
- cron: '14 * * * *' - cron: '14 * * * *'
workflow_dispatch: workflow_dispatch:
permissions:
contents: read
jobs: jobs:
external-trigger-scheduler: external-trigger-scheduler:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4.1.1 - uses: actions/checkout@v3.1.0
with: with:
fetch-depth: '0' fetch-depth: '0'
- name: External Trigger Scheduler - name: External Trigger Scheduler
run: | run: |
printf "# External trigger scheduler for docker-plex\n\n" >> $GITHUB_STEP_SUMMARY echo "**** Branches found: ****"
printf "Found the branches:\n\n%s\n" "$(git for-each-ref --format='- %(refname:lstrip=3)' refs/remotes)" >> $GITHUB_STEP_SUMMARY git for-each-ref --format='%(refname:short)' refs/remotes
for br in $(git for-each-ref --format='%(refname:lstrip=3)' refs/remotes) for br in $(git for-each-ref --format='%(refname:short)' refs/remotes)
do do
if [[ "${br}" == "HEAD" ]]; then br=$(echo "$br" | sed 's|origin/||g')
printf "\nSkipping %s.\n" ${br} >> $GITHUB_STEP_SUMMARY echo "**** Evaluating branch ${br} ****"
continue
fi
printf "\n## Evaluating \`%s\`\n\n" ${br} >> $GITHUB_STEP_SUMMARY
ls_jenkins_vars=$(curl -sX GET https://raw.githubusercontent.com/linuxserver/docker-plex/${br}/jenkins-vars.yml) ls_jenkins_vars=$(curl -sX GET https://raw.githubusercontent.com/linuxserver/docker-plex/${br}/jenkins-vars.yml)
ls_branch=$(echo "${ls_jenkins_vars}" | yq -r '.ls_branch') ls_branch=$(echo "${ls_jenkins_vars}" | yq -r '.ls_branch')
ls_trigger=$(echo "${ls_jenkins_vars}" | yq -r '.external_type') ls_trigger=$(echo "${ls_jenkins_vars}" | yq -r '.external_type')
if [[ "${br}" == "${ls_branch}" ]] && [[ "${ls_trigger}" != "os" ]]; then if [[ "${br}" == "${ls_branch}" ]] && [[ "${ls_trigger}" != "os" ]]; then
echo "Branch appears to be live and trigger is not os; checking workflow." >> $GITHUB_STEP_SUMMARY echo "**** Branch ${br} appears to be live and trigger is not os; checking workflow. ****"
if curl -sfX GET https://raw.githubusercontent.com/linuxserver/docker-plex/${br}/.github/workflows/external_trigger.yml > /dev/null 2>&1; then if curl -sfX GET https://raw.githubusercontent.com/linuxserver/docker-plex/${br}/.github/workflows/external_trigger.yml > /dev/null 2>&1; then
echo "Triggering external trigger workflow for branch." >> $GITHUB_STEP_SUMMARY echo "**** Workflow exists. Triggering external trigger workflow for branch ${br} ****."
echo "Triggering external trigger workflow for branch ${br}" >> $GITHUB_STEP_SUMMARY
curl -iX POST \ curl -iX POST \
-H "Authorization: token ${{ secrets.CR_PAT }}" \ -H "Authorization: token ${{ secrets.CR_PAT }}" \
-H "Accept: application/vnd.github.v3+json" \ -H "Accept: application/vnd.github.v3+json" \
-d "{\"ref\":\"refs/heads/${br}\"}" \ -d "{\"ref\":\"refs/heads/${br}\"}" \
https://api.github.com/repos/linuxserver/docker-plex/actions/workflows/external_trigger.yml/dispatches https://api.github.com/repos/linuxserver/docker-plex/actions/workflows/external_trigger.yml/dispatches
else else
echo "Skipping branch due to no external trigger workflow present." >> $GITHUB_STEP_SUMMARY echo "**** Workflow doesn't exist; skipping trigger. ****"
echo "Skipping branch ${br} due to no external trigger workflow present." >> $GITHUB_STEP_SUMMARY
fi fi
else else
echo "Skipping branch due to being detected as dev branch or having no external version." >> $GITHUB_STEP_SUMMARY echo "**** ${br} is either a dev branch, or has no external version; skipping trigger. ****"
echo "Skipping branch ${br} due to being detected as dev branch or having no external version." >> $GITHUB_STEP_SUMMARY
fi fi
done done

View file

@ -2,14 +2,8 @@ name: Greetings
on: [pull_request_target, issues] on: [pull_request_target, issues]
permissions:
contents: read
jobs: jobs:
greeting: greeting:
permissions:
issues: write
pull-requests: write
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/first-interaction@v1 - uses: actions/first-interaction@v1

42
.github/workflows/package_trigger.yml vendored Normal file
View file

@ -0,0 +1,42 @@
name: Package Trigger Main
on:
workflow_dispatch:
jobs:
package-trigger-master:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3.1.0
- name: Package Trigger
if: github.ref == 'refs/heads/master'
run: |
if [ -n "${{ secrets.PAUSE_PACKAGE_TRIGGER_PLEX_MASTER }}" ]; then
echo "**** Github secret PAUSE_PACKAGE_TRIGGER_PLEX_MASTER is set; skipping trigger. ****"
echo "Github secret \`PAUSE_PACKAGE_TRIGGER_PLEX_MASTER\` is set; skipping trigger." >> $GITHUB_STEP_SUMMARY
exit 0
fi
if [ $(curl -s https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-plex/job/master/lastBuild/api/json | jq -r '.building') == "true" ]; then
echo "**** There already seems to be an active build on Jenkins; skipping package trigger ****"
echo "There already seems to be an active build on Jenkins; skipping package trigger" >> $GITHUB_STEP_SUMMARY
exit 0
fi
echo "**** Package trigger running off of master branch. To disable, set a Github secret named \"PAUSE_PACKAGE_TRIGGER_PLEX_MASTER\". ****"
echo "Package trigger running off of master branch. To disable, set a Github secret named \`PAUSE_PACKAGE_TRIGGER_PLEX_MASTER\`" >> $GITHUB_STEP_SUMMARY
response=$(curl -iX POST \
https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-plex/job/master/buildWithParameters?PACKAGE_CHECK=true \
--user ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_TOKEN }} | grep -i location | sed "s|^[L|l]ocation: \(.*\)|\1|")
echo "**** Jenkins job queue url: ${response%$'\r'} ****"
echo "**** Sleeping 10 seconds until job starts ****"
sleep 10
buildurl=$(curl -s "${response%$'\r'}api/json" | jq -r '.executable.url')
buildurl="${buildurl%$'\r'}"
echo "**** Jenkins job build url: ${buildurl} ****"
echo "Jenkins job build url: ${buildurl}" >> $GITHUB_STEP_SUMMARY
echo "**** Attempting to change the Jenkins job description ****"
curl -iX POST \
"${buildurl}submitDescription" \
--user ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_TOKEN }} \
--data-urlencode "description=GHA package trigger https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" \
--data-urlencode "Submit=Submit"

View file

@ -5,99 +5,46 @@ on:
- cron: '0 9 * * 1' - cron: '0 9 * * 1'
workflow_dispatch: workflow_dispatch:
permissions:
contents: read
jobs: jobs:
package-trigger-scheduler: package-trigger-scheduler:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4.1.1 - uses: actions/checkout@v3.1.0
with: with:
fetch-depth: '0' fetch-depth: '0'
- name: Package Trigger Scheduler - name: Package Trigger Scheduler
env:
SKIP_PACKAGE_TRIGGER: ${{ vars.SKIP_PACKAGE_TRIGGER }}
run: | run: |
printf "# Package trigger scheduler for docker-plex\n\n" >> $GITHUB_STEP_SUMMARY echo "**** Branches found: ****"
printf "Found the branches:\n\n%s\n" "$(git for-each-ref --format='- %(refname:lstrip=3)' refs/remotes)" >> $GITHUB_STEP_SUMMARY git for-each-ref --format='%(refname:short)' refs/remotes
for br in $(git for-each-ref --format='%(refname:lstrip=3)' refs/remotes) for br in $(git for-each-ref --format='%(refname:short)' refs/remotes)
do do
if [[ "${br}" == "HEAD" ]]; then br=$(echo "$br" | sed 's|origin/||g')
printf "\nSkipping %s.\n" ${br} >> $GITHUB_STEP_SUMMARY echo "**** Evaluating branch ${br} ****"
continue ls_branch=$(curl -sX GET https://raw.githubusercontent.com/linuxserver/docker-plex/${br}/jenkins-vars.yml | yq -r '.ls_branch')
fi if [ "${br}" == "${ls_branch}" ]; then
printf "\n## Evaluating \`%s\`\n\n" ${br} >> $GITHUB_STEP_SUMMARY echo "**** Branch ${br} appears to be live; checking workflow. ****"
JENKINS_VARS=$(curl -sX GET https://raw.githubusercontent.com/linuxserver/docker-plex/${br}/jenkins-vars.yml) if curl -sfX GET https://raw.githubusercontent.com/linuxserver/docker-plex/${br}/.github/workflows/package_trigger.yml > /dev/null 2>&1; then
if ! curl -sfX GET https://raw.githubusercontent.com/linuxserver/docker-plex/${br}/Jenkinsfile >/dev/null 2>&1; then echo "**** Workflow exists. Triggering package trigger workflow for branch ${br}. ****"
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY echo "Triggering package trigger workflow for branch ${br}" >> $GITHUB_STEP_SUMMARY
echo "> No Jenkinsfile found. Branch is either deprecated or is an early dev branch." >> $GITHUB_STEP_SUMMARY
skipped_branches="${skipped_branches}${br} "
elif [[ "${br}" == $(yq -r '.ls_branch' <<< "${JENKINS_VARS}") ]]; then
echo "Branch appears to be live; checking workflow." >> $GITHUB_STEP_SUMMARY
README_VARS=$(curl -sX GET https://raw.githubusercontent.com/linuxserver/docker-plex/${br}/readme-vars.yml)
if [[ $(yq -r '.project_deprecation_status' <<< "${README_VARS}") == "true" ]]; then
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
echo "> Branch appears to be deprecated; skipping trigger." >> $GITHUB_STEP_SUMMARY
skipped_branches="${skipped_branches}${br} "
elif [[ $(yq -r '.skip_package_check' <<< "${JENKINS_VARS}") == "true" ]]; then
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
echo "> Skipping branch ${br} due to \`skip_package_check\` being set in \`jenkins-vars.yml\`." >> $GITHUB_STEP_SUMMARY
skipped_branches="${skipped_branches}${br} "
elif grep -q "^plex_${br}" <<< "${SKIP_PACKAGE_TRIGGER}"; then
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
echo "> Github organizational variable \`SKIP_PACKAGE_TRIGGER\` contains \`plex_${br}\`; skipping trigger." >> $GITHUB_STEP_SUMMARY
skipped_branches="${skipped_branches}${br} "
elif [ $(curl -s https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-plex/job/${br}/lastBuild/api/json | jq -r '.building' 2>/dev/null) == "true" ]; then
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
echo "> There already seems to be an active build on Jenkins; skipping package trigger for ${br}" >> $GITHUB_STEP_SUMMARY
skipped_branches="${skipped_branches}${br} "
else
echo "> [!NOTE]" >> $GITHUB_STEP_SUMMARY
echo "> Triggering package trigger for branch ${br}" >> $GITHUB_STEP_SUMMARY
printf "> To disable, add \`plex_%s\` into the Github organizational variable \`SKIP_PACKAGE_TRIGGER\`.\n\n" "${br}" >> $GITHUB_STEP_SUMMARY
triggered_branches="${triggered_branches}${br} " triggered_branches="${triggered_branches}${br} "
response=$(curl -iX POST \ curl -iX POST \
https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-plex/job/${br}/buildWithParameters?PACKAGE_CHECK=true \ -H "Authorization: token ${{ secrets.CR_PAT }}" \
--user ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_TOKEN }} | grep -i location | sed "s|^[L|l]ocation: \(.*\)|\1|") -H "Accept: application/vnd.github.v3+json" \
if [[ -z "${response}" ]]; then -d "{\"ref\":\"refs/heads/${br}\"}" \
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY https://api.github.com/repos/linuxserver/docker-plex/actions/workflows/package_trigger.yml/dispatches
echo "> Jenkins build could not be triggered. Skipping branch." sleep 30
continue else
fi echo "**** Workflow doesn't exist; skipping trigger. ****"
echo "Jenkins [job queue url](${response%$'\r'})" >> $GITHUB_STEP_SUMMARY echo "Skipping branch ${br} due to no package trigger workflow present." >> $GITHUB_STEP_SUMMARY
echo "Sleeping 10 seconds until job starts" >> $GITHUB_STEP_SUMMARY
sleep 10
buildurl=$(curl -s "${response%$'\r'}api/json" | jq -r '.executable.url')
buildurl="${buildurl%$'\r'}"
echo "Jenkins job [build url](${buildurl})" >> $GITHUB_STEP_SUMMARY
echo "Attempting to change the Jenkins job description" >> $GITHUB_STEP_SUMMARY
if ! curl -ifX POST \
"${buildurl}submitDescription" \
--user ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_TOKEN }} \
--data-urlencode "description=GHA package trigger https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" \
--data-urlencode "Submit=Submit"; then
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
echo "> Unable to change the Jenkins job description."
fi
sleep 20
fi fi
else else
echo "**** ${br} appears to be a dev branch; skipping trigger. ****"
echo "Skipping branch ${br} due to being detected as dev branch." >> $GITHUB_STEP_SUMMARY echo "Skipping branch ${br} due to being detected as dev branch." >> $GITHUB_STEP_SUMMARY
fi fi
done done
if [[ -n "${triggered_branches}" ]] || [[ -n "${skipped_branches}" ]]; then echo "**** Package check build(s) triggered for branch(es): ${triggered_branches} ****"
if [[ -n "${triggered_branches}" ]]; then echo "**** Notifying Discord ****"
NOTIFY_BRANCHES="**Triggered:** ${triggered_branches} \n" curl -X POST -H "Content-Type: application/json" --data '{"avatar_url": "https://cdn.discordapp.com/avatars/354986384542662657/df91181b3f1cf0ef1592fbe18e0962d7.png","embeds": [{"color": 9802903,
NOTIFY_BUILD_URL="**Build URL:** https://ci.linuxserver.io/blue/organizations/jenkins/Docker-Pipeline-Builders%2Fdocker-plex/activity/ \n" "description": "**Package Check Build(s) Triggered for plex** \n**Branch(es):** '"${triggered_branches}"' \n**Build URL:** '"https://ci.linuxserver.io/blue/organizations/jenkins/Docker-Pipeline-Builders%2Fdocker-plex/activity/"' \n"}],
echo "**** Package check build(s) triggered for branch(es): ${triggered_branches} ****" "username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }}
fi
if [[ -n "${skipped_branches}" ]]; then
NOTIFY_BRANCHES="${NOTIFY_BRANCHES}**Skipped:** ${skipped_branches} \n"
fi
echo "**** Notifying Discord ****"
curl -X POST -H "Content-Type: application/json" --data '{"avatar_url": "https://cdn.discordapp.com/avatars/354986384542662657/df91181b3f1cf0ef1592fbe18e0962d7.png","embeds": [{"color": 9802903,
"description": "**Package Check Build(s) for plex** \n'"${NOTIFY_BRANCHES}"''"${NOTIFY_BUILD_URL}"'"}],
"username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }}
fi

View file

@ -5,8 +5,6 @@ on:
- '**/run' - '**/run'
- '**/finish' - '**/finish'
- '**/check' - '**/check'
- 'root/migrations/*'
jobs: jobs:
permission_check: permission_check:
uses: linuxserver/github-workflows/.github/workflows/init-svc-executable-permissions.yml@v1 uses: linuxserver/github-workflows/.github/workflows/init-svc-executable-permissions.yml@v1

2
.gitignore vendored
View file

@ -1,5 +1,3 @@
# Wireguard configs, you never know
wg*.conf
# Windows image file caches # Windows image file caches
Thumbs.db Thumbs.db
ehthumbs.db ehthumbs.db

View file

@ -1,8 +1,8 @@
# syntax=docker/dockerfile:1 # syntax=docker/dockerfile:1
FROM ghcr.io/linuxserver/unrar:latest AS unrar FROM ghcr.io/linuxserver/unrar:latest as unrar
FROM ghcr.io/linuxserver/baseimage-ubuntu:noble FROM ghcr.io/linuxserver/baseimage-ubuntu:jammy
# set version label # set version label
ARG BUILD_DATE ARG BUILD_DATE
@ -12,7 +12,7 @@ LABEL build_version="Linuxserver.io version:- ${VERSION} Build-date:- ${BUILD_DA
LABEL maintainer="thelamer" LABEL maintainer="thelamer"
#Add needed nvidia environment variables for https://github.com/NVIDIA/nvidia-docker #Add needed nvidia environment variables for https://github.com/NVIDIA/nvidia-docker
ENV NVIDIA_DRIVER_CAPABILITIES="compute,video,utility,graphics" ENV NVIDIA_DRIVER_CAPABILITIES="compute,video,utility"
# global environment settings # global environment settings
ENV DEBIAN_FRONTEND="noninteractive" \ ENV DEBIAN_FRONTEND="noninteractive" \
@ -23,22 +23,19 @@ ENV DEBIAN_FRONTEND="noninteractive" \
PLEX_MEDIA_SERVER_MAX_PLUGIN_PROCS="6" \ PLEX_MEDIA_SERVER_MAX_PLUGIN_PROCS="6" \
PLEX_MEDIA_SERVER_USER="abc" \ PLEX_MEDIA_SERVER_USER="abc" \
PLEX_MEDIA_SERVER_INFO_VENDOR="Docker" \ PLEX_MEDIA_SERVER_INFO_VENDOR="Docker" \
PLEX_MEDIA_SERVER_INFO_DEVICE="Docker Container (LinuxServer.io)" \ PLEX_MEDIA_SERVER_INFO_DEVICE="Docker Container (LinuxServer.io)"
TMPDIR=/run/plex-temp \
ATTACHED_DEVICES_PERMS="/dev/dri /dev/dvb -type c"
RUN \ RUN \
echo "**** install runtime packages & wireguard ****" && \ echo "**** install runtime packages ****" && \
apt-get update && \ apt-get update && \
apt-get install -y \ apt-get install -y \
jq \
udev \ udev \
wget \ wget && \
iproute2 \
wireguard-tools &&\
echo "**** install plex ****" && \ echo "**** install plex ****" && \
if [ -z ${PLEX_RELEASE+x} ]; then \ if [ -z ${PLEX_RELEASE+x} ]; then \
PLEX_RELEASE=$(curl -sX GET 'https://plex.tv/api/downloads/5.json' \ PLEX_RELEASE=$(curl -sX GET 'https://plex.tv/api/downloads/5.json' \
| jq -r '.computer.Linux.version'); \ | jq -r '.computer.Linux.version'); \
fi && \ fi && \
curl -o \ curl -o \
/tmp/plexmediaserver.deb -L \ /tmp/plexmediaserver.deb -L \
@ -46,7 +43,6 @@ RUN \
dpkg -i /tmp/plexmediaserver.deb && \ dpkg -i /tmp/plexmediaserver.deb && \
echo "**** ensure abc user's home folder is /app ****" && \ echo "**** ensure abc user's home folder is /app ****" && \
usermod -d /app abc && \ usermod -d /app abc && \
printf "Linuxserver.io version: ${VERSION}\nBuild-date: ${BUILD_DATE}" > /build_version && \
echo "**** cleanup ****" && \ echo "**** cleanup ****" && \
apt-get clean && \ apt-get clean && \
rm -rf \ rm -rf \
@ -58,7 +54,6 @@ RUN \
# add local files # add local files
COPY root/ / COPY root/ /
# add unrar # add unrar
COPY --from=unrar /usr/bin/unrar-ubuntu /usr/bin/unrar COPY --from=unrar /usr/bin/unrar-ubuntu /usr/bin/unrar

View file

@ -1,8 +1,8 @@
# syntax=docker/dockerfile:1 # syntax=docker/dockerfile:1
FROM ghcr.io/linuxserver/unrar:arm64v8-latest AS unrar FROM ghcr.io/linuxserver/unrar:arm64v8-latest as unrar
FROM ghcr.io/linuxserver/baseimage-ubuntu:arm64v8-noble FROM ghcr.io/linuxserver/baseimage-ubuntu:arm64v8-jammy
# set version label # set version label
ARG BUILD_DATE ARG BUILD_DATE
@ -20,20 +20,20 @@ ENV DEBIAN_FRONTEND="noninteractive" \
PLEX_MEDIA_SERVER_MAX_PLUGIN_PROCS="6" \ PLEX_MEDIA_SERVER_MAX_PLUGIN_PROCS="6" \
PLEX_MEDIA_SERVER_USER="abc" \ PLEX_MEDIA_SERVER_USER="abc" \
PLEX_MEDIA_SERVER_INFO_VENDOR="Docker" \ PLEX_MEDIA_SERVER_INFO_VENDOR="Docker" \
PLEX_MEDIA_SERVER_INFO_DEVICE="Docker Container (LinuxServer.io)" \ PLEX_MEDIA_SERVER_INFO_DEVICE="Docker Container (LinuxServer.io)"
TMPDIR=/run/plex-temp \
ATTACHED_DEVICES_PERMS="/dev/dri /dev/dvb -type c"
RUN \ RUN \
echo "**** install runtime packages ****" && \ echo "**** install runtime packages ****" && \
apt-get update && \ apt-get update && \
apt-get install -y \ apt-get install -y \
jq \
udev \ udev \
unrar \
wget && \ wget && \
echo "**** install plex ****" && \ echo "**** install plex ****" && \
if [ -z ${PLEX_RELEASE+x} ]; then \ if [ -z ${PLEX_RELEASE+x} ]; then \
PLEX_RELEASE=$(curl -sX GET 'https://plex.tv/api/downloads/5.json' \ PLEX_RELEASE=$(curl -sX GET 'https://plex.tv/api/downloads/5.json' \
| jq -r '.computer.Linux.version'); \ | jq -r '.computer.Linux.version'); \
fi && \ fi && \
curl -o \ curl -o \
/tmp/plexmediaserver.deb -L \ /tmp/plexmediaserver.deb -L \
@ -41,7 +41,6 @@ RUN \
dpkg -i /tmp/plexmediaserver.deb && \ dpkg -i /tmp/plexmediaserver.deb && \
echo "**** ensure abc user's home folder is /app ****" && \ echo "**** ensure abc user's home folder is /app ****" && \
usermod -d /app abc && \ usermod -d /app abc && \
printf "Linuxserver.io version: ${VERSION}\nBuild-date: ${BUILD_DATE}" > /build_version && \
echo "**** cleanup ****" && \ echo "**** cleanup ****" && \
apt-get clean && \ apt-get clean && \
rm -rf \ rm -rf \

1019
Jenkinsfile vendored

File diff suppressed because it is too large Load diff

View file

@ -1,24 +1,11 @@
<<<<<<< HEAD
<!-- DO NOT EDIT THIS FILE MANUALLY --> <!-- DO NOT EDIT THIS FILE MANUALLY -->
<!-- Please read https://github.com/linuxserver/docker-plex/blob/master/.github/CONTRIBUTING.md --> <!-- Please read https://github.com/linuxserver/docker-plex/blob/master/.github/CONTRIBUTING.md -->
=======
due to the recent purge of Hosters by plex, this fork adds wireguard functionallity to the plex container as a quick workaround. all traffic gets tunneled.
wireguard onfig file has to be mounted in /etc/wireguard/wg0.conf. e.g.:
```
volumes:
- ./wg0.conf:/etc/wireguard/wg0.conf
```
<!-- DO NOT EDIT THIS FILE MANUALLY -->
<!-- Please read the https://github.com/linuxserver/docker-plex/blob/master/.github/CONTRIBUTING.md -->
>>>>>>> 72bdfaa (Update README.md)
[![linuxserver.io](https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/linuxserver_medium.png)](https://linuxserver.io) [![linuxserver.io](https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/linuxserver_medium.png)](https://linuxserver.io)
[![Blog](https://img.shields.io/static/v1.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=linuxserver.io&message=Blog)](https://blog.linuxserver.io "all the things you can do with our containers including How-To guides, opinions and much more!") [![Blog](https://img.shields.io/static/v1.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=linuxserver.io&message=Blog)](https://blog.linuxserver.io "all the things you can do with our containers including How-To guides, opinions and much more!")
[![Discord](https://img.shields.io/discord/354974912613449730.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=Discord&logo=discord)](https://linuxserver.io/discord "realtime support / chat with the community and the team.") [![Discord](https://img.shields.io/discord/354974912613449730.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=Discord&logo=discord)](https://discord.gg/YWrKVTn "realtime support / chat with the community and the team.")
[![Discourse](https://img.shields.io/discourse/https/discourse.linuxserver.io/topics.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&logo=discourse)](https://discourse.linuxserver.io "post on our community forum.") [![Discourse](https://img.shields.io/discourse/https/discourse.linuxserver.io/topics.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&logo=discourse)](https://discourse.linuxserver.io "post on our community forum.")
[![Fleet](https://img.shields.io/static/v1.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=linuxserver.io&message=Fleet)](https://fleet.linuxserver.io "an online web interface which displays all of our maintained images.")
[![GitHub](https://img.shields.io/static/v1.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=linuxserver.io&message=GitHub&logo=github)](https://github.com/linuxserver "view the source for all of our repositories.") [![GitHub](https://img.shields.io/static/v1.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=linuxserver.io&message=GitHub&logo=github)](https://github.com/linuxserver "view the source for all of our repositories.")
[![Open Collective](https://img.shields.io/opencollective/all/linuxserver.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=Supporters&logo=open%20collective)](https://opencollective.com/linuxserver "please consider helping us by either donating or contributing to our budget") [![Open Collective](https://img.shields.io/opencollective/all/linuxserver.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=Supporters&logo=open%20collective)](https://opencollective.com/linuxserver "please consider helping us by either donating or contributing to our budget")
@ -33,14 +20,15 @@ The [LinuxServer.io](https://linuxserver.io) team brings you another container r
Find us at: Find us at:
* [Blog](https://blog.linuxserver.io) - all the things you can do with our containers including How-To guides, opinions and much more! * [Blog](https://blog.linuxserver.io) - all the things you can do with our containers including How-To guides, opinions and much more!
* [Discord](https://linuxserver.io/discord) - realtime support / chat with the community and the team. * [Discord](https://discord.gg/YWrKVTn) - realtime support / chat with the community and the team.
* [Discourse](https://discourse.linuxserver.io) - post on our community forum. * [Discourse](https://discourse.linuxserver.io) - post on our community forum.
* [Fleet](https://fleet.linuxserver.io) - an online web interface which displays all of our maintained images.
* [GitHub](https://github.com/linuxserver) - view the source for all of our repositories. * [GitHub](https://github.com/linuxserver) - view the source for all of our repositories.
* [Open Collective](https://opencollective.com/linuxserver) - please consider helping us by either donating or contributing to our budget * [Open Collective](https://opencollective.com/linuxserver) - please consider helping us by either donating or contributing to our budget
# [linuxserver/plex](https://github.com/linuxserver/docker-plex) # [linuxserver/plex](https://github.com/linuxserver/docker-plex)
[![Scarf.io pulls](https://scarf.sh/installs-badge/linuxserver-ci/linuxserver%2Fplex?color=94398d&label-color=555555&logo-color=ffffff&style=for-the-badge&package-type=docker)](https://scarf.sh) [![Scarf.io pulls](https://scarf.sh/installs-badge/linuxserver-ci/linuxserver%2Fplex?color=94398d&label-color=555555&logo-color=ffffff&style=for-the-badge&package-type=docker)](https://scarf.sh/gateway/linuxserver-ci/docker/linuxserver%2Fplex)
[![GitHub Stars](https://img.shields.io/github/stars/linuxserver/docker-plex.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&logo=github)](https://github.com/linuxserver/docker-plex) [![GitHub Stars](https://img.shields.io/github/stars/linuxserver/docker-plex.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&logo=github)](https://github.com/linuxserver/docker-plex)
[![GitHub Release](https://img.shields.io/github/release/linuxserver/docker-plex.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&logo=github)](https://github.com/linuxserver/docker-plex/releases) [![GitHub Release](https://img.shields.io/github/release/linuxserver/docker-plex.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&logo=github)](https://github.com/linuxserver/docker-plex/releases)
[![GitHub Package Repository](https://img.shields.io/static/v1.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=linuxserver.io&message=GitHub%20Package&logo=github)](https://github.com/linuxserver/docker-plex/packages) [![GitHub Package Repository](https://img.shields.io/static/v1.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=linuxserver.io&message=GitHub%20Package&logo=github)](https://github.com/linuxserver/docker-plex/packages)
@ -53,7 +41,7 @@ Find us at:
[Plex](https://plex.tv) organizes video, music and photos from personal media libraries and streams them to smart TVs, streaming boxes and mobile devices. This container is packaged as a standalone Plex Media Server. Straightforward design and bulk actions mean getting things done faster. [Plex](https://plex.tv) organizes video, music and photos from personal media libraries and streams them to smart TVs, streaming boxes and mobile devices. This container is packaged as a standalone Plex Media Server. Straightforward design and bulk actions mean getting things done faster.
[![plex](https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/plex-logo.png)](https://plex.tv) [![plex](http://the-gadgeteer.com/wp-content/uploads/2015/10/plex-logo-e1446990678679.png)](https://plex.tv)
## Supported Architectures ## Supported Architectures
@ -67,77 +55,49 @@ The architectures supported by this image are:
| :----: | :----: | ---- | | :----: | :----: | ---- |
| x86-64 | ✅ | amd64-\<version tag\> | | x86-64 | ✅ | amd64-\<version tag\> |
| arm64 | ✅ | arm64v8-\<version tag\> | | arm64 | ✅ | arm64v8-\<version tag\> |
| armhf | ❌ | |
## Application Setup ## Application Setup
Webui can be found at `<your-ip>:32400/web` Webui can be found at `<your-ip>:32400/web`
>[!NOTE] ** Note about updates, if there is no value set for the VERSION variable, then no updates will take place.**
>If there is no value set for the VERSION variable, then no updates will take place.
>[!NOTE] ** For new users, no updates will take place on the first run of the container as there is no preferences file to read your token from, to update restart the Docker container after logging in through the webui**
>For new users, no updates will take place on the first run of the container as there is no preferences file to read your token from, to update restart the Docker container after logging in through the webui.
Valid settings for VERSION are:- Valid settings for VERSION are:-
>[!NOTE] `IMPORTANT NOTE:- YOU CANNOT UPDATE TO A PLEXPASS ONLY (BETA) VERSION IF YOU ARE NOT LOGGED IN WITH A PLEXPASS ACCOUNT`
>YOU CANNOT UPDATE TO A PLEXPASS ONLY (BETA) VERSION IF YOU ARE NOT LOGGED IN WITH A PLEXPASS ACCOUNT.
+ **`docker`**: Let Docker handle the Plex Version, we keep our Dockerhub Endpoint up to date with the latest public builds. This is the same as leaving this setting out of your create command. + **`docker`**: Let Docker handle the Plex Version, we keep our Dockerhub Endpoint up to date with the latest public builds. This is the same as leaving this setting out of your create command.
+ **`latest`**: will update plex to the latest version available that you are entitled to. + **`latest`**: will update plex to the latest version available that you are entitled to.
+ **`public`**: will update plexpass users to the latest public version, useful for plexpass users that don't want to be on the bleeding edge but still want the latest public updates. + **`public`**: will update plexpass users to the latest public version, useful for plexpass users that don't want to be on the bleeding edge but still want the latest public updates.
+ **`<specific-version>`**: will select a specific version (eg 0.9.12.4.1192-9a47d21) of plex to install, note you cannot use this to access plexpass versions if you do not have plexpass. + **`<specific-version>`**: will select a specific version (eg 0.9.12.4.1192-9a47d21) of plex to install, note you cannot use this to access plexpass versions if you do not have plexpass.
### Hardware Acceleration ## Hardware Acceleration
Many desktop applications need access to a GPU to function properly and even some Desktop Environments have compositor effects that will not function without a GPU. However this is not a hard requirement and all base images will function without a video device mounted into the container. ### Intel
#### Intel/ATI/AMD Hardware acceleration users for Intel Quicksync will need to mount their /dev/dri video device inside of the container by passing the following command when running or creating the container:
To leverage hardware acceleration you will need to mount /dev/dri video device inside of the container. ```
```text
--device=/dev/dri:/dev/dri --device=/dev/dri:/dev/dri
``` ```
We will automatically ensure the abc user inside of the container has the proper permissions to access this device. We will automatically ensure the abc user inside of the container has the proper permissions to access this device.
#### Nvidia ### Nvidia
Hardware acceleration users for Nvidia will need to install the container runtime provided by Nvidia on their host, instructions can be found here: Hardware acceleration users for Nvidia will need to install the container runtime provided by Nvidia on their host, instructions can be found here:
https://github.com/NVIDIA/nvidia-container-toolkit
We automatically add the necessary environment variable that will utilise all the features available on a GPU on the host. Once nvidia-container-toolkit is installed on your host you will need to re/create the docker container with the nvidia container runtime `--runtime=nvidia` and add an environment variable `-e NVIDIA_VISIBLE_DEVICES=all` (can also be set to a specific gpu's UUID, this can be discovered by running `nvidia-smi --query-gpu=gpu_name,gpu_uuid --format=csv` ). NVIDIA automatically mounts the GPU and drivers from your host into the container. https://github.com/NVIDIA/nvidia-docker
#### Arm Devices We automatically add the necessary environment variable that will utilise all the features available on a GPU on the host. Once nvidia-docker is installed on your host you will need to re/create the docker container with the nvidia container runtime `--runtime=nvidia` and add an environment variable `-e NVIDIA_VISIBLE_DEVICES=all` (can also be set to a specific gpu's UUID, this can be discovered by running `nvidia-smi --query-gpu=gpu_name,gpu_uuid --format=csv` ). NVIDIA automatically mounts the GPU and drivers from your host into the plex docker.
Best effort is made to install tools to allow mounting in /dev/dri on Arm devices. In most cases if /dev/dri exists on the host it should just work. If running a Raspberry Pi 4 be sure to enable `dtoverlay=vc4-fkms-v3d` in your usercfg.txt.
## Read-Only Operation
This image can be run with a read-only container filesystem. For details please [read the docs](https://docs.linuxserver.io/misc/read-only/).
### Caveats
* Runtime update of Plex (and thus Plexpass builds) is not supported.
* Transcode directory must be mounted to a host path or tmpfs.
## Non-Root Operation
This image can be run with a non-root user. For details please [read the docs](https://docs.linuxserver.io/misc/non-root/).
### Caveats
* Runtime update of Plex (and thus Plexpass builds) is not supported.
* Transcode directory must be mounted to a host path or tmpfs.
## Usage ## Usage
To help you get started creating a container from this image you can either use docker-compose or the docker cli. To help you get started creating a container from this image you can either use docker-compose or the docker cli.
>[!NOTE]
>Unless a parameter is flagged as 'optional', it is *mandatory* and a value must be provided.
### docker-compose (recommended, [click here for more info](https://docs.linuxserver.io/general/docker-compose)) ### docker-compose (recommended, [click here for more info](https://docs.linuxserver.io/general/docker-compose))
```yaml ```yaml
@ -154,7 +114,7 @@ services:
- VERSION=docker - VERSION=docker
- PLEX_CLAIM= #optional - PLEX_CLAIM= #optional
volumes: volumes:
- /path/to/plex/library:/config - /path/to/library:/config
- /path/to/tvseries:/tv - /path/to/tvseries:/tv
- /path/to/movies:/movies - /path/to/movies:/movies
restart: unless-stopped restart: unless-stopped
@ -171,7 +131,7 @@ docker run -d \
-e TZ=Etc/UTC \ -e TZ=Etc/UTC \
-e VERSION=docker \ -e VERSION=docker \
-e PLEX_CLAIM= `#optional` \ -e PLEX_CLAIM= `#optional` \
-v /path/to/plex/library:/config \ -v /path/to/library:/config \
-v /path/to/tvseries:/tv \ -v /path/to/tvseries:/tv \
-v /path/to/movies:/movies \ -v /path/to/movies:/movies \
--restart unless-stopped \ --restart unless-stopped \
@ -193,8 +153,6 @@ Containers are configured using parameters passed at runtime (such as those abov
| `-v /config` | Plex library location. *This can grow very large, 50gb+ is likely for a large collection.* | | `-v /config` | Plex library location. *This can grow very large, 50gb+ is likely for a large collection.* |
| `-v /tv` | Media goes here. Add as many as needed e.g. `/movies`, `/tv`, etc. | | `-v /tv` | Media goes here. Add as many as needed e.g. `/movies`, `/tv`, etc. |
| `-v /movies` | Media goes here. Add as many as needed e.g. `/movies`, `/tv`, etc. | | `-v /movies` | Media goes here. Add as many as needed e.g. `/movies`, `/tv`, etc. |
| `--read-only=true` | Run container with a read-only filesystem. Please [read the docs](https://docs.linuxserver.io/misc/read-only/). |
| `--user=1000:1000` | Run container with a non-root user. Please [read the docs](https://docs.linuxserver.io/misc/non-root/). |
## Environment variables from files (Docker secrets) ## Environment variables from files (Docker secrets)
@ -359,8 +317,7 @@ Below are the instructions for updating containers:
### Image Update Notifications - Diun (Docker Image Update Notifier) ### Image Update Notifications - Diun (Docker Image Update Notifier)
>[!TIP] **tip**: We recommend [Diun](https://crazymax.dev/diun/) for update notifications. Other tools that automatically update containers unattended are not recommended or supported.
>We recommend [Diun](https://crazymax.dev/diun/) for update notifications. Other tools that automatically update containers unattended are not recommended or supported.
## Building locally ## Building locally
@ -375,21 +332,16 @@ docker build \
-t lscr.io/linuxserver/plex:latest . -t lscr.io/linuxserver/plex:latest .
``` ```
The ARM variants can be built on x86_64 hardware and vice versa using `lscr.io/linuxserver/qemu-static` The ARM variants can be built on x86_64 hardware using `multiarch/qemu-user-static`
```bash ```bash
docker run --rm --privileged lscr.io/linuxserver/qemu-static --reset docker run --rm --privileged multiarch/qemu-user-static:register --reset
``` ```
Once registered you can define the dockerfile to use with `-f Dockerfile.aarch64`. Once registered you can define the dockerfile to use with `-f Dockerfile.aarch64`.
## Versions ## Versions
* **15.03.26:** - Allow TMPDIR to be changed to better support read-only containers
* **15.03.26:** - Fix initial claim setup on non-root containers
* **04.11.24:** - Add Nvidia capability needed for h265
* **18.07.24:** - Rebase to Ubuntu Noble.
* **12.02.24:** - Use universal hardware acceleration blurb
* **09.01.24:** - Set ownership on TranscoderTempDirectory when it's been saved in Preferences. * **09.01.24:** - Set ownership on TranscoderTempDirectory when it's been saved in Preferences.
* **16.08.23:** - Install unrar from [linuxserver repo](https://github.com/linuxserver/docker-unrar). * **16.08.23:** - Install unrar from [linuxserver repo](https://github.com/linuxserver/docker-unrar).
* **03.07.23:** - Deprecate armhf. As announced [here](https://www.linuxserver.io/blog/a-farewell-to-arm-hf) * **03.07.23:** - Deprecate armhf. As announced [here](https://www.linuxserver.io/blog/a-farewell-to-arm-hf)

View file

@ -23,6 +23,6 @@ repo_vars:
- CI_PORT='32400' - CI_PORT='32400'
- CI_SSL='false' - CI_SSL='false'
- CI_DELAY='120' - CI_DELAY='120'
- CI_DOCKERENV='' - CI_DOCKERENV='TZ=US/Pacific'
- CI_AUTH='' - CI_AUTH='user:password'
- CI_WEBPATH='/web/index.html' - CI_WEBPATH='/web/index.html'

View file

@ -1,148 +1,151 @@
NAME VERSION TYPE NAME VERSION TYPE
adduser 3.137ubuntu1 deb adduser 3.118ubuntu5 deb
apt 2.8.3 deb apt 2.4.11 deb
apt-utils 2.8.3 deb apt-utils 2.4.11 deb
base-files 13ubuntu10.4 deb base-files 12ubuntu4.3 deb
base-passwd 3.6.3build1 deb base-passwd 3.5.52build1 deb
bash 5.2.21-2ubuntu4 deb bash 5.1-6ubuntu1 deb
bsdutils 1:2.39.3-9ubuntu6.5 deb bash 5.1.16 binary
ca-certificates 20240203 deb bsdutils 1:2.37.2-4ubuntu3 deb
catatonit 0.1.7-1 deb ca-certificates 20230311ubuntu0.22.04.1 deb
coreutils 9.4-3ubuntu6.2 deb coreutils 8.32-4.1ubuntu1 deb
cron 3.0pl1-184ubuntu2 deb cron 3.0pl1-137ubuntu3 deb
cron-daemon-common 3.0pl1-184ubuntu2 deb curl 7.81.0-1ubuntu1.15 deb
curl 8.5.0-2ubuntu10.8 deb dash 0.5.11+git20210903+057cd650a4ed-3build1 deb
dash 0.5.12-6ubuntu5 deb debconf 1.5.79ubuntu1 deb
debconf 1.5.86ubuntu1 deb debianutils 5.5-1ubuntu2 deb
debianutils 5.17build1 deb diffutils 1:3.8-0ubuntu2 deb
diffutils 1:3.10-1build1 deb dirmngr 2.2.27-3ubuntu2.1 deb
dirmngr 2.4.4-2ubuntu17.4 deb dpkg 1.21.1ubuntu2.2 deb
dpkg 1.22.6ubuntu6.5 deb e2fsprogs 1.46.5-2ubuntu1.1 deb
e2fsprogs 1.47.0-2.4~exp1ubuntu4.1 deb findutils 4.8.0-1ubuntu3 deb
findutils 4.9.0-5build1 deb gcc-12-base 12.1.0-2ubuntu1~22.04 deb
gcc-14-base 14.2.0-4ubuntu2~24.04.1 deb gnupg 2.2.27-3ubuntu2.1 deb
gnupg 2.4.4-2ubuntu17.4 deb gnupg-l10n 2.2.27-3ubuntu2.1 deb
gnupg-l10n 2.4.4-2ubuntu17.4 deb gnupg-utils 2.2.27-3ubuntu2.1 deb
gnupg-utils 2.4.4-2ubuntu17.4 deb gpg 2.2.27-3ubuntu2.1 deb
gpg 2.4.4-2ubuntu17.4 deb gpg-agent 2.2.27-3ubuntu2.1 deb
gpg-agent 2.4.4-2ubuntu17.4 deb gpg-wks-client 2.2.27-3ubuntu2.1 deb
gpg-wks-client 2.4.4-2ubuntu17.4 deb gpg-wks-server 2.2.27-3ubuntu2.1 deb
gpgconf 2.4.4-2ubuntu17.4 deb gpgconf 2.2.27-3ubuntu2.1 deb
gpgsm 2.4.4-2ubuntu17.4 deb gpgsm 2.2.27-3ubuntu2.1 deb
gpgv 2.4.4-2ubuntu17.4 deb gpgv 2.2.27-3ubuntu2.1 deb
grep 3.11-4build1 deb grep 3.7-1build1 deb
gzip 1.12-1ubuntu3.1 deb gzip 1.10-4ubuntu4.1 deb
hostname 3.23+nmu2ubuntu2 deb hostname 3.23ubuntu2 deb
init-system-helpers 1.66ubuntu1 deb init-system-helpers 1.62 deb
jq 1.7.1-3ubuntu0.24.04.2 deb jq 1.6-2.1ubuntu3 deb
keyboxd 2.4.4-2ubuntu17.4 deb libacl1 2.3.1-1 deb
krb5-locales 1.20.1-6ubuntu2.6 deb libapt-pkg6.0 2.4.11 deb
libacl1 2.3.2-1build1.1 deb libassuan0 2.5.5-1build1 deb
libapt-pkg6.0t64 2.8.3 deb libattr1 1:2.5.1-1build1 deb
libassuan0 2.5.6-1build1 deb libaudit-common 1:3.0.7-1build1 deb
libattr1 1:2.5.2-1build1.1 deb libaudit1 1:3.0.7-1build1 deb
libaudit-common 1:3.1.2-2.1build1.1 deb libblkid1 2.37.2-4ubuntu3 deb
libaudit1 1:3.1.2-2.1build1.1 deb libbrotli1 1.0.9-2build6 deb
libblkid1 2.39.3-9ubuntu6.5 deb libbsd0 0.11.5-1 deb
libbrotli1 1.1.0-2build2 deb libbz2-1.0 1.0.8-5build1 deb
libbsd0 0.12.1-1build1.1 deb libc-bin 2.35-0ubuntu3.1 deb
libbz2-1.0 1.0.8-5.1build0.1 deb libc6 2.35-0ubuntu3.1 deb
libc-bin 2.39-0ubuntu8.7 deb libcap-ng0 0.7.9-2.2build3 deb
libc6 2.39-0ubuntu8.7 deb libcap2 1:2.44-1ubuntu0.22.04.1 deb
libcap-ng0 0.8.4-2build2 deb libcom-err2 1.46.5-2ubuntu1.1 deb
libcap2 1:2.66-5ubuntu2.4 deb libcrypt1 1:4.4.27-1 deb
libcom-err2 1.47.0-2.4~exp1ubuntu4.1 deb libcurl4 7.81.0-1ubuntu1.15 deb
libcrypt1 1:4.4.36-4build1 deb libdb5.3 5.3.28+dfsg1-0.8ubuntu3 deb
libcurl4t64 8.5.0-2ubuntu10.8 deb libdebconfclient0 0.261ubuntu1 deb
libdb5.3t64 5.3.28+dfsg2-7 deb libext2fs2 1.46.5-2ubuntu1.1 deb
libdebconfclient0 0.271ubuntu3 deb libffi8 3.4.2-4 deb
libext2fs2t64 1.47.0-2.4~exp1ubuntu4.1 deb libgcc-s1 12.1.0-2ubuntu1~22.04 deb
libffi8 3.4.6-1build1 deb libgcrypt20 1.9.4-3ubuntu3 deb
libgcc-s1 14.2.0-4ubuntu2~24.04.1 deb libgmp10 2:6.2.1+dfsg-3ubuntu1 deb
libgcrypt20 1.10.3-2build1 deb libgnutls30 3.7.3-4ubuntu1.2 deb
libgmp10 2:6.3.0+dfsg-2ubuntu6.1 deb libgpg-error0 1.43-3 deb
libgnutls30t64 3.8.3-1.1ubuntu3.5 deb libgssapi-krb5-2 1.19.2-2ubuntu0.2 deb
libgpg-error0 1.47-3build2.1 deb libhogweed6 3.7.3-1build2 deb
libgssapi-krb5-2 1.20.1-6ubuntu2.6 deb libidn2-0 2.3.2-2build1 deb
libhogweed6t64 3.9.1-2.2build1.1 deb libjq1 1.6-2.1ubuntu3 deb
libidn2-0 2.3.7-2build1.1 deb libk5crypto3 1.19.2-2ubuntu0.2 deb
libjq1 1.7.1-3ubuntu0.24.04.2 deb libkeyutils1 1.6.1-2ubuntu3 deb
libk5crypto3 1.20.1-6ubuntu2.6 deb libkmod2 29-1ubuntu1 deb
libkeyutils1 1.6.3-3build1 deb libkrb5-3 1.19.2-2ubuntu0.2 deb
libkmod2 31+20240202-2ubuntu7.2 deb libkrb5support0 1.19.2-2ubuntu0.2 deb
libkrb5-3 1.20.1-6ubuntu2.6 deb libksba8 1.6.0-2ubuntu0.2 deb
libkrb5support0 1.20.1-6ubuntu2.6 deb libldap-2.5-0 2.5.16+dfsg-0ubuntu0.22.04.1 deb
libksba8 1.6.6-1build1 deb libldap-common 2.5.16+dfsg-0ubuntu0.22.04.1 deb
libldap-common 2.6.10+dfsg-0ubuntu0.24.04.1 deb liblz4-1 1.9.3-2build2 deb
libldap2 2.6.10+dfsg-0ubuntu0.24.04.1 deb liblzma5 5.2.5-2ubuntu1 deb
liblz4-1 1.9.4-1build1.1 deb libmd0 1.0.4-1build1 deb
liblzma5 5.6.1+really5.4.5-1ubuntu0.2 deb libmount1 2.37.2-4ubuntu3 deb
libmd0 1.1.0-2build1.1 deb libncurses6 6.3-2ubuntu0.1 deb
libmount1 2.39.3-9ubuntu6.5 deb libncursesw6 6.3-2ubuntu0.1 deb
libncursesw6 6.4+20240113-1ubuntu2 deb libnettle8 3.7.3-1build2 deb
libnettle8t64 3.9.1-2.2build1.1 deb libnghttp2-14 1.43.0-1ubuntu0.1 deb
libnghttp2-14 1.59.0-1ubuntu0.2 deb libnpth0 1.6-3build2 deb
libnpth0t64 1.6-3.1build1 deb libnsl2 1.3.0-2build2 deb
libonig5 6.9.9-1build1 deb libonig5 6.9.7.1-2build1 deb
libp11-kit0 0.25.3-4ubuntu2.1 deb libp11-kit0 0.24.0-6build1 deb
libpam-modules 1.5.3-5ubuntu5.5 deb libpam-modules 1.4.0-11ubuntu2.3 deb
libpam-modules-bin 1.5.3-5ubuntu5.5 deb libpam-modules-bin 1.4.0-11ubuntu2.3 deb
libpam-runtime 1.5.3-5ubuntu5.5 deb libpam-runtime 1.4.0-11ubuntu2.3 deb
libpam0g 1.5.3-5ubuntu5.5 deb libpam0g 1.4.0-11ubuntu2.3 deb
libpcre2-8-0 10.42-4ubuntu2.1 deb libpcre2-8-0 10.39-3ubuntu0.1 deb
libproc2-0 2:4.0.4-4ubuntu3.2 deb libpcre3 2:8.39-13ubuntu0.22.04.1 deb
libpsl5t64 0.21.2-1.1build1 deb libprocps8 2:3.3.17-6ubuntu2 deb
libreadline8t64 8.2-4build1 deb libpsl5 0.21.0-1.2build2 deb
librtmp1 2.4+20151223.gitfa8646d.1-2build7 deb libreadline8 8.1.2-1 deb
libsasl2-2 2.1.28+dfsg1-5ubuntu3.1 deb librtmp1 2.4+20151223.gitfa8646d.1-2build4 deb
libsasl2-modules 2.1.28+dfsg1-5ubuntu3.1 deb libsasl2-2 2.1.27+dfsg2-3ubuntu1.2 deb
libsasl2-modules-db 2.1.28+dfsg1-5ubuntu3.1 deb libsasl2-modules 2.1.27+dfsg2-3ubuntu1.2 deb
libseccomp2 2.5.5-1ubuntu3.1 deb libsasl2-modules-db 2.1.27+dfsg2-3ubuntu1.2 deb
libselinux1 3.5-2ubuntu2.1 deb libseccomp2 2.5.3-2ubuntu2 deb
libsemanage-common 3.5-1build5 deb libselinux1 3.3-1build2 deb
libsemanage2 3.5-1build5 deb libsemanage-common 3.3-1build2 deb
libsepol2 3.5-2build1 deb libsemanage2 3.3-1build2 deb
libsmartcols1 2.39.3-9ubuntu6.5 deb libsepol2 3.3-1build1 deb
libsqlite3-0 3.45.1-1ubuntu2.5 deb libsmartcols1 2.37.2-4ubuntu3 deb
libss2 1.47.0-2.4~exp1ubuntu4.1 deb libsqlite3-0 3.37.2-2ubuntu0.3 deb
libssh-4 0.10.6-2ubuntu0.4 deb libss2 1.46.5-2ubuntu1.1 deb
libssl3t64 3.0.13-0ubuntu3.9 deb libssh-4 0.9.6-2ubuntu0.22.04.3 deb
libstdc++6 14.2.0-4ubuntu2~24.04.1 deb libssl3 3.0.2-0ubuntu1.10 deb
libsystemd0 255.4-1ubuntu8.15 deb libstdc++6 12.1.0-2ubuntu1~22.04 deb
libtasn1-6 4.19.0-3ubuntu0.24.04.2 deb libsystemd0 249.11-0ubuntu3.9 deb
libtinfo6 6.4+20240113-1ubuntu2 deb libtasn1-6 4.18.0-4build1 deb
libudev1 255.4-1ubuntu8.15 deb libtinfo6 6.3-2ubuntu0.1 deb
libunistring5 1.1-2build1.1 deb libtirpc-common 1.3.2-2ubuntu0.1 deb
libuuid1 2.39.3-9ubuntu6.5 deb libtirpc3 1.3.2-2ubuntu0.1 deb
libxxhash0 0.8.2-2build1 deb libudev1 249.11-0ubuntu3.12 deb
libzstd1 1.5.5+dfsg2-2build1.1 deb libunistring2 1.0-1 deb
locales 2.39-0ubuntu8.7 deb libuuid1 2.37.2-4ubuntu3 deb
login 1:4.13+dfsg1-4ubuntu3.2 deb libxxhash0 0.8.1-1 deb
logsave 1.47.0-2.4~exp1ubuntu4.1 deb libzstd1 1.4.8+dfsg-3build1 deb
mawk 1.3.4.20240123-1build1 deb locales 2.35-0ubuntu3.6 deb
mount 2.39.3-9ubuntu6.5 deb login 1:4.8.1-2ubuntu2.1 deb
ncurses-base 6.4+20240113-1ubuntu2 deb logsave 1.46.5-2ubuntu1.1 deb
ncurses-bin 6.4+20240113-1ubuntu2 deb lsb-base 11.1.0ubuntu4 deb
netcat-openbsd 1.226-1ubuntu2 deb mawk 1.3.4.20200120-3 deb
openssl 3.0.13-0ubuntu3.9 deb mount 2.37.2-4ubuntu3 deb
passwd 1:4.13+dfsg1-4ubuntu3.2 deb ncurses-base 6.3-2ubuntu0.1 deb
perl-base 5.38.2-3.2ubuntu0.2 deb ncurses-bin 6.3-2ubuntu0.1 deb
pinentry-curses 1.2.1-3ubuntu5 deb netcat 1.218-4ubuntu1 deb
plexmediaserver 1.43.1.10611-1e34174b1 deb netcat-openbsd 1.218-4ubuntu1 deb
procps 2:4.0.4-4ubuntu3.2 deb openssl 3.0.2-0ubuntu1.12 deb
publicsuffix 20231001.0357-0.1 deb passwd 1:4.8.1-2ubuntu2.1 deb
readline-common 8.2-4build1 deb perl-base 5.34.0-3ubuntu1.2 deb
sed 4.9-2build1 deb pinentry-curses 1.1.1-1build2 deb
sensible-utils 0.0.22 deb plexmediaserver 1.32.8.7639-fb6452ebf deb
systemd-dev 255.4-1ubuntu8.15 deb procps 2:3.3.17-6ubuntu2 deb
systemd-hwe-hwdb 255.1.7 deb publicsuffix 20211207.1025-1 deb
systemd-standalone-sysusers 255.4-1ubuntu8.15 deb readline-common 8.1.2-1 deb
sysvinit-utils 3.08-6ubuntu3 deb sed 4.8-1ubuntu2 deb
tar 1.35+dfsg-3build1 deb sensible-utils 0.0.17 deb
tzdata 2026a-0ubuntu0.24.04.1 deb systemd-hwe-hwdb 249.11.5 deb
ubuntu-keyring 2023.11.28.1 deb sysvinit-utils 3.01-1ubuntu1 deb
udev 255.4-1ubuntu8.15 deb tar 1.34+dfsg-1ubuntu0.1.22.04.1 deb
unminimize 0.2.1 deb tzdata 2023d-0ubuntu0.22.04 deb
util-linux 2.39.3-9ubuntu6.5 deb ubuntu-keyring 2021.03.26 deb
wget 1.21.4-1ubuntu4.1 deb udev 249.11-0ubuntu3.12 deb
zlib1g 1:1.3.dfsg-3.1ubuntu2.1 deb usrmerge 25ubuntu2 deb
util-linux 2.37.2-4ubuntu3 deb
wget 1.21.2-2ubuntu1 deb
zlib1g 1:1.2.11.dfsg-2ubuntu9.2 deb

View file

@ -3,22 +3,24 @@
# project information # project information
project_name: plex project_name: plex
project_url: "https://plex.tv" project_url: "https://plex.tv"
project_logo: "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/plex-logo.png" project_logo: "http://the-gadgeteer.com/wp-content/uploads/2015/10/plex-logo-e1446990678679.png"
project_blurb: "[{{ project_name|capitalize }}]({{ project_url }}) organizes video, music and photos from personal media libraries and streams them to smart TVs, streaming boxes and mobile devices. This container is packaged as a standalone Plex Media Server. Straightforward design and bulk actions mean getting things done faster." project_blurb: "[{{ project_name|capitalize }}]({{ project_url }}) organizes video, music and photos from personal media libraries and streams them to smart TVs, streaming boxes and mobile devices. This container is packaged as a standalone Plex Media Server. Straightforward design and bulk actions mean getting things done faster."
project_lsio_github_repo_url: "https://github.com/linuxserver/docker-{{ project_name }}" project_lsio_github_repo_url: "https://github.com/linuxserver/docker-{{ project_name }}"
project_categories: "Media Servers,Music,Audiobooks"
# supported architectures # supported architectures
available_architectures: available_architectures:
- {arch: "{{ arch_x86_64 }}", tag: "amd64-latest"} - {arch: "{{ arch_x86_64 }}", tag: "amd64-latest"}
- {arch: "{{ arch_arm64 }}", tag: "arm64v8-latest"} - {arch: "{{ arch_arm64 }}", tag: "arm64v8-latest"}
# development version
development_versions: false
# container parameters # container parameters
common_param_env_vars_enabled: true #PGID, PUID, etc common_param_env_vars_enabled: true #PGID, PUID, etc
param_container_name: "{{ project_name }}" param_container_name: "{{ project_name }}"
param_usage_include_vols: true param_usage_include_vols: true
param_volumes: param_volumes:
- {vol_path: "/config", vol_host_path: "/path/to/{{ project_name }}/library", desc: "Plex library location. *This can grow very large, 50gb+ is likely for a large collection.*"} - {vol_path: "/config", vol_host_path: "/path/to/library", desc: "Plex library location. *This can grow very large, 50gb+ is likely for a large collection.*"}
- {vol_path: "/tv", vol_host_path: "/path/to/tvseries", desc: "Media goes here. Add as many as needed e.g. `/movies`, `/tv`, etc."} - {vol_path: "/tv", vol_host_path: "/path/to/tvseries", desc: "Media goes here. Add as many as needed e.g. `/movies`, `/tv`, etc."}
- {vol_path: "/movies", vol_host_path: "/path/to/movies", desc: "Media goes here. Add as many as needed e.g. `/movies`, `/tv`, etc."} - {vol_path: "/movies", vol_host_path: "/path/to/movies", desc: "Media goes here. Add as many as needed e.g. `/movies`, `/tv`, etc."}
param_usage_include_ports: false
param_usage_include_net: true param_usage_include_net: true
param_net: "host" param_net: "host"
param_net_desc: "Use Host Networking" param_net_desc: "Use Host Networking"
@ -59,77 +61,40 @@ app_setup_block_enabled: true
app_setup_block: | app_setup_block: |
Webui can be found at `<your-ip>:32400/web` Webui can be found at `<your-ip>:32400/web`
?+note[Updates](|If there is no value set for the VERSION variable, then no updates will take place.|) ** Note about updates, if there is no value set for the VERSION variable, then no updates will take place.**
?+note[New users](|For new users, no updates will take place on the first run of the container as there is no preferences file to read your token from, to update restart the Docker container after logging in through the webui.|) ** For new users, no updates will take place on the first run of the container as there is no preferences file to read your token from, to update restart the Docker container after logging in through the webui**
Valid settings for VERSION are:- Valid settings for VERSION are:-
?+info[Plexpass](|YOU CANNOT UPDATE TO A PLEXPASS ONLY (BETA) VERSION IF YOU ARE NOT LOGGED IN WITH A PLEXPASS ACCOUNT.|) `IMPORTANT NOTE:- YOU CANNOT UPDATE TO A PLEXPASS ONLY (BETA) VERSION IF YOU ARE NOT LOGGED IN WITH A PLEXPASS ACCOUNT`
+ **`docker`**: Let Docker handle the Plex Version, we keep our Dockerhub Endpoint up to date with the latest public builds. This is the same as leaving this setting out of your create command. + **`docker`**: Let Docker handle the Plex Version, we keep our Dockerhub Endpoint up to date with the latest public builds. This is the same as leaving this setting out of your create command.
+ **`latest`**: will update plex to the latest version available that you are entitled to. + **`latest`**: will update plex to the latest version available that you are entitled to.
+ **`public`**: will update plexpass users to the latest public version, useful for plexpass users that don't want to be on the bleeding edge but still want the latest public updates. + **`public`**: will update plexpass users to the latest public version, useful for plexpass users that don't want to be on the bleeding edge but still want the latest public updates.
+ **`<specific-version>`**: will select a specific version (eg 0.9.12.4.1192-9a47d21) of plex to install, note you cannot use this to access plexpass versions if you do not have plexpass. + **`<specific-version>`**: will select a specific version (eg 0.9.12.4.1192-9a47d21) of plex to install, note you cannot use this to access plexpass versions if you do not have plexpass.
readme_hwaccel: true
readonly_supported: true ## Hardware Acceleration
readonly_message: |
* Runtime update of Plex (and thus Plexpass builds) is not supported. ### Intel
* Transcode directory must be mounted to a host path or tmpfs.
nonroot_supported: true Hardware acceleration users for Intel Quicksync will need to mount their /dev/dri video device inside of the container by passing the following command when running or creating the container:
nonroot_message: |
* Runtime update of Plex (and thus Plexpass builds) is not supported. ```
* Transcode directory must be mounted to a host path or tmpfs. --device=/dev/dri:/dev/dri
# init diagram ```
init_diagram: |
"plex:latest": { We will automatically ensure the abc user inside of the container has the proper permissions to access this device.
docker-mods
base { ### Nvidia
fix-attr +\nlegacy cont-init
} Hardware acceleration users for Nvidia will need to install the container runtime provided by Nvidia on their host, instructions can be found here:
docker-mods -> base
legacy-services https://github.com/NVIDIA/nvidia-docker
custom services
init-services -> legacy-services We automatically add the necessary environment variable that will utilise all the features available on a GPU on the host. Once nvidia-docker is installed on your host you will need to re/create the docker container with the nvidia container runtime `--runtime=nvidia` and add an environment variable `-e NVIDIA_VISIBLE_DEVICES=all` (can also be set to a specific gpu's UUID, this can be discovered by running `nvidia-smi --query-gpu=gpu_name,gpu_uuid --format=csv` ). NVIDIA automatically mounts the GPU and drivers from your host into the plex docker.
init-services -> custom services
custom services -> legacy-services
legacy-services -> ci-service-check
init-migrations -> init-adduser
init-os-end -> init-config
init-config -> init-config-end
init-crontab-config -> init-config-end
init-plex-update -> init-config-end
init-config -> init-crontab-config
init-mods-end -> init-custom-files
init-adduser -> init-device-perms
base -> init-envfile
base -> init-migrations
init-config-end -> init-mods
init-mods-package-install -> init-mods-end
init-mods -> init-mods-package-install
init-adduser -> init-os-end
init-device-perms -> init-os-end
init-envfile -> init-os-end
init-config -> init-plex-chown
init-plex-chown -> init-plex-claim
init-plex-claim -> init-plex-update
init-custom-files -> init-services
init-services -> svc-cron
svc-cron -> legacy-services
init-services -> svc-plex
svc-plex -> legacy-services
}
Base Images: {
"baseimage-ubuntu:noble"
}
"plex:latest" <- Base Images
# changelog # changelog
changelogs: changelogs:
- {date: "15.03.26:", desc: "Allow TMPDIR to be changed to better support read-only containers"}
- {date: "15.03.26:", desc: "Fix initial claim setup on non-root containers"}
- {date: "04.11.24:", desc: "Add Nvidia capability needed for h265"}
- {date: "18.07.24:", desc: "Rebase to Ubuntu Noble."}
- {date: "12.02.24:", desc: "Use universal hardware acceleration blurb"}
- {date: "09.01.24:", desc: "Set ownership on TranscoderTempDirectory when it's been saved in Preferences."} - {date: "09.01.24:", desc: "Set ownership on TranscoderTempDirectory when it's been saved in Preferences."}
- {date: "16.08.23:", desc: "Install unrar from [linuxserver repo](https://github.com/linuxserver/docker-unrar)."} - {date: "16.08.23:", desc: "Install unrar from [linuxserver repo](https://github.com/linuxserver/docker-unrar)."}
- {date: "03.07.23:", desc: "Deprecate armhf. As announced [here](https://www.linuxserver.io/blog/a-farewell-to-arm-hf)"} - {date: "03.07.23:", desc: "Deprecate armhf. As announced [here](https://www.linuxserver.io/blog/a-farewell-to-arm-hf)"}

View file

@ -1,18 +1,19 @@
#!/usr/bin/with-contenv bash #!/usr/bin/with-contenv bash
# shellcheck shell=bash # shellcheck shell=bash
# remove plex temporary directory after unclean stop
if [[ -d "${TMPDIR}" ]]; then
rm -rf "${TMPDIR}"
fi
mkdir -p ${TMPDIR}
# create folders # create folders
if [[ ! -d "${PLEX_MEDIA_SERVER_APPLICATION_SUPPORT_DIR}" ]]; then if [[ ! -d "${PLEX_MEDIA_SERVER_APPLICATION_SUPPORT_DIR}" ]]; then
mkdir -p "${PLEX_MEDIA_SERVER_APPLICATION_SUPPORT_DIR}" mkdir -p "${PLEX_MEDIA_SERVER_APPLICATION_SUPPORT_DIR}"
if [[ -z ${LSIO_NON_ROOT_USER} ]]; then lsiown -R abc:abc /config
lsiown -R abc:abc /config fi
fi
# check Library permissions
PUID=${PUID:-911}
if [[ ! "$(stat -c %u /config/Library)" == "${PUID}" ]]; then
echo "Change in ownership detected, please be patient while we chown existing files"
echo "This could take some time"
lsiown abc:abc -R \
/config/Library
fi fi
# remove plex pid after unclean stop # remove plex pid after unclean stop
@ -20,31 +21,19 @@ if [[ -f "/config/Library/Application Support/Plex Media Server/plexmediaserver.
rm -f "/config/Library/Application Support/Plex Media Server/plexmediaserver.pid" rm -f "/config/Library/Application Support/Plex Media Server/plexmediaserver.pid"
fi fi
if [[ -z ${LSIO_NON_ROOT_USER} ]]; then # set permissions on Plex Transcoder Temp Directory
# check Library permissions PLEX_MEDIA_SERVER_PREFERENCES="${PLEX_MEDIA_SERVER_APPLICATION_SUPPORT_DIR}/Plex Media Server/Preferences.xml"
PUID=${PUID:-911} if [[ -f "${PLEX_MEDIA_SERVER_PREFERENCES}" ]]; then
if [[ ! "$(stat -c %u /config/Library)" == "${PUID}" ]]; then TranscoderTempDirectory='\bTranscoderTempDirectory="([^"]+)"'
echo "Change in ownership detected, please be patient while we chown existing files" while IFS= read -r line; do
echo "This could take some time" if [[ ${line} =~ ${TranscoderTempDirectory} ]] && [[ -d "${BASH_REMATCH[1]}" ]]; then
lsiown -R abc:abc \ echo "Setting permissions on ${BASH_REMATCH[1]}"
/config/Library lsiown -R abc:abc "${BASH_REMATCH[1]}"
fi fi
done <"${PLEX_MEDIA_SERVER_PREFERENCES}"
# set permissions on Plex Transcoder Temp Directory
PLEX_MEDIA_SERVER_PREFERENCES="${PLEX_MEDIA_SERVER_APPLICATION_SUPPORT_DIR}/Plex Media Server/Preferences.xml"
if [[ -f "${PLEX_MEDIA_SERVER_PREFERENCES}" ]]; then
TranscoderTempDirectory='\bTranscoderTempDirectory="([^"]+)"'
while IFS= read -r line; do
if [[ ${line} =~ ${TranscoderTempDirectory} ]] && [[ -d "${BASH_REMATCH[1]}" ]]; then
echo "Setting permissions on ${BASH_REMATCH[1]}"
lsiown -R abc:abc "${BASH_REMATCH[1]}"
fi
done <"${PLEX_MEDIA_SERVER_PREFERENCES}"
fi
# permissions (non-recursive) on config root and folders
lsiown abc:abc \
"${TMPDIR}" \
/config \
/config/*
fi fi
# permissions (non-recursive) on config root and folders
lsiown abc:abc \
/config \
/config/*

View file

@ -19,15 +19,8 @@ if [[ ! -f "${PLEX_MEDIA_SERVER_PREFERENCES}" ]]; then
export PLEX_MEDIA_SERVER_INFO_MODEL export PLEX_MEDIA_SERVER_INFO_MODEL
PLEX_MEDIA_SERVER_INFO_PLATFORM_VERSION=$(uname -r) PLEX_MEDIA_SERVER_INFO_PLATFORM_VERSION=$(uname -r)
export PLEX_MEDIA_SERVER_INFO_PLATFORM_VERSION export PLEX_MEDIA_SERVER_INFO_PLATFORM_VERSION
s6-setuidgid abc /bin/bash -c \
if [[ -z ${LSIO_NON_ROOT_USER} ]]; then 'LD_LIBRARY_PATH=/usr/lib/plexmediaserver:/usr/lib/plexmediaserver/lib /usr/lib/plexmediaserver/Plex\ Media\ Server' &
s6-setuidgid abc /bin/bash -c \
'LD_LIBRARY_PATH=/usr/lib/plexmediaserver:/usr/lib/plexmediaserver/lib /usr/lib/plexmediaserver/Plex\ Media\ Server' &
else
/bin/bash -c \
'LD_LIBRARY_PATH=/usr/lib/plexmediaserver:/usr/lib/plexmediaserver/lib /usr/lib/plexmediaserver/Plex\ Media\ Server' &
fi
PID=$! PID=$!
echo "Waiting for Plex to generate its config" echo "Waiting for Plex to generate its config"
DBNAME="/config/Library/Application Support/Plex Media Server/Plug-in Support/Databases/com.plexapp.plugins.library.db-wal" DBNAME="/config/Library/Application Support/Plex Media Server/Plug-in Support/Databases/com.plexapp.plugins.library.db-wal"

View file

@ -0,0 +1,35 @@
#!/usr/bin/with-contenv bash
# shellcheck shell=bash
FILES=$(find /dev/dri /dev/dvb -type c -print 2>/dev/null)
for i in ${FILES}; do
VIDEO_GID=$(stat -c '%g' "${i}")
VIDEO_UID=$(stat -c '%u' "${i}")
# check if user matches device
if id -u abc | grep -qw "${VIDEO_UID}"; then
echo "**** permissions for ${i} are good ****"
else
# check if group matches and that device has group rw
if id -G abc | grep -qw "${VIDEO_GID}" && [[ $(stat -c '%A' "${i}" | cut -b 5,6) == "rw" ]]; then
echo "**** permissions for ${i} are good ****"
# check if device needs to be added to video group
elif ! id -G abc | grep -qw "${VIDEO_GID}"; then
# check if video group needs to be created
VIDEO_NAME=$(getent group "${VIDEO_GID}" | awk -F: '{print $1}')
if [[ -z "${VIDEO_NAME}" ]]; then
VIDEO_NAME="video$(head /dev/urandom | tr -dc 'a-z0-9' | head -c4)"
groupadd "${VIDEO_NAME}"
groupmod -g "${VIDEO_GID}" "${VIDEO_NAME}"
echo "**** creating video group ${VIDEO_NAME} with id ${VIDEO_GID} ****"
fi
echo "**** adding ${i} to video group ${VIDEO_NAME} with id ${VIDEO_GID} ****"
usermod -a -G "${VIDEO_NAME}" abc
fi
# check if device has group rw
if [[ $(stat -c '%A' "${i}" | cut -b 5,6) != "rw" ]]; then
echo -e "**** The device ${i} does not have group read/write permissions, attempting to fix inside the container. ****"
chmod g+rw "${i}"
fi
fi
done

View file

@ -0,0 +1 @@
oneshot

View file

@ -0,0 +1 @@
/etc/s6-overlay/s6-rc.d/init-plex-gid-video/run

View file

@ -1,11 +1,6 @@
#!/usr/bin/with-contenv bash #!/usr/bin/with-contenv bash
# shellcheck shell=bash # shellcheck shell=bash
if [[ -n ${LSIO_READ_ONLY_FS} ]] || [[ -n ${LSIO_NON_ROOT_USER} ]]; then
echo "Runtime update not supported with read-only or non-root operation, skipping."
exit 0
fi
# If docker manages versioning exit # If docker manages versioning exit
if [[ -n "${VERSION}" ]] && [[ "${VERSION}" == "docker" ]]; then if [[ -n "${VERSION}" ]] && [[ "${VERSION}" == "docker" ]]; then
echo "Docker is used for versioning skip update check" echo "Docker is used for versioning skip update check"

View file

@ -1,14 +0,0 @@
#!/usr/bin/with-contenv bash
# Bring up WireGuard if not already up
if ! ip link show dev wg0 > /dev/null 2>&1; then
wg-quick up wg0
fi
# Monitor wireguard status
while true; do
if ! ip link show dev wg0 | grep -q "UP"; then
wg-quick up wg0
fi
sleep 60
done

View file

@ -1 +0,0 @@
longrun

View file

@ -1,20 +1,11 @@
#!/usr/bin/with-contenv bash #!/usr/bin/with-contenv bash
# shellcheck shell=bash # shellcheck shell=bash
# Wait for WireGuard to be up
echo "Starting Plex Media Server. . . (you can ignore the libusb_init error)" echo "Starting Plex Media Server. . . (you can ignore the libusb_init error)"
PLEX_MEDIA_SERVER_INFO_MODEL=$(uname -m) PLEX_MEDIA_SERVER_INFO_MODEL=$(uname -m)
export PLEX_MEDIA_SERVER_INFO_MODEL export PLEX_MEDIA_SERVER_INFO_MODEL
PLEX_MEDIA_SERVER_INFO_PLATFORM_VERSION=$(uname -r) PLEX_MEDIA_SERVER_INFO_PLATFORM_VERSION=$(uname -r)
export PLEX_MEDIA_SERVER_INFO_PLATFORM_VERSION export PLEX_MEDIA_SERVER_INFO_PLATFORM_VERSION
exec \
if [[ -z ${LSIO_NON_ROOT_USER} ]]; then s6-notifyoncheck -d -n 300 -w 1000 -c "nc -z localhost 32400" \
exec \ s6-setuidgid abc "/usr/lib/plexmediaserver/Plex Media Server"
s6-notifyoncheck -d -n 300 -w 1000 -c "nc -z localhost 32400" \
s6-setuidgid abc "/usr/lib/plexmediaserver/Plex Media Server"
else
exec \
s6-notifyoncheck -d -n 300 -w 1000 -c "nc -z localhost 32400" \
"/usr/lib/plexmediaserver/Plex Media Server"
fi