devome / dockerfiles

一些Dockerfile
https://evine.win
GNU General Public License v3.0
197 stars 22 forks source link

v4 v6同时绑定时好像不会主动发起v6连接? #75

Open Franinc opened 1 year ago

Franinc commented 1 year ago

unraid:6.11.5 docker镜像:4.4.5(天雪禁了qb每个版本的前两个小版本比如4.5.0和4.5.1这种) host网络类型,qb只开tcp,www.port.tools/port-checker-ipv6测试v4 v6端口全通。rarbg选了4个热门种+pt一个种测试90分钟。

qb选绑定“所有地址”,有上下行的v4 peer一切正常,flag参数里有 I(传入连接)和没 I 的peer都有,而v6 peer一方面数量远小于v4,另一方面有上下行的v6 peer的flag里全都有 I 。90分钟测试我全在手动ban掉v4 peer和flag有 I 的v6,但从没刷出过flag不带 I 的v6 peer。

qb选绑定“所有ipv6地址”,现在v6 peer一切正常,flag参数里有 I(传入连接)和没 I 的peer全都有了。直接切回绑定“所有地址”,暂停并重开任务,又变回老样子

devome commented 1 year ago

这个很难讲,因素太多了。比如:仅ipv6时,tracker服务器主动向你广播了其他ipv6 peer,而ipv4+ipv6时,只给你广播了ipv4 peer;又或者同时存在ipv4+ipv6时,client会优先连接ipv4 peer,当已经满足了你所设置的条件时就不再联系ipv6 peer;又或者是一些tracker服务器对双ip支持不够,导致peer和peer间存在问题:或者是与tracker通信时间不一,双ip时,你的client在同tracker服务器通信时刚好没能拿到ipv6 peer,而服务器拿到你的peer时又刚好广播给其他peer了;又或者是90分钟这个时长太短,不足以支持你的观点;又或者是连接双方都是ipv4+ipv 6时,你的client仅主动建立ipv4连接不主动建立ipv6连接;又或者是版本太老,等等之类的。

此issue与本镜像倒是关系不大,如有疑惑请向官方提吧。

Franinc commented 1 year ago

不好意思,主要手头几个社区几乎没深入关注qb这类工具的,只有不通时才有讨论,另外qb docker host网络类型和unraid有玄学兼容问题,以及qb自己也有bug,所以想了想还是发这讨论讨论。

我倒是知道当tracker有v4v6双栈时,qb如果向tracker ipv6地址汇报,可能只汇报自己v4或v6 ip,但是向tracker v4地址汇报时就能稳定提供自己v4+v6 ip。其他客户端不知道是否也有这bug? 来自天雪的一个旧问题:如何让 Qbittorrent 一个种子同时汇报 ipv4+ipv6

与unraid的玄学兼容坑了我十几小时:用host网络类型时qb几乎不会监听ipv4端口(v6一直正常),甚至局域网另一设备tcping qb的ipv4端口都死活不通,但其它不变只换成bridge或macvlan就恢复正常。三种网络类型的netstat -anp没区别。unraid版本试过6.10和6.11,docker镜像全新安装过三个版本 linuxserver / 80x86 / hotio ,重启几十次+来回切换“只绑定v4/v6”时有三两次莫名其妙tcping ipv4通了,但放着不动几十分钟或者立刻切回绑定所有地址又不通了。 最后受 https://github.com/qbittorrent/qBittorrent/issues/13052#issuecomment-698318218 这条issue的20年的回复的启发(虽然我没像回复里那位用dmz),host网络类型时打开qb“使用我的路由的upnp/nat-pmp转发端口”,v4端口就这么通了😅,目前开着几十小时都通着。在线测端口网页我都没敢关,时不时测一测。还故意试过网关防火墙不回应qb发的upnp/nat-pmp开放端口请求,重启qb还是一切正常。 找到解决方法后才切到你这版qb,host类型 全新安装 一切重新配置,qb默认开着upnp选项,试过关闭这项并多次重启qb,v4端口都正常监听。莫名其妙修好了。

用macvlan时如果想用v6 SLACC而关闭unraid自动配置macvlan网络,由于qb启动后绑定地址快于虚拟网卡拿到ipv6全局唯一地址,于是此时qb无法监听ipv6,需要打开qb设置再点一次“应用”才能监听v6。这问题我还没找到修复/自动化解决方法。 bridge多一层nat,难受。

还试过关了qb直接同样host类型 同一端口,transmission docker开着一个月都没这问题,但tr太简洁连分类都没,任务多了再加上辅种找起来头大。

另外老哥有空的话能否加个“qb web查看日志”功能?(如下图80x86的) 因为iyuu要先过6个pt站验证才让用(hdai还润了),几个站我都没有,目前只能靠ptpp浏览器扩展手动辅种凑合,浏览器发送任务后qb时常没收到,不得不经常检查qb日志看看是ptpp发错下载链接还是pt站抽风qb下载种子超时。qb web能看日志的话排查ip监听问题也方便些。

Snipaste_2023-02-27_19-59-43

devome commented 1 year ago

需要打开qb设置再点一次“应用”才能监听v6。这问题我还没找到修复/自动化解决方法。

参考官方WIKI:https://github.com/qbittorrent/qBittorrent/wiki/WebUI-API-(qBittorrent-4.1)#set-application-preferences

通过qB的API(/api/v2/app/setPreferences)向其POST一个JSON:json={"current_interface_address":"想要绑定的 IP地址,如果为空就是全部地址"}

devome commented 1 year ago

另外老哥有空的话能否加个“qb web查看日志”功能?

本镜像未对官方代码作任何修改,对官方客户端作修改,万一出啥问题了得怪在这个镜像头上。官方已经合并代码了,在4.6.0版本中会具备此功能,如果你实在想提前用上的话,Backport一下,对我原本的Dockerfile增加三行内容即可以在低版本中构建出具备webui查看日志的功能,我已经验证是可行的。

image

在这两行中间:

https://github.com/devome/dockerfiles/blob/d2a596de3e526e9c74e20051f2cb8fc9e635c02a/qbittorrent/Dockerfile#L13-L14

增加一行变为:

       samurai \
       patch \
    && rm -rf /tmp/* /var/cache/apk/*

在这两行中间:

https://github.com/devome/dockerfiles/blob/d2a596de3e526e9c74e20051f2cb8fc9e635c02a/qbittorrent/Dockerfile#L19-L20

增加两行变为:

    && curl -sSL https://github.com/qbittorrent/qBittorrent/archive/refs/tags/release-${QBITTORRENT_VERSION}.tar.gz | tar xz --strip-components 1 \
    && wget https://patch-diff.githubusercontent.com/raw/qbittorrent/qBittorrent/pull/18290.patch \
    && patch -p1 < 18290.patch \
    && cmake \

Backport后Dockerfile如下:

ARG LIBTORRENT_VERSION=2
FROM nevinee/libtorrent-rasterbar:${LIBTORRENT_VERSION} AS builder
RUN apk upgrade \
    && apk add --no-cache \
       boost-dev \
       openssl-dev \
       qt6-qtbase-dev \
       qt6-qttools-dev \
       g++ \
       cmake \
       curl \
       tar \
       samurai \
       patch \
    && rm -rf /tmp/* /var/cache/apk/*
ARG QBITTORRENT_VERSION
ARG JNPROC=1
RUN mkdir -p /tmp/qbittorrent \
    && cd /tmp/qbittorrent \
    && curl -sSL https://github.com/qbittorrent/qBittorrent/archive/refs/tags/release-${QBITTORRENT_VERSION}.tar.gz | tar xz --strip-components 1 \
    && wget https://patch-diff.githubusercontent.com/raw/qbittorrent/qBittorrent/pull/18290.patch \
    && patch -p1 < 18290.patch \
    && cmake \
       -DCMAKE_BUILD_TYPE=Release \
       -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON \
       -DCMAKE_CXX_STANDARD=17 \
       -DWEBUI=ON \
       -DVERBOSE_CONFIGURE=OFF \
       -DSTACKTRACE=OFF \
       -DDBUS=OFF \
       -DGUI=OFF \
       -DQT6=ON \
       -Brelease \
       -GNinja \
    && cd release \
    && ninja -j${JNPROC} \
    && ninja install \
    && ls -al /usr/local/bin/ \
    && qbittorrent-nox --help
RUN echo "Copy to /out" \
    && strip /usr/local/lib/libtorrent-rasterbar.so.* \
    && strip /usr/local/bin/qbittorrent-nox \
    && mkdir -p /out/usr/lib /out/usr/bin \
    && cp -d /usr/local/lib/libtorrent-rasterbar.so* /out/usr/lib \
    && cp /usr/local/bin/qbittorrent-nox /out/usr/bin

FROM alpine:latest
ENV S6_SERVICES_GRACETIME=30000 \
    S6_KILL_GRACETIME=60000 \
    S6_CMD_WAIT_FOR_SERVICES_MAXTIME=0 \
    S6_SYNC_DISKS=1 \
    QBITTORRENT_HOME=/home/qbittorrent \
    TZ=Asia/Shanghai \
    PUID=1000 \
    PGID=100 \
    WEBUI_PORT=8080 \
    BT_PORT=34567 \
    LANG=zh_CN.UTF-8 \
    SHELL=/bin/bash \
    PS1="\u@\h:\w \$ "
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.bfsu.edu.cn/g' /etc/apk/repositories \
    && apk add --no-cache \
       bash \
       curl \
       jq \
       openssl \
       qt6-qtbase \
       qt6-qtbase-sqlite \
       s6-overlay \
       shadow \
       tzdata \
    && rm -rf /tmp/* /var/cache/apk/* \
    && ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime \
    && echo "${TZ}" > /etc/timezone \
    && useradd qbittorrent -u ${PUID} -U -m -d ${QBITTORRENT_HOME} -s /sbin/nologin
COPY --from=builder /out /
COPY s6-overlay /
WORKDIR /data
VOLUME ["/data"]
ENTRYPOINT ["/init"]
Franinc commented 1 year ago

好的好的,非常感谢老哥! 前两天回复完没多久qb崩了 连着一起崩了unraid的web服务,疑似libtorrent 2.0.8和透明大页不兼容: CRASHES SINCE UPDATING TO V6.11.X FOR QBITTORRENT AND DELUGE USERS 不过看回复关了透明大页并不是对所有人都有效。 切回4.3.9折腾半天,请问libtorrent 1.2.18 当磁盘缓存: -1时,是不是统计页面的总缓冲大小最大只能到 850M ?开了操作系统缓存,32G内存。 我目的是尽量减少磁盘io次数,手动设置磁盘缓存2G / 4G效果会更好吗?可惜unraid不像群晖还是哪家的平台能看近期磁头读写频率还是啥

当前设置: Snipaste_2023-03-01_20-22-04

devome commented 1 year ago

在Linux机器上,缓存这项特性多数时候受内核控制更多一些,libtorrent-rasterbar更多的也是利用内核的缓存特性。既然你已经设置为-1了,那么就放心大胆的交给内核和libtorrent-rasterbar吧,可以说内核在这方面有世界上那么多牛逼的程序员为其站台,技术已经非常可靠了。至于到底缓存多少合适,你觉得我们能比内核更懂?我有个西数绿盘用了9年7x24小时也没跑坏。

另外,个人觉得libtorrent-rasterbar 2.x肯定有比1.x更好的地方,要不然作者为啥升级呢?2.x不能设置缓存我觉得就挺好,用户又不懂其中的技术,不如放心大胆的交给内核来处理,你内存大,那高缓存不是更好么,减少了磁盘io,搞不懂为啥许多人看着qb占用内存多就叫嚷嚷的。