From f835af8ae20f5b59a34065b349f888d6fe9cdb9f Mon Sep 17 00:00:00 2001 From: aptalca <541623+aptalca@users.noreply.github.com> Date: Sat, 7 Oct 2023 20:40:10 -0400 Subject: [PATCH 1/3] install unrar from lsio repo --- Dockerfile | 10 +++- Dockerfile.aarch64 | 10 +++- Jenkinsfile | 77 +++++++++++++------------ README.md | 137 +++++++++++++++++++++++++++++++++------------ readme-vars.yml | 1 + 5 files changed, 160 insertions(+), 75 deletions(-) diff --git a/Dockerfile b/Dockerfile index ef6c0ca75..c758b9e05 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,3 +1,7 @@ +# syntax=docker/dockerfile:1 + +FROM ghcr.io/linuxserver/unrar:latest as unrar + FROM ghcr.io/linuxserver/baseimage-ubuntu:jammy # set version label @@ -30,8 +34,7 @@ RUN \ libxtst6 \ python3-minimal \ python3-pip \ - python3-pkg-resources \ - unrar && \ + python3-pkg-resources && \ echo "**** install calibre-web ****" && \ if [ -z ${CALIBREWEB_RELEASE+x} ]; then \ CALIBREWEB_RELEASE=$(curl -sX GET "https://api.github.com/repos/janeczku/calibre-web/releases/latest" \ @@ -76,6 +79,9 @@ RUN \ # add local files COPY root/ / +# add unrar +COPY --from=unrar /usr/bin/unrar-ubuntu /usr/bin/unrar + # ports and volumes EXPOSE 8083 VOLUME /config diff --git a/Dockerfile.aarch64 b/Dockerfile.aarch64 index 73f1d9187..c9936b749 100644 --- a/Dockerfile.aarch64 +++ b/Dockerfile.aarch64 @@ -1,3 +1,7 @@ +# syntax=docker/dockerfile:1 + +FROM ghcr.io/linuxserver/unrar:arm64v8-latest as unrar + FROM ghcr.io/linuxserver/baseimage-ubuntu:arm64v8-jammy # set version label @@ -36,8 +40,7 @@ RUN \ libxtst6 \ python3-minimal \ python3-pip \ - python3-pkg-resources \ - unrar && \ + python3-pkg-resources && \ echo "**** install calibre-web ****" && \ if [ -z ${CALIBREWEB_RELEASE+x} ]; then \ CALIBREWEB_RELEASE=$(curl -sX GET "https://api.github.com/repos/janeczku/calibre-web/releases/latest" \ @@ -88,6 +91,9 @@ RUN \ # add local files COPY root/ / +# add unrar +COPY --from=unrar /usr/bin/unrar-ubuntu /usr/bin/unrar + # ports and volumes EXPOSE 8083 VOLUME /config diff --git a/Jenkinsfile b/Jenkinsfile index ace8c8ed6..5a17e4964 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -16,7 +16,6 @@ pipeline { GITHUB_TOKEN=credentials('498b4638-2d02-4ce5-832d-8a57d01d97ab') GITLAB_TOKEN=credentials('b6f0f1dd-6952-4cf6-95d1-9c06380283f0') GITLAB_NAMESPACE=credentials('gitlab-namespace-id') - SCARF_TOKEN=credentials('scarf_api_key') EXT_GIT_BRANCH = 'master' EXT_USER = 'janeczku' EXT_REPO = 'calibre-web' @@ -339,12 +338,12 @@ pipeline { else echo "false" > /tmp/${COMMIT_SHA}-${BUILD_NUMBER} fi - mkdir -p ${TEMPDIR}/gitbook - git clone https://github.com/linuxserver/docker-documentation.git ${TEMPDIR}/gitbook/docker-documentation - if [[ ("${BRANCH_NAME}" == "master") || ("${BRANCH_NAME}" == "main") ]] && [[ (! -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}/docker-${CONTAINER_NAME}/.jenkins-external/docker-${CONTAINER_NAME}.md | awk '{ print $1 }')") ]]; then - cp ${TEMPDIR}/docker-${CONTAINER_NAME}/.jenkins-external/docker-${CONTAINER_NAME}.md ${TEMPDIR}/gitbook/docker-documentation/images/ - cd ${TEMPDIR}/gitbook/docker-documentation/ - git add images/docker-${CONTAINER_NAME}.md + mkdir -p ${TEMPDIR}/docs + git clone https://github.com/linuxserver/docker-documentation.git ${TEMPDIR}/docs/docker-documentation + if [[ ("${BRANCH_NAME}" == "master") || ("${BRANCH_NAME}" == "main") ]] && [[ (! -f ${TEMPDIR}/docs/docker-documentation/docs/images/docker-${CONTAINER_NAME}.md) || ("$(md5sum ${TEMPDIR}/docs/docker-documentation/docs/images/docker-${CONTAINER_NAME}.md | awk '{ print $1 }')" != "$(md5sum ${TEMPDIR}/docker-${CONTAINER_NAME}/.jenkins-external/docker-${CONTAINER_NAME}.md | awk '{ print $1 }')") ]]; then + cp ${TEMPDIR}/docker-${CONTAINER_NAME}/.jenkins-external/docker-${CONTAINER_NAME}.md ${TEMPDIR}/docs/docker-documentation/docs/images/ + cd ${TEMPDIR}/docs/docker-documentation + git add docs/images/docker-${CONTAINER_NAME}.md git commit -m 'Bot Updating Documentation' git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/linuxserver/docker-documentation.git --all fi @@ -435,35 +434,6 @@ pipeline { "visibility":"public"}' ''' } } - /* ####################### - Scarf.sh package registry - ####################### */ - // Add package to Scarf.sh and set permissions - stage("Scarf.sh package registry"){ - when { - branch "master" - environment name: 'EXIT_STATUS', value: '' - } - steps{ - sh '''#! /bin/bash - PACKAGE_UUID=$(curl -X GET -H "Authorization: Bearer ${SCARF_TOKEN}" https://scarf.sh/api/v1/organizations/linuxserver-ci/packages | jq -r '.[] | select(.name=="linuxserver/calibre-web") | .uuid' || :) - if [ -z "${PACKAGE_UUID}" ]; then - echo "Adding package to Scarf.sh" - curl -sX POST https://scarf.sh/api/v1/organizations/linuxserver-ci/packages \ - -H "Authorization: Bearer ${SCARF_TOKEN}" \ - -H "Content-Type: application/json" \ - -d '{"name":"linuxserver/calibre-web",\ - "shortDescription":"example description",\ - "libraryType":"docker",\ - "website":"https://github.com/linuxserver/docker-calibre-web",\ - "backendUrl":"https://ghcr.io/linuxserver/calibre-web",\ - "publicUrl":"https://lscr.io/linuxserver/calibre-web"}' || : - else - echo "Package already exists on Scarf.sh" - fi - ''' - } - } /* ############### Build Container ############### */ @@ -859,6 +829,41 @@ pipeline { curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done''' } } + // Add protection to the release branch + stage('Github-Release-Branch-Protection') { + when { + branch "master" + environment name: 'CHANGE_ID', value: '' + environment name: 'EXIT_STATUS', value: '' + } + steps { + echo "Setting up protection for release branch master" + sh '''#! /bin/bash + curl -H "Authorization: token ${GITHUB_TOKEN}" -X PUT https://api.github.com/repos/${LS_USER}/${LS_REPO}/branches/master/protection \ + -d $(jq -c . << EOF + { + "required_status_checks": null, + "enforce_admins": false, + "required_pull_request_reviews": { + "dismiss_stale_reviews": false, + "require_code_owner_reviews": false, + "require_last_push_approval": false, + "required_approving_review_count": 1 + }, + "restrictions": null, + "required_linear_history": false, + "allow_force_pushes": false, + "allow_deletions": false, + "block_creations": false, + "required_conversation_resolution": true, + "lock_branch": false, + "allow_fork_syncing": false, + "required_signatures": false + } +EOF + ) ''' + } + } // Use helper container to sync the current README on master to the dockerhub endpoint stage('Sync-README') { when { diff --git a/README.md b/README.md index 293467a9e..e0def6b1e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,5 @@ - - - + + [![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!") @@ -68,6 +67,7 @@ This image provides various versions that are available via tags. Please read th | :----: | :----: |--- | | latest | ✅ | Releases of Calibre-Web | | nightly | ✅ | Commits to the master branch of Calibre-Web | + ## Application Setup Webui can be found at `http://your-ip:8083` @@ -92,7 +92,7 @@ This image contains the [kepubify](https://pgaskin.net/kepubify/) ebook conversi ## Usage -Here are some example snippets to help you get started creating a container. +To help you get started creating a container from this image you can either use docker-compose or the docker cli. ### docker-compose (recommended, [click here for more info](https://docs.linuxserver.io/general/docker-compose)) @@ -132,12 +132,11 @@ docker run -d \ -v /path/to/calibre/library:/books \ --restart unless-stopped \ lscr.io/linuxserver/calibre-web:latest - ``` ## Parameters -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. +Containers 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. | Parameter | Function | | :----: | --- | @@ -157,10 +156,10 @@ You can set any environment variable from a file by using a special prepend `FIL As an example: ```bash --e FILE__PASSWORD=/run/secrets/mysecretpassword +-e FILE__MYVAR=/run/secrets/mysecretvariable ``` -Will set the environment variable `PASSWORD` based on the contents of the `/run/secrets/mysecretpassword` file. +Will set the environment variable `MYVAR` based on the contents of the `/run/secrets/mysecretvariable` file. ## Umask for running applications @@ -169,15 +168,20 @@ Keep in mind umask is not chmod it subtracts from permissions based on it's valu ## User / Group Identifiers -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`. +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`. Ensure any volume directories on the host are owned by the same user you specify and any permissions issues will vanish like magic. -In this instance `PUID=1000` and `PGID=1000`, to find yours use `id user` as below: +In this instance `PUID=1000` and `PGID=1000`, to find yours use `id your_user` as below: ```bash - $ id username - uid=1000(dockeruser) gid=1000(dockergroup) groups=1000(dockergroup) +id your_user +``` + +Example output: + +```text +uid=1000(your_user) gid=1000(your_user) groups=1000(your_user) ``` ## Docker Mods @@ -188,12 +192,29 @@ We publish various [Docker Mods](https://github.com/linuxserver/docker-mods) to ## Support Info -* Shell access whilst the container is running: `docker exec -it calibre-web /bin/bash` -* To monitor the logs of the container in realtime: `docker logs -f calibre-web` -* container version number - * `docker inspect -f '{{ index .Config.Labels "build_version" }}' calibre-web` -* image version number - * `docker inspect -f '{{ index .Config.Labels "build_version" }}' lscr.io/linuxserver/calibre-web:latest` +* Shell access whilst the container is running: + + ```bash + docker exec -it calibre-web /bin/bash + ``` + +* To monitor the logs of the container in realtime: + + ```bash + docker logs -f calibre-web + ``` + +* Container version number: + + ```bash + docker inspect -f '{{ index .Config.Labels "build_version" }}' calibre-web + ``` + +* Image version number: + + ```bash + docker inspect -f '{{ index .Config.Labels "build_version" }}' lscr.io/linuxserver/calibre-web:latest + ``` ## Updating Info @@ -203,38 +224,83 @@ Below are the instructions for updating containers: ### Via Docker Compose -* Update all images: `docker-compose pull` - * or update a single image: `docker-compose pull calibre-web` -* Let compose update all containers as necessary: `docker-compose up -d` - * or update a single container: `docker-compose up -d calibre-web` -* You can also remove the old dangling images: `docker image prune` +* Update images: + * All images: + + ```bash + docker-compose pull + ``` + + * Single image: + + ```bash + docker-compose pull calibre-web + ``` + +* Update containers: + * All containers: + + ```bash + docker-compose up -d + ``` + + * Single container: + + ```bash + docker-compose up -d calibre-web + ``` + +* You can also remove the old dangling images: + + ```bash + docker image prune + ``` ### Via Docker Run -* Update the image: `docker pull lscr.io/linuxserver/calibre-web:latest` -* Stop the running container: `docker stop calibre-web` -* Delete the container: `docker rm calibre-web` +* Update the image: + + ```bash + docker pull lscr.io/linuxserver/calibre-web:latest + ``` + +* Stop the running container: + + ```bash + docker stop calibre-web + ``` + +* Delete the container: + + ```bash + docker rm calibre-web + ``` + * Recreate a new container with the same docker run parameters as instructed above (if mapped correctly to a host folder, your `/config` folder and settings will be preserved) -* You can also remove the old dangling images: `docker image prune` +* You can also remove the old dangling images: + + ```bash + docker image prune + ``` ### Via Watchtower auto-updater (only use if you don't remember the original parameters) * Pull the latest image at its tag and replace it with the same env variables in one run: - ```bash - docker run --rm \ - -v /var/run/docker.sock:/var/run/docker.sock \ - containrrr/watchtower \ - --run-once calibre-web - ``` + ```bash + docker run --rm \ + -v /var/run/docker.sock:/var/run/docker.sock \ + containrrr/watchtower \ + --run-once calibre-web + ``` * You can also remove the old dangling images: `docker image prune` -**Note:** We do not endorse the use of Watchtower as a solution to automated updates of existing Docker containers. In fact we generally discourage automated updates. However, this is a useful tool for one-time manual updates of containers where you have forgotten the original parameters. In the long term, we highly recommend using [Docker Compose](https://docs.linuxserver.io/general/docker-compose). +**warning**: We do not endorse the use of Watchtower as a solution to automated updates of existing Docker containers. In fact we generally discourage automated updates. However, this is a useful tool for one-time manual updates of containers where you have forgotten the original parameters. In the long term, we highly recommend using [Docker Compose](https://docs.linuxserver.io/general/docker-compose). ### Image Update Notifications - Diun (Docker Image Update Notifier) -* We recommend [Diun](https://crazymax.dev/diun/) for update notifications. Other tools that automatically update containers unattended are not recommended or supported. +**tip**: We recommend [Diun](https://crazymax.dev/diun/) for update notifications. Other tools that automatically update containers unattended are not recommended or supported. ## Building locally @@ -259,6 +325,7 @@ Once registered you can define the dockerfile to use with `-f Dockerfile.aarch64 ## Versions +* **07.10.23:** - Install unrar from [linuxserver repo](https://github.com/linuxserver/docker-unrar). * **13.04.23:** - Deprecate armhf. * **27.03.23:** - Add cmake as build dep for Levenshtein. * **27.12.22:** - Add ghostscript, libxtst6, libxkbfile-dev. diff --git a/readme-vars.yml b/readme-vars.yml index 15bc1c8f8..9cc1d410e 100644 --- a/readme-vars.yml +++ b/readme-vars.yml @@ -72,6 +72,7 @@ app_setup_block: | # changelog changelogs: + - { date: "07.10.23:", desc: "Install unrar from [linuxserver repo](https://github.com/linuxserver/docker-unrar)."} - { date: "13.04.23:", desc: "Deprecate armhf."} - { date: "27.03.23:", desc: "Add cmake as build dep for Levenshtein."} - { date: "27.12.22:", desc: "Add ghostscript, libxtst6, libxkbfile-dev."} From 3f9fb412edf94469880ee3287685c130c3892cb9 Mon Sep 17 00:00:00 2001 From: aptalca <541623+aptalca@users.noreply.github.com> Date: Sat, 7 Oct 2023 21:55:29 -0400 Subject: [PATCH 2/3] use venv --- Dockerfile | 9 ++++----- Dockerfile.aarch64 | 9 ++++----- readme-vars.yml | 2 +- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/Dockerfile b/Dockerfile index c758b9e05..54e0146b9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -32,9 +32,7 @@ RUN \ libxkbfile-dev \ libxslt1.1 \ libxtst6 \ - python3-minimal \ - python3-pip \ - python3-pkg-resources && \ + python3-venv && \ echo "**** install calibre-web ****" && \ if [ -z ${CALIBREWEB_RELEASE+x} ]; then \ CALIBREWEB_RELEASE=$(curl -sX GET "https://api.github.com/repos/janeczku/calibre-web/releases/latest" \ @@ -49,10 +47,11 @@ RUN \ /tmp/calibre-web.tar.gz -C \ /app/calibre-web --strip-components=1 && \ cd /app/calibre-web && \ - pip3 install --no-cache-dir -U \ + python3 -m venv /lsiopy && \ + pip install -U --no-cache-dir \ pip \ wheel && \ - pip3 install --no-cache-dir -U --ignore-installed --find-links https://wheel-index.linuxserver.io/ubuntu/ -r \ + pip install -U --no-cache-dir --find-links https://wheel-index.linuxserver.io/ubuntu/ -r \ requirements.txt -r \ optional-requirements.txt && \ echo "***install kepubify" && \ diff --git a/Dockerfile.aarch64 b/Dockerfile.aarch64 index c9936b749..296988f1b 100644 --- a/Dockerfile.aarch64 +++ b/Dockerfile.aarch64 @@ -38,9 +38,7 @@ RUN \ libxkbfile-dev \ libxslt1.1 \ libxtst6 \ - python3-minimal \ - python3-pip \ - python3-pkg-resources && \ + python3-venv && \ echo "**** install calibre-web ****" && \ if [ -z ${CALIBREWEB_RELEASE+x} ]; then \ CALIBREWEB_RELEASE=$(curl -sX GET "https://api.github.com/repos/janeczku/calibre-web/releases/latest" \ @@ -55,10 +53,11 @@ RUN \ /tmp/calibre-web.tar.gz -C \ /app/calibre-web --strip-components=1 && \ cd /app/calibre-web && \ - pip3 install --no-cache-dir -U \ + python3 -m venv /lsiopy && \ + pip install -U --no-cache-dir \ pip \ wheel && \ - pip3 install --no-cache-dir -U --ignore-installed --find-links https://wheel-index.linuxserver.io/ubuntu/ -r \ + pip3 install -U --no-cache-dir --find-links https://wheel-index.linuxserver.io/ubuntu/ -r \ requirements.txt -r \ optional-requirements.txt && \ echo "***install kepubify" && \ diff --git a/readme-vars.yml b/readme-vars.yml index 9cc1d410e..9c111c538 100644 --- a/readme-vars.yml +++ b/readme-vars.yml @@ -72,7 +72,7 @@ app_setup_block: | # changelog changelogs: - - { date: "07.10.23:", desc: "Install unrar from [linuxserver repo](https://github.com/linuxserver/docker-unrar)."} + - { date: "07.10.23:", desc: "Install unrar from [linuxserver repo](https://github.com/linuxserver/docker-unrar). Switch to Python virtual environment."} - { date: "13.04.23:", desc: "Deprecate armhf."} - { date: "27.03.23:", desc: "Add cmake as build dep for Levenshtein."} - { date: "27.12.22:", desc: "Add ghostscript, libxtst6, libxkbfile-dev."} From f7ee848dd655ff71dcbca5279e87117fd7333b02 Mon Sep 17 00:00:00 2001 From: aptalca <541623+aptalca@users.noreply.github.com> Date: Sat, 7 Oct 2023 21:58:26 -0400 Subject: [PATCH 3/3] fix typo --- Dockerfile.aarch64 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile.aarch64 b/Dockerfile.aarch64 index 296988f1b..2443d82d5 100644 --- a/Dockerfile.aarch64 +++ b/Dockerfile.aarch64 @@ -57,7 +57,7 @@ RUN \ pip install -U --no-cache-dir \ pip \ wheel && \ - pip3 install -U --no-cache-dir --find-links https://wheel-index.linuxserver.io/ubuntu/ -r \ + pip install -U --no-cache-dir --find-links https://wheel-index.linuxserver.io/ubuntu/ -r \ requirements.txt -r \ optional-requirements.txt && \ echo "***install kepubify" && \