├── .github └── workflows │ └── readme_update.yml ├── Build.json ├── Build.sh ├── Dockerfile ├── LICENSE ├── README.md ├── dependency-version.json ├── renovate.json └── version.json /.github/workflows/readme_update.yml: -------------------------------------------------------------------------------- 1 | name: Docker readme update 2 | 3 | on: 4 | workflow_dispatch: 5 | push: 6 | branches: 7 | - master 8 | paths: 9 | - README.md 10 | 11 | jobs: 12 | job: 13 | name: Docker Hub Description 14 | runs-on: ubuntu-latest 15 | steps: 16 | - 17 | name: Checkout 18 | uses: actions/checkout@v4 19 | 20 | - 21 | name: Get Description 22 | id: description 23 | run: | 24 | Description=$(curl -s \ 25 | -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ 26 | -H "Accept: application/vnd.github.v3+json" \ 27 | https://api.github.com/repos/DDS-Derek/qBittorrent-Enhanced-Edition-Docker | \ 28 | jq -r ".description") 29 | echo "Description=${Description}" 30 | echo "Description=${Description}" >> $GITHUB_OUTPUT 31 | 32 | - 33 | name: Get dependency version 34 | id: dependency-version 35 | run: | 36 | docker run -d --name=test ddsderek/qbittorrentee:latest 37 | docker cp test:/usr/bin/dependency-version.json ./dependency-version.json 38 | 39 | - 40 | uses: stefanzweifel/git-auto-commit-action@v5 41 | with: 42 | commit_message: 'chore(deps): update dependency version' 43 | branch: master 44 | file_pattern: 'dependency-version.json' 45 | env: 46 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 47 | 48 | - 49 | name: Docker Hub Description 50 | uses: peter-evans/dockerhub-description@v4 51 | with: 52 | username: ${{ secrets.DOCKER_USERNAME }} 53 | password: ${{ secrets.DOCKER_PASSWORD }} 54 | repository: ${{ secrets.DOCKER_USERNAME }}/qbittorrentee 55 | short-description: ${{ steps.description.outputs.Description }} 56 | readme-filepath: ./README.md -------------------------------------------------------------------------------- /Build.json: -------------------------------------------------------------------------------- 1 | { 2 | "DockerHub_Repo_Name": "qbittorrentee", 3 | "Github_Repo": "DDS-Derek/qBittorrent-Enhanced-Edition-Docker", 4 | "Branches": "master", 5 | "Version_qbee": "$(jq -r '.qBittorrentee_Version' version.json)", 6 | "Version_qb": "$(jq -r '.qBittorrent_Version' version.json)", 7 | "Dockerfile_Name": "Dockerfile", 8 | "ARCH": "linux/amd64,linux/arm64/v8,linux/arm/v7", 9 | "ARG": "--build-arg QBITTORRENTEE_VERSION=${Version_qbee}", 10 | "TAG": "--tag ${Dockerhub_Username}/${DockerHub_Repo_Name}:${Version_qb} --tag ${Dockerhub_Username}/${DockerHub_Repo_Name}:latest" 11 | } -------------------------------------------------------------------------------- /Build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | Green="\033[32m" 4 | Red="\033[31m" 5 | Yellow='\033[33m' 6 | Font="\033[0m" 7 | INFO="[${Green}INFO${Font}]" 8 | ERROR="[${Red}ERROR${Font}]" 9 | WARN="[${Yellow}WARN${Font}]" 10 | function INFO() { 11 | echo -e "${INFO} ${1}" 12 | } 13 | function ERROR() { 14 | echo -e "${ERROR} ${1}" 15 | } 16 | function WARN() { 17 | echo -e "${WARN} ${1}" 18 | } 19 | 20 | 21 | function get_info(){ 22 | WORKDIR=$(pwd) 23 | INFO "WorkDir=${WORKDIR}" 24 | 25 | CONFIG_FILE_DIR=/etc/DDSRem/config.json 26 | 27 | Builder_Name=builder_ddsrem_$(date -u +"T%H%M%S%3NZ") 28 | 29 | Github_Token=$(jq -r '.Github_Token' ${CONFIG_FILE_DIR}) 30 | Dockerhub_Username=$(jq -r '.Dockerhub_Username' ${CONFIG_FILE_DIR}) 31 | Dockerhub_Password=$(jq -r '.Dockerhub_Password' ${CONFIG_FILE_DIR}) 32 | DockerHub_Repo_Name=$(jq -r '.DockerHub_Repo_Name' Build.json) 33 | Github_Repo=$(jq -r '.Github_Repo' Build.json) 34 | Branches=$(jq -r '.Branches' Build.json) 35 | Version_qb=$(eval echo $(jq -r '.Version_qb' Build.json)) 36 | Version_qbee=$(eval echo $(jq -r '.Version_qbee' Build.json)) 37 | Dockerfile_Name=$(jq -r '.Dockerfile_Name' Build.json) 38 | ARCH=$(jq -r '.ARCH' Build.json) 39 | ARG=$(eval echo $(jq -r '.ARG' Build.json)) 40 | TAG=$(eval echo $(jq -r '.TAG' Build.json)) 41 | DockerHub_Repo="${Dockerhub_Username}/${DockerHub_Repo_Name}" 42 | GITHUB_API=$(curl -s -H "Authorization: token ${Github_Token}" -H "Accept: application/vnd.github.v3+json" https://api.github.com/repos/${Github_Repo}) 43 | image_created=$(date -u +"%Y-%m-%dT%H:%M:%S.%3NZ") 44 | image_description=$(echo ${GITHUB_API} | jq -r ".description") 45 | image_licenses=$(echo ${GITHUB_API} | jq -r ".license.name") 46 | image_revision=$(curl -s -H "Authorization: token ${Github_Token}" -H "Accept: application/vnd.github.v3+json" https://api.github.com/repos/${Github_Repo}/commits/${Branches} | jq -r ".sha") 47 | image_source=$(echo ${GITHUB_API} | jq -r ".html_url") 48 | image_title=$(echo ${GITHUB_API} | jq -r ".name") 49 | image_url=$(echo ${GITHUB_API} | jq -r ".html_url") 50 | image_version=${Version_qb} 51 | 52 | INFO "org.opencontainers.image.created=${image_created}" 53 | INFO "org.opencontainers.image.description=${image_description}" 54 | INFO "org.opencontainers.image.licenses=${image_licenses}" 55 | INFO "org.opencontainers.image.revision=${image_revision}" 56 | INFO "org.opencontainers.image.source=${image_source}" 57 | INFO "org.opencontainers.image.title=${image_title}" 58 | INFO "org.opencontainers.image.url=${image_url}" 59 | INFO "org.opencontainers.image.version=${image_version}" 60 | INFO "DockerHub_Repo_Name=${DockerHub_Repo_Name}" 61 | INFO "DockerHub_Repo=${DockerHub_Repo}" 62 | INFO "Github_Repo=${Github_Repo}" 63 | INFO "Branches=${Branches}" 64 | INFO "Version=${Version_qbee}" 65 | INFO "Dockerfile_Name=${Dockerfile_Name}" 66 | INFO "ARCH=${ARCH}" 67 | INFO "ARG=${ARG}" 68 | INFO "TAG=${TAG}" 69 | } 70 | 71 | function prepare_build() { 72 | docker run -d \ 73 | --name=${Builder_Name} \ 74 | -v /var/run/docker.sock:/var/run/docker.sock \ 75 | -v ${WORKDIR}:/build \ 76 | --workdir /build \ 77 | dockerhub.ddsrem.in:998/catthehacker/ubuntu@sha256:3ad2f8684955514d9ddf942efc9078f3cb02ffe5ebbb6a5af655a783ffe3062f tail -f /dev/null 78 | docker exec -it ${Builder_Name} uname -a 79 | docker exec -it ${Builder_Name} mkdir -p ${HOME}/.docker/cli-plugins 80 | docker exec -it ${Builder_Name} curl -sL https://github.com/christian-korneck/docker-pushrm/releases/download/v1.9.0/docker-pushrm_linux_amd64 -o ${HOME}/.docker/cli-plugins/docker-pushrm 81 | docker exec -it ${Builder_Name} chmod +x ${HOME}/.docker/cli-plugins/docker-pushrm 82 | docker exec -it ${Builder_Name} docker pull tonistiigi/binfmt 83 | docker exec -it ${Builder_Name} docker run --privileged --rm tonistiigi/binfmt --install all 84 | docker exec -it ${Builder_Name} docker buildx create --name ${Builder_Name} --use 2>/dev/null || docker buildx use builder 85 | docker exec -it ${Builder_Name} docker buildx inspect --bootstrap 86 | docker exec -it ${Builder_Name} docker login --password ${Dockerhub_Password} --username ${Dockerhub_Username} 87 | } 88 | 89 | function clear_build() { 90 | docker exec -it ${Builder_Name} docker logout 91 | docker exec -it ${Builder_Name} docker buildx rm ${Builder_Name} 92 | docker stop ${Builder_Name} 93 | docker rm ${Builder_Name} 94 | docker image rm moby/buildkit:buildx-stable-1 95 | } 96 | 97 | function build_image() { 98 | git clone -b master https://github.com/devome/dockerfiles.git files 99 | cp -r files/qbittorrent/root root 100 | cp -r files/qbittorrent/root2 root2 101 | ls -al 102 | ls -al root 103 | ls -al root2 104 | docker exec -it ${Builder_Name} \ 105 | docker buildx build \ 106 | ${ARG} \ 107 | --file ${Dockerfile_Name} \ 108 | --label "org.opencontainers.image.created=${image_created}" \ 109 | --label "org.opencontainers.image.description=${image_description}" \ 110 | --label "org.opencontainers.image.licenses=${image_licenses}" \ 111 | --label "org.opencontainers.image.revision=${image_revision}" \ 112 | --label "org.opencontainers.image.source=${image_source}" \ 113 | --label "org.opencontainers.image.title=${image_title}" \ 114 | --label "org.opencontainers.image.url=${image_url}" \ 115 | --label "org.opencontainers.image.version=${image_version}" \ 116 | --platform ${ARCH} \ 117 | ${TAG} \ 118 | --push \ 119 | . 120 | } 121 | 122 | get_info 123 | 124 | prepare_build 125 | 126 | build_image 127 | 128 | clear_build -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | ARG LIBTORRENT_VERSION=2 2 | FROM nevinee/libtorrent-rasterbar:${LIBTORRENT_VERSION} AS builder 3 | RUN apk upgrade \ 4 | && apk add --no-cache \ 5 | boost-dev \ 6 | openssl-dev \ 7 | qt6-qtbase-dev \ 8 | qt6-qttools-dev \ 9 | g++ \ 10 | cmake \ 11 | curl \ 12 | tar \ 13 | samurai \ 14 | && rm -rf /tmp/* /var/cache/apk/* 15 | ARG QBITTORRENTEE_VERSION 16 | RUN mkdir -p /tmp/qbittorrent \ 17 | && cd /tmp/qbittorrent \ 18 | && curl -sSL https://github.com/c0re100/qBittorrent-Enhanced-Edition/archive/refs/tags/release-${QBITTORRENTEE_VERSION}.tar.gz | tar xz --strip-components 1 \ 19 | && cmake \ 20 | -DCMAKE_BUILD_TYPE=Release \ 21 | -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON \ 22 | -DCMAKE_CXX_STANDARD=20 \ 23 | -DWEBUI=ON \ 24 | -DVERBOSE_CONFIGURE=OFF \ 25 | -DSTACKTRACE=OFF \ 26 | -DDBUS=OFF \ 27 | -DGUI=OFF \ 28 | -DQT6=ON \ 29 | -Brelease \ 30 | -GNinja \ 31 | && cmake --build release -j $(nproc) \ 32 | && cmake --install release \ 33 | && ls -al /usr/local/bin/ \ 34 | && qbittorrent-nox --help \ 35 | && qbittorrent-nox --version 36 | RUN echo "Copy to /out" \ 37 | && strip /usr/local/lib/libtorrent-rasterbar.so.* \ 38 | && strip /usr/local/bin/qbittorrent-nox \ 39 | && mkdir -p /out/usr/lib /out/usr/bin \ 40 | && cp -d /usr/local/lib/libtorrent-rasterbar.so* /out/usr/lib \ 41 | && cp /usr/local/bin/qbittorrent-nox /out/usr/bin 42 | RUN echo "Write dependency version" \ 43 | && apk update \ 44 | && OpenSSL=$(apk version openssl-dev | sed -n '2p' | awk -F'= ' '{print $2}' | awk -F'-' '{print $1}') \ 45 | && Boost=$(apk version boost-dev | sed -n '2p' | awk -F'= ' '{print $2}' | awk -F'-' '{print $1}') \ 46 | && Libtorrent=$(find /usr/local/lib/libtorrent-rasterbar.so* -type f | awk -F'.so.' '{print $2}') \ 47 | && Qt=$(apk version qt6-qtbase-dev | sed -n '2p' | awk -F'= ' '{print $2}' | awk -F'-' '{print $1}') \ 48 | && zlib=$(apk version zlib | sed -n '2p' | awk -F'= ' '{print $2}' | awk -F'-' '{print $1}') \ 49 | && echo -e '{\n "OpenSSL": "'$OpenSSL'",\n "Boost": "'$Boost'",\n "Libtorrent": "'$Libtorrent'",\n "Qt": "'$Qt'",\n "zlib": "'$zlib'"\n}' \ 50 | && echo -e '{\n "OpenSSL": "'$OpenSSL'",\n "Boost": "'$Boost'",\n "Libtorrent": "'$Libtorrent'",\n "Qt": "'$Qt'",\n "zlib": "'$zlib'"\n}' > /out/usr/bin/dependency-version.json \ 51 | && rm -rf /tmp/* /var/cache/apk/* 52 | 53 | FROM alpine:3.21 AS app 54 | ENV QBT_PROFILE=/home/qbittorrent \ 55 | TZ=Asia/Shanghai \ 56 | PUID=1000 \ 57 | PGID=100 \ 58 | WEBUI_PORT=8080 \ 59 | BT_PORT=34567 \ 60 | QB_USERNAME=admin \ 61 | QB_PASSWORD=adminadmin \ 62 | LANG=zh_CN.UTF-8 \ 63 | SHELL=/bin/bash \ 64 | PS1="\u@\h:\w \$ " 65 | RUN apk upgrade \ 66 | && apk add --no-cache \ 67 | bash \ 68 | busybox-suid \ 69 | curl \ 70 | jq \ 71 | openssl \ 72 | python3 \ 73 | qt6-qtbase \ 74 | qt6-qtbase-sqlite \ 75 | shadow \ 76 | su-exec \ 77 | tini \ 78 | tzdata \ 79 | && rm -rf /tmp/* /var/cache/apk/* \ 80 | && ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime \ 81 | && echo "${TZ}" > /etc/timezone \ 82 | && useradd qbittorrent -u ${PUID} -U -m -d ${QBT_PROFILE} -s /sbin/nologin \ 83 | && sed -i 's/dl-cdn.alpinelinux.org/mirrors.bfsu.edu.cn/g' /etc/apk/repositories 84 | COPY --from=builder /out / 85 | COPY root / 86 | WORKDIR /data 87 | VOLUME ["/data"] 88 | ENTRYPOINT ["tini", "-g", "--", "entrypoint.sh"] 89 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 DDS-Rem 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # qBittorrent-Enhanced-Edition-Docker 2 | 3 | # 本镜像为增强版qBittorrent,非官方qBittorrent,使用者请自行承担风险! 4 | 5 | ![Docker Pulls](https://img.shields.io/docker/pulls/ddsderek/qbittorrentee.svg?style=for-the-badge&label=pulls&logo=docker) 6 | 7 | 由 nevinee 大佬的 qBittorrent 镜像改编的 qBittorrent Enhanced Edition 镜像。 8 | 9 | 此项目功能与使用方法和`nevinee/qbittorrent`一致,故详细功能和使用教程[点击这里](https://evine.win/p/docker-install-qbittorrent/)查看。 10 | 11 | ## 架构 12 | 13 | | Architecture | Tag | 14 | | :----------: | :------------: | 15 | | x86-64 | latest | 16 | | arm64 | latest | 17 | | arm32 | latest | 18 | 19 | ## 标签 20 | 21 | 1. **`4.x.x` , `latest`**: 标签以纯数字版本号命名,这是qBittorrentee正式发布的稳定版,其中最新的版本额外增加`latest`标签。 22 | 23 | 2. **`4.x.x-iyuu` , `latest-iyuu` , `iyuu`**: 标签中带有`iyuu`字样,基于qBittorrentee稳定版集成了[IYUUPlus](https://github.com/ledccn/IYUUPlus),其中最新的版本额外增加`latest-iyuu`和`iyuu`标签,自动安装好[IYUUPlus](https://github.com/ledccn/IYUUPlus),自动设置好下载器,主要针对不会设置下载器的用户。 24 | 25 | 26 | ## 部署 27 | 28 | **qBittorrent Enhanced Edition** 29 | 30 | ```yaml 31 | version: "2.0" 32 | services: 33 | qbittorrentee: 34 | image: ddsderek/qbittorrentee:latest 35 | container_name: qbittorrentee 36 | restart: always 37 | tty: true 38 | network_mode: bridge 39 | hostname: qbittorrentee 40 | volumes: 41 | - ./data:/data # 配置保存目录 42 | tmpfs: 43 | - /tmp 44 | environment: # 下面未列出的其他环境变量请根据环境变量清单自行添加 45 | - WEBUI_PORT=8080 # WEBUI控制端口,可自定义 46 | - BT_PORT=34567 # BT监听端口,可自定义 47 | - PUID=1000 # 输入id -u可查询,群晖必须改 48 | - PGID=100 # 输入id -g可查询,群晖必须改 49 | ports: 50 | - 8080:8080 # 冒号左右一致,必须同WEBUI_PORT一样,本文件中的3个8080要改一起改 51 | - 34567:34567 # 冒号左右一致,必须同BT_PORT一样,本文件中的5个34567要改一起改 52 | - 34567:34567/udp # 冒号左右一致,必须同BT_PORT一样,本文件中的5个34567要改一起改 53 | #security_opt: # armv7设备请解除本行和下一行的注释 54 | #- seccomp=unconfined 55 | ``` 56 | 57 | **qBittorrent Enhanced Edition + IYUU** 58 | 59 | ```yaml 60 | version: "2.0" 61 | services: 62 | qbittorrentee: 63 | image: ddsderek/qbittorrentee:latest-iyuu 64 | container_name: qbittorrentee 65 | restart: always 66 | tty: true 67 | network_mode: bridge 68 | hostname: qbittorrentee 69 | volumes: 70 | - ./data:/data # 配置保存目录 71 | tmpfs: 72 | - /tmp 73 | environment: # 下面未列出的其他环境变量请根据环境变量清单自行添加 74 | - WEBUI_PORT=8080 # WEBUI控制端口,可自定义 75 | - BT_PORT=34567 # BT监听端口,可自定义 76 | - PUID=1000 # 输入id -u可查询,群晖必须改 77 | - PGID=100 # 输入id -g可查询,群晖必须改 78 | ports: 79 | - 8080:8080 # 冒号左右一致,必须同WEBUI_PORT一样,本文件中的3个8080要改一起改 80 | - 34567:34567 # 冒号左右一致,必须同BT_PORT一样,本文件中的5个34567要改一起改 81 | - 34567:34567/udp # 冒号左右一致,必须同BT_PORT一样,本文件中的5个34567要改一起改 82 | #security_opt: # armv7设备请解除本行和下一行的注释 83 | #- seccomp=unconfined 84 | ``` -------------------------------------------------------------------------------- /dependency-version.json: -------------------------------------------------------------------------------- 1 | { 2 | "OpenSSL": "3.3.3", 3 | "Boost": "1.84.0", 4 | "Libtorrent": "2.0.10", 5 | "Qt": "6.8.0", 6 | "zlib": "1.3.1" 7 | } 8 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": [ 4 | "config:base" 5 | ] 6 | } 7 | -------------------------------------------------------------------------------- /version.json: -------------------------------------------------------------------------------- 1 | { 2 | "qBittorrent_Version": "5.1.0", 3 | "qBittorrentee_Version": "5.1.0.11" 4 | } 5 | --------------------------------------------------------------------------------