所有docker项目均采用docker compose的方式部署

1、emby(影音服务器)

version: "2.3"
services:
  emby:
    image: lovechen/embyserver:latest
    container_name: embyserver-cp
    network_mode: bridge
    environment:
      - UID=1026
      - GID=100
      - GIDLIST=100,0
    volumes:
      - /volume1/docker/emby:/config
      - /volume1/1/raws-Music:/data
      - /volume4/4:/data1
      - /volume3/3:/data2
      - /volume2/2:/data3
    ports:
      - 8095:8096
    devices:
      - /dev/dri:/dev/dri
    restart: unless-stopped

推荐关闭硬件转码功能,使用开心版只是因为可以显示歌词。数据库这里推荐将数据库缓存大小(MB)改为512,分析行限制改为4000。

另外,如果你启用了实时监控,但是没生效,不扫描新文件,网上很多人给的方法是定时重启emby、去计划任务设置Scan media library狠狠地扫,这些都是错的,其实是元数据信息太多,然后群晖有限制上限导致的,具体可以参见https://emby.media/community/index.php?/topic/106276-how-to-fix-rtm-not-working-caused-by-limited-inotify-instanceswatches/
解决方式:群晖控制面板-计划任务-添加一个root任务,取名随便,比如fix for RTM,执行如下脚本即可——

sysctl fs.inotify.max_user_watches=1048576;
sysctl fs.inotify.max_user_instances=4096;

2、qbittorrent(BT下载器)

使用下载器之前,推荐提前建立一个macvlan的网络接口,ssh登录群晖——

sudo -i
#获取root权限
ip addr
#查看网络接口名称,通常不是eth0就是ovs_eth0
sudo ip link set ovs_eth0 promisc on
#开启混杂模式
docker network create -d macvlan --subnet=192.168.2.0/24 --gateway=192.168.2.1 --ipv6 --subnet=fd0d:7eb5:2afd::/64 --gateway=fd0d:7eb5:2afd::1 -o parent=ovs_eth0 macnet
#双栈版本,192.168.2.0改为你的ipv4网段,192.168.2.1改为你的ipv4网关,后面ipv6随便设置一个f开头的内网地址,可以照抄,macnet可以随便取名,后面建立容器需要用到
docker network create -d macvlan --subnet=192.168.2.0/24 --gateway=192.168.2.1 -o parent=ovs_eth0 macnet
#仅ipv4版本,如果添加错了,可以去群晖container manager网络里面直接删除,如果删除不了,取消已经链接的容器就可以执行删除了

这里推荐qbittorrent的4.3.9版本,给两个案例仅供参考——

version: "2.1"
services:
  qbittorrent:
    image: linuxserver/qbittorrent:14.3.9
    container_name: qbittorrent-pt
    restart: unless-stopped
    networks: 
      macnet:
        ipv4_address: 192.168.2.4
    volumes:
      - /volume1/docker/qbittorrent-pt:/config
      - /volume3/3/PT:/downloads
    environment:
      - WEBUI_PORT=8080
      - TZ=Asia/Shanghai
      - PUID=1026
      - PGID=100
    ports:
      - 8080:8080
      - 52004:52004
      - 52004:52004/udp
networks: 
  macnet:
    external: true
version: "2.1"
services:
  qbittorrent:
    image: johngong/qbittorrent:4.3.9
    container_name: qbittorrent-skyey2
    restart: unless-stopped
    networks: 
      macnet:
        ipv4_address: 192.168.2.5
    volumes:
      - /volume1/docker/qbittorrent-skyey2:/config
      - /volume1/1/downloads/pt:/Downloads
    environment:
      - WEBUIPORT=8989
      - TZ=Asia/Shanghai
      - PUID=1026
      - PGID=100
      - UMASK=022
      - TRACKERSAUTO=NO
    ports:
      - 8989:8989
      - 52003:52003
      - 52003:52003/udp
networks: 
  macnet:
    external: true

另外说下个人喜欢的配置——
选项-下载-默认 Torrent 管理模式改为自动,自己创建分类的时候请设置好下载地址,其他地方全不打钩;连接,全不勾选;
速度-设置速度限制,保持默认选1、3;BitTorrent,如果是BT勾选隐私前三个,如果是PT,隐私均不勾选,并关闭做种限制,均关掉Torrent 排队和自动添加tracker;
如果需要外网访问,在Web UI-验证-启用 Host header 属性验证,取消勾选。
其他保持默认即可。另外,如果发现切换版本后种子信息不显示(没有文件、tracker信息等),清除下浏览器cookie和缓存即可,并不是降级/升级版本失败。

3、AutoBangumi(自动追番神器)

因为群晖出于安全考虑,有默认限制macvlan网络的容器与宿主机之间的访问,所以如果把AutoBangumi建立在host或者bridge下面是没法访问qbittorrent的,但是macvlan网络的容器之间可以访问,而且路由器访问也是没问题,这里就不介绍如何用代码实现macvlan容器与群晖互通并添加计划任务了,直接将AutoBangumi也建立在macvlan下即可。

version: "3.8"
 
services:
  AutoBangumi:
    image: "estrellaxd/auto_bangumi:latest"
    container_name: AutoBangumi
    volumes:
      - ./config:/app/config
      - ./data:/app/data
    ports:
      - "7892:7892"
    restart: unless-stopped
    networks: 
      macnet:
        ipv4_address: 192.168.2.3
    environment:
      - TZ=Asia/Shanghai
      - AB_METHOD=Advance
      - PGID=1026
      - PUID=100
      - UMASK=022
networks: 
  macnet:
    external: true

AutoBangumi经历多个版本,界面已经又换成了中文,配置非常简单,官方也有详细的说明文档,这里就简单说下我自己解析设置的排除内容:
720 \d+-\d BIG5 繁日双语 先行版 繁體 繁体 Bilibili 繁日内嵌 简体内嵌

4、zflie(简洁直观的在线文件目录程序)

version: "3"
services:
  zfile:
    image: stilleshan/zfile:latest
    container_name: zfile-cp
    ports:
      - 8094:8080
    volumes:
      - /volume1/docker/zfile:/root/.zfile-v4:rw
      - /volume1/1/Share:/root/zfile/data:rw
    restart: always
    network_mode: bridge

建议就把zfile作为本地共享的一种方式,配置比alist简单多了。

5、chatgpt-web(使用api的ChatGPT演示网页)

version: '3'

services:
  app:
    image: chenzhaoyu94/chatgpt-web:latest
    network_mode: host
    restart: always
    ports:
      - 3002:3002
    environment:
      # 二选一
      OPENAI_API_KEY: sk-*******************************
      # 二选一
      # OPENAI_ACCESS_TOKEN: 
      # API接口地址,可选,设置 OPENAI_API_KEY 时可用
      OPENAI_API_BASE_URL: https://api.chatanywhere.com.cn
      # API模型,可选,设置 OPENAI_API_KEY 时可用
      # OPENAI_API_MODEL: 
      # 反向代理,可选
      # API_REVERSE_PROXY: 
      # 访问权限密钥,可选
      AUTH_SECRET_KEY: *******************************
      # 每小时最大请求次数,可选,默认无限
      # MAX_REQUEST_PER_HOUR: 0
      # 超时,单位毫秒,可选
      TIMEOUT_MS: 60000
      # Socks代理,可选,和 SOCKS_PROXY_PORT 一起时生效
      # SOCKS_PROXY_HOST: 
      # Socks代理端口,可选,和 SOCKS_PROXY_HOST 一起时生效
      # SOCKS_PROXY_PORT: 

推荐去这里领取免费api,https://github.com/chatanywhere/GPT_API_free,上面我自己用不到的部分都用#注释了,有需要可以自己去#添加。

6、speedtest(测速软件,测试你当前的设备和群晖之间的网速)

version: "3"

services:
  web:
    image: adolfintel/speedtest:latest
    container_name: speedtest
    hostname: speedtest
    restart: unless-stopped
    network_mode: bridge
    ports:
      - 8844:80

7、qdtoday(自动签到,支持大部分论坛和部分应用)

version: "3"
services:
  qiandao:
    image: qdtoday/qd:latest
    container_name: qiandao
    network_mode: bridge
    volumes:
      - /volume1/docker/qiandao:/usr/src/app/config
    ports:
      - 8923:80
    restart: unless-stopped

配置很复杂,不过主要难点还是在于获取cookies,电脑上就用Chrome之类的按F12获取,手机上推荐Alook和VNET,另外推荐一个仓库:https://github.com/wjf0214/qd-templates,分支写master。

8、qinglong(自动京东打工签到,还支持阿里云盘)

version: '2'
services:
  web:
    container_name: qinglong
    image: whyour/qinglong:latest
    network_mode: bridge
    volumes:
      - /volume1/docker/qinglong:/ql/data
    ports:
      - "0.0.0.0:5700:5700"
    restart: unless-stopped

推荐KingRan库,https://github.com/KingRan/KR.git
阿里云盘每日签到,https://github.com/mrabit/aliyundriveDailyCheck.git
以及二次元虫洞的签到脚本,https://github.com/CelestialRipple/2cycd_Autosignin/blob/main/autosignin.py
添加脚本的时候,直接去脚本管理新建一个文件,取名2cycd.py,记得一定要加.py,复制上面的代码进去,然后去定时任务那里新建一个任务,命令/脚本填写task 2cycd.py,定时规则比如每天8点,0 8 * * *,这样就可以了。
另外京东的环境变量可以只写JD_WSCK,需要手机app抓取(推荐),也可以在网页抓JD_COOKIE,失效很快就是。前者格式为pin=123;wskey=123;(注意最后的;),后者格式为pt_key=123;pt_pin=123;(注意最后的;)。

9、flaresolverr(签到PT站等脚本的依赖,作用是跳过cloudflare的验证)

version: "3"

services:
  web:
    image: 15cm/flaresolverr:3.0.0
    container_name: flaresolverr
    hostname: flaresolverr
    restart: unless-stopped
    network_mode: bridge
    ports:
      - 8191:8191
    environment:
      - TZ="Asia/Shanghai"
      - LOG_LEVEL=info

10、reader(非常有名的Legado的docker版阅读器)

version: '3.1'

services:
  reader:
    container_name: reader
    image: hectorqin/reader:latest
    restart: always
    network_mode: bridge
    ports:
      - 4395:8080
    volumes:
      - /volume1/docker/reader/logs:/logs
      - /volume1/docker/reader/storage:/storage
    environment:
      - SPRING_PROFILES_ACTIVE=prod
      - READER_APP_SECURE=true #开启登录鉴权,开启后将支持多用户模式
      - READER_APP_CACHECHAPTERCONTENT=true #是否开启缓存章节内容 V2.0
      - READER_APP_SECUREKEY=123456  #管理员密码  可自行修改
      - READER_APP_INVITECODE=123456 #注册邀请码,如需要取消注释 可自行修改

个人感觉比calibre好用,推荐作为本地书籍的在线阅读管理器,当然也可以添加网络源。

11、ms-ra-forwarder(一个本地的在线文本转语音API,支持微软语音)

version: '3'

services:
  ms-ra-forwarder:
    container_name: ms-ra-forwarder
    image: wxxxcxx/ms-ra-forwarder:latest
    restart: unless-stopped
    network_mode: bridge
    ports:
      - 3000:3000
    environment:
      # 不需要可以不用设置环境变量
      - TOKEN=123456

搭配上面的reader使用。

12、Alist(多网盘文件列表程序)

version: '3.3'
services:
    alist:
        image: 'xhofe/alist:latest'
        container_name: alist
        volumes:
            - '/volume1/docker/alist:/opt/alist/data'
            - '/volume1/1/downloads/the story:/1'
            - '/volume2/2/after story:/2'
            - '/volume3/3/temp:/3'
            - '/volume4/4/before story:/4'
        ports:
            - '5244:5244'
        environment:
            - PUID=1026
            - PGID=100
            - UMASK=022
        restart: unless-stopped
        network_mode: host

群晖的Alist和aria2、qb的联动,导入种子后的下载权限总是有问题,提示下载错误。再加上离线下载这个功能并不太实用,试了很多权限添加方式后,都不行,果断放弃了,欢迎有爱的大佬告诉我解决方法呀~

13、NASTools(NAS媒体库管理工具)

version: "3"
services:
  nas-tools:
    image: hsuyelin/nas-tools:latest
    ports:
      - 3003:3000
    volumes:
      - /volume1/docker/nas-tools:/config
      - /volume3/3:/3
    environment: 
      - PUID=1026
      - PGID=100
      - UMASK=022
      - NASTOOL_AUTO_UPDATE=false
      - NASTOOL_CN_UPDATE=false
    restart: always
    network_mode: bridge
    hostname: nas-tools
    container_name: nas-tools

本人用nastools主要是用于创建硬链接,PT刷流什么的,还是喜欢手动。

14、CloudDrive2(云盘本地挂载的一站式的多云盘解决方案)

sudo -i
#获取root权限
mkdir -p /etc/systemd/system/docker.service.d/
cat <<EOF > /etc/systemd/system/docker.service.d/clear_mount_propagation_flags.conf
[Service]
MountFlags=shared
EOF
#开启MountFlags
mount --make-shared /volume1
#开启share类型挂载,这里需要预先在群晖控制面板-共享文件夹里新建一个共享文件夹,这里以建立在volume1硬盘下自定义名称为CloudNAS的共享文件夹为例进行演示,如果你建立在其他volume,请自行更改命令行里的数字
#后续每次启动docker前都需要运行mount……volume1这一行命令,建议在群辉控制面板-计划任务,新增触发的任务,并设置开机启动即可

事先准备完成后,下面是compose——

version: "3.8"
services:
  cloudnas:
    image: cloudnas/clouddrive2:latest
    container_name: clouddrive2
    network_mode: bridge
    environment:
      - TZ=Asia/Shanghai
      - CLOUDDRIVE_HOME=/Config
    volumes:
      - /volume1/CloudNAS:/CloudNAS:shared
      - /volume1/docker/clouddrive2:/Config
      - /volume1/1:/1
      - /volume2/2:/2
      - /volume3/3:/3
      - /volume4/4:/4
    ports:
      - 29798:19798
    devices:
      - /dev/fuse:/dev/fuse
    restart: unless-stopped
    privileged: true

可以建立多个,比如我还建立了一个如下——

version: "3.8"
services:
  cloudnas:
    image: cloudnas/clouddrive2:latest
    container_name: clouddrive
    network_mode: bridge
    environment:
      - TZ=Asia/Shanghai
      - CLOUDDRIVE_HOME=/Config
    volumes:
      - /volume1/CloudNAS:/CloudNAS:shared
      - /volume1/docker/clouddrive:/Config
      - /volume1/1:/1
      - /volume2/2:/2
      - /volume3/3:/3
      - /volume4/4:/4
    ports:
      - 19798:19798
    devices:
      - /dev/fuse:/dev/fuse
    restart: unless-stopped
    privileged: true

注意:想要映射给容器里的本地文件夹目录,挂载时后面不需要加“:share”,容器创建完成后需要登录clouddrive2进行挂载网盘操作,具体可以参考https://www.huluohu.com/posts/332/的第四步——
1、选择需要挂载的网盘,然后点击上面的“电脑”图标
2、在弹出的界面中选择挂载点,选择/CloudNAS
3、选完以后,点击挂载,就 OK 啦(可自定义挂载文件夹名称)

如果嫌麻烦,也可以使用矿神源的套件版来安装clouddrive2,套件地址——https://spk7.imnks.com/,开机启动脚本更换为——sudo sed -i 's/package/root/g' /var/packages/CloudDrive2/conf/privilege
不过套件每次安装后都会在群辉系统里残留很多垃圾,比如系统内部用户、一些缓存设置文件之类的,如果有强迫症,可以参考这篇文章进行删除https://www.takochan.moe/archives/91,需要root执行权限,请务必小心操作!

15、miniflux(开源轻量级 RSS 阅读器)

version: "3"
services:
  miniflux:
    image: miniflux/miniflux:latest
    container_name: miniflux
    depends_on:
      - db
    environment:
      - DATABASE_URL=postgres://miniflux:secret@db/miniflux?sslmode=disable
      - RUN_MIGRATIONS=1
      - FETCH_YOUTUBE_WATCH_TIME=1
      - CREATE_ADMIN=1
      - ADMIN_USERNAME=admin
      - ADMIN_PASSWORD=adminadmin
      - BASE_URL=http://127.0.0.1:8480
      - POLLING_FREQUENCY=20
      - POLLING_PARSING_ERROR_LIMIT=0
      - BATCH_SIZE=100
      - POLLING_SCHEDULER=entry_frequency
      - SCHEDULER_ENTRY_FREQUENCY_MAX_INTERVAL=45
      - MEDIA_PROXY_PRIVATE_KEY=password
      - DATABASE_MAX_CONNS=50
      - DATABASE_MIN_CONNS=5
      - WORKER_POOL_SIZE=10
    restart: always
    ports:
      - "8480:8080"

  db:
    image: postgres:latest
    container_name: miniflux-postgres
    restart: always
    environment:
      - POSTGRES_USER=miniflux
      - POSTGRES_PASSWORD=secret
      - POSTGRES_DB=miniflux
    volumes:
      - /volume1/docker/miniflux:/var/lib/postgresql/data

注意提前创建/volume1/docker/miniflux目录来装postgres的数据库,开启文件夹everyone读写权限并保证为空白目录(目录下没有任何文件、文件夹)。admin/adminadmin的用户名和密码登录后均可修改,SCHEDULER_ENTRY_FREQUENCY_MAX_INTERVAL变量最高就是30min刷新一次,我这里设置成45也没有效果,如果不需要如此频繁的刷新,建议手动禁止(如一些个人博客之类的)。
还有就是项目会自行创建一个miniflux_default的bridge网络,这个保持这样就好,不然会报错(miniflux无法找到数据库,会一直去dns服务器:53的地址找)。原因大概如下——

User-defined bridges provide automatic DNS resolution between containers.
Containers on the default bridge network can only access each other by IP addresses, unless you use the --link option, which is considered legacy. On a user-defined bridge network, containers can resolve each other by name or alias.
翻译过来大意:就是用户自定义的网卡可以在容器之间提供自动的 DNS 解析,缺省的桥接网络上的容器只能通过 IP 地址互相访问,除非使用 --link 参数。在用户自定义的网卡上,容器直接可以通过名称或者别名相互解析。

如果需要自建rsshub服务,可以参考如下配置——

version: "3"
services:
  miniflux:
    image: miniflux/miniflux:latest
    container_name: miniflux
    depends_on:
      - db
      - rsshub
    environment:
      - DATABASE_URL=postgres://miniflux:secret@db/miniflux?sslmode=disable
      - RUN_MIGRATIONS=1
      - FETCH_YOUTUBE_WATCH_TIME=1
      - CREATE_ADMIN=1
      - ADMIN_USERNAME=admin
      - ADMIN_PASSWORD=adminadmin
      - BASE_URL=http://127.0.0.1:8480
      - POLLING_FREQUENCY=60
      - POLLING_PARSING_ERROR_LIMIT=0
      - BATCH_SIZE=100
      - POLLING_SCHEDULER=entry_frequency
      - SCHEDULER_ENTRY_FREQUENCY_MAX_INTERVAL=30
      - MEDIA_PROXY_PRIVATE_KEY=password
      - DATABASE_MAX_CONNS=50
      - DATABASE_MIN_CONNS=5
      - WORKER_POOL_SIZE=10
    restart: always
    ports:
      - "8480:8080"

  db:
    image: postgres:latest
    container_name: miniflux-postgres
    restart: always
    environment:
      - POSTGRES_USER=miniflux
      - POSTGRES_PASSWORD=secret
      - POSTGRES_DB=miniflux
    volumes:
      - /volume1/docker/miniflux:/var/lib/postgresql/data
  rsshub:
    image: diygod/rsshub:latest
    container_name: miniflux-rsshub
    restart: always
    ports:
      - "1200:1200"
    environment:
      NODE_ENV: production
      CACHE_TYPE: redis
      REDIS_URL: 'redis://redis:6379/'
      PUPPETEER_WS_ENDPOINT: 'ws://browserless:3000'
    depends_on:
      - redis
      - browserless
  browserless:
      image: browserless/chrome:latest
      container_name: miniflux-browserless
      restart: always
      ulimits:
        core:
          hard: 0
          soft: 0
  redis:
      image: redis:alpine
      container_name: miniflux-redis
      restart: always
      volumes:
          - redis-data:/data

volumes:
    redis-data:

我个人是觉得官方的rsshub.app已经足够好用了,没必要浪费服务器资源自己搭建,当然有需要用到个人cookies的除外。创建好后在订阅地址填写http://rsshub:1200/或者http://内网服务器ip地址:1200/就行,若要映射到公网请自行研究。
再提一嘴,大部分个人博客网站,包括wordpress在内的默认rss订阅地址都是网址/feed,比如本站就是https://sirongzi.xyz/feed/,阿里嘎多喵。

另外如果没有软路由还可以用DDNS-GO来进行ddns。

以后发现了其他有意思好玩实用的docker项目再推荐给大家~祝大家新年快乐,天天开心。

幸福とは現在を楽しむことであり、また明日を楽しみにすることです。
最后更新于 2024-04-29