├── .dockerignore ├── .gitattributes ├── .github ├── ISSUE_TEMPLATE.md └── PULL_REQUEST_TEMPLATE.md ├── .gitignore ├── Dockerfile ├── Dockerfile.aarch64 ├── Dockerfile.armhf ├── Jenkinsfile ├── README.md ├── jenkins-vars.yml ├── package_versions.txt ├── prebuilds └── jetty-runner ├── readme-vars.yml └── root └── etc ├── cont-init.d ├── 20-config └── 90-config └── services.d └── libresonic └── run /.dockerignore: -------------------------------------------------------------------------------- 1 | .git 2 | .gitignore 3 | .github 4 | .gitattributes 5 | READMETEMPLATE.md 6 | README.md 7 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | 7 | # Standard to msysgit 8 | *.doc diff=astextplain 9 | *.DOC diff=astextplain 10 | *.docx diff=astextplain 11 | *.DOCX diff=astextplain 12 | *.dot diff=astextplain 13 | *.DOT diff=astextplain 14 | *.pdf diff=astextplain 15 | *.PDF diff=astextplain 16 | *.rtf diff=astextplain 17 | *.RTF diff=astextplain 18 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | [linuxserverurl]: https://linuxserver.io 4 | [![linuxserver.io](https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/linuxserver_medium.png)][linuxserverurl] 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | ## Thanks, team linuxserver.io 21 | 22 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | [linuxserverurl]: https://linuxserver.io 4 | [![linuxserver.io](https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/linuxserver_medium.png)][linuxserverurl] 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | ## Thanks, team linuxserver.io 15 | 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Windows image file caches 2 | Thumbs.db 3 | ehthumbs.db 4 | 5 | # Folder config file 6 | Desktop.ini 7 | 8 | # Recycle Bin used on file shares 9 | $RECYCLE.BIN/ 10 | 11 | # Windows Installer files 12 | *.cab 13 | *.msi 14 | *.msm 15 | *.msp 16 | 17 | # Windows shortcuts 18 | *.lnk 19 | 20 | # ========================= 21 | # Operating System Files 22 | # ========================= 23 | 24 | # OSX 25 | # ========================= 26 | 27 | .DS_Store 28 | .AppleDouble 29 | .LSOverride 30 | 31 | # Thumbnails 32 | ._* 33 | 34 | # Files that might appear on external disk 35 | .Spotlight-V100 36 | .Trashes 37 | 38 | # Directories potentially created on remote AFP share 39 | .AppleDB 40 | .AppleDesktop 41 | Network Trash Folder 42 | Temporary Items 43 | .apdisk 44 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM lsiobase/ubuntu:bionic 2 | 3 | # set version label 4 | ARG BUILD_DATE 5 | ARG VERSION 6 | ARG LIBRESONIC_RELEASE 7 | LABEL build_version="Linuxserver.io version:- ${VERSION} Build-date:- ${BUILD_DATE}" 8 | LABEL maintainer="sparklyballs, thelamer" 9 | 10 | # environment settings 11 | ENV LIBRE_HOME="/app/libresonic" \ 12 | LIBRE_SETTINGS="/config" \ 13 | LANG="C.UTF-8" 14 | 15 | RUN \ 16 | echo "**** install runtime packages ****" && \ 17 | apt-get update && \ 18 | apt-get install -y \ 19 | --no-install-recommends \ 20 | ca-certificates \ 21 | ffmpeg \ 22 | flac \ 23 | fontconfig \ 24 | lame \ 25 | openjdk-8-jre-headless \ 26 | ttf-dejavu && \ 27 | echo "**** fix XXXsonic status page ****" && \ 28 | find /etc -name "accessibility.properties" -exec rm -fv '{}' + && \ 29 | find /usr -name "accessibility.properties" -exec rm -fv '{}' + && \ 30 | echo "**** Get War ****" && \ 31 | if [ -z ${LIBRESONIC_RELEASE+x} ]; then \ 32 | LIBRESONIC_RELEASE=$(curl -sX GET "https://api.github.com/repos/Libresonic/libresonic/releases/latest" \ 33 | | awk '/tag_name/{print $4;exit}' FS='[""]'); \ 34 | fi && \ 35 | mkdir -p /app/libresonic && \ 36 | curl -o \ 37 | /app/libresonic/libresonic.war -L \ 38 | "https://github.com/Libresonic/libresonic/releases/download/${LIBRESONIC_RELEASE}/libresonic-${LIBRESONIC_RELEASE}.war" 39 | 40 | # add local files 41 | COPY root/ / 42 | 43 | # ports and volumes 44 | EXPOSE 4040 45 | VOLUME /config /media /music /playlists /podcasts 46 | -------------------------------------------------------------------------------- /Dockerfile.aarch64: -------------------------------------------------------------------------------- 1 | FROM lsiobase/ubuntu:arm64v8-bionic 2 | 3 | # set version label 4 | ARG BUILD_DATE 5 | ARG VERSION 6 | ARG LIBRESONIC_RELEASE 7 | LABEL build_version="Linuxserver.io version:- ${VERSION} Build-date:- ${BUILD_DATE}" 8 | LABEL maintainer="sparklyballs, thelamer" 9 | 10 | # environment settings 11 | ENV LIBRE_HOME="/app/libresonic" \ 12 | LIBRE_SETTINGS="/config" \ 13 | LANG="C.UTF-8" 14 | 15 | RUN \ 16 | echo "**** install runtime packages ****" && \ 17 | apt-get update && \ 18 | apt-get install -y \ 19 | --no-install-recommends \ 20 | ca-certificates \ 21 | ffmpeg \ 22 | flac \ 23 | fontconfig \ 24 | lame \ 25 | openjdk-8-jre-headless \ 26 | ttf-dejavu && \ 27 | echo "**** fix XXXsonic status page ****" && \ 28 | find /etc -name "accessibility.properties" -exec rm -fv '{}' + && \ 29 | find /usr -name "accessibility.properties" -exec rm -fv '{}' + && \ 30 | echo "**** Get War ****" && \ 31 | if [ -z ${LIBRESONIC_RELEASE+x} ]; then \ 32 | LIBRESONIC_RELEASE=$(curl -sX GET "https://api.github.com/repos/Libresonic/libresonic/releases/latest" \ 33 | | awk '/tag_name/{print $4;exit}' FS='[""]'); \ 34 | fi && \ 35 | mkdir -p /app/libresonic && \ 36 | curl -o \ 37 | /app/libresonic/libresonic.war -L \ 38 | "https://github.com/Libresonic/libresonic/releases/download/${LIBRESONIC_RELEASE}/libresonic-${LIBRESONIC_RELEASE}.war" 39 | 40 | # add local files 41 | COPY root/ / 42 | 43 | # ports and volumes 44 | EXPOSE 4040 45 | VOLUME /config /media /music /playlists /podcasts 46 | -------------------------------------------------------------------------------- /Dockerfile.armhf: -------------------------------------------------------------------------------- 1 | FROM lsiobase/ubuntu:arm32v7-bionic 2 | 3 | # set version label 4 | ARG BUILD_DATE 5 | ARG VERSION 6 | ARG LIBRESONIC_RELEASE 7 | LABEL build_version="Linuxserver.io version:- ${VERSION} Build-date:- ${BUILD_DATE}" 8 | LABEL maintainer="sparklyballs, thelamer" 9 | 10 | # environment settings 11 | ENV LIBRE_HOME="/app/libresonic" \ 12 | LIBRE_SETTINGS="/config" \ 13 | LANG="C.UTF-8" 14 | 15 | RUN \ 16 | echo "**** install runtime packages ****" && \ 17 | apt-get update && \ 18 | apt-get install -y \ 19 | --no-install-recommends \ 20 | ca-certificates \ 21 | ffmpeg \ 22 | flac \ 23 | fontconfig \ 24 | lame \ 25 | openjdk-8-jre-headless \ 26 | ttf-dejavu && \ 27 | echo "**** fix XXXsonic status page ****" && \ 28 | find /etc -name "accessibility.properties" -exec rm -fv '{}' + && \ 29 | find /usr -name "accessibility.properties" -exec rm -fv '{}' + && \ 30 | echo "**** Get War ****" && \ 31 | if [ -z ${LIBRESONIC_RELEASE+x} ]; then \ 32 | LIBRESONIC_RELEASE=$(curl -sX GET "https://api.github.com/repos/Libresonic/libresonic/releases/latest" \ 33 | | awk '/tag_name/{print $4;exit}' FS='[""]'); \ 34 | fi && \ 35 | mkdir -p /app/libresonic && \ 36 | curl -o \ 37 | /app/libresonic/libresonic.war -L \ 38 | "https://github.com/Libresonic/libresonic/releases/download/${LIBRESONIC_RELEASE}/libresonic-${LIBRESONIC_RELEASE}.war" 39 | 40 | # add local files 41 | COPY root/ / 42 | 43 | # ports and volumes 44 | EXPOSE 4040 45 | VOLUME /config /media /music /playlists /podcasts 46 | -------------------------------------------------------------------------------- /Jenkinsfile: -------------------------------------------------------------------------------- 1 | pipeline { 2 | agent { 3 | label 'X86-64-MULTI' 4 | } 5 | // Input to determine if this is a package check 6 | parameters { 7 | string(defaultValue: 'false', description: 'package check run', name: 'PACKAGE_CHECK') 8 | } 9 | // Configuration for the variables used for this specific repo 10 | environment { 11 | BUILDS_DISCORD=credentials('build_webhook_url') 12 | GITHUB_TOKEN=credentials('498b4638-2d02-4ce5-832d-8a57d01d97ab') 13 | EXT_GIT_BRANCH = 'master' 14 | EXT_USER = 'Libresonic' 15 | EXT_REPO = 'libresonic' 16 | BUILD_VERSION_ARG = 'LIBRESONIC_RELEASE' 17 | LS_USER = 'linuxserver' 18 | LS_REPO = 'docker-libresonic' 19 | CONTAINER_NAME = 'libresonic' 20 | DOCKERHUB_IMAGE = 'linuxserver/libresonic' 21 | DEV_DOCKERHUB_IMAGE = 'lsiodev/libresonic' 22 | PR_DOCKERHUB_IMAGE = 'lspipepr/libresonic' 23 | DIST_IMAGE = 'ubuntu' 24 | MULTIARCH='true' 25 | CI='true' 26 | CI_WEB='true' 27 | CI_PORT='4040' 28 | CI_SSL='false' 29 | CI_DELAY='360' 30 | CI_DOCKERENV='TZ=US/Pacific' 31 | CI_AUTH='user:password' 32 | CI_WEBPATH='' 33 | } 34 | stages { 35 | // Setup all the basic environment variables needed for the build 36 | stage("Set ENV Variables base"){ 37 | steps{ 38 | script{ 39 | env.EXIT_STATUS = '' 40 | env.LS_RELEASE = sh( 41 | script: '''curl -s https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases/latest | jq -r '. | .tag_name' ''', 42 | returnStdout: true).trim() 43 | env.LS_RELEASE_NOTES = sh( 44 | script: '''cat readme-vars.yml | awk -F \\" '/date: "[0-9][0-9].[0-9][0-9].[0-9][0-9]:/ {print $4;exit;}' | sed -E ':a;N;$!ba;s/\\r{0,1}\\n/\\\\n/g' ''', 45 | returnStdout: true).trim() 46 | env.GITHUB_DATE = sh( 47 | script: '''date '+%Y-%m-%dT%H:%M:%S%:z' ''', 48 | returnStdout: true).trim() 49 | env.COMMIT_SHA = sh( 50 | script: '''git rev-parse HEAD''', 51 | returnStdout: true).trim() 52 | env.CODE_URL = 'https://github.com/' + env.LS_USER + '/' + env.LS_REPO + '/commit/' + env.GIT_COMMIT 53 | env.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.DOCKERHUB_IMAGE + '/tags/' 54 | env.PULL_REQUEST = env.CHANGE_ID 55 | } 56 | script{ 57 | env.LS_RELEASE_NUMBER = sh( 58 | script: '''echo ${LS_RELEASE} |sed 's/^.*-ls//g' ''', 59 | returnStdout: true).trim() 60 | } 61 | script{ 62 | env.LS_TAG_NUMBER = sh( 63 | script: '''#! /bin/bash 64 | tagsha=$(git rev-list -n 1 ${LS_RELEASE} 2>/dev/null) 65 | if [ "${tagsha}" == "${COMMIT_SHA}" ]; then 66 | echo ${LS_RELEASE_NUMBER} 67 | elif [ -z "${GIT_COMMIT}" ]; then 68 | echo ${LS_RELEASE_NUMBER} 69 | else 70 | echo $((${LS_RELEASE_NUMBER} + 1)) 71 | fi''', 72 | returnStdout: true).trim() 73 | } 74 | } 75 | } 76 | /* ####################### 77 | Package Version Tagging 78 | ####################### */ 79 | // Grab the current package versions in Git to determine package tag 80 | stage("Set Package tag"){ 81 | steps{ 82 | script{ 83 | env.PACKAGE_TAG = sh( 84 | script: '''#!/bin/bash 85 | if [ -e package_versions.txt ] ; then 86 | cat package_versions.txt | md5sum | cut -c1-8 87 | else 88 | echo none 89 | fi''', 90 | returnStdout: true).trim() 91 | } 92 | } 93 | } 94 | /* ######################## 95 | External Release Tagging 96 | ######################## */ 97 | // If this is a stable github release use the latest endpoint from github to determine the ext tag 98 | stage("Set ENV github_stable"){ 99 | steps{ 100 | script{ 101 | env.EXT_RELEASE = sh( 102 | script: '''curl -s https://api.github.com/repos/${EXT_USER}/${EXT_REPO}/releases/latest | jq -r '. | .tag_name' ''', 103 | returnStdout: true).trim() 104 | } 105 | } 106 | } 107 | // If this is a stable or devel github release generate the link for the build message 108 | stage("Set ENV github_link"){ 109 | steps{ 110 | script{ 111 | env.RELEASE_LINK = 'https://github.com/' + env.EXT_USER + '/' + env.EXT_REPO + '/releases/tag/' + env.EXT_RELEASE 112 | } 113 | } 114 | } 115 | // Sanitize the release tag and strip illegal docker or github characters 116 | stage("Sanitize tag"){ 117 | steps{ 118 | script{ 119 | env.EXT_RELEASE_CLEAN = sh( 120 | script: '''echo ${EXT_RELEASE} | sed 's/[~,%@+;:/]//g' ''', 121 | returnStdout: true).trim() 122 | } 123 | } 124 | } 125 | // If this is a master build use live docker endpoints 126 | stage("Set ENV live build"){ 127 | when { 128 | branch "master" 129 | environment name: 'CHANGE_ID', value: '' 130 | } 131 | steps { 132 | script{ 133 | env.IMAGE = env.DOCKERHUB_IMAGE 134 | if (env.MULTIARCH == 'true') { 135 | env.CI_TAGS = 'amd64-' + env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER + '|arm32v7-' + env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER + '|arm64v8-' + env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER 136 | } else { 137 | env.CI_TAGS = env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER 138 | } 139 | env.META_TAG = env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER 140 | } 141 | } 142 | } 143 | // If this is a dev build use dev docker endpoints 144 | stage("Set ENV dev build"){ 145 | when { 146 | not {branch "master"} 147 | environment name: 'CHANGE_ID', value: '' 148 | } 149 | steps { 150 | script{ 151 | env.IMAGE = env.DEV_DOCKERHUB_IMAGE 152 | if (env.MULTIARCH == 'true') { 153 | env.CI_TAGS = 'amd64-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + '|arm32v7-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + '|arm64v8-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA 154 | } else { 155 | env.CI_TAGS = env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA 156 | } 157 | env.META_TAG = env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA 158 | env.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.DEV_DOCKERHUB_IMAGE + '/tags/' 159 | } 160 | } 161 | } 162 | // If this is a pull request build use dev docker endpoints 163 | stage("Set ENV PR build"){ 164 | when { 165 | not {environment name: 'CHANGE_ID', value: ''} 166 | } 167 | steps { 168 | script{ 169 | env.IMAGE = env.PR_DOCKERHUB_IMAGE 170 | if (env.MULTIARCH == 'true') { 171 | env.CI_TAGS = 'amd64-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST + '|arm32v7-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST + '|arm64v8-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST 172 | } else { 173 | env.CI_TAGS = env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST 174 | } 175 | env.META_TAG = env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST 176 | env.CODE_URL = 'https://github.com/' + env.LS_USER + '/' + env.LS_REPO + '/pull/' + env.PULL_REQUEST 177 | env.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.PR_DOCKERHUB_IMAGE + '/tags/' 178 | } 179 | } 180 | } 181 | // Run ShellCheck 182 | stage('ShellCheck') { 183 | when { 184 | environment name: 'CI', value: 'true' 185 | } 186 | steps { 187 | withCredentials([ 188 | string(credentialsId: 'spaces-key', variable: 'DO_KEY'), 189 | string(credentialsId: 'spaces-secret', variable: 'DO_SECRET') 190 | ]) { 191 | script{ 192 | env.SHELLCHECK_URL = 'https://lsio-ci.ams3.digitaloceanspaces.com/' + env.IMAGE + '/' + env.META_TAG + '/shellcheck-result.xml' 193 | } 194 | sh '''curl -sL https://raw.githubusercontent.com/linuxserver/docker-shellcheck/master/checkrun.sh | /bin/bash''' 195 | sh '''#! /bin/bash 196 | set -e 197 | docker pull lsiodev/spaces-file-upload:latest 198 | docker run --rm \ 199 | -e DESTINATION=\"${IMAGE}/${META_TAG}/shellcheck-result.xml\" \ 200 | -e FILE_NAME="shellcheck-result.xml" \ 201 | -e MIMETYPE="text/xml" \ 202 | -v ${WORKSPACE}:/mnt \ 203 | -e SECRET_KEY=\"${DO_SECRET}\" \ 204 | -e ACCESS_KEY=\"${DO_KEY}\" \ 205 | -t lsiodev/spaces-file-upload:latest \ 206 | python /upload.py''' 207 | } 208 | } 209 | } 210 | // Use helper containers to render templated files 211 | stage('Update-Templates') { 212 | when { 213 | branch "master" 214 | environment name: 'CHANGE_ID', value: '' 215 | expression { 216 | env.CONTAINER_NAME != null 217 | } 218 | } 219 | steps { 220 | sh '''#! /bin/bash 221 | set -e 222 | TEMPDIR=$(mktemp -d) 223 | docker pull linuxserver/jenkins-builder:latest 224 | docker run --rm -e CONTAINER_NAME=${CONTAINER_NAME} -e GITHUB_BRANCH=master -v ${TEMPDIR}:/ansible/jenkins linuxserver/jenkins-builder:latest 225 | docker pull linuxserver/doc-builder:latest 226 | docker run --rm -e CONTAINER_NAME=${CONTAINER_NAME} -e GITHUB_BRANCH=master -v ${TEMPDIR}:/ansible/readme linuxserver/doc-builder:latest 227 | if [ "$(md5sum ${TEMPDIR}/${LS_REPO}/Jenkinsfile | awk '{ print $1 }')" != "$(md5sum Jenkinsfile | awk '{ print $1 }')" ] || [ "$(md5sum ${TEMPDIR}/${CONTAINER_NAME}/README.md | awk '{ print $1 }')" != "$(md5sum README.md | awk '{ print $1 }')" ]; then 228 | mkdir -p ${TEMPDIR}/repo 229 | git clone https://github.com/${LS_USER}/${LS_REPO}.git ${TEMPDIR}/repo/${LS_REPO} 230 | git --git-dir ${TEMPDIR}/repo/${LS_REPO}/.git checkout -f master 231 | cp ${TEMPDIR}/${CONTAINER_NAME}/README.md ${TEMPDIR}/repo/${LS_REPO}/ 232 | cp ${TEMPDIR}/docker-${CONTAINER_NAME}/Jenkinsfile ${TEMPDIR}/repo/${LS_REPO}/ 233 | cd ${TEMPDIR}/repo/${LS_REPO}/ 234 | git --git-dir ${TEMPDIR}/repo/${LS_REPO}/.git add Jenkinsfile README.md 235 | git --git-dir ${TEMPDIR}/repo/${LS_REPO}/.git commit -m 'Bot Updating Templated Files' 236 | git --git-dir ${TEMPDIR}/repo/${LS_REPO}/.git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/${LS_USER}/${LS_REPO}.git --all 237 | echo "true" > /tmp/${COMMIT_SHA}-${BUILD_NUMBER} 238 | else 239 | echo "false" > /tmp/${COMMIT_SHA}-${BUILD_NUMBER} 240 | fi 241 | mkdir -p ${TEMPDIR}/gitbook 242 | git clone https://github.com/linuxserver/docker-documentation.git ${TEMPDIR}/gitbook/docker-documentation 243 | if [ "${BRANCH_NAME}" = "master" ] && [ ! -f ${TEMPDIR}/gitbook/docker-documentation/images/docker-${CONTAINER_NAME}.md ] || [ "$(md5sum ${TEMPDIR}/gitbook/docker-documentation/images/docker-${CONTAINER_NAME}.md | awk '{ print $1 }')" != "$(md5sum ${TEMPDIR}/${CONTAINER_NAME}/docker-${CONTAINER_NAME}.md | awk '{ print $1 }')" ]; then 244 | cp ${TEMPDIR}/${CONTAINER_NAME}/docker-${CONTAINER_NAME}.md ${TEMPDIR}/gitbook/docker-documentation/images/ 245 | cd ${TEMPDIR}/gitbook/docker-documentation/ 246 | git add images/docker-${CONTAINER_NAME}.md 247 | git commit -m 'Bot Updating Templated Files' 248 | git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/linuxserver/docker-documentation.git --all 249 | fi 250 | rm -Rf ${TEMPDIR}''' 251 | script{ 252 | env.FILES_UPDATED = sh( 253 | script: '''cat /tmp/${COMMIT_SHA}-${BUILD_NUMBER}''', 254 | returnStdout: true).trim() 255 | } 256 | } 257 | } 258 | // Exit the build if the Templated files were just updated 259 | stage('Template-exit') { 260 | when { 261 | branch "master" 262 | environment name: 'CHANGE_ID', value: '' 263 | environment name: 'FILES_UPDATED', value: 'true' 264 | expression { 265 | env.CONTAINER_NAME != null 266 | } 267 | } 268 | steps { 269 | script{ 270 | env.EXIT_STATUS = 'ABORTED' 271 | } 272 | } 273 | } 274 | /* ############### 275 | Build Container 276 | ############### */ 277 | // Build Docker container for push to LS Repo 278 | stage('Build-Single') { 279 | when { 280 | environment name: 'MULTIARCH', value: 'false' 281 | environment name: 'EXIT_STATUS', value: '' 282 | } 283 | steps { 284 | sh "docker build --no-cache --pull -t ${IMAGE}:${META_TAG} \ 285 | --build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${META_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ." 286 | } 287 | } 288 | // Build MultiArch Docker containers for push to LS Repo 289 | stage('Build-Multi') { 290 | when { 291 | environment name: 'MULTIARCH', value: 'true' 292 | environment name: 'EXIT_STATUS', value: '' 293 | } 294 | parallel { 295 | stage('Build X86') { 296 | steps { 297 | sh "docker build --no-cache --pull -t ${IMAGE}:amd64-${META_TAG} \ 298 | --build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${META_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ." 299 | } 300 | } 301 | stage('Build ARMHF') { 302 | agent { 303 | label 'ARMHF' 304 | } 305 | steps { 306 | withCredentials([ 307 | [ 308 | $class: 'UsernamePasswordMultiBinding', 309 | credentialsId: '3f9ba4d5-100d-45b0-a3c4-633fd6061207', 310 | usernameVariable: 'DOCKERUSER', 311 | passwordVariable: 'DOCKERPASS' 312 | ] 313 | ]) { 314 | echo 'Logging into DockerHub' 315 | sh '''#! /bin/bash 316 | echo $DOCKERPASS | docker login -u $DOCKERUSER --password-stdin 317 | ''' 318 | sh "curl https://lsio-ci.ams3.digitaloceanspaces.com/qemu-arm-static -o qemu-arm-static" 319 | sh "chmod +x qemu-*" 320 | sh "docker build --no-cache --pull -f Dockerfile.armhf -t ${IMAGE}:arm32v7-${META_TAG} \ 321 | --build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${META_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ." 322 | sh "docker tag ${IMAGE}:arm32v7-${META_TAG} lsiodev/buildcache:arm32v7-${COMMIT_SHA}-${BUILD_NUMBER}" 323 | sh "docker push lsiodev/buildcache:arm32v7-${COMMIT_SHA}-${BUILD_NUMBER}" 324 | sh '''docker rmi \ 325 | ${IMAGE}:arm32v7-${META_TAG} \ 326 | lsiodev/buildcache:arm32v7-${COMMIT_SHA}-${BUILD_NUMBER} ''' 327 | } 328 | } 329 | } 330 | stage('Build ARM64') { 331 | agent { 332 | label 'ARM64' 333 | } 334 | steps { 335 | withCredentials([ 336 | [ 337 | $class: 'UsernamePasswordMultiBinding', 338 | credentialsId: '3f9ba4d5-100d-45b0-a3c4-633fd6061207', 339 | usernameVariable: 'DOCKERUSER', 340 | passwordVariable: 'DOCKERPASS' 341 | ] 342 | ]) { 343 | echo 'Logging into DockerHub' 344 | sh '''#! /bin/bash 345 | echo $DOCKERPASS | docker login -u $DOCKERUSER --password-stdin 346 | ''' 347 | sh "curl https://lsio-ci.ams3.digitaloceanspaces.com/qemu-aarch64-static -o qemu-aarch64-static" 348 | sh "chmod +x qemu-*" 349 | sh "docker build --no-cache --pull -f Dockerfile.aarch64 -t ${IMAGE}:arm64v8-${META_TAG} \ 350 | --build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${META_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ." 351 | sh "docker tag ${IMAGE}:arm64v8-${META_TAG} lsiodev/buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}" 352 | sh "docker push lsiodev/buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}" 353 | sh '''docker rmi \ 354 | ${IMAGE}:arm64v8-${META_TAG} \ 355 | lsiodev/buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} ''' 356 | } 357 | } 358 | } 359 | } 360 | } 361 | // Take the image we just built and dump package versions for comparison 362 | stage('Update-packages') { 363 | when { 364 | branch "master" 365 | environment name: 'CHANGE_ID', value: '' 366 | environment name: 'EXIT_STATUS', value: '' 367 | } 368 | steps { 369 | sh '''#! /bin/bash 370 | set -e 371 | TEMPDIR=$(mktemp -d) 372 | if [ "${MULTIARCH}" == "true" ]; then 373 | LOCAL_CONTAINER=${IMAGE}:amd64-${META_TAG} 374 | else 375 | LOCAL_CONTAINER=${IMAGE}:${META_TAG} 376 | fi 377 | if [ "${DIST_IMAGE}" == "alpine" ]; then 378 | docker run --rm --entrypoint '/bin/sh' -v ${TEMPDIR}:/tmp ${LOCAL_CONTAINER} -c '\ 379 | apk info -v > /tmp/package_versions.txt && \ 380 | sort -o /tmp/package_versions.txt /tmp/package_versions.txt && \ 381 | chmod 777 /tmp/package_versions.txt' 382 | elif [ "${DIST_IMAGE}" == "ubuntu" ]; then 383 | docker run --rm --entrypoint '/bin/sh' -v ${TEMPDIR}:/tmp ${LOCAL_CONTAINER} -c '\ 384 | apt list -qq --installed | sed "s#/.*now ##g" | cut -d" " -f1 > /tmp/package_versions.txt && \ 385 | sort -o /tmp/package_versions.txt /tmp/package_versions.txt && \ 386 | chmod 777 /tmp/package_versions.txt' 387 | fi 388 | NEW_PACKAGE_TAG=$(md5sum ${TEMPDIR}/package_versions.txt | cut -c1-8 ) 389 | echo "Package tag sha from current packages in buit container is ${NEW_PACKAGE_TAG} comparing to old ${PACKAGE_TAG} from github" 390 | if [ "${NEW_PACKAGE_TAG}" != "${PACKAGE_TAG}" ]; then 391 | git clone https://github.com/${LS_USER}/${LS_REPO}.git ${TEMPDIR}/${LS_REPO} 392 | git --git-dir ${TEMPDIR}/${LS_REPO}/.git checkout -f master 393 | cp ${TEMPDIR}/package_versions.txt ${TEMPDIR}/${LS_REPO}/ 394 | cd ${TEMPDIR}/${LS_REPO}/ 395 | wait 396 | git add package_versions.txt 397 | git commit -m 'Bot Updating Package Versions' 398 | git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/${LS_USER}/${LS_REPO}.git --all 399 | echo "true" > /tmp/packages-${COMMIT_SHA}-${BUILD_NUMBER} 400 | echo "Package tag updated, stopping build process" 401 | else 402 | echo "false" > /tmp/packages-${COMMIT_SHA}-${BUILD_NUMBER} 403 | echo "Package tag is same as previous continue with build process" 404 | fi 405 | rm -Rf ${TEMPDIR}''' 406 | script{ 407 | env.PACKAGE_UPDATED = sh( 408 | script: '''cat /tmp/packages-${COMMIT_SHA}-${BUILD_NUMBER}''', 409 | returnStdout: true).trim() 410 | } 411 | } 412 | } 413 | // Exit the build if the package file was just updated 414 | stage('PACKAGE-exit') { 415 | when { 416 | branch "master" 417 | environment name: 'CHANGE_ID', value: '' 418 | environment name: 'PACKAGE_UPDATED', value: 'true' 419 | environment name: 'EXIT_STATUS', value: '' 420 | } 421 | steps { 422 | script{ 423 | env.EXIT_STATUS = 'ABORTED' 424 | } 425 | } 426 | } 427 | // Exit the build if this is just a package check and there are no changes to push 428 | stage('PACKAGECHECK-exit') { 429 | when { 430 | branch "master" 431 | environment name: 'CHANGE_ID', value: '' 432 | environment name: 'PACKAGE_UPDATED', value: 'false' 433 | environment name: 'EXIT_STATUS', value: '' 434 | expression { 435 | params.PACKAGE_CHECK == 'true' 436 | } 437 | } 438 | steps { 439 | script{ 440 | env.EXIT_STATUS = 'ABORTED' 441 | } 442 | } 443 | } 444 | /* ####### 445 | Testing 446 | ####### */ 447 | // Run Container tests 448 | stage('Test') { 449 | when { 450 | environment name: 'CI', value: 'true' 451 | environment name: 'EXIT_STATUS', value: '' 452 | } 453 | steps { 454 | withCredentials([ 455 | string(credentialsId: 'spaces-key', variable: 'DO_KEY'), 456 | string(credentialsId: 'spaces-secret', variable: 'DO_SECRET') 457 | ]) { 458 | script{ 459 | env.CI_URL = 'https://lsio-ci.ams3.digitaloceanspaces.com/' + env.IMAGE + '/' + env.META_TAG + '/index.html' 460 | } 461 | sh '''#! /bin/bash 462 | set -e 463 | docker pull lsiodev/ci:latest 464 | if [ "${MULTIARCH}" == "true" ]; then 465 | docker pull lsiodev/buildcache:arm32v7-${COMMIT_SHA}-${BUILD_NUMBER} 466 | docker pull lsiodev/buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} 467 | docker tag lsiodev/buildcache:arm32v7-${COMMIT_SHA}-${BUILD_NUMBER} ${IMAGE}:arm32v7-${META_TAG} 468 | docker tag lsiodev/buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} ${IMAGE}:arm64v8-${META_TAG} 469 | fi 470 | docker run --rm \ 471 | -v /var/run/docker.sock:/var/run/docker.sock \ 472 | -e IMAGE=\"${IMAGE}\" \ 473 | -e DELAY_START=\"${CI_DELAY}\" \ 474 | -e TAGS=\"${CI_TAGS}\" \ 475 | -e META_TAG=\"${META_TAG}\" \ 476 | -e PORT=\"${CI_PORT}\" \ 477 | -e SSL=\"${CI_SSL}\" \ 478 | -e BASE=\"${DIST_IMAGE}\" \ 479 | -e SECRET_KEY=\"${DO_SECRET}\" \ 480 | -e ACCESS_KEY=\"${DO_KEY}\" \ 481 | -e DOCKER_ENV=\"${CI_DOCKERENV}\" \ 482 | -e WEB_SCREENSHOT=\"${CI_WEB}\" \ 483 | -e WEB_AUTH=\"${CI_AUTH}\" \ 484 | -e WEB_PATH=\"${CI_WEBPATH}\" \ 485 | -e DO_REGION="ams3" \ 486 | -e DO_BUCKET="lsio-ci" \ 487 | -t lsiodev/ci:latest \ 488 | python /ci/ci.py''' 489 | } 490 | } 491 | } 492 | /* ################## 493 | Release Logic 494 | ################## */ 495 | // If this is an amd64 only image only push a single image 496 | stage('Docker-Push-Single') { 497 | when { 498 | environment name: 'MULTIARCH', value: 'false' 499 | environment name: 'EXIT_STATUS', value: '' 500 | } 501 | steps { 502 | withCredentials([ 503 | [ 504 | $class: 'UsernamePasswordMultiBinding', 505 | credentialsId: '3f9ba4d5-100d-45b0-a3c4-633fd6061207', 506 | usernameVariable: 'DOCKERUSER', 507 | passwordVariable: 'DOCKERPASS' 508 | ] 509 | ]) { 510 | echo 'Logging into DockerHub' 511 | sh '''#! /bin/bash 512 | echo $DOCKERPASS | docker login -u $DOCKERUSER --password-stdin 513 | ''' 514 | sh "docker tag ${IMAGE}:${META_TAG} ${IMAGE}:latest" 515 | sh "docker push ${IMAGE}:latest" 516 | sh "docker push ${IMAGE}:${META_TAG}" 517 | sh '''docker rmi \ 518 | ${IMAGE}:${META_TAG} \ 519 | ${IMAGE}:latest ''' 520 | 521 | } 522 | } 523 | } 524 | // If this is a multi arch release push all images and define the manifest 525 | stage('Docker-Push-Multi') { 526 | when { 527 | environment name: 'MULTIARCH', value: 'true' 528 | environment name: 'EXIT_STATUS', value: '' 529 | } 530 | steps { 531 | withCredentials([ 532 | [ 533 | $class: 'UsernamePasswordMultiBinding', 534 | credentialsId: '3f9ba4d5-100d-45b0-a3c4-633fd6061207', 535 | usernameVariable: 'DOCKERUSER', 536 | passwordVariable: 'DOCKERPASS' 537 | ] 538 | ]) { 539 | sh '''#! /bin/bash 540 | echo $DOCKERPASS | docker login -u $DOCKERUSER --password-stdin 541 | ''' 542 | sh '''#! /bin/bash 543 | if [ "${CI}" == "false" ]; then 544 | docker pull lsiodev/buildcache:arm32v7-${COMMIT_SHA}-${BUILD_NUMBER} 545 | docker pull lsiodev/buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} 546 | docker tag lsiodev/buildcache:arm32v7-${COMMIT_SHA}-${BUILD_NUMBER} ${IMAGE}:arm32v7-${META_TAG} 547 | docker tag lsiodev/buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} ${IMAGE}:arm64v8-${META_TAG} 548 | fi''' 549 | sh "docker tag ${IMAGE}:amd64-${META_TAG} ${IMAGE}:amd64-latest" 550 | sh "docker tag ${IMAGE}:arm32v7-${META_TAG} ${IMAGE}:arm32v7-latest" 551 | sh "docker tag ${IMAGE}:arm64v8-${META_TAG} ${IMAGE}:arm64v8-latest" 552 | sh "docker push ${IMAGE}:amd64-${META_TAG}" 553 | sh "docker push ${IMAGE}:arm32v7-${META_TAG}" 554 | sh "docker push ${IMAGE}:arm64v8-${META_TAG}" 555 | sh "docker push ${IMAGE}:amd64-latest" 556 | sh "docker push ${IMAGE}:arm32v7-latest" 557 | sh "docker push ${IMAGE}:arm64v8-latest" 558 | sh "docker manifest push --purge ${IMAGE}:latest || :" 559 | sh "docker manifest create ${IMAGE}:latest ${IMAGE}:amd64-latest ${IMAGE}:arm32v7-latest ${IMAGE}:arm64v8-latest" 560 | sh "docker manifest annotate ${IMAGE}:latest ${IMAGE}:arm32v7-latest --os linux --arch arm" 561 | sh "docker manifest annotate ${IMAGE}:latest ${IMAGE}:arm64v8-latest --os linux --arch arm64 --variant v8" 562 | sh "docker manifest push --purge ${IMAGE}:${META_TAG} || :" 563 | sh "docker manifest create ${IMAGE}:${META_TAG} ${IMAGE}:amd64-${META_TAG} ${IMAGE}:arm32v7-${META_TAG} ${IMAGE}:arm64v8-${META_TAG}" 564 | sh "docker manifest annotate ${IMAGE}:${META_TAG} ${IMAGE}:arm32v7-${META_TAG} --os linux --arch arm" 565 | sh "docker manifest annotate ${IMAGE}:${META_TAG} ${IMAGE}:arm64v8-${META_TAG} --os linux --arch arm64 --variant v8" 566 | sh "docker manifest push --purge ${IMAGE}:latest" 567 | sh "docker manifest push --purge ${IMAGE}:${META_TAG}" 568 | sh '''docker rmi \ 569 | ${IMAGE}:amd64-${META_TAG} \ 570 | ${IMAGE}:amd64-latest \ 571 | ${IMAGE}:arm32v7-${META_TAG} \ 572 | ${IMAGE}:arm32v7-latest \ 573 | ${IMAGE}:arm64v8-${META_TAG} \ 574 | ${IMAGE}:arm64v8-latest \ 575 | lsiodev/buildcache:arm32v7-${COMMIT_SHA}-${BUILD_NUMBER} \ 576 | lsiodev/buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} ''' 577 | } 578 | } 579 | } 580 | // If this is a public release tag it in the LS Github 581 | stage('Github-Tag-Push-Release') { 582 | when { 583 | branch "master" 584 | expression { 585 | env.LS_RELEASE != env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-ls' + env.LS_TAG_NUMBER 586 | } 587 | environment name: 'CHANGE_ID', value: '' 588 | environment name: 'EXIT_STATUS', value: '' 589 | } 590 | steps { 591 | echo "Pushing New tag for current commit ${EXT_RELEASE_CLEAN}-pkg-${PACKAGE_TAG}-ls${LS_TAG_NUMBER}" 592 | sh '''curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \ 593 | -d '{"tag":"'${EXT_RELEASE_CLEAN}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\ 594 | "object": "'${COMMIT_SHA}'",\ 595 | "message": "Tagging Release '${EXT_RELEASE_CLEAN}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}' to master",\ 596 | "type": "commit",\ 597 | "tagger": {"name": "LinuxServer Jenkins","email": "jenkins@linuxserver.io","date": "'${GITHUB_DATE}'"}}' ''' 598 | echo "Pushing New release for Tag" 599 | sh '''#! /bin/bash 600 | curl -s https://api.github.com/repos/${EXT_USER}/${EXT_REPO}/releases/latest | jq '. |.body' | sed 's:^.\\(.*\\).$:\\1:' > releasebody.json 601 | echo '{"tag_name":"'${EXT_RELEASE_CLEAN}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\ 602 | "target_commitish": "master",\ 603 | "name": "'${EXT_RELEASE_CLEAN}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\ 604 | "body": "**LinuxServer Changes:**\\n\\n'${LS_RELEASE_NOTES}'\\n**'${EXT_REPO}' Changes:**\\n\\n' > start 605 | printf '","draft": false,"prerelease": false}' >> releasebody.json 606 | paste -d'\\0' start releasebody.json > releasebody.json.done 607 | curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done''' 608 | } 609 | } 610 | // Use helper container to sync the current README on master to the dockerhub endpoint 611 | stage('Sync-README') { 612 | when { 613 | environment name: 'CHANGE_ID', value: '' 614 | environment name: 'EXIT_STATUS', value: '' 615 | } 616 | steps { 617 | withCredentials([ 618 | [ 619 | $class: 'UsernamePasswordMultiBinding', 620 | credentialsId: '3f9ba4d5-100d-45b0-a3c4-633fd6061207', 621 | usernameVariable: 'DOCKERUSER', 622 | passwordVariable: 'DOCKERPASS' 623 | ] 624 | ]) { 625 | sh '''#! /bin/bash 626 | docker pull lsiodev/readme-sync 627 | docker run --rm=true \ 628 | -e DOCKERHUB_USERNAME=$DOCKERUSER \ 629 | -e DOCKERHUB_PASSWORD=$DOCKERPASS \ 630 | -e GIT_REPOSITORY=${LS_USER}/${LS_REPO} \ 631 | -e DOCKER_REPOSITORY=${IMAGE} \ 632 | -e GIT_BRANCH=master \ 633 | lsiodev/readme-sync bash -c 'node sync' ''' 634 | } 635 | } 636 | } 637 | // If this is a Pull request send the CI link as a comment on it 638 | stage('Pull Request Comment') { 639 | when { 640 | not {environment name: 'CHANGE_ID', value: ''} 641 | environment name: 'CI', value: 'true' 642 | environment name: 'EXIT_STATUS', value: '' 643 | } 644 | steps { 645 | sh '''curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/issues/${PULL_REQUEST}/comments \ 646 | -d '{"body": "I am a bot, here are the test results for this PR: \\n'${CI_URL}' \\n'${SHELLCHECK_URL}'"}' ''' 647 | } 648 | } 649 | } 650 | /* ###################### 651 | Send status to Discord 652 | ###################### */ 653 | post { 654 | always { 655 | script{ 656 | if (env.EXIT_STATUS == "ABORTED"){ 657 | sh 'echo "build aborted"' 658 | } 659 | else if (currentBuild.currentResult == "SUCCESS"){ 660 | sh ''' curl -X POST --data '{"avatar_url": "https://wiki.jenkins-ci.org/download/attachments/2916393/headshot.png","embeds": [{"color": 1681177,\ 661 | "description": "**Build:** '${BUILD_NUMBER}'\\n**CI Results:** '${CI_URL}'\\n**ShellCheck Results:** '${SHELLCHECK_URL}'\\n**Status:** Success\\n**Job:** '${RUN_DISPLAY_URL}'\\n**Change:** '${CODE_URL}'\\n**External Release:**: '${RELEASE_LINK}'\\n**DockerHub:** '${DOCKERHUB_LINK}'\\n"}],\ 662 | "username": "Jenkins"}' ${BUILDS_DISCORD} ''' 663 | } 664 | else { 665 | sh ''' curl -X POST --data '{"avatar_url": "https://wiki.jenkins-ci.org/download/attachments/2916393/headshot.png","embeds": [{"color": 16711680,\ 666 | "description": "**Build:** '${BUILD_NUMBER}'\\n**CI Results:** '${CI_URL}'\\n**ShellCheck Results:** '${SHELLCHECK_URL}'\\n**Status:** failure\\n**Job:** '${RUN_DISPLAY_URL}'\\n**Change:** '${CODE_URL}'\\n**External Release:**: '${RELEASE_LINK}'\\n**DockerHub:** '${DOCKERHUB_LINK}'\\n"}],\ 667 | "username": "Jenkins"}' ${BUILDS_DISCORD} ''' 668 | } 669 | } 670 | } 671 | } 672 | } 673 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![linuxserver.io](https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/linuxserver_medium.png)](https://linuxserver.io) 2 | 3 | The [LinuxServer.io](https://linuxserver.io) team brings you another container release featuring :- 4 | 5 | * regular and timely application updates 6 | * easy user mappings (PGID, PUID) 7 | * custom base image with s6 overlay 8 | * weekly base OS updates with common layers across the entire LinuxServer.io ecosystem to minimise space usage, down time and bandwidth 9 | * regular security updates 10 | 11 | Find us at: 12 | * [Discord](https://discord.gg/YWrKVTn) - realtime support / chat with the community and the team. 13 | * [IRC](https://irc.linuxserver.io) - on freenode at `#linuxserver.io`. Our primary support channel is Discord. 14 | * [Blog](https://blog.linuxserver.io) - all the things you can do with our containers including How-To guides, opinions and much more! 15 | 16 | # [linuxserver/libresonic](https://github.com/linuxserver/docker-libresonic) 17 | [![](https://img.shields.io/discord/354974912613449730.svg?logo=discord&label=LSIO%20Discord&style=flat-square)](https://discord.gg/YWrKVTn) 18 | [![](https://images.microbadger.com/badges/version/linuxserver/libresonic.svg)](https://microbadger.com/images/linuxserver/libresonic "Get your own version badge on microbadger.com") 19 | [![](https://images.microbadger.com/badges/image/linuxserver/libresonic.svg)](https://microbadger.com/images/linuxserver/libresonic "Get your own version badge on microbadger.com") 20 | ![Docker Pulls](https://img.shields.io/docker/pulls/linuxserver/libresonic.svg) 21 | ![Docker Stars](https://img.shields.io/docker/stars/linuxserver/libresonic.svg) 22 | [![Build Status](https://ci.linuxserver.io/buildStatus/icon?job=Docker-Pipeline-Builders/docker-libresonic/master)](https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-libresonic/job/master/) 23 | [![](https://lsio-ci.ams3.digitaloceanspaces.com/linuxserver/libresonic/latest/badge.svg)](https://lsio-ci.ams3.digitaloceanspaces.com/linuxserver/libresonic/latest/index.html) 24 | 25 | THIS IMAGE IS DEPRECATED. PLEASE USE AIRSONIC `linuxserver/airsonic` [Libresonic](https://github.com/Libresonic/libresonic) is a free, web-based media streamer, providing ubiqutious access to your music. Use it to share your music with friends, or to listen to your own music while at work. You can stream to multiple players simultaneously, for instance to one player in your kitchen and another in your living room. 26 | 27 | [![libresonic](https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/libresonic.png)](https://github.com/Libresonic/libresonic) 28 | 29 | ## Supported Architectures 30 | 31 | Our images support multiple architectures such as `x86-64`, `arm64` and `armhf`. We utilise the docker manifest for multi-platform awareness. More information is available from docker [here](https://github.com/docker/distribution/blob/master/docs/spec/manifest-v2-2.md#manifest-list) and our announcement [here](https://blog.linuxserver.io/2019/02/21/the-lsio-pipeline-project/). 32 | 33 | Simply pulling `linuxserver/libresonic` should retrieve the correct image for your arch, but you can also pull specific arch images via tags. 34 | 35 | The architectures supported by this image are: 36 | 37 | | Architecture | Tag | 38 | | :----: | --- | 39 | | x86-64 | amd64-latest | 40 | | arm64 | arm64v8-latest | 41 | | armhf | arm32v7-latest | 42 | 43 | 44 | ## Usage 45 | 46 | Here are some example snippets to help you get started creating a container. 47 | 48 | ### docker 49 | 50 | ``` 51 | docker create \ 52 | --name=libresonic \ 53 | -e PUID=1000 \ 54 | -e PGID=1000 \ 55 | -e TZ=Europe/London \ 56 | -e CONTEXT_PATH= `#optional` \ 57 | -p 4040:4040 \ 58 | -v :/config \ 59 | -v :/music \ 60 | -v :/playlists \ 61 | -v :/podcasts \ 62 | -v :/media `#optional` \ 63 | --restart unless-stopped \ 64 | linuxserver/libresonic 65 | ``` 66 | 67 | 68 | ### docker-compose 69 | 70 | Compatible with docker-compose v2 schemas. 71 | 72 | ``` 73 | --- 74 | version: "2" 75 | services: 76 | libresonic: 77 | image: linuxserver/libresonic 78 | container_name: libresonic 79 | environment: 80 | - PUID=1000 81 | - PGID=1000 82 | - TZ=Europe/London 83 | - CONTEXT_PATH= #optional 84 | volumes: 85 | - :/config 86 | - :/music 87 | - :/playlists 88 | - :/podcasts 89 | - :/media #optional 90 | ports: 91 | - 4040:4040 92 | restart: unless-stopped 93 | ``` 94 | 95 | ## Parameters 96 | 97 | Container images are configured using parameters passed at runtime (such as those above). These parameters are separated by a colon and indicate `:` respectively. For example, `-p 8080:80` would expose port `80` from inside the container to be accessible from the host's IP on port `8080` outside the container. 98 | 99 | | Parameter | Function | 100 | | :----: | --- | 101 | | `-p 4040` | WebUI | 102 | | `-e PUID=1000` | for UserID - see below for explanation | 103 | | `-e PGID=1000` | for GroupID - see below for explanation | 104 | | `-e TZ=Europe/London` | Specify a timezone to use EG Europe/London. | 105 | | `-e CONTEXT_PATH=` | For setting url-base in reverse proxy setups. | 106 | | `-v /config` | Configuration file location. | 107 | | `-v /music` | Location of music. | 108 | | `-v /playlists` | Location for playlists to be saved to. | 109 | | `-v /podcasts` | Location of podcasts. | 110 | | `-v /media` | Location of other media. | 111 | 112 | ## User / Group Identifiers 113 | 114 | When using volumes (`-v` flags) permissions issues can arise between the host OS and the container, we avoid this issue by allowing you to specify the user `PUID` and group `PGID`. 115 | 116 | Ensure any volume directories on the host are owned by the same user you specify and any permissions issues will vanish like magic. 117 | 118 | In this instance `PUID=1000` and `PGID=1000`, to find yours use `id user` as below: 119 | 120 | ``` 121 | $ id username 122 | uid=1000(dockeruser) gid=1000(dockergroup) groups=1000(dockergroup) 123 | ``` 124 | 125 | 126 |   127 | ## Application Setup 128 | 129 | Access WebUI at `:4040`. 130 | 131 | Default user/pass is admin/admin 132 | 133 | 134 | 135 | ## Support Info 136 | 137 | * Shell access whilst the container is running: `docker exec -it libresonic /bin/bash` 138 | * To monitor the logs of the container in realtime: `docker logs -f libresonic` 139 | * container version number 140 | * `docker inspect -f '{{ index .Config.Labels "build_version" }}' libresonic` 141 | * image version number 142 | * `docker inspect -f '{{ index .Config.Labels "build_version" }}' linuxserver/libresonic` 143 | 144 | ## Updating Info 145 | 146 | Most of our images are static, versioned, and require an image update and container recreation to update the app inside. With some exceptions (ie. nextcloud, plex), we do not recommend or support updating apps inside the container. Please consult the [Application Setup](#application-setup) section above to see if it is recommended for the image. 147 | 148 | Below are the instructions for updating containers: 149 | 150 | ### Via Docker Run/Create 151 | * Update the image: `docker pull linuxserver/libresonic` 152 | * Stop the running container: `docker stop libresonic` 153 | * Delete the container: `docker rm libresonic` 154 | * Recreate a new container with the same docker create parameters as instructed above (if mapped correctly to a host folder, your `/config` folder and settings will be preserved) 155 | * Start the new container: `docker start libresonic` 156 | * You can also remove the old dangling images: `docker image prune` 157 | 158 | ### Via Taisun auto-updater (especially useful if you don't remember the original parameters) 159 | * Pull the latest image at its tag and replace it with the same env variables in one shot: 160 | ``` 161 | docker run --rm \ 162 | -v /var/run/docker.sock:/var/run/docker.sock taisun/updater \ 163 | --oneshot libresonic 164 | ``` 165 | * You can also remove the old dangling images: `docker image prune` 166 | 167 | ### Via Docker Compose 168 | * Update all images: `docker-compose pull` 169 | * or update a single image: `docker-compose pull libresonic` 170 | * Let compose update all containers as necessary: `docker-compose up -d` 171 | * or update a single container: `docker-compose up -d libresonic` 172 | * You can also remove the old dangling images: `docker image prune` 173 | 174 | ## Versions 175 | 176 | * **24.03.19:** - Switching to new Base images, shift to arm32v7 tag. 177 | * **15.01.19:** - Pull war from github, adding pipeline multi arch builds. 178 | * **05.01.19:** - Linting fixes. 179 | * **27.08.18:** - Rebase to ubuntu bionic. 180 | * **12.12.17:** - Rebase to alpine 3.7. 181 | * **11.07.17:** - Rebase to alpine 3.6. 182 | * **12.05.17:** - Add annotation timeout (primarily for armhf and lower powered hosts). 183 | * **08.02.17:** - Rebase to alpine 3.5. 184 | * **04.12.16:** - Update jetty runner version. 185 | * **29.11.16:** - Switch to building from release tags following v6.1 stable release. 186 | * **17.11.16:** - Initial Release. 187 | -------------------------------------------------------------------------------- /jenkins-vars.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | # jenkins variables 4 | project_name: docker-libresonic 5 | external_type: github_stable 6 | release_type: stable 7 | release_tag: latest 8 | ls_branch: master 9 | repo_vars: 10 | - EXT_GIT_BRANCH = 'master' 11 | - EXT_USER = 'Libresonic' 12 | - EXT_REPO = 'libresonic' 13 | - BUILD_VERSION_ARG = 'LIBRESONIC_RELEASE' 14 | - LS_USER = 'linuxserver' 15 | - LS_REPO = 'docker-libresonic' 16 | - CONTAINER_NAME = 'libresonic' 17 | - DOCKERHUB_IMAGE = 'linuxserver/libresonic' 18 | - DEV_DOCKERHUB_IMAGE = 'lsiodev/libresonic' 19 | - PR_DOCKERHUB_IMAGE = 'lspipepr/libresonic' 20 | - DIST_IMAGE = 'ubuntu' 21 | - MULTIARCH='true' 22 | - CI='true' 23 | - CI_WEB='true' 24 | - CI_PORT='4040' 25 | - CI_SSL='false' 26 | - CI_DELAY='360' 27 | - CI_DOCKERENV='TZ=US/Pacific' 28 | - CI_AUTH='user:password' 29 | - CI_WEBPATH='' 30 | -------------------------------------------------------------------------------- /package_versions.txt: -------------------------------------------------------------------------------- 1 | adduser3.116ubuntu1 2 | apt-utils1.6.10 3 | apt1.6.10 4 | base-files10.1ubuntu2.4 5 | base-passwd3.5.44 6 | bash4.4.18-2ubuntu1 7 | bsdutils1:2.31.1-0.4ubuntu3.3 8 | bzip21.0.6-8.1 9 | ca-certificates-java20180516ubuntu1~18.04.1 10 | ca-certificates20180409 11 | coreutils8.28-1ubuntu1 12 | curl7.58.0-2ubuntu3.6 13 | dash0.5.8-2.10 14 | debconf1.5.66 15 | debianutils4.8.4 16 | diffutils1:3.6-1 17 | dpkg1.19.0.5ubuntu2.1 18 | e2fsprogs1.44.1-1ubuntu1.1 19 | fdisk2.31.1-0.4ubuntu3.3 20 | ffmpeg7:3.4.4-0ubuntu0.18.04.1 21 | findutils4.6.0+git+20170828-2 22 | flac1.3.2-1 23 | fontconfig-config2.12.6-0ubuntu2 24 | fontconfig2.12.6-0ubuntu2 25 | fonts-dejavu-core2.37-1 26 | fonts-dejavu-extra2.37-1 27 | fonts-dejavu2.37-1 28 | gcc-8-base8.2.0-1ubuntu2~18.04 29 | gpgv2.2.4-1ubuntu1.2 30 | grep3.1-2 31 | gzip1.6-5ubuntu1 32 | hostname3.20 33 | init-system-helpers1.51 34 | java-common0.68ubuntu1~18.04.1 35 | krb5-locales1.16-2ubuntu0.1 36 | lame3.100-2 37 | libacl12.2.52-3build1 38 | libapt-inst2.01.6.10 39 | libapt-pkg5.01.6.10 40 | libasn1-8-heimdal7.5.0+dfsg-1 41 | libasound2-data1.1.3-5ubuntu0.2 42 | libasound21.1.3-5ubuntu0.2 43 | libass91:0.14.0-1 44 | libasyncns00.8-6 45 | libattr11:2.4.47-2build1 46 | libaudit-common1:2.8.2-1ubuntu1 47 | libaudit11:2.8.2-1ubuntu1 48 | libavahi-client30.7-3.1ubuntu1.2 49 | libavahi-common-data0.7-3.1ubuntu1.2 50 | libavahi-common30.7-3.1ubuntu1.2 51 | libavc1394-00.5.4-4build1 52 | libavcodec577:3.4.4-0ubuntu0.18.04.1 53 | libavdevice577:3.4.4-0ubuntu0.18.04.1 54 | libavfilter67:3.4.4-0ubuntu0.18.04.1 55 | libavformat577:3.4.4-0ubuntu0.18.04.1 56 | libavresample37:3.4.4-0ubuntu0.18.04.1 57 | libavutil557:3.4.4-0ubuntu0.18.04.1 58 | libblkid12.31.1-0.4ubuntu3.3 59 | libbluray21:1.0.2-3 60 | libbs2b03.1.0+dfsg-2.2 61 | libbsd00.8.7-1 62 | libbz2-1.01.0.6-8.1 63 | libc-bin2.27-3ubuntu1 64 | libc62.27-3ubuntu1 65 | libcaca00.99.beta19-2ubuntu0.18.04.1 66 | libcairo21.15.10-2ubuntu0.1 67 | libcap-ng00.7.7-3.1 68 | libcdio-cdda210.2+0.94+2-2build1 69 | libcdio-paranoia210.2+0.94+2-2build1 70 | libcdio171.0.0-2ubuntu2 71 | libchromaprint11.4.3-1 72 | libcom-err21.44.1-1ubuntu1.1 73 | libcroco30.6.12-2 74 | libcrystalhd31:0.0~git20110715.fdd2f19-12 75 | libcups22.2.7-1ubuntu2.4 76 | libcurl47.58.0-2ubuntu3.6 77 | libdatrie10.2.10-7 78 | libdb5.35.3.28-13.1ubuntu1 79 | libdbus-1-31.12.2-1ubuntu1 80 | libdc1394-222.2.5-1 81 | libdebconfclient00.213ubuntu1 82 | libdrm-amdgpu12.4.95-1~18.04.1 83 | libdrm-common2.4.95-1~18.04.1 84 | libdrm-intel12.4.95-1~18.04.1 85 | libdrm-nouveau22.4.95-1~18.04.1 86 | libdrm-radeon12.4.95-1~18.04.1 87 | libdrm22.4.95-1~18.04.1 88 | libedit23.1-20170329-1 89 | libelf10.170-0.4 90 | libexpat12.2.5-3 91 | libext2fs21.44.1-1ubuntu1.1 92 | libfdisk12.31.1-0.4ubuntu3.3 93 | libffi63.2.1-8 94 | libfftw3-double33.3.7-1 95 | libflac81.3.2-1 96 | libflite12.1-release-1 97 | libfontconfig12.12.6-0ubuntu2 98 | libfreetype62.8.1-2ubuntu2 99 | libfribidi00.19.7-2 100 | libgcc11:8.2.0-1ubuntu2~18.04 101 | libgcrypt201.8.1-4ubuntu1.1 102 | libgdk-pixbuf2.0-02.36.11-2 103 | libgdk-pixbuf2.0-common2.36.11-2 104 | libgl1-mesa-dri18.2.8-0ubuntu0~18.04.2 105 | libgl11.0.0-2ubuntu2.2 106 | libglapi-mesa18.2.8-0ubuntu0~18.04.2 107 | libglib2.0-02.56.3-0ubuntu0.18.04.1 108 | libglvnd01.0.0-2ubuntu2.2 109 | libglx-mesa018.2.8-0ubuntu0~18.04.2 110 | libglx01.0.0-2ubuntu2.2 111 | libgme00.6.2-1 112 | libgmp102:6.1.2+dfsg-2 113 | libgnutls303.5.18-1ubuntu1 114 | libgomp18.2.0-1ubuntu2~18.04 115 | libgpg-error01.27-6 116 | libgraphite2-31.3.11-2 117 | libgsm11.0.13-4build1 118 | libgssapi-krb5-21.16-2ubuntu0.1 119 | libgssapi3-heimdal7.5.0+dfsg-1 120 | libharfbuzz0b1.7.2-1ubuntu1 121 | libhcrypto4-heimdal7.5.0+dfsg-1 122 | libheimbase1-heimdal7.5.0+dfsg-1 123 | libheimntlm0-heimdal7.5.0+dfsg-1 124 | libhogweed43.4-1 125 | libhx509-5-heimdal7.5.0+dfsg-1 126 | libicu6060.2-3ubuntu3 127 | libidn2-02.0.4-1.1build2 128 | libiec61883-01.2.0-2 129 | libjack-jackd2-01.9.12~dfsg-2 130 | libjbig02.1-3.1build1 131 | libjpeg-turbo81.5.2-0ubuntu5.18.04.1 132 | libjpeg88c-2ubuntu8 133 | libk5crypto31.16-2ubuntu0.1 134 | libkeyutils11.5.9-9.2ubuntu2 135 | libkrb5-26-heimdal7.5.0+dfsg-1 136 | libkrb5-31.16-2ubuntu0.1 137 | libkrb5support01.16-2ubuntu0.1 138 | liblcms2-22.9-1ubuntu0.1 139 | libldap-2.4-22.4.45+dfsg-1ubuntu1.1 140 | libldap-common2.4.45+dfsg-1ubuntu1.1 141 | libllvm71:7-3~ubuntu0.18.04.1 142 | liblz4-10.0~r131-2ubuntu3 143 | liblzma55.2.2-1.3 144 | libmount12.31.1-0.4ubuntu3.3 145 | libmp3lame03.100-2 146 | libmpg123-01.25.10-1 147 | libmysofa00.6~dfsg0-2 148 | libncurses56.1-1ubuntu1.18.04 149 | libncursesw56.1-1ubuntu1.18.04 150 | libnettle63.4-1 151 | libnghttp2-141.30.0-1ubuntu1 152 | libnorm11.5r6+dfsg1-6 153 | libnspr42:4.18-1ubuntu1 154 | libnss32:3.35-2ubuntu2.2 155 | libnuma12.0.11-2.1ubuntu0.1 156 | libogg01.3.2-1 157 | libopenal-data1:1.18.2-2 158 | libopenal11:1.18.2-2 159 | libopenjp2-72.3.0-1 160 | libopenmpt00.3.6-1 161 | libopus01.1.2-1ubuntu1 162 | libp11-kit00.23.9-2 163 | libpam-modules-bin1.1.8-3.6ubuntu2.18.04.1 164 | libpam-modules1.1.8-3.6ubuntu2.18.04.1 165 | libpam-runtime1.1.8-3.6ubuntu2.18.04.1 166 | libpam0g1.1.8-3.6ubuntu2.18.04.1 167 | libpango-1.0-01.40.14-1ubuntu0.1 168 | libpangocairo-1.0-01.40.14-1ubuntu0.1 169 | libpangoft2-1.0-01.40.14-1ubuntu0.1 170 | libpciaccess00.14-1 171 | libpcre32:8.39-9 172 | libpcsclite11.8.23-1 173 | libpgm-5.2-05.2.122~dfsg-2 174 | libpixman-1-00.34.0-2 175 | libpng16-161.6.34-1ubuntu0.18.04.1 176 | libpostproc547:3.4.4-0ubuntu0.18.04.1 177 | libprocps62:3.3.12-3ubuntu1.1 178 | libpsl50.19.1-5build1 179 | libpulse01:11.1-1ubuntu7.2 180 | libraw1394-112.1.2-1 181 | libroken18-heimdal7.5.0+dfsg-1 182 | librsvg2-22.40.20-2 183 | librtmp12.4+20151223.gitfa8646d.1-1 184 | librubberband21.8.1-7ubuntu2 185 | libsamplerate00.1.9-1 186 | libsasl2-22.1.27~101-g0780600+dfsg-3ubuntu2 187 | libsasl2-modules-db2.1.27~101-g0780600+dfsg-3ubuntu2 188 | libsasl2-modules2.1.27~101-g0780600+dfsg-3ubuntu2 189 | libsdl2-2.0-02.0.8+dfsg1-1ubuntu1.18.04.3 190 | libseccomp22.3.1-2.1ubuntu4.1 191 | libselinux12.7-2build2 192 | libsemanage-common2.7-2build2 193 | libsemanage12.7-2build2 194 | libsensors41:3.4.0-4 195 | libsepol12.7-1 196 | libshine33.1.1-1 197 | libslang22.3.1a-3ubuntu1 198 | libsmartcols12.31.1-0.4ubuntu3.3 199 | libsnappy1v51.1.7-1 200 | libsndfile11.0.28-4 201 | libsndio6.11.1.0-3 202 | libsodium231.0.16-2 203 | libsoxr00.1.2-3 204 | libspeex11.2~rc1.2-1ubuntu2 205 | libsqlite3-03.22.0-1 206 | libss21.44.1-1ubuntu1.1 207 | libssh-gcrypt-40.8.0~20170825.94fa1e38-1ubuntu0.2 208 | libssl1.11.1.0g-2ubuntu4.3 209 | libstdc++68.2.0-1ubuntu2~18.04 210 | libswresample27:3.4.4-0ubuntu0.18.04.1 211 | libswscale47:3.4.4-0ubuntu0.18.04.1 212 | libsystemd0237-3ubuntu10.20 213 | libtasn1-64.13-2 214 | libthai-data0.1.27-2 215 | libthai00.1.27-2 216 | libtheora01.1.1+dfsg.1-14 217 | libtiff54.0.9-5ubuntu0.2 218 | libtinfo56.1-1ubuntu1.18.04 219 | libtwolame00.3.13-3 220 | libudev1237-3ubuntu10.20 221 | libunistring20.9.9-0ubuntu2 222 | libusb-1.0-02:1.0.21-2 223 | libuuid12.31.1-0.4ubuntu3.3 224 | libva-drm22.1.0-3 225 | libva-x11-22.1.0-3 226 | libva22.1.0-3 227 | libvdpau11.1.1-3ubuntu1 228 | libvorbis0a1.3.5-4.2 229 | libvorbisenc21.3.5-4.2 230 | libvorbisfile31.3.5-4.2 231 | libvpx51.7.0-3 232 | libwavpack15.1.0-2ubuntu1.2 233 | libwayland-client01.16.0-1ubuntu1.1~18.04.1 234 | libwayland-cursor01.16.0-1ubuntu1.1~18.04.1 235 | libwayland-egl11.16.0-1ubuntu1.1~18.04.1 236 | libwebp60.6.1-2 237 | libwebpmux30.6.1-2 238 | libwind0-heimdal7.5.0+dfsg-1 239 | libwrap07.6.q-27 240 | libx11-62:1.6.4-3ubuntu0.2 241 | libx11-data2:1.6.4-3ubuntu0.2 242 | libx11-xcb12:1.6.4-3ubuntu0.2 243 | libx264-1522:0.152.2854+gite9a5903-2 244 | libx265-1462.6-3 245 | libxau61:1.0.8-1 246 | libxcb-dri2-01.13-2~ubuntu18.04 247 | libxcb-dri3-01.13-2~ubuntu18.04 248 | libxcb-glx01.13-2~ubuntu18.04 249 | libxcb-present01.13-2~ubuntu18.04 250 | libxcb-render01.13-2~ubuntu18.04 251 | libxcb-shape01.13-2~ubuntu18.04 252 | libxcb-shm01.13-2~ubuntu18.04 253 | libxcb-sync11.13-2~ubuntu18.04 254 | libxcb-xfixes01.13-2~ubuntu18.04 255 | libxcb11.13-2~ubuntu18.04 256 | libxcursor11:1.1.15-1 257 | libxdamage11:1.1.4-3 258 | libxdmcp61:1.1.2-3 259 | libxext62:1.3.3-1 260 | libxfixes31:5.0.3-1 261 | libxi62:1.7.9-1 262 | libxinerama12:1.1.3-1 263 | libxkbcommon00.8.0-1ubuntu0.1 264 | libxml22.9.4+dfsg1-6.1ubuntu1.2 265 | libxrandr22:1.5.1-1 266 | libxrender11:0.9.10-1 267 | libxshmfence11.3-1 268 | libxss11:1.2.2-1 269 | libxtst62:1.2.3-1 270 | libxv12:1.0.11-1 271 | libxvidcore42:1.3.5-1 272 | libxxf86vm11:1.1.4-1 273 | libzmq54.2.5-1ubuntu0.1 274 | libzstd11.3.3+dfsg-2ubuntu1 275 | libzvbi-common0.2.35-13 276 | libzvbi00.2.35-13 277 | locales2.27-3ubuntu1 278 | login1:4.5-1ubuntu1 279 | lsb-base9.20170808ubuntu1 280 | mawk1.3.3-17ubuntu3 281 | mount2.31.1-0.4ubuntu3.3 282 | multiarch-support2.27-3ubuntu1 283 | ncurses-base6.1-1ubuntu1.18.04 284 | ncurses-bin6.1-1ubuntu1.18.04 285 | openjdk-8-jre-headless8u191-b12-2ubuntu0.18.04.1 286 | openssl1.1.0g-2ubuntu4.3 287 | passwd1:4.5-1ubuntu1 288 | perl-base5.26.1-6ubuntu0.3 289 | procps2:3.3.12-3ubuntu1.1 290 | publicsuffix20180223.1310-1 291 | sed4.4-2 292 | sensible-utils0.0.12 293 | shared-mime-info1.9-2 294 | sysvinit-utils2.88dsf-59.10ubuntu1 295 | tar1.29b-2ubuntu0.1 296 | ttf-dejavu-core2.37-1 297 | ttf-dejavu-extra2.37-1 298 | ttf-dejavu2.37-1 299 | tzdata2019a-0ubuntu0.18.04 300 | ubuntu-keyring2018.09.18.1~18.04.0 301 | ucf3.0038 302 | util-linux2.31.1-0.4ubuntu3.3 303 | x11-common1:7.7+19ubuntu7.1 304 | xkb-data2.23.1-1ubuntu1 305 | zlib1g1:1.2.11.dfsg-0ubuntu2 306 | -------------------------------------------------------------------------------- /prebuilds/jetty-runner: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | java="${JAVA_HOME:+$JAVA_HOME/bin/}java" 4 | 5 | $java $JAVA_OPTS -cp /usr/share/java/jetty-runner.jar org.eclipse.jetty.runner.Runner $@ 6 | 7 | 8 | -------------------------------------------------------------------------------- /readme-vars.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | # project information 4 | project_name: libresonic 5 | project_url: "https://github.com/Libresonic/libresonic" 6 | project_logo: "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/libresonic.png" 7 | project_blurb: "THIS IMAGE IS DEPRECATED. PLEASE USE AIRSONIC `linuxserver/airsonic` [{{ project_name|capitalize }}]({{ project_url }}) is a free, web-based media streamer, providing ubiqutious access to your music. Use it to share your music with friends, or to listen to your own music while at work. You can stream to multiple players simultaneously, for instance to one player in your kitchen and another in your living room." 8 | project_lsio_github_repo_url: "https://github.com/linuxserver/docker-{{ project_name }}" 9 | project_blurb_optional_extras_enabled: false 10 | 11 | # supported architectures 12 | available_architectures: 13 | - { arch: "{{ arch_x86_64 }}", tag: "amd64-latest"} 14 | - { arch: "{{ arch_arm64 }}", tag: "arm64v8-latest"} 15 | - { arch: "{{ arch_armhf }}", tag: "arm32v7-latest"} 16 | 17 | # development version 18 | development_versions: false 19 | 20 | # container parameters 21 | common_param_env_vars_enabled: true 22 | param_container_name: "{{ project_name }}" 23 | param_usage_include_net: false 24 | param_usage_include_env: true 25 | param_env_vars: 26 | - { env_var: "TZ", env_value: "Europe/London", desc: "Specify a timezone to use EG Europe/London." } 27 | param_usage_include_vols: true 28 | param_volumes: 29 | - { vol_path: "/config", vol_host_path: "", desc: "Configuration file location." } 30 | - { vol_path: "/music", vol_host_path: "", desc: "Location of music." } 31 | - { vol_path: "/playlists", vol_host_path: "", desc: "Location for playlists to be saved to." } 32 | - { vol_path: "/podcasts", vol_host_path: "", desc: "Location of podcasts." } 33 | param_usage_include_ports: true 34 | param_ports: 35 | - { external_port: "4040", internal_port: "4040", port_desc: "WebUI" } 36 | param_device_map: false 37 | cap_add_param: false 38 | 39 | # optional container parameters 40 | opt_param_usage_include_env: true 41 | opt_param_env_vars: 42 | - { env_var: "CONTEXT_PATH", env_value: "", desc: "For setting url-base in reverse proxy setups." } 43 | opt_param_usage_include_vols: true 44 | opt_param_volumes: 45 | - { vol_path: "/media", vol_host_path: "", desc: "Location of other media." } 46 | opt_param_usage_include_ports: false 47 | opt_param_device_map: false 48 | opt_cap_add_param: false 49 | optional_block_1: false 50 | 51 | # application setup block 52 | app_setup_block_enabled: true 53 | app_setup_block: | 54 | Access WebUI at `:4040`. 55 | 56 | Default user/pass is admin/admin 57 | 58 | # changelog 59 | changelogs: 60 | - { date: "24.03.19:", desc: "Switching to new Base images, shift to arm32v7 tag." } 61 | - { date: "15.01.19:", desc: "Pull war from github, adding pipeline multi arch builds." } 62 | - { date: "05.01.19:", desc: "Linting fixes." } 63 | - { date: "27.08.18:", desc: "Rebase to ubuntu bionic." } 64 | - { date: "12.12.17:", desc: "Rebase to alpine 3.7." } 65 | - { date: "11.07.17:", desc: "Rebase to alpine 3.6." } 66 | - { date: "12.05.17:", desc: "Add annotation timeout (primarily for armhf and lower powered hosts)." } 67 | - { date: "08.02.17:", desc: "Rebase to alpine 3.5." } 68 | - { date: "04.12.16:", desc: "Update jetty runner version." } 69 | - { date: "29.11.16:", desc: "Switch to building from release tags following v6.1 stable release." } 70 | - { date: "17.11.16:", desc: "Initial Release." } 71 | -------------------------------------------------------------------------------- /root/etc/cont-init.d/20-config: -------------------------------------------------------------------------------- 1 | #!/usr/bin/with-contenv bash 2 | 3 | mkdir -p "${LIBRE_SETTINGS}"/transcode 4 | 5 | if [[ ! -e "${LIBRE_SETTINGS}"/transcode/ffmpeg || ! -e "${LIBRE_SETTINGS}"/transcode/flac || ! -e "${LIBRE_SETTINGS}"/transcode/lame ]]; then 6 | ln -sf /usr/bin/ffmpeg "${LIBRE_SETTINGS}"/transcode/ 7 | ln -sf /usr/bin/flac "${LIBRE_SETTINGS}"/transcode/ 8 | ln -sf /usr/bin/lame "${LIBRE_SETTINGS}"/transcode/ 9 | fi 10 | 11 | chown -R abc:abc /config "${LIBRE_SETTINGS}" "${LIBRE_HOME}" 12 | -------------------------------------------------------------------------------- /root/etc/cont-init.d/90-config: -------------------------------------------------------------------------------- 1 | #!/usr/bin/with-contenv bash 2 | 3 | echo ' 4 | ****************************************************** 5 | ****************************************************** 6 | * * 7 | * * 8 | * This image has been deprecated * 9 | * * 10 | * Use the currently supported * 11 | * * 12 | * linuxserver/airsonic * 13 | * * 14 | * https://hub.docker.com/r/linuxserver/airsonic * 15 | * * 16 | * https://github.com/linuxserver/docker-airsonic * 17 | * * 18 | * * 19 | * * 20 | ****************************************************** 21 | ******************************************************' 22 | -------------------------------------------------------------------------------- /root/etc/services.d/libresonic/run: -------------------------------------------------------------------------------- 1 | #!/usr/bin/with-contenv bash 2 | 3 | # strip leading slash if present in set variable 4 | [[ -n "$CONTEXT_PATH" ]] && CONTEXT_PATH="${CONTEXT_PATH#/}" 5 | 6 | # set url base to / if variable not set, readding leading slash if variable is set. 7 | URL_BASE="/${CONTEXT_PATH}" 8 | 9 | cd "${LIBRE_HOME}" || exit 10 | exec \ 11 | s6-setuidgid abc \ 12 | java \ 13 | -Dlibresonic.home="${LIBRE_SETTINGS}" \ 14 | -Dlibresonic.defaultMusicFolder=/music \ 15 | -Dlibresonic.defaultPodcastFolder=/podcasts \ 16 | -Dlibresonic.defaultPlaylistFolder=/playlists \ 17 | -Dserver.contextPath="${URL_BASE}" \ 18 | -Dserver.host=0.0.0.0 \ 19 | -Dserver.port=4040 \ 20 | "${RUN_ARRAY[@]}" \ 21 | -jar libresonic.war 22 | --------------------------------------------------------------------------------