├── .dockerignore ├── .github └── workflows │ ├── build.yml │ ├── build_tgbot.yml │ ├── readme_update.yml │ └── test.yml ├── Dockerfile ├── LICENSE ├── README.md ├── aria2.Dockerfile ├── docs ├── example │ ├── aria2-pro │ │ └── docker-compose.yml │ ├── default │ │ └── docker-compose.yml │ └── transmission │ │ └── docker-compose.yml └── img │ └── ariang.png ├── info.json ├── renovate.json ├── rootfs ├── etc │ ├── nginx │ │ └── nginx.conf │ └── s6-overlay │ │ └── s6-rc.d │ │ ├── init-010-mkdir │ │ ├── run │ │ ├── type │ │ └── up │ │ ├── init-020-adduser │ │ ├── dependencies.d │ │ │ └── init-010-mkdir │ │ ├── run │ │ ├── type │ │ └── up │ │ ├── init-030-config │ │ ├── dependencies.d │ │ │ └── init-020-adduser │ │ ├── run │ │ ├── type │ │ └── up │ │ ├── init-040-fixuser │ │ ├── dependencies.d │ │ │ └── init-030-config │ │ ├── run │ │ ├── type │ │ └── up │ │ ├── init-050-outset │ │ ├── dependencies.d │ │ │ └── init-040-fixuser │ │ ├── run │ │ ├── type │ │ └── up │ │ ├── svc-aria2-ban │ │ ├── dependencies.d │ │ │ └── init-050-outset │ │ ├── run │ │ └── type │ │ ├── svc-bgmi-http │ │ ├── dependencies.d │ │ │ └── init-050-outset │ │ ├── notification-fd │ │ ├── run │ │ └── type │ │ ├── svc-crond │ │ ├── dependencies.d │ │ │ └── init-050-outset │ │ ├── run │ │ └── type │ │ ├── svc-downloader │ │ ├── dependencies.d │ │ │ └── init-050-outset │ │ ├── notification-fd │ │ ├── run │ │ └── type │ │ ├── svc-filebrowser │ │ ├── dependencies.d │ │ │ └── init-050-outset │ │ ├── notification-fd │ │ ├── run │ │ └── type │ │ ├── svc-nginx │ │ ├── dependencies.d │ │ │ └── init-050-outset │ │ ├── run │ │ └── type │ │ └── user │ │ └── contents.d │ │ ├── init-010-mkdir │ │ ├── init-020-adduser │ │ ├── init-030-config │ │ ├── init-040-fixuser │ │ ├── init-050-outset │ │ ├── svc-aria2-ban │ │ ├── svc-bgmi-http │ │ ├── svc-crond │ │ ├── svc-downloader │ │ ├── svc-filebrowser │ │ └── svc-nginx ├── home │ └── bgmi-docker │ │ ├── BGmi-Docker.logo │ │ ├── config │ │ ├── bgmi_nginx.conf.tmpl │ │ ├── config.py │ │ ├── crontab.sh │ │ └── filebrowser.json │ │ ├── downloader │ │ ├── aria2 │ │ │ ├── Aria2-Pro │ │ │ └── settings.sh │ │ └── transmission │ │ │ ├── settings.json │ │ │ └── settings.sh │ │ ├── hardlink │ │ └── hardlink.py │ │ ├── init_base │ │ └── utils │ │ └── copy_cover.py └── usr │ └── local │ └── bin │ ├── bgmi_download │ ├── bgmi_hardlink │ └── finish-dl ├── test.Dockerfile ├── tgbot.Dockerfile └── transmission.Dockerfile /.dockerignore: -------------------------------------------------------------------------------- 1 | # Ignore git 2 | .github 3 | .git 4 | 5 | # Ignore useless files 6 | README.md 7 | README.cn.md 8 | .dockerignore 9 | renovate.json 10 | docs/ -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Release & Build image 2 | 3 | on: 4 | workflow_dispatch: 5 | push: 6 | branches: 7 | - master 8 | paths: 9 | - info.json 10 | 11 | jobs: 12 | release: 13 | runs-on: ubuntu-latest 14 | name: Release 15 | steps: 16 | - 17 | name: Checkout 18 | uses: actions/checkout@v4 19 | 20 | - 21 | name: Set Version 22 | id: set-version 23 | run: | 24 | RELEASE_VERSION=$(jq -r '.Release_Version' info.json) 25 | 26 | echo "RELEASE_VERSION=${RELEASE_VERSION}" 27 | 28 | echo "RELEASE_VERSION=${RELEASE_VERSION}" >> $GITHUB_OUTPUT 29 | 30 | - 31 | name: Generate Release 32 | uses: softprops/action-gh-release@v2 33 | with: 34 | tag_name: ${{ steps.set-version.outputs.RELEASE_VERSION }} 35 | name: ${{ steps.set-version.outputs.RELEASE_VERSION }} 36 | draft: false 37 | prerelease: false 38 | env: 39 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 40 | 41 | bgmi: 42 | needs: [release] 43 | runs-on: ubuntu-latest 44 | steps: 45 | - 46 | name: Checkout 47 | uses: actions/checkout@v4 48 | 49 | - 50 | name: Set Version 51 | id: set-version 52 | run: | 53 | BGMI_VERSION=$(jq -r '.BGmi.version' info.json) 54 | RELEASE_VERSION=$(jq -r '.Release_Version' info.json) 55 | 56 | echo "BGMI_VERSION=${BGMI_VERSION}" 57 | echo "RELEASE_VERSION=${RELEASE_VERSION}" 58 | 59 | echo "BGMI_VERSION=${BGMI_VERSION}" >> $GITHUB_OUTPUT 60 | echo "RELEASE_VERSION=${RELEASE_VERSION}" >> $GITHUB_OUTPUT 61 | 62 | - 63 | name: Docker meta 64 | id: meta 65 | uses: docker/metadata-action@v5 66 | with: 67 | images: ${{ secrets.DOCKER_USERNAME }}/bgmi-all-in-one 68 | tags: | 69 | type=raw,value=${{ steps.set-version.outputs.RELEASE_VERSION }} 70 | type=raw,value=latest 71 | 72 | - 73 | name: Set Up QEMU 74 | uses: docker/setup-qemu-action@v3 75 | 76 | - 77 | name: Set Up Buildx 78 | uses: docker/setup-buildx-action@v3 79 | 80 | - 81 | name: Login DockerHub 82 | uses: docker/login-action@v3 83 | with: 84 | username: ${{ secrets.DOCKER_USERNAME }} 85 | password: ${{ secrets.DOCKER_PASSWORD }} 86 | 87 | - 88 | name: Build 89 | uses: docker/build-push-action@v6 90 | with: 91 | context: . 92 | file: Dockerfile 93 | platforms: | 94 | linux/386 95 | linux/amd64 96 | linux/arm64/v8 97 | linux/arm/v7 98 | linux/arm/v6 99 | push: true 100 | build-args: | 101 | BGMI_VERSION=${{ steps.set-version.outputs.BGMI_VERSION }} 102 | tags: ${{ steps.meta.outputs.tags }} 103 | labels: ${{ steps.meta.outputs.labels }} 104 | cache-from: type=gha, scope=${{ github.workflow }} 105 | cache-to: type=gha, scope=${{ github.workflow }} 106 | 107 | transmission: 108 | needs: [bgmi] 109 | runs-on: ubuntu-latest 110 | steps: 111 | - 112 | name: Checkout 113 | uses: actions/checkout@master 114 | 115 | - 116 | name: Set Version 117 | id: set-version 118 | run: | 119 | TRANSMISSION_WEB_HOME=$(jq -r '.Transmission.web_home' info.json) 120 | RELEASE_VERSION=$(jq -r '.Release_Version' info.json) 121 | 122 | echo "TRANSMISSION_WEB_HOME=${TRANSMISSION_WEB_HOME}" 123 | echo "RELEASE_VERSION=${RELEASE_VERSION}" 124 | 125 | echo "TRANSMISSION_WEB_HOME=${TRANSMISSION_WEB_HOME}" >> $GITHUB_OUTPUT 126 | echo "RELEASE_VERSION=${RELEASE_VERSION}" >> $GITHUB_OUTPUT 127 | 128 | - 129 | name: Docker meta 130 | id: meta 131 | uses: docker/metadata-action@v5 132 | with: 133 | images: ${{ secrets.DOCKER_USERNAME }}/bgmi-all-in-one 134 | tags: | 135 | type=raw,value=${{ steps.set-version.outputs.RELEASE_VERSION }}-transmission 136 | type=raw,value=transmission 137 | 138 | - 139 | name: Set Up QEMU 140 | uses: docker/setup-qemu-action@v3 141 | 142 | - 143 | name: Set Up Buildx 144 | uses: docker/setup-buildx-action@v3 145 | 146 | - 147 | name: Login DockerHub 148 | uses: docker/login-action@v3 149 | with: 150 | username: ${{ secrets.DOCKER_USERNAME }} 151 | password: ${{ secrets.DOCKER_PASSWORD }} 152 | 153 | - 154 | name: Build 155 | uses: docker/build-push-action@v6 156 | with: 157 | context: . 158 | file: transmission.Dockerfile 159 | platforms: | 160 | linux/386 161 | linux/amd64 162 | linux/arm64/v8 163 | linux/arm/v7 164 | linux/arm/v6 165 | push: true 166 | build-args: | 167 | RELEASE_VERSION=${{ steps.set-version.outputs.RELEASE_VERSION }} 168 | TRANSMISSION_WEB_HOME=${{ steps.set-version.outputs.TRANSMISSION_WEB_HOME }} 169 | tags: ${{ steps.meta.outputs.tags }} 170 | labels: ${{ steps.meta.outputs.labels }} 171 | 172 | aria2: 173 | needs: [bgmi] 174 | runs-on: ubuntu-latest 175 | steps: 176 | - 177 | name: Checkout 178 | uses: actions/checkout@master 179 | 180 | - 181 | name: Set Version 182 | id: set-version 183 | run: | 184 | RELEASE_VERSION=$(jq -r '.Release_Version' info.json) 185 | 186 | echo "RELEASE_VERSION=${RELEASE_VERSION}" 187 | 188 | echo "RELEASE_VERSION=${RELEASE_VERSION}" >> $GITHUB_OUTPUT 189 | 190 | - 191 | name: Docker meta 192 | id: meta 193 | uses: docker/metadata-action@v5 194 | with: 195 | images: ${{ secrets.DOCKER_USERNAME }}/bgmi-all-in-one 196 | tags: | 197 | type=raw,value=${{ steps.set-version.outputs.RELEASE_VERSION }}-aria2 198 | type=raw,value=aria2 199 | 200 | - 201 | name: Set Up QEMU 202 | uses: docker/setup-qemu-action@v3 203 | 204 | - 205 | name: Set Up Buildx 206 | uses: docker/setup-buildx-action@v3 207 | 208 | - 209 | name: Login DockerHub 210 | uses: docker/login-action@v3 211 | with: 212 | username: ${{ secrets.DOCKER_USERNAME }} 213 | password: ${{ secrets.DOCKER_PASSWORD }} 214 | 215 | - 216 | name: Build 217 | uses: docker/build-push-action@v6 218 | with: 219 | context: . 220 | file: aria2.Dockerfile 221 | platforms: | 222 | linux/amd64 223 | linux/arm64/v8 224 | push: true 225 | build-args: | 226 | RELEASE_VERSION=${{ steps.set-version.outputs.RELEASE_VERSION }} 227 | tags: ${{ steps.meta.outputs.tags }} 228 | labels: ${{ steps.meta.outputs.labels }} 229 | -------------------------------------------------------------------------------- /.github/workflows/build_tgbot.yml: -------------------------------------------------------------------------------- 1 | name: Build tgbot image 2 | 3 | on: 4 | workflow_dispatch: 5 | 6 | jobs: 7 | build: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - 11 | name: Checkout 12 | uses: actions/checkout@v4 13 | 14 | - 15 | name: Docker meta 16 | id: meta 17 | uses: docker/metadata-action@v5 18 | with: 19 | images: ${{ secrets.DOCKER_USERNAME }}/bgmi-all-in-one 20 | tags: | 21 | type=raw,value=tgbot 22 | 23 | - 24 | name: Set Up QEMU 25 | uses: docker/setup-qemu-action@v3 26 | 27 | - 28 | name: Set Up Buildx 29 | uses: docker/setup-buildx-action@v3 30 | 31 | - 32 | name: Login DockerHub 33 | uses: docker/login-action@v3 34 | with: 35 | username: ${{ secrets.DOCKER_USERNAME }} 36 | password: ${{ secrets.DOCKER_PASSWORD }} 37 | 38 | - 39 | name: Build 40 | uses: docker/build-push-action@v6 41 | with: 42 | context: . 43 | file: tgbot.Dockerfile 44 | platforms: | 45 | linux/amd64 46 | linux/arm64/v8 47 | push: true 48 | tags: ${{ steps.meta.outputs.tags }} 49 | labels: ${{ steps.meta.outputs.labels }} 50 | cache-from: type=gha, scope=${{ github.workflow }} 51 | cache-to: type=gha, scope=${{ github.workflow }} -------------------------------------------------------------------------------- /.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: Docker Hub Description 22 | uses: peter-evans/dockerhub-description@v4 23 | with: 24 | username: ${{ secrets.DOCKER_USERNAME }} 25 | password: ${{ secrets.DOCKER_PASSWORD }} 26 | repository: ${{ secrets.DOCKER_USERNAME }}/bgmi-all-in-one 27 | short-description: A better BGmi Docker image 28 | readme-filepath: ./README.md 29 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Test image 2 | 3 | on: 4 | push: 5 | pull_request: 6 | 7 | jobs: 8 | test: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - 12 | name: Checkout 13 | uses: actions/checkout@v4 14 | 15 | - 16 | name: Set Version 17 | id: set-version 18 | run: | 19 | BGMI_VERSION=$(jq -r '.BGmi.version' info.json) 20 | TRANSMISSION_WEB_HOME=$(jq -r '.Transmission.web_home' info.json) 21 | 22 | echo "BGMI_VERSION=${BGMI_VERSION}" 23 | echo "TRANSMISSION_WEB_HOME=${TRANSMISSION_WEB_HOME}" 24 | 25 | echo "BGMI_VERSION=${BGMI_VERSION}" >> $GITHUB_OUTPUT 26 | echo "TRANSMISSION_WEB_HOME=${TRANSMISSION_WEB_HOME}" >> $GITHUB_OUTPUT 27 | 28 | - 29 | name: Docker meta 30 | id: meta 31 | uses: docker/metadata-action@v5 32 | with: 33 | images: ${{ secrets.DOCKER_USERNAME }}/bgmi-all-in-one 34 | tags: | 35 | type=raw,value=test 36 | 37 | - 38 | name: Set Up QEMU 39 | uses: docker/setup-qemu-action@v3 40 | 41 | - 42 | name: Set Up Buildx 43 | uses: docker/setup-buildx-action@v3 44 | 45 | - 46 | name: BGmi 47 | uses: docker/build-push-action@v6 48 | with: 49 | context: . 50 | file: test.Dockerfile 51 | platforms: | 52 | linux/amd64 53 | push: false 54 | build-args: | 55 | BGMI_VERSION=${{ steps.set-version.outputs.BGMI_VERSION }} 56 | TRANSMISSION_WEB_HOME=${{ steps.set-version.outputs.TRANSMISSION_WEB_HOME }} 57 | tags: ${{ steps.meta.outputs.tags }} 58 | labels: ${{ steps.meta.outputs.labels }} -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1.9 2 | 3 | FROM python:3.11.9-alpine3.20 4 | 5 | LABEL maintainer="ddstomo@gmail.com" 6 | 7 | ARG BGMI_VERSION 8 | 9 | ENV LANG=C.UTF-8 \ 10 | PS1="\[\e[32m\][\[\e[m\]\[\e[36m\]\u \[\e[m\]\[\e[37m\]@ \[\e[m\]\[\e[34m\]\h\[\e[m\]\[\e[32m\]]\[\e[m\] \[\e[37;35m\]in\[\e[m\] \[\e[33m\]\w\[\e[m\] \[\e[32m\][\[\e[m\]\[\e[37m\]\d\[\e[m\] \[\e[m\]\[\e[37m\]\t\[\e[m\]\[\e[32m\]]\[\e[m\] \n\[\e[1;31m\]$ \[\e[0m\]" \ 11 | S6_SERVICES_GRACETIME=30000 \ 12 | S6_KILL_GRACETIME=60000 \ 13 | S6_CMD_WAIT_FOR_SERVICES_MAXTIME=0 \ 14 | S6_SYNC_DISKS=1 \ 15 | BGMI_PATH="/bgmi/conf/bgmi" \ 16 | BGMI_HARDLINK_PATH="/bgmi/conf/bgmi_hardlink" \ 17 | BGMI_HOME="/home/bgmi-docker" \ 18 | PUID=1000 \ 19 | PGID=1000 \ 20 | UMASK=022 \ 21 | # 注意:这两个目录必须在 /media 下 22 | DOWNLOAD_DIR=/media/downloads \ 23 | MEDIA_DIR=/media/cartoon \ 24 | BGMI_HTTP_ADMIN_TOKEN=password \ 25 | BGMI_DATA_SOURCE=mikan_project 26 | 27 | COPY --from=powerman/dockerize:0.20.2 /usr/local/bin/dockerize /usr/local/bin 28 | 29 | RUN set -ex && \ 30 | dockerize --version && \ 31 | apk add --no-cache \ 32 | nginx \ 33 | bash \ 34 | curl \ 35 | tzdata \ 36 | shadow \ 37 | jq \ 38 | grep \ 39 | ca-certificates \ 40 | coreutils \ 41 | netcat-openbsd \ 42 | procps-ng \ 43 | findutils \ 44 | s6-overlay && \ 45 | pip install --upgrade pip && \ 46 | nginx -v && \ 47 | crond --help && \ 48 | # Adduser 49 | mkdir ${BGMI_HOME} /versions && \ 50 | addgroup -S bgmi -g 911 && \ 51 | adduser -S bgmi -G bgmi -h ${BGMI_HOME} -u 911 -s /bin/bash bgmi && \ 52 | # BGmi install 53 | echo ${BGMI_VERSION} > /versions/BGMI_VERSION.txt && \ 54 | mkdir -p ${BGMI_HOME}/BGmi && \ 55 | curl \ 56 | -sL https://github.com/BGmi/BGmi/archive/refs/tags/${BGMI_VERSION}.tar.gz | \ 57 | tar -zxvf - --strip-components 1 -C ${BGMI_HOME}/BGmi && \ 58 | pip install ${BGMI_HOME}/BGmi && \ 59 | bgmi --help && \ 60 | bgmi_http --help && \ 61 | # Filebrowser install 62 | touch /tmp/filebrowser_install.sh && \ 63 | curl -fsSL https://raw.githubusercontent.com/filebrowser/get/master/get.sh -o /tmp/filebrowser_install.sh && \ 64 | echo 'echo ${filemanager_tag} > /versions/FILEBROWSER_VERSION.txt' >> /tmp/filebrowser_install.sh && \ 65 | bash /tmp/filebrowser_install.sh && \ 66 | filebrowser version && \ 67 | # Clear 68 | rm -rf \ 69 | /var/cache/apk/* \ 70 | /root/.cache \ 71 | /tmp/* 72 | 73 | COPY --chmod=755 ./rootfs / 74 | 75 | ENTRYPOINT [ "/init" ] 76 | 77 | VOLUME [ "/bgmi", "/media" ] 78 | 79 | EXPOSE 80 80 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2022-2023 DDSRem DDSDerek 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 | # BGmi All In One Docker 2 | 3 | [![Build](https://github.com/DDS-Derek/BGmi-All-In-One-Docker/actions/workflows/build.yml/badge.svg)](https://github.com/DDS-Derek/BGmi-All-In-One-Docker/actions/workflows/build.yml) 4 | [![Test](https://github.com/DDS-Derek/BGmi-All-In-One-Docker/actions/workflows/test.yml/badge.svg)](https://github.com/DDS-Derek/BGmi-All-In-One-Docker/actions/workflows/test.yml) 5 | 6 | **注意,Dockerhub仓库从`ddsderek/bgmi-docker-all-in-one`换为`ddsderek/bgmi-all-in-one`** 7 | 8 | 参考 https://github.com/codysk/bgmi-docker-all-in-one 大佬的镜像制作而成。 9 | 10 | ## 功能 11 | 1. 硬链接,硬链接通过内置硬链接脚本实现。 12 | 2. `PUID`,`PGID`和`Umask`配置。 13 | 3. 内置 aria2-pro,transmission 下载器。 14 | 4. Transmission 下载器内置 `Transmission Web Control` UI。 15 | 5. Aria2 下载器内置 Ariang 管理界面。 16 | 6. Aria2 下载器自动 ban 掉迅雷等不受欢迎客户端。 17 | 7. Aria2 下载器内置 Anime trackers。 18 | 8. 常用脚本 `bgmi_download` `bgmi_hardlink`。 19 | 9. 镜像体积小,层数少。 20 | 10. 内置FileBrowser,管理文件更方便(通过```IP:PORT/file```访问)。 21 | 22 | ## BGmi介绍 23 | 24 | [官方介绍和使用方法](https://github.com/BGmi/BGmi/blob/master/README.md) 25 | 26 | ## 部署 27 | ### docker-cli 28 | 29 | **Transmission** 30 | 31 | > 注意:镜像内置Transmission Web Control管理界面,访问```IP:PORT/tr```,此```PORT```与访问BGmi Web端口为同一端口 32 | 33 | ```bash 34 | docker run -itd \ 35 | --name=bgmi \ 36 | --restart always \ 37 | -v /bgmi:/bgmi \ 38 | -v /media:/media \ 39 | -p 80:80 \ 40 | -p 51413:51413/tcp \ 41 | -p 51413:51413/udp \ 42 | -e TZ=Asia/Shanghai \ 43 | -e PGID=1000 \ 44 | -e PUID=1000 \ 45 | -e UMASK=022 \ 46 | -e MEDIA_DIR=/media/cartoon \ 47 | -e DOWNLOAD_DIR=/media/downloads \ 48 | -e BGMI_DATA_SOURCE=mikan_project \ 49 | -e BGMI_HTTP_ADMIN_TOKEN=password \ 50 | -e BGMI_HARDLINK_USE=true \ 51 | -e FILEBROWSER_USE=true \ 52 | -e TR_USER=bgmi \ 53 | -e TR_PASS=password \ 54 | -e TR_PEERPORT=51413 \ 55 | ddsderek/bgmi-all-in-one:transmission 56 | ``` 57 | 58 | **Aria2** 59 | 60 | > 注意:镜像内置Ariang管理界面,访问```IP:PORT/ariang```,此```PORT```与访问BGmi Web端口为同一端口 61 | > 其中Aria2 RPC端口做了Nginx反向代理,与访问BGmi Web端口为同一端口,类似于图中这样设置 62 | ![](./docs/img/ariang.png) 63 | 64 | ```bash 65 | docker run -itd \ 66 | --name=bgmi \ 67 | --restart always \ 68 | -v /bgmi:/bgmi \ 69 | -v /media:/media \ 70 | -p 80:80 \ 71 | -p 6888:6888/tcp \ 72 | -p 6888:6888/udp \ 73 | -e TZ=Asia/Shanghai \ 74 | -e PGID=1000 \ 75 | -e PUID=1000 \ 76 | -e UMASK=022 \ 77 | -e MEDIA_DIR=/media/cartoon \ 78 | -e DOWNLOAD_DIR=/media/downloads \ 79 | -e BGMI_DATA_SOURCE=mikan_project \ 80 | -e BGMI_HTTP_ADMIN_TOKEN=password \ 81 | -e BGMI_HARDLINK_USE=true \ 82 | -e FILEBROWSER_USE=true \ 83 | -e ARIA2_UPDATE_TRACKERS=true \ 84 | -e ARIA2_CUSTOM_TRACKER_URL=https://raw.githubusercontent.com/DDS-Derek/Aria2-Pro-Docker/main/tracker/all.list \ 85 | -e ARIA2_LISTEN_PORT=6888 \ 86 | -e ARIA2_RPC_PORT=6800 \ 87 | -e ARIA2_RPC_SECRET= \ 88 | -e ARIA2_DISK_CACHE= \ 89 | -e ARIA2_IPV6_MODE= \ 90 | --cap-add=NET_ADMIN \ 91 | ddsderek/bgmi-all-in-one:aria2 92 | ``` 93 | 94 | **不使用内置下载器** 95 | 96 | ```bash 97 | docker run -itd \ 98 | --name=bgmi \ 99 | --restart always \ 100 | -v /root/config/bgmi:/bgmi \ 101 | -v /media:/media \ 102 | -p 80:80 \ 103 | -e TZ=Asia/Shanghai \ 104 | -e PGID=1000 \ 105 | -e PUID=1000 \ 106 | -e UMASK=022 \ 107 | -e MEDIA_DIR=/media/cartoon \ 108 | -e DOWNLOAD_DIR=/media/downloads \ 109 | -e BGMI_DATA_SOURCE=mikan_project \ 110 | -e BGMI_HTTP_ADMIN_TOKEN=password \ 111 | -e BGMI_HARDLINK_USE=false \ 112 | -e FILEBROWSER_USE=true \ 113 | ddsderek/bgmi-all-in-one:latest 114 | ``` 115 | 116 | ### docker-compose 117 | 118 | **transmission** 119 | 120 | [docker-compose](https://github.com/DDS-Derek/BGmi-All-In-One-Docker/blob/master/docs/example/transmission/docker-compose.yml) 121 | 122 | **Aria2** 123 | 124 | [docker-compose](https://github.com/DDS-Derek/BGmi-All-In-One-Docker/blob/master/docs/example/aria2-pro/docker-compose.yml) 125 | 126 | **不使用内置下载器** 127 | 128 | [docker-compose](https://github.com/DDS-Derek/BGmi-All-In-One-Docker/blob/master/docs/example/default/docker-compose.yml) 129 | 130 | ## 参数说明 131 | 132 | ### 镜像TAG 133 | 134 | | TAG | 解释 | 135 | | :----------: | :--------------------------: | 136 | | latest | 只包含BGmi程序的镜像 | 137 | | transmission | 包含BGmi和transmission的镜像 | 138 | | aria2 | 包含BGmi和aria2的镜像 | 139 | 140 | ### BGmi 141 | 142 | | 参数 | 作用 | 143 | | :-------------------: | :--------------------------------------------------------: | 144 | | `-e TZ` | 时区设置 | 145 | | `-e PUID` | 启动程序用户ID | 146 | | `-e PGID` | 启动程序用户组ID | 147 | | `-e UMASK` | 权限掩码 | 148 | | `-e MEDIA_DIR` | BGmi 硬链接目录(目录必须在 `/media` 下) | 149 | | `-e DOWNLOAD_DIR` | BGmi 下载目录(目录必须在 `/media` 下) | 150 | | `-e BGMI_DATA_SOURCE` | 设置 BGMI 默认数据源(bangumi_moe、mikan_project 或 DMHY) | 151 | | `-e BGMI_HTTP_ADMIN_TOKEN` | 设置 BGMI Web 界面身份验证令牌 | 152 | | `-e BGMI_HARDLINK_USE` | 是否启用镜像内置的硬链接脚本(默认开启) | 153 | | `-e FILEBROWSER_USE` | 是否启用镜像内置的FileBrowser | 154 | | `-p 80` | BGmi Web 端口 | 155 | | `-v /bgmi` | 配置文件 | 156 | | `-v /media` | 媒体文件夹,包含下载文件和硬链接文件 | 157 | 158 | ### Transmission 159 | 160 | | 参数 | 作用 | 161 | | :--------------: | :-----------------------: | 162 | | `-e TR_USER` | transmission Web 登入用户 | 163 | | `-e TR_PASS` | transmission Web 登入密码 | 164 | | `-e TR_PEERPORT` | 种子传输端口 | 165 | 166 | ### Aria2 167 | 168 | 此镜像内置使用Aria2-Pro,具体参数设置请看[Aria2-Pro-Docker官方说明](https://github.com/P3TERX/Aria2-Pro-Docker#parameters) 169 | 170 | ## PUID GUID 说明 171 | 172 | 当在主机操作系统和容器之间使用卷(`-v`标志)权限问题时,我们通过允许您指定用户`PUID`和组来避免这个问题`PGID`。 173 | 174 | 确保主机上的任何卷目录都归您指定的同一用户所有,并且任何权限问题都会像魔术一样消失。 175 | 176 | 在这种情况下`PUID=1000`,`PGID=1000`找到你的用途`id user`如下: 177 | 178 | ``` 179 | $ id username 180 | uid=1000(dockeruser) gid=1000(dockergroup) groups=1000(dockergroup) 181 | ``` 182 | 183 | ## 硬链接说明 184 | 185 | 硬链接 BGmi 下载的新番资源,改善文件格式以便于自动化刮削,并且不会影响保种。 186 | 187 | 硬链接后的目录格式用于刮削器的自动识别,配置正确的话可以完全避免刮削。目前的配置适用于 Jellyfin 的刮削器, 188 | 理论上也可适用于绝大多数刮削器。 189 | 190 | - 番剧存储于文件夹 `BANGUMI_FOLDER_FORMAT` 下。默认格式是 `{name}`,如“小林家的龙女仆”。 191 | 也可以设置为嵌套,如 `{name}/Season {season}`,即“小林家的龙女仆/Season 2”。 192 | - 番剧的命名格式为 `BANGUMI_FILE_FORMAT`,默认是 `S{season:0>2d}E{episode:0>2d}.{format}`。 193 | 如“S01E01.mp4”。 -------------------------------------------------------------------------------- /aria2.Dockerfile: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1.9 2 | 3 | ARG RELEASE_VERSION 4 | 5 | FROM ddsderek/bgmi-all-in-one:${RELEASE_VERSION} 6 | 7 | ENV BGMI_VERSION=aria2 \ 8 | ARIA2_UPDATE_TRACKERS=true \ 9 | ARIA2_CUSTOM_TRACKER_URL=https://raw.githubusercontent.com/DDS-Derek/Aria2-Pro-Docker/main/tracker/all.list \ 10 | ARIA2_LISTEN_PORT=6888 \ 11 | ARIA2_RPC_PORT=6800 \ 12 | ARIA2_RPC_SECRET=password \ 13 | ARIA2_DISK_CACHE= \ 14 | ARIA2_IPV6_MODE= 15 | 16 | RUN set -ex && \ 17 | apk add --no-cache \ 18 | iptables \ 19 | ip6tables \ 20 | ipset \ 21 | libcap \ 22 | nodejs \ 23 | npm && \ 24 | # Aria2-Ban install 25 | npm i -g aria2b && \ 26 | # Aria2-Pro install 27 | curl --insecure -fsSL https://raw.githubusercontent.com/DDS-Derek/Aria2-Pro-Core/master/aria2-install.sh | bash && \ 28 | echo $(aria2c --version) > /versions/ARIA2C_VERSION.txt && \ 29 | # AriaNg install 30 | mkdir -p ${BGMI_HOME}/downloader/aria2/ariang && \ 31 | ARIANG_TAG=$(curl -s "https://api.github.com/repos/mayswind/AriaNg/releases/latest" | jq -r .tag_name) && \ 32 | echo ${ARIANG_TAG} > /versions/ARIANG_VERSION.txt && \ 33 | curl \ 34 | -sL https://github.com/mayswind/AriaNg/releases/download/${ARIANG_TAG}/AriaNg-${ARIANG_TAG}.zip | \ 35 | busybox unzip -qd ${BGMI_HOME}/downloader/aria2/ariang - && \ 36 | aria2c --version && \ 37 | # Clear 38 | rm -rf \ 39 | /var/cache/apk/* \ 40 | /root/.cache \ 41 | /tmp/* -------------------------------------------------------------------------------- /docs/example/aria2-pro/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.3' 2 | services: 3 | bgmi: 4 | container_name: BGmi 5 | restart: always 6 | volumes: 7 | - './bgmi:/bgmi' 8 | - '/media:/media' 9 | ports: 10 | - '80:80' 11 | - '6888:6888/tcp' 12 | - '6888:6888/udp' 13 | environment: 14 | - TZ=Asia/Shanghai 15 | - PGID=1000 16 | - PUID=1000 17 | - UMASK=022 18 | - MEDIA_DIR=/media/cartoon 19 | - DOWNLOAD_DIR=/media/downloads 20 | - BGMI_DATA_SOURCE=mikan_project 21 | - BGMI_HTTP_ADMIN_TOKEN=password 22 | - BGMI_HARDLINK_USE=true 23 | - FILEBROWSER_USE=true 24 | - ARIA2_UPDATE_TRACKERS=true 25 | - ARIA2_CUSTOM_TRACKER_URL=https://raw.githubusercontent.com/DDS-Derek/Aria2-Pro-Docker/main/tracker/all.list 26 | - ARIA2_LISTEN_PORT=6888 27 | - ARIA2_RPC_PORT=6800 28 | - ARIA2_RPC_SECRET= 29 | - ARIA2_DISK_CACHE= 30 | - ARIA2_IPV6_MODE= 31 | cap_add: 32 | - NET_ADMIN 33 | image: 'ddsderek/bgmi-all-in-one:aria2' -------------------------------------------------------------------------------- /docs/example/default/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.3' 2 | services: 3 | bgmi: 4 | container_name: BGmi 5 | restart: always 6 | volumes: 7 | - './bgmi:/bgmi' 8 | - '/media:/media' 9 | ports: 10 | - '80:80' 11 | environment: 12 | - TZ=Asia/Shanghai 13 | - PGID=1000 14 | - PUID=1000 15 | - UMASK=022 16 | - MEDIA_DIR=/media/cartoon 17 | - DOWNLOAD_DIR=/media/downloads 18 | - BGMI_DATA_SOURCE=mikan_project 19 | - BGMI_HTTP_ADMIN_TOKEN=password 20 | - BGMI_HARDLINK_USE=true 21 | - FILEBROWSER_USE=true 22 | image: 'ddsderek/bgmi-all-in-one:latest' -------------------------------------------------------------------------------- /docs/example/transmission/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.3' 2 | services: 3 | bgmi: 4 | container_name: BGmi 5 | restart: always 6 | volumes: 7 | - './bgmi:/bgmi' 8 | - '/media:/media' 9 | ports: 10 | - '80:80' 11 | - '51413:51413/tcp' 12 | - '51413:51413/udp' 13 | environment: 14 | - TZ=Asia/Shanghai 15 | - PGID=1000 16 | - PUID=1000 17 | - UMASK=022 18 | - MEDIA_DIR=/media/cartoon 19 | - DOWNLOAD_DIR=/media/downloads 20 | - BGMI_DATA_SOURCE=mikan_project 21 | - BGMI_HTTP_ADMIN_TOKEN=password 22 | - BGMI_HARDLINK_USE=true 23 | - FILEBROWSER_USE=true 24 | - TR_USER=bgmi 25 | - TR_PASS=password 26 | - TR_PEERPORT=51413 27 | image: 'ddsderek/bgmi-all-in-one:transmission' -------------------------------------------------------------------------------- /docs/img/ariang.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DDS-Derek/BGmi-All-In-One-Docker/97fa8564306ea6f63abd437f96af0d5f2ccaf9df/docs/img/ariang.png -------------------------------------------------------------------------------- /info.json: -------------------------------------------------------------------------------- 1 | { 2 | "Release_Version": "v4.5.4", 3 | "BGmi": { 4 | "version": "v4.5.0" 5 | }, 6 | "Transmission": { 7 | "web_home": "/usr/share/transmission/public_html" 8 | }, 9 | "Aria2": {} 10 | } 11 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": ["config:base"], 4 | "dockerfile": { 5 | "enabled": false 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /rootfs/etc/nginx/nginx.conf: -------------------------------------------------------------------------------- 1 | user bgmi; 2 | 3 | # Set number of worker processes automatically based on number of CPU cores. 4 | worker_processes auto; 5 | 6 | # Enables the use of JIT for regular expressions to speed-up their processing. 7 | pcre_jit on; 8 | 9 | # Configures default error logger. 10 | error_log /dev/stdout warn; 11 | 12 | # Includes files with directives to load dynamic modules. 13 | include /etc/nginx/modules/*.conf; 14 | 15 | # Include files with config snippets into the root context. 16 | include /etc/nginx/conf.d/*.conf; 17 | 18 | events { 19 | # The maximum number of simultaneous connections that can be opened by 20 | # a worker process. 21 | worker_connections 1024; 22 | } 23 | 24 | http { 25 | # Includes mapping of file name extensions to MIME types of responses 26 | # and defines the default type. 27 | include /etc/nginx/mime.types; 28 | default_type application/octet-stream; 29 | 30 | # Name servers used to resolve names of upstream servers into addresses. 31 | # It's also needed when using tcpsocket and udpsocket in Lua modules. 32 | #resolver 1.1.1.1 1.0.0.1 2606:4700:4700::1111 2606:4700:4700::1001; 33 | 34 | # Don't tell nginx version to the clients. Default is 'on'. 35 | server_tokens off; 36 | 37 | # Specifies the maximum accepted body size of a client request, as 38 | # indicated by the request header Content-Length. If the stated content 39 | # length is greater than this size, then the client receives the HTTP 40 | # error code 413. Set to 0 to disable. Default is '1m'. 41 | client_max_body_size 1m; 42 | 43 | # Sendfile copies data between one FD and other from within the kernel, 44 | # which is more efficient than read() + write(). Default is off. 45 | sendfile on; 46 | 47 | # Causes nginx to attempt to send its HTTP response head in one packet, 48 | # instead of using partial frames. Default is 'off'. 49 | tcp_nopush on; 50 | 51 | 52 | # Enables the specified protocols. Default is TLSv1 TLSv1.1 TLSv1.2. 53 | # TIP: If you're not obligated to support ancient clients, remove TLSv1.1. 54 | ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; 55 | 56 | # Path of the file with Diffie-Hellman parameters for EDH ciphers. 57 | # TIP: Generate with: `openssl dhparam -out /etc/ssl/nginx/dh2048.pem 2048` 58 | #ssl_dhparam /etc/ssl/nginx/dh2048.pem; 59 | 60 | # Specifies that our cipher suits should be preferred over client ciphers. 61 | # Default is 'off'. 62 | ssl_prefer_server_ciphers on; 63 | 64 | # Enables a shared SSL cache with size that can hold around 8000 sessions. 65 | # Default is 'none'. 66 | ssl_session_cache shared:SSL:2m; 67 | 68 | # Specifies a time during which a client may reuse the session parameters. 69 | # Default is '5m'. 70 | ssl_session_timeout 1h; 71 | 72 | # Disable TLS session tickets (they are insecure). Default is 'on'. 73 | ssl_session_tickets off; 74 | 75 | 76 | # Enable gzipping of responses. 77 | #gzip on; 78 | 79 | # Set the Vary HTTP header as defined in the RFC 2616. Default is 'off'. 80 | gzip_vary on; 81 | 82 | 83 | # Helper variable for proxying websockets. 84 | map $http_upgrade $connection_upgrade { 85 | default upgrade; 86 | '' close; 87 | } 88 | 89 | 90 | # Specifies the main log format. 91 | log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 92 | '$status $body_bytes_sent "$http_referer" ' 93 | '"$http_user_agent" "$http_x_forwarded_for"'; 94 | 95 | # Sets the path, format, and configuration for a buffered log write. 96 | access_log /dev/stdout main; 97 | 98 | 99 | # Includes virtual hosts configs. 100 | include /etc/nginx/http.d/*.conf; 101 | } 102 | -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/init-010-mkdir/run: -------------------------------------------------------------------------------- 1 | #!/usr/bin/with-contenv bash 2 | # shellcheck shell=bash 3 | # shellcheck disable=SC1091 4 | # shellcheck disable=SC2154 5 | 6 | . /home/bgmi-docker/init_base 7 | 8 | nginx_run="/var/run/nginx" 9 | bgmi_conf="/bgmi/conf/bgmi" 10 | bgmi_nginx="/bgmi/conf/nginx" 11 | filebrowser_conf="/bgmi/conf/filebrowser" 12 | media_cartoon=${MEDIA_DIR} 13 | meida_downloads=${DOWNLOAD_DIR} 14 | 15 | if [ ! -f "${first_lock}" ]; then 16 | 17 | if [ ! -d ${nginx_run} ]; then 18 | mkdir -p ${nginx_run} 19 | fi 20 | 21 | if [ ! -d ${bgmi_conf} ]; then 22 | mkdir -p ${bgmi_conf} 23 | fi 24 | 25 | if [ ! -d ${bgmi_nginx} ]; then 26 | mkdir -p ${bgmi_nginx} 27 | fi 28 | 29 | if [ "${FILEBROWSER_USE}" == "true" ]; then 30 | if [ ! -d ${filebrowser_conf} ]; then 31 | mkdir -p ${filebrowser_conf} 32 | fi 33 | fi 34 | 35 | if [ ! -d "${media_cartoon}" ]; then 36 | mkdir -p "${media_cartoon}" 37 | fi 38 | 39 | if [ ! -d "${meida_downloads}" ]; then 40 | mkdir -p "${meida_downloads}" 41 | fi 42 | 43 | fi -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/init-010-mkdir/type: -------------------------------------------------------------------------------- 1 | oneshot -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/init-010-mkdir/up: -------------------------------------------------------------------------------- 1 | /etc/s6-overlay/s6-rc.d/init-010-mkdir/run -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/init-020-adduser/dependencies.d/init-010-mkdir: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DDS-Derek/BGmi-All-In-One-Docker/97fa8564306ea6f63abd437f96af0d5f2ccaf9df/rootfs/etc/s6-overlay/s6-rc.d/init-020-adduser/dependencies.d/init-010-mkdir -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/init-020-adduser/run: -------------------------------------------------------------------------------- 1 | #!/usr/bin/with-contenv bash 2 | # shellcheck shell=bash 3 | # shellcheck disable=SC1091 4 | # shellcheck disable=SC2154 5 | 6 | . /home/bgmi-docker/init_base 7 | 8 | if [ ! -f "${first_lock}" ]; then 9 | 10 | if [[ -z ${PUID} && -z ${PGID} ]]; then 11 | WARN "Ignore permission settings. Start with root user" 12 | export PUID=0 13 | export PGID=0 14 | groupmod -o -g "$PGID" bgmi 2>&1 | sed "s#^#${Time} WARN | $0#g" | sed "s#/home/bgmi-docker/entrypoint.sh##g" 15 | usermod -o -u "$PUID" bgmi 2>&1 | sed "s#^#${Time} WARN | $0#g" | sed "s#/home/bgmi-docker/entrypoint.sh##g" 16 | else 17 | groupmod -o -g "$PGID" bgmi 2>&1 | sed "s#^#${Time} INFO | $0#g" | sed "s#/home/bgmi-docker/entrypoint.sh##g" 18 | usermod -o -u "$PUID" bgmi 2>&1 | sed "s#^#${Time} INFO | $0#g" | sed "s#/home/bgmi-docker/entrypoint.sh##g" 19 | fi 20 | 21 | fi -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/init-020-adduser/type: -------------------------------------------------------------------------------- 1 | oneshot -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/init-020-adduser/up: -------------------------------------------------------------------------------- 1 | /etc/s6-overlay/s6-rc.d/init-020-adduser/run -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/init-030-config/dependencies.d/init-020-adduser: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DDS-Derek/BGmi-All-In-One-Docker/97fa8564306ea6f63abd437f96af0d5f2ccaf9df/rootfs/etc/s6-overlay/s6-rc.d/init-030-config/dependencies.d/init-020-adduser -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/init-030-config/run: -------------------------------------------------------------------------------- 1 | #!/usr/bin/with-contenv bash 2 | # shellcheck shell=bash 3 | # shellcheck disable=SC1091 4 | # shellcheck disable=SC2154 5 | # shellcheck disable=SC2086 6 | 7 | . /home/bgmi-docker/init_base 8 | 9 | function __bgmi_crond { 10 | 11 | crontab -r 12 | if [ ! -f /etc/crontabs/root ]; then 13 | touch /etc/crontabs/root 14 | fi 15 | bash ${BGMI_HOME}/BGmi/bgmi/others/crontab.sh 16 | 17 | } 18 | 19 | function __config_bgmi { 20 | 21 | bangumi_db="$BGMI_PATH/bangumi.db" 22 | bgmi_config="$BGMI_PATH/config.toml" 23 | 24 | cp ${BGMI_HOME}/config/crontab.sh ${BGMI_HOME}/BGmi/bgmi/others/crontab.sh 25 | 26 | if [ ! -f $bangumi_db ]; then 27 | bgmi install 28 | __bgmi_crond 29 | else 30 | bgmi upgrade 31 | __bgmi_crond 32 | fi 33 | 34 | bgmi config set save_path --value ${DOWNLOAD_DIR} 35 | 36 | if [ "${BGMI_VERSION}" == "transmission" ]; then 37 | bgmi config set download_delegate --value transmission-rpc 38 | bgmi config set transmission rpc_path --value /tr/rpc 39 | if [[ -n "$TR_USER" ]] && [[ -n "$TR_PASS" ]]; then 40 | bgmi config set transmission rpc_username --value ${TR_USER} 41 | bgmi config set transmission rpc_password --value ${TR_PASS} 42 | fi 43 | elif [ "${BGMI_VERSION}" == "aria2" ]; then 44 | bgmi config set download_delegate --value aria2-rpc 45 | bgmi config set aria2 rpc_token --value token:${ARIA2_RPC_SECRET} 46 | bgmi config set aria2 rpc_url --value http://127.0.0.1:${ARIA2_RPC_PORT}/rpc 47 | fi 48 | 49 | } 50 | 51 | function __config_bgmi_hardlink { 52 | 53 | if [ ! -d ${BGMI_HARDLINK_PATH} ]; then 54 | mkdir -p ${BGMI_HARDLINK_PATH} 55 | fi 56 | 57 | if [ ! -f ${BGMI_HARDLINK_PATH}/config.py ]; then 58 | dockerize -no-overwrite -template ${BGMI_HOME}/config/config.py:${BGMI_HARDLINK_PATH}/config.py 59 | fi 60 | 61 | (crontab -l ; echo "20 */2 * * * umask ${UMASK}; LC_ALL=zh_CN.UTF-8 s6-setuidgid bgmi $(which python3) ${BGMI_HOME}/hardlink/hardlink.py run") | crontab - 62 | INFO "hard link timing task setting is completed" 63 | 64 | } 65 | 66 | function __config_nginx { 67 | 68 | bgmi_nginx="/bgmi/conf/nginx" 69 | bgmi_nginx_conf="$bgmi_nginx/bgmi.conf" 70 | nginx_conf_dir="/etc/nginx/http.d" 71 | 72 | rm -rf $nginx_conf_dir 73 | ln -s $bgmi_nginx $nginx_conf_dir 74 | 75 | if [ ! -f "${bgmi_nginx_conf}" ]; then 76 | if [ -z ${BGMI_VERSION} ]; then 77 | export NGINX_PARAMETER=" 78 | " 79 | elif [ "${BGMI_VERSION}" == "transmission" ]; then 80 | export NGINX_PARAMETER=" 81 | location /tr { 82 | proxy_pass http://127.0.0.1:9091; 83 | proxy_set_header Host \$host; 84 | proxy_set_header X-Real-IP \$remote_addr; 85 | proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; 86 | } 87 | " 88 | elif [ "${BGMI_VERSION}" == "aria2" ]; then 89 | export NGINX_PARAMETER=" 90 | location /ariang { 91 | alias /home/bgmi-docker/downloader/aria2/ariang; 92 | } 93 | 94 | location /jsonrpc { 95 | proxy_pass http://127.0.0.1:${ARIA2_RPC_PORT}/jsonrpc; 96 | proxy_set_header Host \$host; 97 | proxy_set_header X-Real-IP \$remote_addr; 98 | proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; 99 | } 100 | " 101 | fi 102 | dockerize -no-overwrite -template ${BGMI_HOME}/config/bgmi_nginx.conf.tmpl:${bgmi_nginx_conf} 103 | fi 104 | 105 | } 106 | 107 | function __set_downloader { 108 | 109 | if [ -z ${BGMI_VERSION} ]; then 110 | INFO "No downloader settings" 111 | elif [ "${BGMI_VERSION}" == "transmission" ]; then 112 | INFO "Set transmission" 113 | bash ${BGMI_HOME}/downloader/transmission/settings.sh 114 | elif [ "${BGMI_VERSION}" == "aria2" ]; then 115 | INFO "Set aria2" 116 | bash ${BGMI_HOME}/downloader/aria2/settings.sh 117 | else 118 | WARN "Wrong container version, start with default version" 119 | fi 120 | 121 | } 122 | 123 | if [ ! -f "${first_lock}" ]; then 124 | 125 | __config_bgmi 126 | 127 | if [ "${BGMI_HARDLINK_USE}" == "true" ]; then 128 | __config_bgmi_hardlink 129 | fi 130 | 131 | __config_nginx 132 | 133 | if [ "${FILEBROWSER_USE}" == "true" ]; then 134 | if [ ! -f /bgmi/conf/filebrowser/settings.json ]; then 135 | cp ${BGMI_HOME}/config/filebrowser.json /bgmi/conf/filebrowser/settings.json 136 | fi 137 | fi 138 | 139 | __set_downloader 140 | 141 | touch "${first_lock}" 142 | 143 | fi -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/init-030-config/type: -------------------------------------------------------------------------------- 1 | oneshot -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/init-030-config/up: -------------------------------------------------------------------------------- 1 | /etc/s6-overlay/s6-rc.d/init-030-config/run -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/init-040-fixuser/dependencies.d/init-030-config: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DDS-Derek/BGmi-All-In-One-Docker/97fa8564306ea6f63abd437f96af0d5f2ccaf9df/rootfs/etc/s6-overlay/s6-rc.d/init-040-fixuser/dependencies.d/init-030-config -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/init-040-fixuser/run: -------------------------------------------------------------------------------- 1 | #!/usr/bin/with-contenv bash 2 | # shellcheck shell=bash 3 | # shellcheck disable=SC1091 4 | 5 | . /home/bgmi-docker/init_base 6 | 7 | chown -R bgmi:bgmi \ 8 | /home/bgmi-docker \ 9 | /var/lib/nginx \ 10 | /run/nginx \ 11 | /var/log/nginx 12 | chown -R bgmi:bgmi \ 13 | /bgmi 14 | if [[ "$(stat -c '%U' /media)" != "bgmi" ]] || [[ "$(stat -c '%G' /media)" != "bgmi" ]]; then 15 | chown bgmi:bgmi \ 16 | /media 17 | fi 18 | if [[ "$(stat -c '%U' "${MEDIA_DIR}")" != "bgmi" ]] || [[ "$(stat -c '%G' "${MEDIA_DIR}")" != "bgmi" ]]; then 19 | chown bgmi:bgmi \ 20 | "${MEDIA_DIR}" 21 | fi 22 | if [[ "$(stat -c '%U' "${DOWNLOAD_DIR}")" != "bgmi" ]] || [[ "$(stat -c '%G' "${DOWNLOAD_DIR}")" != "bgmi" ]]; then 23 | chown bgmi:bgmi \ 24 | "${DOWNLOAD_DIR}" 25 | fi -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/init-040-fixuser/type: -------------------------------------------------------------------------------- 1 | oneshot -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/init-040-fixuser/up: -------------------------------------------------------------------------------- 1 | /etc/s6-overlay/s6-rc.d/init-040-fixuser/run -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/init-050-outset/dependencies.d/init-040-fixuser: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DDS-Derek/BGmi-All-In-One-Docker/97fa8564306ea6f63abd437f96af0d5f2ccaf9df/rootfs/etc/s6-overlay/s6-rc.d/init-050-outset/dependencies.d/init-040-fixuser -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/init-050-outset/run: -------------------------------------------------------------------------------- 1 | #!/usr/bin/with-contenv bash 2 | # shellcheck shell=bash 3 | # shellcheck disable=SC1091 4 | 5 | . /home/bgmi-docker/init_base 6 | 7 | cat /home/bgmi-docker/BGmi-Docker.logo 8 | echo "Current crontab is:" 9 | crontab -l 10 | 11 | echo "Software version information:" 12 | versions_dir="/versions" 13 | for file in "$versions_dir"/*; do 14 | if [ -f "$file" ]; then 15 | filename=$(basename "$file" .txt) 16 | content=$(cat "$file") 17 | echo "$filename $content" 18 | fi 19 | done -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/init-050-outset/type: -------------------------------------------------------------------------------- 1 | oneshot -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/init-050-outset/up: -------------------------------------------------------------------------------- 1 | /etc/s6-overlay/s6-rc.d/init-050-outset/run -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/svc-aria2-ban/dependencies.d/init-050-outset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DDS-Derek/BGmi-All-In-One-Docker/97fa8564306ea6f63abd437f96af0d5f2ccaf9df/rootfs/etc/s6-overlay/s6-rc.d/svc-aria2-ban/dependencies.d/init-050-outset -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/svc-aria2-ban/run: -------------------------------------------------------------------------------- 1 | #!/usr/bin/with-contenv bash 2 | # shellcheck shell=bash 3 | 4 | if [ "${BGMI_VERSION}" == "aria2" ]; then 5 | if capsh --print | grep -q '!cap_net_admin'; then 6 | INFO "Aria2-ban does not start" 7 | exec \ 8 | tail -f /dev/null 9 | else 10 | exec \ 11 | aria2b -u "http://127.0.0.1:${ARIA2_RPC_PORT}/jsonrpc" -s "${ARIA2_RPC_SECRET}" 12 | fi 13 | else 14 | exec \ 15 | tail -f /dev/null 16 | fi -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/svc-aria2-ban/type: -------------------------------------------------------------------------------- 1 | longrun -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/svc-bgmi-http/dependencies.d/init-050-outset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DDS-Derek/BGmi-All-In-One-Docker/97fa8564306ea6f63abd437f96af0d5f2ccaf9df/rootfs/etc/s6-overlay/s6-rc.d/svc-bgmi-http/dependencies.d/init-050-outset -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/svc-bgmi-http/notification-fd: -------------------------------------------------------------------------------- 1 | 3 -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/svc-bgmi-http/run: -------------------------------------------------------------------------------- 1 | #!/usr/bin/with-contenv bash 2 | # shellcheck shell=bash 3 | 4 | umask "${UMASK}" 5 | 6 | exec \ 7 | s6-notifyoncheck -d -n 300 -w 1000 -c "nc -z localhost 8888" \ 8 | s6-setuidgid bgmi bgmi_http --port=8888 --address=0.0.0.0 -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/svc-bgmi-http/type: -------------------------------------------------------------------------------- 1 | longrun -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/svc-crond/dependencies.d/init-050-outset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DDS-Derek/BGmi-All-In-One-Docker/97fa8564306ea6f63abd437f96af0d5f2ccaf9df/rootfs/etc/s6-overlay/s6-rc.d/svc-crond/dependencies.d/init-050-outset -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/svc-crond/run: -------------------------------------------------------------------------------- 1 | #!/usr/bin/with-contenv bash 2 | # shellcheck shell=bash 3 | 4 | exec \ 5 | s6-setuidgid root crond -f -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/svc-crond/type: -------------------------------------------------------------------------------- 1 | longrun -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/svc-downloader/dependencies.d/init-050-outset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DDS-Derek/BGmi-All-In-One-Docker/97fa8564306ea6f63abd437f96af0d5f2ccaf9df/rootfs/etc/s6-overlay/s6-rc.d/svc-downloader/dependencies.d/init-050-outset -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/svc-downloader/notification-fd: -------------------------------------------------------------------------------- 1 | 3 -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/svc-downloader/run: -------------------------------------------------------------------------------- 1 | #!/usr/bin/with-contenv bash 2 | # shellcheck shell=bash 3 | # shellcheck disable=SC1091 4 | 5 | . /home/bgmi-docker/init_base 6 | 7 | if [ -z "${BGMI_VERSION}" ]; then 8 | INFO "No downloader start" 9 | exec \ 10 | tail -f /dev/null 11 | elif [ "${BGMI_VERSION}" == "aria2" ]; then 12 | exec \ 13 | s6-notifyoncheck -d -n 300 -w 1000 -c "nc -z localhost ${ARIA2_RPC_PORT}" \ 14 | s6-setuidgid bgmi aria2c --conf-path=/bgmi/conf/aria2/aria2.conf 15 | elif [ "${BGMI_VERSION}" == "transmission" ]; then 16 | exec \ 17 | s6-notifyoncheck -d -n 300 -w 1000 -c "nc -z localhost 9091" \ 18 | s6-setuidgid bgmi transmission-daemon -f -g /bgmi/conf/transmission/ --encryption-preferred 19 | else 20 | INFO "No downloader start" 21 | exec \ 22 | tail -f /dev/null 23 | fi -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/svc-downloader/type: -------------------------------------------------------------------------------- 1 | longrun -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/svc-filebrowser/dependencies.d/init-050-outset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DDS-Derek/BGmi-All-In-One-Docker/97fa8564306ea6f63abd437f96af0d5f2ccaf9df/rootfs/etc/s6-overlay/s6-rc.d/svc-filebrowser/dependencies.d/init-050-outset -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/svc-filebrowser/notification-fd: -------------------------------------------------------------------------------- 1 | 3 -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/svc-filebrowser/run: -------------------------------------------------------------------------------- 1 | #!/usr/bin/with-contenv bash 2 | # shellcheck shell=bash 3 | # shellcheck disable=SC1091 4 | 5 | . /home/bgmi-docker/init_base 6 | 7 | umask "${UMASK}" 8 | 9 | if [ "${FILEBROWSER_USE}" == "true" ]; then 10 | exec \ 11 | s6-notifyoncheck -d -n 300 -w 1000 -c "nc -z localhost 8098" \ 12 | s6-setuidgid bgmi filebrowser -c /bgmi/conf/filebrowser/settings.json -d /bgmi/conf/filebrowser/filebrowser.db --noauth 13 | else 14 | exec \ 15 | tail -f /dev/null 16 | fi -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/svc-filebrowser/type: -------------------------------------------------------------------------------- 1 | longrun -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/svc-nginx/dependencies.d/init-050-outset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DDS-Derek/BGmi-All-In-One-Docker/97fa8564306ea6f63abd437f96af0d5f2ccaf9df/rootfs/etc/s6-overlay/s6-rc.d/svc-nginx/dependencies.d/init-050-outset -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/svc-nginx/run: -------------------------------------------------------------------------------- 1 | #!/usr/bin/with-contenv bash 2 | # shellcheck shell=bash 3 | 4 | exec \ 5 | s6-setuidgid root nginx -g "daemon off;" -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/svc-nginx/type: -------------------------------------------------------------------------------- 1 | longrun -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/init-010-mkdir: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DDS-Derek/BGmi-All-In-One-Docker/97fa8564306ea6f63abd437f96af0d5f2ccaf9df/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/init-010-mkdir -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/init-020-adduser: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DDS-Derek/BGmi-All-In-One-Docker/97fa8564306ea6f63abd437f96af0d5f2ccaf9df/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/init-020-adduser -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/init-030-config: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DDS-Derek/BGmi-All-In-One-Docker/97fa8564306ea6f63abd437f96af0d5f2ccaf9df/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/init-030-config -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/init-040-fixuser: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DDS-Derek/BGmi-All-In-One-Docker/97fa8564306ea6f63abd437f96af0d5f2ccaf9df/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/init-040-fixuser -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/init-050-outset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DDS-Derek/BGmi-All-In-One-Docker/97fa8564306ea6f63abd437f96af0d5f2ccaf9df/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/init-050-outset -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/svc-aria2-ban: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DDS-Derek/BGmi-All-In-One-Docker/97fa8564306ea6f63abd437f96af0d5f2ccaf9df/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/svc-aria2-ban -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/svc-bgmi-http: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DDS-Derek/BGmi-All-In-One-Docker/97fa8564306ea6f63abd437f96af0d5f2ccaf9df/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/svc-bgmi-http -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/svc-crond: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DDS-Derek/BGmi-All-In-One-Docker/97fa8564306ea6f63abd437f96af0d5f2ccaf9df/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/svc-crond -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/svc-downloader: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DDS-Derek/BGmi-All-In-One-Docker/97fa8564306ea6f63abd437f96af0d5f2ccaf9df/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/svc-downloader -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/svc-filebrowser: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DDS-Derek/BGmi-All-In-One-Docker/97fa8564306ea6f63abd437f96af0d5f2ccaf9df/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/svc-filebrowser -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/svc-nginx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DDS-Derek/BGmi-All-In-One-Docker/97fa8564306ea6f63abd437f96af0d5f2ccaf9df/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/svc-nginx -------------------------------------------------------------------------------- /rootfs/home/bgmi-docker/BGmi-Docker.logo: -------------------------------------------------------------------------------- 1 | ———————————————————————————————————————————————————————————————— 2 | ____ ____ _ ____ _ 3 | | __ ) / ___|_ __ ___ (_) | _ \ ___ ___| | _____ _ __ 4 | | _ \| | _| '_ ` _ \| | | | | |/ _ \ / __| |/ / _ \ '__| 5 | | |_) | |_| | | | | | | | | |_| | (_) | (__| < __/ | 6 | |____/ \____|_| |_| |_|_| |____/ \___/ \___|_|\_\___|_| 7 | 8 | 9 | https://github.com/DDS-Derek/BGmi-All-In-One-Docker 10 | 11 | Copyright (c) 2022-2023 DDSRem 12 | 13 | ———————————————————————————————————————————————————————————————— 14 | 15 | -------------------------------------------------------------------------------- /rootfs/home/bgmi-docker/config/bgmi_nginx.conf.tmpl: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80 default_server; 3 | server_name _; 4 | root /bgmi/; 5 | autoindex on; 6 | charset utf-8; 7 | 8 | location = /bangumi { 9 | return 301 $scheme://$http_host/bangumi/; 10 | } 11 | 12 | location /bangumi { 13 | alias {{ .Env.DOWNLOAD_DIR }}; 14 | } 15 | 16 | location /api { 17 | proxy_pass http://127.0.0.1:8888; 18 | } 19 | 20 | location /resource { 21 | proxy_pass http://127.0.0.1:8888; 22 | } 23 | 24 | location /file { 25 | proxy_pass http://127.0.0.1:8098; 26 | proxy_set_header Host $host; 27 | proxy_set_header X-Real-IP $remote_addr; 28 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 29 | } 30 | 31 | location / { 32 | alias /bgmi/conf/bgmi/front_static/; 33 | } 34 | {{ .Env.NGINX_PARAMETER }} 35 | } 36 | -------------------------------------------------------------------------------- /rootfs/home/bgmi-docker/config/config.py: -------------------------------------------------------------------------------- 1 | ####### 2 | # 配置 # 3 | ####### 4 | 5 | # 硬链接目标目录 6 | HARDLINK_DEST = '{{ .Env.MEDIA_DIR }}' 7 | 8 | # 硬链接特殊规则 9 | MAP_RULE = { 10 | # 键值为 BGmi 显示的番名 11 | '我立于百万生命之上 第二季': { 12 | # name 表示映射后的番名 13 | 'name': '我立于百万生命之上', 14 | # season 表示对应的季名,参照刮削数据库填写 15 | 'season': 2, 16 | }, 17 | '小林家的龙女仆S': { 18 | 'name': '小林家的龙女仆', 19 | 'season': 2, 20 | }, 21 | } 22 | 23 | # 番剧文件夹格式 24 | BANGUMI_FOLDER_FORMAT = "{name}" # 允许有多层级,如 {name}/Season {season} 25 | 26 | # 番剧文件格式 27 | BANGUMI_FILE_FORMAT = "S{season:0>2d}E{episode:0>2d}.{format}" -------------------------------------------------------------------------------- /rootfs/home/bgmi-docker/config/crontab.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # shellcheck shell=bash 3 | PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 4 | export PATH 5 | 6 | Green="\033[32m" 7 | Red="\033[31m" 8 | Yellow='\033[33m' 9 | Font="\033[0m" 10 | INFO="${Green}INFO${Font}" 11 | ERROR="${Red}ERROR${Font}" 12 | WARN="${Yellow}WARN${Font}" 13 | Time=$(date +"%Y-%m-%d %T") 14 | INFO(){ 15 | echo -e "${Time} ${INFO} | ${1}" 16 | } 17 | ERROR(){ 18 | echo -e "${Time} ${ERROR} | ${1}" 19 | } 20 | WARN(){ 21 | echo -e "${Time} ${WARN} | ${1}" 22 | } 23 | 24 | BGMI_PATH=$(which bgmi) 25 | DOWNLOAD="--download" 26 | 27 | usage(){ 28 | echo -e "Usage: sh crontab.sh [options]\n" 29 | echo -e "Options:\n --no-download\t\tNot download bangumi when updated" 30 | exit 31 | } 32 | 33 | if [ $# -ne 1 ] && [ $# -ne 0 ]; then 34 | usage 35 | fi 36 | 37 | if [ $# -eq 1 ] && [ "$1" != "--no-download" ]; then 38 | usage 39 | fi 40 | 41 | if [ $# -eq 1 ] && [ "$1" = "--no-download" ]; then 42 | DOWNLOAD="" 43 | fi 44 | 45 | if crontab -l | grep "bgmi update" > /dev/null; then 46 | INFO "crontab update already exist" 47 | else 48 | (crontab -l ; echo "0 */2 * * * umask ${UMASK}; LC_ALL=zh_CN.UTF-8 s6-setuidgid bgmi $BGMI_PATH update $DOWNLOAD") | crontab - 49 | INFO "crontab update added" 50 | fi 51 | 52 | 53 | if crontab -l | grep "bgmi cal" > /dev/null; then 54 | INFO "crontab update cover already exist" 55 | else 56 | (crontab -l ; echo "40 */10 * * * umask ${UMASK}; LC_ALL=zh_CN.UTF-8 TRAVIS_CI=1 s6-setuidgid bgmi $BGMI_PATH cal --force-update --download-cover") | crontab - 57 | INFO "crontab update cover added" 58 | fi -------------------------------------------------------------------------------- /rootfs/home/bgmi-docker/config/filebrowser.json: -------------------------------------------------------------------------------- 1 | { 2 | "port": 8098, 3 | "baseURL": "/file", 4 | "address": "", 5 | "log": "stdout", 6 | "database": "/bgmi/conf/filebrowser/filebrowser.db", 7 | "root": "/media" 8 | } -------------------------------------------------------------------------------- /rootfs/home/bgmi-docker/downloader/aria2/Aria2-Pro: -------------------------------------------------------------------------------- 1 | 2 | ----------------------------------------------------------------------------------------------- 3 | 4 | █████╗ ██████╗ ██╗ █████╗ ██████╗ ██████╗ ██████╗ ██████╗ 5 | ██╔══██╗██╔══██╗██║██╔══██╗╚════██╗ ██╔══██╗██╔══██╗██╔═══██╗ 6 | ███████║██████╔╝██║███████║ █████╔╝ ██████╔╝██████╔╝██║ ██║ 7 | ██╔══██║██╔══██╗██║██╔══██║██╔═══╝ ██╔═══╝ ██╔══██╗██║ ██║ 8 | ██║ ██║██║ ██║██║██║ ██║███████╗ ██║ ██║ ██║╚██████╔╝ 9 | ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ 10 | 11 | https://github.com/P3TERX/Aria2-Pro-Docker https://github.com/DDS-Derek/Aria2-Pro-Docker 12 | 13 | Copyright (c) 2020-2022 P3TERX DDSRem DDSDerek 14 | 15 | Version: COMMIT_HASH | Build Time: DATE_TIME 16 | ----------------------------------------------------------------------------------------------- 17 | -------------------------------------------------------------------------------- /rootfs/home/bgmi-docker/downloader/aria2/settings.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/with-contenv bash 2 | # shellcheck shell=bash 3 | # shellcheck disable=SC2086 4 | # _ _ ____ ____ 5 | # / \ _ __(_) __ _|___ \ | _ \ _ __ ___ 6 | # / _ \ | '__| |/ _` | __) | | |_) | '__/ _ \ 7 | # / ___ \| | | | (_| |/ __/ | __/| | | (_) | 8 | # /_/ \_\_| |_|\__,_|_____| |_| |_| \___/ 9 | # 10 | # https://github.com/P3TERX/Docker-Aria2-Pro https://github.com/DDS-Derek/Aria2-Pro-Docker 11 | # 12 | # Copyright (c) 2020-2022 P3TERX DDSRem DDSDerek 13 | # 14 | # This is free software, licensed under the MIT License. 15 | # See /LICENSE for more information. 16 | 17 | Green_font_prefix="\033[32m" 18 | Red_font_prefix="\033[31m" 19 | Font_color_suffix="\033[0m" 20 | INFO="[${Green_font_prefix}INFO${Font_color_suffix}]" 21 | ERROR="[${Red_font_prefix}ERROR${Font_color_suffix}]" 22 | ARIA2_CONF_DIR="/bgmi/conf/aria2" 23 | ARIA2_CONF="${ARIA2_CONF_DIR}/aria2.conf" 24 | SCRIPT_CONF="${ARIA2_CONF_DIR}/script.conf" 25 | SCRIPT_DIR="${ARIA2_CONF_DIR}/script" 26 | CURL_OPTIONS="-fsSL --connect-timeout 3 --max-time 3" 27 | PROFILE_URL1="https://p3terx.github.io/aria2.conf" 28 | PROFILE_URL2="https://aria2c.now.sh" 29 | PROFILE_URL3="https://cdn.jsdelivr.net/gh/P3TERX/aria2.conf" 30 | 31 | FILE_ALLOCATION_SET() { 32 | TMP_FILE="${DOWNLOAD_DIR}/P3TERX.COM" 33 | if fallocate -l 5G ${TMP_FILE}; then 34 | FILE_ALLOCATION=falloc 35 | else 36 | FILE_ALLOCATION=none 37 | fi 38 | rm -f ${TMP_FILE} 39 | sed -i "s@^\(file-allocation=\).*@\1${FILE_ALLOCATION}@" "${ARIA2_CONF}" 40 | } 41 | 42 | CONVERSION_ARIA2_CONF() { 43 | sed -i "s@^\(rpc-listen-port=\).*@\1${ARIA2_RPC_PORT:-6800}@" "${ARIA2_CONF}" 44 | sed -i "s@^\(listen-port=\).*@\1${ARIA2_LISTEN_PORT:-6888}@" "${ARIA2_CONF}" 45 | sed -i "s@^\(dht-listen-port=\).*@\1${ARIA2_LISTEN_PORT:-6888}@" "${ARIA2_CONF}" 46 | sed -i "s@^\(dir=\).*@\1${DOWNLOAD_DIR}@" "${ARIA2_CONF}" 47 | sed -i "s@/root/.aria2@${ARIA2_CONF_DIR}@" "${ARIA2_CONF}" 48 | sed -i "s@^#\(retry-on-.*=\).*@\1true@" "${ARIA2_CONF}" 49 | sed -i "s@^\(max-connection-per-server=\).*@\132@" "${ARIA2_CONF}" 50 | sed -i "s@^\(on-download-stop=\).*@\1${SCRIPT_DIR}/delete.sh@" ${ARIA2_CONF} 51 | sed -i "s@^\(on-download-complete=\).*@\1${SCRIPT_DIR}/clean.sh@" "${ARIA2_CONF}" 52 | [[ $TZ != "Asia/Shanghai" ]] && sed -i '11,$s/#.*//;/^$/d' "${ARIA2_CONF}" 53 | FILE_ALLOCATION_SET 54 | } 55 | 56 | CONVERSION_SCRIPT_CONF() { 57 | sed -i "s@\(upload-log=\).*@\1${ARIA2_CONF_DIR}/upload.log@" "${SCRIPT_CONF}" 58 | sed -i "s@\(move-log=\).*@\1${ARIA2_CONF_DIR}/move.log@" "${SCRIPT_CONF}" 59 | sed -i "s@^\(dest-dir=\).*@\1${DOWNLOAD_DIR}/completed@" "${SCRIPT_CONF}" 60 | } 61 | 62 | CONVERSION_CORE() { 63 | sed -i "s@\(ARIA2_CONF_DIR=\"\).*@\1${ARIA2_CONF_DIR}\"@" "${SCRIPT_DIR}/core" 64 | } 65 | 66 | DOWNLOAD_PROFILE() { 67 | for PROFILE in ${PROFILES}; do 68 | [[ ${PROFILE} = *.sh || ${PROFILE} = core ]] && cd "${SCRIPT_DIR}" || cd "${ARIA2_CONF_DIR}" || exit 69 | while [[ ! -f ${PROFILE} ]]; do 70 | rm -rf ${PROFILE} 71 | echo 72 | echo -e "${INFO} Downloading '${PROFILE}' ..." 73 | curl -O ${CURL_OPTIONS} ${PROFILE_URL1}/${PROFILE} || 74 | curl -O ${CURL_OPTIONS} ${PROFILE_URL2}/${PROFILE} || 75 | curl -O ${CURL_OPTIONS} ${PROFILE_URL3}/${PROFILE} 76 | [[ -s ${PROFILE} ]] && { 77 | [[ "${PROFILE}" = "aria2.conf" ]] && CONVERSION_ARIA2_CONF 78 | [[ "${PROFILE}" = "script.conf" ]] && CONVERSION_SCRIPT_CONF 79 | [[ "${PROFILE}" = "core" ]] && CONVERSION_CORE 80 | echo 81 | echo -e "${INFO} '${PROFILE}' download completed !" 82 | } || { 83 | echo 84 | echo -e "${ERROR} '${PROFILE}' download error, retry ..." 85 | sleep 3 86 | } 87 | done 88 | done 89 | } 90 | 91 | mkdir -p ${ARIA2_CONF_DIR} ${SCRIPT_DIR} ${DOWNLOAD_DIR} 92 | 93 | PROFILES=" 94 | aria2.conf 95 | script.conf 96 | core 97 | delete.sh 98 | dht.dat 99 | dht6.dat 100 | LICENSE 101 | " 102 | 103 | DOWNLOAD_PROFILE 104 | 105 | [[ ! -f "${ARIA2_CONF_DIR}/aria2.session" ]] && { 106 | rm -rf "${ARIA2_CONF_DIR}/aria2.session" 107 | touch "${ARIA2_CONF_DIR}/aria2.session" 108 | } 109 | 110 | if ! [[ "${ARIA2_UPDATE_TRACKERS}" = "false" || "${ARIA2_UPDATE_TRACKERS}" = "disable" ]]; then 111 | (crontab -l ; echo "0 7 * * * umask 022; export CUSTOM_TRACKER_URL=${ARIA2_CUSTOM_TRACKER_URL}; sleep $((RANDOM % 1800)); su-exec bgmi bash /bgmi/conf/aria2/script/tracker.sh /bgmi/conf/aria2/aria2.conf RPC 2>&1 | tee /bgmi/log/tracker.log") | crontab - 112 | if [ ! -d /bgmi/log ]; then 113 | mkdir /bgmi/log 114 | fi 115 | touch /bgmi/log/tracker.log 116 | PROFILES="tracker.sh" 117 | DOWNLOAD_PROFILE 118 | export CUSTOM_TRACKER_URL=${ARIA2_CUSTOM_TRACKER_URL}; bash ${SCRIPT_DIR}/tracker.sh ${ARIA2_CONF} 119 | fi 120 | 121 | [[ -e ${ARIA2_CONF_DIR}/delete.sh ]] && { 122 | rm -f ${ARIA2_CONF_DIR}/*.sh 123 | sed -i "s@^\(on-download-stop=\).*@\1${SCRIPT_DIR}/delete.sh@" ${ARIA2_CONF} 124 | sed -i "s@^\(on-download-complete=\).*@\1${SCRIPT_DIR}/clean.sh@" ${ARIA2_CONF} 125 | } 126 | 127 | sed -i "s@^\(dir=\).*@\1${DOWNLOAD_DIR}@" ${ARIA2_CONF} 128 | sed -i "s@^\(input-file=\).*@\1${ARIA2_CONF_DIR}/aria2.session@" ${ARIA2_CONF} 129 | sed -i "s@^\(save-session=\).*@\1${ARIA2_CONF_DIR}/aria2.session@" ${ARIA2_CONF} 130 | sed -i "s@^\(dht-file-path=\).*@\1${ARIA2_CONF_DIR}/dht.dat@" ${ARIA2_CONF} 131 | sed -i "s@^\(dht-file-path6=\).*@\1${ARIA2_CONF_DIR}/dht6.dat@" ${ARIA2_CONF} 132 | 133 | [[ -e ${ARIA2_CONF_DIR}/HelloWorld ]] && exit 0 134 | 135 | [[ ${ARIA2_RPC_PORT} ]] && 136 | sed -i "s@^\(rpc-listen-port=\).*@\1${ARIA2_RPC_PORT}@" ${ARIA2_CONF} 137 | 138 | [[ ${ARIA2_LISTEN_PORT} ]] && { 139 | sed -i "s@^\(listen-port=\).*@\1${ARIA2_LISTEN_PORT}@" ${ARIA2_CONF} 140 | sed -i "s@^\(dht-listen-port=\).*@\1${ARIA2_LISTEN_PORT}@" ${ARIA2_CONF} 141 | } 142 | 143 | [[ ${ARIA2_RPC_SECRET} ]] && 144 | sed -i "s@^\(rpc-secret=\).*@\1${ARIA2_RPC_SECRET}@" ${ARIA2_CONF} 145 | 146 | [[ ${ARIA2_DISK_CACHE} ]] && 147 | sed -i "s@^\(disk-cache=\).*@\1${ARIA2_DISK_CACHE}@" ${ARIA2_CONF} 148 | 149 | [[ "${ARIA2_IPV6_MODE}" = "false" || "${ARIA2_IPV6_MODE}" = "disable" ]] && { 150 | sed -i "s@^\(disable-ipv6=\).*@\1true@" ${ARIA2_CONF} 151 | sed -i "s@^\(enable-dht6=\).*@\1false@" ${ARIA2_CONF} 152 | } 153 | 154 | sed -i "s@^\(on-download-complete=\).*@\1finish-dl@" ${ARIA2_CONF} 155 | 156 | [[ "${ARIA2_SPECIAL_MODE}" = "rclone" ]] && 157 | sed -i "s@^\(on-download-complete=\).*@\1${SCRIPT_DIR}/upload.sh@" ${ARIA2_CONF} 158 | 159 | [[ "${ARIA2_SPECIAL_MODE}" = "move" ]] && 160 | sed -i "s@^\(on-download-complete=\).*@\1${SCRIPT_DIR}/move.sh@" ${ARIA2_CONF} 161 | 162 | # set ariang 163 | sed -i "s|6800|${ARIA2_RPC_PORT}|g" /home/bgmi-docker/downloader/aria2/ariang/js/aria-ng*.min.js 164 | 165 | cat /home/bgmi-docker/downloader/aria2/Aria2-Pro 166 | 167 | exit 0 -------------------------------------------------------------------------------- /rootfs/home/bgmi-docker/downloader/transmission/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "alt-speed-down": 50, 3 | "alt-speed-enabled": false, 4 | "alt-speed-time-begin": 540, 5 | "alt-speed-time-day": 127, 6 | "alt-speed-time-enabled": false, 7 | "alt-speed-time-end": 1020, 8 | "alt-speed-up": 50, 9 | "bind-address-ipv4": "0.0.0.0", 10 | "bind-address-ipv6": "::", 11 | "blocklist-enabled": false, 12 | "blocklist-url": "http://www.example.com/blocklist", 13 | "cache-size-mb": 4, 14 | "dht-enabled": true, 15 | "download-dir": "/bgmi/bangumi/other", 16 | "download-queue-enabled": true, 17 | "download-queue-size": 5, 18 | "encryption": 1, 19 | "idle-seeding-limit": 30, 20 | "idle-seeding-limit-enabled": false, 21 | "incomplete-dir": "/bgmi/bangumi/other", 22 | "incomplete-dir-enabled": false, 23 | "lpd-enabled": false, 24 | "message-level": 2, 25 | "peer-congestion-algorithm": "", 26 | "peer-id-ttl-hours": 6, 27 | "peer-limit-global": 200, 28 | "peer-limit-per-torrent": 50, 29 | "peer-port": 51413, 30 | "peer-port-random-high": 65535, 31 | "peer-port-random-low": 49152, 32 | "peer-port-random-on-start": false, 33 | "peer-socket-tos": "default", 34 | "pex-enabled": true, 35 | "port-forwarding-enabled": true, 36 | "preallocation": 1, 37 | "prefetch-enabled": true, 38 | "queue-stalled-enabled": true, 39 | "queue-stalled-minutes": 30, 40 | "ratio-limit": 2, 41 | "ratio-limit-enabled": false, 42 | "rename-partial-files": true, 43 | "rpc-authentication-required": false, 44 | "rpc-bind-address": "0.0.0.0", 45 | "rpc-enabled": true, 46 | "rpc-host-whitelist": "", 47 | "rpc-host-whitelist-enabled": false, 48 | "rpc-password": "{e19e377085488d8a11b1edf8cec76f78f44fc8d797sK5Hhh", 49 | "rpc-port": 9091, 50 | "rpc-url": "/tr/", 51 | "rpc-username": "", 52 | "rpc-whitelist": "127.0.0.1", 53 | "rpc-whitelist-enabled": false, 54 | "scrape-paused-torrents-enabled": true, 55 | "script-torrent-added-enabled": false, 56 | "script-torrent-added-filename": "", 57 | "script-torrent-done-enabled": true, 58 | "script-torrent-done-filename": "finish-dl", 59 | "script-torrent-done-seeding-enabled": false, 60 | "script-torrent-done-seeding-filename": "", 61 | "seed-queue-enabled": false, 62 | "seed-queue-size": 10, 63 | "speed-limit-down": 100, 64 | "speed-limit-down-enabled": false, 65 | "speed-limit-up": 100, 66 | "speed-limit-up-enabled": false, 67 | "start-added-torrents": true, 68 | "trash-original-torrent-files": false, 69 | "umask": 18, 70 | "upload-slots-per-torrent": 14, 71 | "utp-enabled": true 72 | } -------------------------------------------------------------------------------- /rootfs/home/bgmi-docker/downloader/transmission/settings.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/with-contenv bash 2 | # shellcheck shell=bash 3 | # shellcheck disable=SC2086 4 | 5 | transmission_config_file="/bgmi/conf/transmission/settings.json" 6 | 7 | if [ ! -f /bgmi/conf/transmission ]; then 8 | mkdir -p /bgmi/conf/transmission 9 | fi 10 | 11 | if [ ! -f ${transmission_config_file} ]; then 12 | cp ${BGMI_HOME}/downloader/transmission/settings.json ${transmission_config_file} 13 | fi 14 | 15 | sed -i "/\"rpc-url\"/c\ \"rpc-url\": \"/tr/\"," ${transmission_config_file} 16 | 17 | sed -i '/script-torrent-done-enabled/c\ "script-torrent-done-enabled": true,' ${transmission_config_file} 18 | sed -i '/script-torrent-done-filename/c\ "script-torrent-done-filename": "finish-dl",' ${transmission_config_file} 19 | 20 | if [[ -n "${TR_USER}" ]] && [[ -n "${TR_PASS}" ]]; then 21 | sed -i '/rpc-authentication-required/c\ "rpc-authentication-required": true,' ${transmission_config_file} 22 | sed -i "/rpc-username/c\ \"rpc-username\": \"$TR_USER\"," ${transmission_config_file} 23 | sed -i "/rpc-password/c\ \"rpc-password\": \"$TR_PASS\"," ${transmission_config_file} 24 | else 25 | sed -i '/rpc-authentication-required/c\ "rpc-authentication-required": false,' ${transmission_config_file} 26 | sed -i "/rpc-username/c\ \"rpc-username\": \"$TR_USER\"," ${transmission_config_file} 27 | sed -i "/rpc-password/c\ \"rpc-password\": \"$TR_PASS\"," ${transmission_config_file} 28 | fi 29 | 30 | if [[ -n "${TR_PEERPORT}" ]]; then 31 | sed -i "/\"peer-port\"/c\ \"peer-port\": ${TR_PEERPORT}," ${transmission_config_file} 32 | sed -i '/peer-port-random-on-start/c\ "peer-port-random-on-start": false,' ${transmission_config_file} 33 | fi 34 | 35 | if [ ! -z "${DOWNLOAD_DIR}" ]; then 36 | sed -i "/\"download-dir\"/c\ \"download-dir\": \"$DOWNLOAD_DIR\"," ${transmission_config_file} 37 | sed -i "/\"incomplete-dir\"/c\ \"incomplete-dir\": \"$DOWNLOAD_DIR\"," ${transmission_config_file} 38 | fi 39 | -------------------------------------------------------------------------------- /rootfs/home/bgmi-docker/hardlink/hardlink.py: -------------------------------------------------------------------------------- 1 | from bgmi.lib.models import STATUS_DELETED, STATUS_UPDATING, Followed 2 | from bgmi.front.index import get_player 3 | from bgmi import config as bgmi_config 4 | import os 5 | import sys 6 | config_path = os.getenv("BGMI_HARDLINK_PATH") 7 | if config_path: 8 | sys.path.append(config_path) 9 | from config import * 10 | import argparse as arg 11 | import re 12 | 13 | if hasattr(bgmi_config, 'SAVE_PATH'): 14 | save_path = bgmi_config.SAVE_PATH 15 | elif hasattr(bgmi_config, 'cfg'): 16 | save_path = bgmi_config.cfg.save_path 17 | else: 18 | print("不支持此 BGmi 版本!") 19 | exit(1) 20 | 21 | _CHINESE_NUMBERS = '一二三四五六七八九十' 22 | 23 | 24 | def extract_season_from_bgmi(bgmi_data: dict): 25 | """从 BGmi 的番剧信息中获得剧集的季信息""" 26 | info = { 27 | 'name': bgmi_data['bangumi_name'], 28 | 'season': 1, 29 | } 30 | 31 | # 特殊规则 32 | rule = MAP_RULE.get(info['name'], None) 33 | if rule is not None: 34 | info['name'] = rule['name'] 35 | info['season'] = rule['season'] 36 | return info 37 | 38 | # 检查番剧名中的季 39 | r = re.search(r'^(.*?) ?第(.)季$', info['name']) 40 | if r is not None: 41 | season = r.group(2) 42 | 43 | # 解析季数 44 | if season in _CHINESE_NUMBERS: 45 | season = _CHINESE_NUMBERS.index(season) + 1 46 | else: 47 | try: 48 | season = int(season) 49 | except ValueError: 50 | season = None 51 | 52 | if season is not None: 53 | info['name'] = r.group(1) 54 | info['season'] = season 55 | 56 | return info 57 | 58 | 59 | def run_hardlink(preview=False): 60 | """ 61 | 进行番剧硬链接 62 | :param preview: 是否预览硬链接 63 | """ 64 | 65 | # 获取番剧数据 66 | data = Followed.get_all_followed(STATUS_DELETED, STATUS_UPDATING) 67 | print("共订阅", len(data), "番剧,开始扫描...") 68 | 69 | # 创建硬链接 70 | link_count = 0 71 | for bangumi in data: 72 | # 获得信息 73 | info = { 74 | 'name': '', 75 | 'season': 1, 76 | 'episode': None, 77 | 'format': None, 78 | } 79 | info.update(extract_season_from_bgmi(bangumi)) 80 | # 获得播放数据 81 | player_data = get_player(bangumi['bangumi_name']) 82 | for episode, ep in player_data.items(): 83 | info['episode'] = episode 84 | path = ep['path'] 85 | info['format'] = path.split('.')[-1] 86 | # 源位置 87 | src_path = os.path.join(save_path, path[1:]) 88 | # 目标位置 89 | dst_dir = os.path.join( 90 | HARDLINK_DEST, 91 | BANGUMI_FOLDER_FORMAT.format(**info) 92 | ) 93 | dst_path = os.path.join( 94 | dst_dir, 95 | BANGUMI_FILE_FORMAT.format(**info) 96 | ) 97 | # 目录判断 98 | if not os.path.exists(dst_dir): 99 | os.makedirs(dst_dir) 100 | if os.path.exists(dst_path): 101 | # 已经链接过 102 | continue 103 | # 硬链接 104 | if preview: 105 | print(src_path, "-->", dst_path) 106 | else: 107 | os.link(src_path, dst_path) 108 | link_count += 1 109 | 110 | print("共链接", link_count, "个文件") 111 | 112 | 113 | def install_cron(): 114 | """ 115 | 安装 crontab 任务 116 | """ 117 | script_path = os.path.realpath(__file__) 118 | cmd = '(crontab -l;printf "0 */2 * * * ' \ 119 | 'LC_ALL=en_US.UTF-8 python3 ' + script_path + ' run\n")|crontab -' 120 | os.system(cmd) 121 | print("安装成功") 122 | 123 | 124 | if __name__ == '__main__': 125 | parser = arg.ArgumentParser( 126 | description='BGmi 硬链接工具') 127 | parser.add_argument(dest='action', metavar='动作', 128 | help='预览(preview)、运行(run)、设置定时任务(install_cron)') 129 | args = parser.parse_args() 130 | action = args.action 131 | if action == 'preview': 132 | run_hardlink(True) 133 | elif action == 'run': 134 | run_hardlink(False) 135 | elif action == 'install_cron': 136 | install_cron() 137 | else: 138 | print("动作不存在") 139 | exit(1) -------------------------------------------------------------------------------- /rootfs/home/bgmi-docker/init_base: -------------------------------------------------------------------------------- 1 | #!/usr/bin/with-contenv bash 2 | # shellcheck shell=bash 3 | # shellcheck disable=SC2034 4 | 5 | Green="\033[32m" 6 | Red="\033[31m" 7 | Yellow='\033[33m' 8 | Font="\033[0m" 9 | INFO="${Green}INFO${Font}" 10 | ERROR="${Red}ERROR${Font}" 11 | WARN="${Yellow}WARN${Font}" 12 | Time=$(date +"%Y-%m-%d %T") 13 | function INFO() { 14 | echo -e "${Time} ${INFO} | ${1}" 15 | } 16 | function ERROR() { 17 | echo -e "${Time} ${ERROR} | ${1}" 18 | } 19 | function WARN() { 20 | echo -e "${Time} ${WARN} | ${1}" 21 | } 22 | 23 | first_lock="${BGMI_HOME}/bgmi_install.lock" 24 | 25 | BGMI_HARDLINK_USE=${BGMI_HARDLINK_USE:-true} 26 | FILEBROWSER_USE=${FILEBROWSER_USE:-true} 27 | 28 | umask "${UMASK}" -------------------------------------------------------------------------------- /rootfs/home/bgmi-docker/utils/copy_cover.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | import os 3 | from shutil import copy 4 | from bgmi.config import cfg 5 | from bgmi.lib.models import STATUS_DELETED, STATUS_UPDATING, Followed 6 | from bgmi.script import ScriptRunner 7 | from bgmi.utils import normalize_path 8 | 9 | print(cfg.save_path) 10 | 11 | def getBangumiList(): 12 | 13 | # subscribe list 14 | data = Followed.get_all_followed(STATUS_DELETED, STATUS_UPDATING) 15 | 16 | # bgmi-scripts list 17 | runner = ScriptRunner() 18 | patch_list = runner.get_models_dict() 19 | for i in patch_list: 20 | i['cover'] = normalize_path(i['cover']) 21 | 22 | data.extend(patch_list) 23 | return data 24 | 25 | def copyCover2BangumiDirectory(bangumi=None): 26 | if bangumi is None: 27 | return 28 | coverBase = os.path.join(cfg.save_path, 'cover') 29 | 30 | coverPath = os.path.join(coverBase, bangumi['cover']) 31 | bangumiDir = os.path.join(cfg.save_path, bangumi['name']) 32 | 33 | print("copy: %s -> %s" % (coverPath, bangumiDir)) 34 | copy(coverPath, bangumiDir) 35 | 36 | def main(): 37 | bangumi_list = getBangumiList() 38 | for bangumi in bangumi_list: 39 | copyCover2BangumiDirectory(bangumi) 40 | pass 41 | pass 42 | 43 | if __name__ == '__main__': 44 | main() -------------------------------------------------------------------------------- /rootfs/usr/local/bin/bgmi_download: -------------------------------------------------------------------------------- 1 | #!/usr/bin/with-contenv bash 2 | # shellcheck shell=bash 3 | PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 4 | export PATH 5 | 6 | Green="\033[32m" 7 | Red="\033[31m" 8 | Yellow='\033[33m' 9 | Font="\033[0m" 10 | INFO="${Green}INFO${Font}" 11 | ERROR="${Red}ERROR${Font}" 12 | WARN="${Yellow}WARN${Font}" 13 | Time=$(date +"%Y-%m-%d %T") 14 | INFO(){ 15 | echo -e "${Time} ${INFO} | ${1}" 16 | } 17 | ERROR(){ 18 | echo -e "${Time} ${ERROR} | ${1}" 19 | } 20 | WARN(){ 21 | echo -e "${Time} ${WARN} | ${1}" 22 | } 23 | 24 | INFO "Download start" 25 | umask "${UMASK}"; LC_ALL=zh_CN.UTF-8 TRAVIS_CI=1 s6-setuidgid bgmi bgmi cal --force-update --download-cover 26 | umask "${UMASK}"; LC_ALL=zh_CN.UTF-8 s6-setuidgid bgmi bgmi update --download 27 | INFO "done" 28 | -------------------------------------------------------------------------------- /rootfs/usr/local/bin/bgmi_hardlink: -------------------------------------------------------------------------------- 1 | #!/usr/bin/with-contenv bash 2 | # shellcheck shell=bash 3 | PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 4 | export PATH 5 | 6 | Green="\033[32m" 7 | Red="\033[31m" 8 | Yellow='\033[33m' 9 | Font="\033[0m" 10 | INFO="${Green}INFO${Font}" 11 | ERROR="${Red}ERROR${Font}" 12 | WARN="${Yellow}WARN${Font}" 13 | Time=$(date +"%Y-%m-%d %T") 14 | INFO(){ 15 | echo -e "${Time} ${INFO} | ${1}" 16 | } 17 | ERROR(){ 18 | echo -e "${Time} ${ERROR} | ${1}" 19 | } 20 | WARN(){ 21 | echo -e "${Time} ${WARN} | ${1}" 22 | } 23 | 24 | INFO "Hardlink start" 25 | umask "${UMASK}"; LC_ALL=zh_CN.UTF-8 s6-setuidgid bgmi python3 /home/bgmi-docker/hardlink/hardlink.py run 26 | INFO "done" 27 | -------------------------------------------------------------------------------- /rootfs/usr/local/bin/finish-dl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/with-contenv bash 2 | # shellcheck shell=bash 3 | PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 4 | export PATH 5 | 6 | sleep 2 7 | 8 | bgmi_hardlink 9 | -------------------------------------------------------------------------------- /test.Dockerfile: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1.9 2 | 3 | FROM python:3.11.9-alpine3.20 4 | 5 | LABEL maintainer="ddstomo@gmail.com" 6 | 7 | ARG BGMI_VERSION 8 | 9 | ENV LANG=C.UTF-8 \ 10 | PS1="\[\e[32m\][\[\e[m\]\[\e[36m\]\u \[\e[m\]\[\e[37m\]@ \[\e[m\]\[\e[34m\]\h\[\e[m\]\[\e[32m\]]\[\e[m\] \[\e[37;35m\]in\[\e[m\] \[\e[33m\]\w\[\e[m\] \[\e[32m\][\[\e[m\]\[\e[37m\]\d\[\e[m\] \[\e[m\]\[\e[37m\]\t\[\e[m\]\[\e[32m\]]\[\e[m\] \n\[\e[1;31m\]$ \[\e[0m\]" \ 11 | S6_SERVICES_GRACETIME=30000 \ 12 | S6_KILL_GRACETIME=60000 \ 13 | S6_CMD_WAIT_FOR_SERVICES_MAXTIME=0 \ 14 | S6_SYNC_DISKS=1 \ 15 | BGMI_PATH="/bgmi/conf/bgmi" \ 16 | BGMI_HARDLINK_PATH="/bgmi/conf/bgmi_hardlink" \ 17 | BGMI_HOME="/home/bgmi-docker" \ 18 | PUID=1000 \ 19 | PGID=1000 \ 20 | UMASK=022 \ 21 | # 注意:这两个目录必须在 /media 下 22 | DOWNLOAD_DIR=/media/downloads \ 23 | MEDIA_DIR=/media/cartoon \ 24 | BGMI_HTTP_ADMIN_TOKEN=password \ 25 | BGMI_DATA_SOURCE=mikan_project 26 | 27 | COPY --from=powerman/dockerize:0.20.2 /usr/local/bin/dockerize /usr/local/bin 28 | 29 | RUN set -ex && \ 30 | dockerize --version && \ 31 | apk add --no-cache \ 32 | nginx \ 33 | bash \ 34 | curl \ 35 | tzdata \ 36 | shadow \ 37 | jq \ 38 | grep \ 39 | ca-certificates \ 40 | coreutils \ 41 | netcat-openbsd \ 42 | procps-ng \ 43 | findutils \ 44 | s6-overlay && \ 45 | pip install --upgrade pip && \ 46 | nginx -v && \ 47 | crond --help && \ 48 | # Adduser 49 | mkdir ${BGMI_HOME} /versions && \ 50 | addgroup -S bgmi -g 911 && \ 51 | adduser -S bgmi -G bgmi -h ${BGMI_HOME} -u 911 -s /bin/bash bgmi && \ 52 | # BGmi install 53 | echo ${BGMI_VERSION} > /versions/BGMI_VERSION.txt && \ 54 | mkdir -p ${BGMI_HOME}/BGmi && \ 55 | curl \ 56 | -sL https://github.com/BGmi/BGmi/archive/refs/tags/${BGMI_VERSION}.tar.gz | \ 57 | tar -zxvf - --strip-components 1 -C ${BGMI_HOME}/BGmi && \ 58 | pip install ${BGMI_HOME}/BGmi && \ 59 | bgmi --help && \ 60 | bgmi_http --help && \ 61 | # Filebrowser install 62 | touch /tmp/filebrowser_install.sh && \ 63 | curl -fsSL https://raw.githubusercontent.com/filebrowser/get/master/get.sh -o /tmp/filebrowser_install.sh && \ 64 | echo 'echo ${filemanager_tag} > /versions/FILEBROWSER_VERSION.txt' >> /tmp/filebrowser_install.sh && \ 65 | bash /tmp/filebrowser_install.sh && \ 66 | filebrowser version && \ 67 | # Clear 68 | rm -rf \ 69 | /var/cache/apk/* \ 70 | /root/.cache \ 71 | /tmp/* 72 | 73 | COPY --chmod=755 ./rootfs / 74 | 75 | ENTRYPOINT [ "/init" ] 76 | 77 | VOLUME [ "/bgmi", "/media" ] 78 | 79 | EXPOSE 80 80 | 81 | # Test Aria2 82 | 83 | ENV BGMI_VERSION=aria2 \ 84 | ARIA2_UPDATE_TRACKERS=true \ 85 | ARIA2_CUSTOM_TRACKER_URL=https://raw.githubusercontent.com/DDS-Derek/Aria2-Pro-Docker/main/tracker/all.list \ 86 | ARIA2_LISTEN_PORT=6888 \ 87 | ARIA2_RPC_PORT=6800 \ 88 | ARIA2_RPC_SECRET=password \ 89 | ARIA2_DISK_CACHE= \ 90 | ARIA2_IPV6_MODE= 91 | 92 | RUN set -ex && \ 93 | apk add --no-cache \ 94 | iptables \ 95 | ip6tables \ 96 | ipset \ 97 | libcap \ 98 | nodejs \ 99 | npm && \ 100 | # Aria2-Ban install 101 | npm i -g aria2b && \ 102 | # Aria2-Pro install 103 | curl --insecure -fsSL https://raw.githubusercontent.com/DDS-Derek/Aria2-Pro-Core/master/aria2-install.sh | bash && \ 104 | echo $(aria2c --version) > /versions/ARIA2C_VERSION.txt && \ 105 | # AriaNg install 106 | mkdir -p ${BGMI_HOME}/downloader/aria2/ariang && \ 107 | ARIANG_TAG=$(curl -s "https://api.github.com/repos/mayswind/AriaNg/releases/latest" | jq -r .tag_name) && \ 108 | echo ${ARIANG_TAG} > /versions/ARIANG_VERSION.txt && \ 109 | curl \ 110 | -sL https://github.com/mayswind/AriaNg/releases/download/${ARIANG_TAG}/AriaNg-${ARIANG_TAG}.zip | \ 111 | busybox unzip -qd ${BGMI_HOME}/downloader/aria2/ariang - && \ 112 | aria2c --version && \ 113 | # Clear 114 | rm -rf \ 115 | /var/cache/apk/* \ 116 | /root/.cache \ 117 | /tmp/* 118 | 119 | # Test Transmission 120 | 121 | ARG TRANSMISSION_WEB_HOME 122 | 123 | ENV BGMI_VERSION=transmission 124 | 125 | RUN set -ex && \ 126 | # Transmission install 127 | mkdir /tmp/version && \ 128 | curl -sL "http://dl-cdn.alpinelinux.org/alpine/v3.20/community/x86_64/APKINDEX.tar.gz" | tar -xz -C /tmp/version && \ 129 | TRANSMISSION_VERSION=$(awk '/^P:transmission$/,/V:/' /tmp/version/APKINDEX | sed -n 2p | sed 's/^V://') && \ 130 | apk add --update --no-cache \ 131 | transmission-cli==${TRANSMISSION_VERSION} \ 132 | transmission-daemon==${TRANSMISSION_VERSION} && \ 133 | transmission-daemon --version && \ 134 | # Transmission Web Control install 135 | mv ${TRANSMISSION_WEB_HOME}/index.html ${TRANSMISSION_WEB_HOME}/index.original.html && \ 136 | mkdir /tmp/web && \ 137 | TRANSMISSION_WEB_CONTROL_VERSION=$(curl -s "https://api.github.com/repos/ronggang/transmission-web-control/releases/latest" | jq -r .tag_name) && \ 138 | curl -sL "https://github.com/ronggang/transmission-web-control/archive/${TRANSMISSION_WEB_CONTROL_VERSION}.tar.gz" | \ 139 | tar xzvpf - --strip-components=1 -C /tmp/web && \ 140 | cp -r /tmp/web/src/* ${TRANSMISSION_WEB_HOME} && \ 141 | # Write version 142 | echo ${TRANSMISSION_VERSION} > /versions/TRANSMISSION_VERSION.txt && \ 143 | echo ${TRANSMISSION_WEB_CONTROL_VERSION} > /versions/TRANSMISSION_WEB_CONTROL_VERSION.txt && \ 144 | # Clear 145 | rm -rf \ 146 | /var/cache/apk/* \ 147 | /root/.cache \ 148 | /tmp/* 149 | -------------------------------------------------------------------------------- /tgbot.Dockerfile: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1.9 2 | 3 | FROM python:3.8-alpine 4 | 5 | ENV TZ=Asia/Shanghai \ 6 | DATA_PATH=/data 7 | 8 | WORKDIR /app 9 | 10 | RUN set -ex && \ 11 | apk add --no-cache \ 12 | bash \ 13 | tzdata \ 14 | tini && \ 15 | apk add --no-cache --virtual=build-dependencies \ 16 | build-base \ 17 | gcc \ 18 | g++ \ 19 | make \ 20 | git && \ 21 | git clone -b master https://github.com/codysk/bgmi-tgbot.git /app && \ 22 | pip install --upgrade pip && \ 23 | pip install -r requirements.txt && \ 24 | apk del --purge build-dependencies && \ 25 | rm -rf \ 26 | /var/cache/apk/* \ 27 | /root/.cache \ 28 | /tmp/* 29 | 30 | ENTRYPOINT ["tini", "-g", "python3", "run.py"] -------------------------------------------------------------------------------- /transmission.Dockerfile: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1.9 2 | 3 | ARG RELEASE_VERSION 4 | 5 | FROM ddsderek/bgmi-all-in-one:${RELEASE_VERSION} 6 | 7 | ARG TRANSMISSION_WEB_HOME 8 | 9 | ENV BGMI_VERSION=transmission 10 | 11 | RUN set -ex && \ 12 | # Transmission install 13 | mkdir /tmp/version && \ 14 | curl -sL "http://dl-cdn.alpinelinux.org/alpine/v3.20/community/x86_64/APKINDEX.tar.gz" | tar -xz -C /tmp/version && \ 15 | TRANSMISSION_VERSION=$(awk '/^P:transmission$/,/V:/' /tmp/version/APKINDEX | sed -n 2p | sed 's/^V://') && \ 16 | apk add --update --no-cache \ 17 | transmission-cli==${TRANSMISSION_VERSION} \ 18 | transmission-daemon==${TRANSMISSION_VERSION} && \ 19 | transmission-daemon --version && \ 20 | # Transmission Web Control install 21 | mv ${TRANSMISSION_WEB_HOME}/index.html ${TRANSMISSION_WEB_HOME}/index.original.html && \ 22 | mkdir /tmp/web && \ 23 | TRANSMISSION_WEB_CONTROL_VERSION=$(curl -s "https://api.github.com/repos/ronggang/transmission-web-control/releases/latest" | jq -r .tag_name) && \ 24 | curl -sL "https://github.com/ronggang/transmission-web-control/archive/${TRANSMISSION_WEB_CONTROL_VERSION}.tar.gz" | \ 25 | tar xzvpf - --strip-components=1 -C /tmp/web && \ 26 | cp -r /tmp/web/src/* ${TRANSMISSION_WEB_HOME} && \ 27 | # Write version 28 | echo ${TRANSMISSION_VERSION} > /versions/TRANSMISSION_VERSION.txt && \ 29 | echo ${TRANSMISSION_WEB_CONTROL_VERSION} > /versions/TRANSMISSION_WEB_CONTROL_VERSION.txt && \ 30 | # Clear 31 | rm -rf \ 32 | /var/cache/apk/* \ 33 | /root/.cache \ 34 | /tmp/* 35 | --------------------------------------------------------------------------------