杂谈

好玩的docker项目——群晖部署compose



所有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项目再推荐给大家~祝大家新年快乐,天天开心。

留言

您的电子邮箱地址不会被公开。 必填项已用 * 标注