点击展开更新日志

2024

10-13

  1. 更新 qb、ddns、jellyfin 容器部署

11-07

  1. 添加【声明】
  2. 更新代理镜像地址
  3. 添加 qb docker-compose.yml
  4. 添加 embyserver 部署

11-11

  1. 更新"更新日志"时间线格式,去掉单次更新的年份;
  2. 补充 ddns 常见问题。

11-27

  1. 补充 npm 登录 502 报错原因。

2025

02-16

更新 Bitwarden 配置。

07-13

  1. 修正创建 Macvlan ip 错误的问题。

nexttime

会有些什么呢?

源起

五月的时候买了一台威联通的 C464,当时只是作为备份服务器在使用,并没有过多研究,最近有空正好开始好好的玩玩,根据网上的教程和摸索,简要记录一下。

声明:

以下所有的操作,均为在我个人的威联通 C462 最新官方版本上执行。

不保证在其它任何设备上能获得同样结果,不对产生的任何错误负责,有问题请按照必应-谷歌-评论-邮件的顺序依次处理。

网络环境

因为有互联网访问需求,因此需要搞一个公网 IP 或者穿透,最终还是确定用 IPv6。所以在光猫和路由打开 IPv6,同时关闭防火墙,本地内网设备就可以获取到 IPv6 了,记得 检查一下 是否正常。
至于路由改桥接啥的自行谷歌一下吧,我这边因为是用的室友的,所以能用就行(●’◡’●)

Container station 容器

考虑到 dockerhub 可能直接上不去,所以下载的时候建议使用镜像,如果自备魔法自然更好。

提供一个可用镜像代理:dockerpull.org dockerpull.com (更新,现在需要手法才能打开了),下载镜像的时候加在最前面即可,如: dockerpull.com/linuxserver/qbittorrent

qBittorrent/transmission

  • 描述:磁力下载。Free and reliable P2P Bittorrent client.
  • 镜像:https://hub.docker.com/r/linuxserver/qbittorrent
  • 网络模式:bridge
  • 存储:
    • /media:/media 可写,没有用 downloads 是因为方便 mp 的下载目录能够和 qb 保持一致。
  • Web 配置:
    • 初始默认 admin 密码请查看日志获取
    • 更改【选项】-【连接】中【监听端口】,一般 6881 都是被屏蔽的,下不动种子。实际上点击 Tracker 也能看到报错。

docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
---
services:
qbittorrent:
image: lscr.io/linuxserver/qbittorrent:latest
container_name: qbittorrent
environment:
- PUID=1000
- PGID=1000
- UMASK=022
- TZ=Asia/Shanghai
- WEBUI_PORT=8080
- TORRENTING_PORT=6881
volumes:
- /path/to/qbittorrent/appdata:/config
- /path/to/downloads:/downloads #optional
ports:
- 8080:8080
- 6881:6881
- 6881:6881/udp
restart: unless-stopped
  • TZ 时区,https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List

    直接部署即可,没啥需要注意的,哦,还是有一点。

    qb 默认 web 端口是 8080,但是在浏览器直接输入 ip:8080 是不行的,需要末尾加上一个 / ,或者复制 Container qb 详细页面的 8080 端口,直接复制出来就可以。

ddns-go

  • 描述:自动将变动的公网 IP 绑定的固定的域名
  • 镜像:jeessy/ddns-go
  • 官网:https://github.com/jeessy2/ddns-go
  • 网络模式:host
  • Web 配置:
    • DNS Provider:根据自己的 DNS 服务商绑定 token,下面蓝色小字可以跳转到获取 token 的页面
    • IPv4:如果没有公网 IPv4,就不要勾选 enable,可能会导致 v6 用不了
    • IPv6:
      • Get IP method: By network card 从网卡获取
      • Domains: 需要从外网访问的域名,一行一个
    • Others:勾选禁止互联网访问 Web 管理页面。可以修改用户名和密码
    • Webhook:IP 变动通知。可以在 Github 上查看支持的通知方式。

记得保存!

如果使用 Macvlan,,虽然可以另外指定一个 IPv4 且同时监听 IPv6,但是此时 localhost 是解析到 NAS 本机的,因为 npm 登录会请求本地 3000 端口的 node 服务,此时如果还部署了其它 3000 端口的服务,登录就会报错 405 Not Allowed 。

常见问题

无法获取网卡信息

网络模式需要选择Host主机模式,因为是从当前环境获取网卡,如果是 docker 网络,那么就获取不到。

405 Not Allowed 登录报错

因为登录 API 会请求 http://localhost:3000 的服务,显然这个地址请求到了别的地方,一般是网路模式为 Host/Macvlan,且存在使用 3000 端口的其它服务,与 npm 产生冲突。更改网络模式为 host 或者更换 3000 端口服务都可以。

所以最好的建议就是,npm 使用 host 模式,既可以监听 IPv6 的请求,也可以直接通过 docker 网络进行转发;使用 3000 等端口的服务更换默认端口,比如 3000 -> 13000。

npm 502 Bad Gatewy 登录报错

我要沙银了!这个 b 报错困扰了我好久,反复重装容器了好几次,一般刚装好是可以的,重启就寄,issue 上也有人遇到,但是没有找到解决方法,甚至还有卸载宿主机 node 的!(不是,那这 docker 隔绝了个啥呀,显然不是啊)。

事情的转机还是来自日志 /data/logs/fallback_error.log, upstream http://127.0.0.1:3000 超时?为啥官方文档压根没提这个端口的事,F12 看一下登录的接口,显然就是 API token 的后端接口,但是这个服务没启动起来。

所以问题变成这是个什么服务,为什么没起起来?所以我又重新拉取镜像部署了一套,查看部署日志:

可以看到有一个进程 ID(PID) 为 160 的进程在监听 3000 端口,所以就看看这是个嘛玩意。容器内没有 ps 命令,所以要先安装:

1
2
apt-get update # 你可以先试试直接执行下一句(●'◡'●),看看会发生什么
apt-get install procps

查看这个 160 的进程是什么:

1
2
3
# ps -ef | grep 160
root 160 153 0 11:20 ? 00:00:03 node --abort_on_uncaught_exception --max_old_space_size=250 index.js
root 214 203 0 12:43 pts/0 00:00:00 grep 160

这下就明晰了,真相只有一个!把这条 node 命令复制到 NAS 上的 npm 终端跑一下 node --abort_on_uncaught_exception --max_old_space_size=250 index.js &,等几秒钟出现监听端口或者直接回到终端提示符即可,再试试是否正常:

1
curl http://localhost:3000

如果出现 {"status":"OK","version":{"major":2,"minor":12,"revision":1}} ,恭喜 🎉,你已经成功解决了这个问题,回到 81 端口登录,锵锵,可以啦!

20241126 更新,我大概知道为什么作者没有提及这个端口了,因为正常情况下就不会存在这个问题。先来看正常的启动日志:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[11/27/2024] [11:08:50 AM] [Global   ] › ℹ  info      Using Sqlite: /data/database.sqlite

[11/27/2024] [11:08:51 AM] [Migrate ] › ℹ info Current database version: none

[11/27/2024] [11:08:51 AM] [Setup ] › ℹ info Logrotate Timer initialized

[11/27/2024] [11:08:51 AM] [Global ] › ⬤ debug CMD: logrotate /etc/logrotate.d/nginx-proxy-manager

[11/27/2024] [11:08:51 AM] [Setup ] › ℹ info Logrotate completed.

[11/27/2024] [11:08:51 AM] [IP Ranges] › ℹ info Fetching IP Ranges from online services...

[11/27/2024] [11:08:51 AM] [IP Ranges] › ℹ info Fetching https://ip-ranges.amazonaws.com/ip-ranges.json

[11/27/2024] [11:08:53 AM] [IP Ranges] › ℹ info Fetching https://www.cloudflare.com/ips-v4

[11/27/2024] [11:08:54 AM] [IP Ranges] › ℹ info Fetching https://www.cloudflare.com/ips-v6

[11/27/2024] [11:08:54 AM] [SSL ] › ℹ info Let's Encrypt Renewal Timer initialized

[11/27/2024] [11:08:54 AM] [SSL ] › ℹ info Renewing SSL certs expiring within 30 days ...

[11/27/2024] [11:08:54 AM] [IP Ranges] › ℹ info IP Ranges Renewal Timer initialized

[11/27/2024] [11:08:54 AM] [Global ] › ℹ info Backend PID 154 listening on port 3000 ...

[11/27/2024] [11:08:54 AM] [SSL ] › ℹ info Completed SSL cert renew process

在启动 3000 端口的服务前,会请求 ip-range 这个文件,很多情况下会卡在这里(众所周知的原因),所以服务也就启不起来,因为最近在玩软路由,才发觉这个问题。

无法通过互联网访问:Connection refused

先确认光猫 IPv6 开了吗,IPv6 防火墙关了吗,路由 IPv6 防火墙关了吗,本地机器能获取到公网 IPv6 吗,240e 开头的那个哦。

如果都没问题,NAS 防火墙放行了吗?

如果以上都确认没问题了,大概就是 npm 部署用的桥接,没有 IPv6,自然也就无法转发 IPv6 的流量,原因可以看上面的注意事项。

jellyfin

  • 描述:影像库
  • 镜像:nyanmisaka/jellyfin
    • 高级设置:
      • 运行时:特权模式
      • 设备:Direct Rendering Infrastructure (226), 可写
    • 存储:自己创建 /media 目录并挂在进来,可以参考下面链接。
  • 网络模式:默认 bridge,因为需要看 v6 的直播且 QTS 容器不支持开启 v6,所以用的 host。——这个问题的表现为,播放时会提示客户端不兼容,实际上查看 ffmpeg 日志 key 发现是网络不通。
  • Web 配置:贴一个我觉得不错的链接。
  • 注意事项
    • 更改显示语言为中文还是显示英文:清理缓存
    • 如果无法播放或者报错:控制台看看日志+谷歌
    • 插件加载不出来:删除第一个默认的,如果需要找个镜像

portainer

Portainer 部署

emby

docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
version: "2.3"
services:
emby:
image: emby/embyserver
container_name: embyserver
runtime: nvidia # Expose NVIDIA GPUs
network_mode: host # Enable DLNA and Wake-on-Lan
environment:
- UID=1000 # The UID to run emby as (default: 2)
- GID=100 # The GID to run emby as (default 2)
- GIDLIST=100 # A comma-separated list of additional GIDs to run emby as (default: 2)
volumes:
- /path/to/programdata:/config # Configuration directory
- /path/to/tvshows:/mnt/share1 # Media directory
- /path/to/movies:/mnt/share2 # Media directory
ports:
- 8096:8096 # HTTP port
- 8920:8920 # HTTPS port
devices:
- /dev/dri:/dev/dri # VAAPI/NVDEC/NVENC render nodes
- /dev/vchiq:/dev/vchiq # MMAL/OMX on Raspberry Pi
restart: on-failure

emby 是通过 portainer 进行安装的,其它安装方式类似。

  1. 创建 Macvlan

    1. 在 portainer 管理页面左侧容器选择【Network】-【Add network】
    2. 配置
      • Name: 网络名称,比如 Macvlan_template
      • DriverL: macvlan
      • Macvlan configuration: 选择【Configuration】(默认)
      • Parent network card: 父网卡,选择宿主机网卡,比如 eth0
      • IPV4 Network configuration: 宿主机 IPV4 网段和网关配置
        • Subnet: 子网,如宿主机 IP 为 192.168.77.19,则子网为 192.168.77.0/24
        • Gateway: 网关,一般都是 xxx.xxx.xxx.1,比如上面我的就是 192.168.77.1
        • IP range: IP 范围,同子网即可
      • IPV6 Network configuration: 宿主机 IPV6 网段和网关配置
        • Subnet: 子网,如果有公网 IPV6(240e 开头),那就用这个,否则就是局域 v6。格式 xxxx:xxxx:xxxx:xxxx::/64(四段)
        • Gateway: 网关,一般都是 xxx:xxx:xxx:xxx::1,比如上面我的就是 abcd:1234:2231:bca1::1
        • IP range: IP 范围,同子网即可
    3. 【Create the network】创建网络。注意,这里还不能直接用,需要先配置一个模板(上面我们创建的这个)才能创建实际使用的环境
    4. 按照上面的步骤重新创建一个 macvlan 驱动网络,但是【Macvlan configuration】配置选择【Creation】!下面的【Configuration】选择刚才创建的【Macvlan_template】创建网络。
  2. 拉取镜像

    1. 先在左侧【Image】中拉取 embyserver 镜像到本地,如果 dockerhub 拉不下来就先加一个镜像地址
  3. 创建容器

    1. 左侧【Container】选择【Add container】,输入容器名称和镜像,和上面拉取的需要保持一致。
    2. Advanced container settings 高级设置
      1. Volumes:数据卷
        • 先选择后面的【Bind】,表示映射到宿主机目录
        • 将容器中的 /config - 配置目录 、 /media - 媒体目录 分别映射到宿主机指定位置,权限【Writable】
      2. Network:网络
        • Network: 选择上面创建的 Macvlan,不是模板那个啊
        • Hostname:
        • IPv4 Address: 保持和宿主机同一网段,任一未使用 IPv4 即可
        • IPv6 Address: 保持和宿主机同一网段,任一未使用 IPv6 即可
        • 其它非必要的不必填
      3. Env:环境变量,配置以下关键变量即可,其它可以保持默认
        • UID: 0 (管理员 ID,默认 1000,可以先用 1000 试一下,不行再改)
        • GID: 0 (管理员组 ID,默认 100,可以先试一下,不行再改)
        • LIBVA_DRIVERS_PATH: /lib/dri (显卡驱动路径,用于硬解)
      4. Runtime & Resource:运行环境
        • 开启【Priviledged mode】特权模式
        • Runtime: runc
        • Devices: 添加一个, /dev/dri:/dev/dri 映射显卡到 docker
      5. 部署容器
  4. 浏览器打开 容器 IP:8096 进入 emby!

  5. 检查硬解
    进入【设置】-【转码】配置,【启用硬件加速】一栏选择【高级】,检查下方首选硬件编码器和首选硬件解码器是否有内容,如果没有那就是开启失败,大概率是没有权限。

    补充一句,emby 想要开启硬件需要购买高级会员(大概 RMB 800+ 永久),实在囊中羞涩(比如正在敲文字的这位),可以使用开心版ヾ(≧▽≦*)o,本文不提供任何非官方版本,全凭能耐,各显神通。

其它问题

  • 电影详情界面演职人员头像加载不出来
    因为众所周知的原因,需要设置 http 代理:重新创建容器新增环境变量(这里以 Clash 为例):
    1
    2
    ALL_PROXY http://ip:7890
    HTTP_PROXY http://ip:7890

nginx-proxy-manager

  • 描述:可视化 Nginx 代理
  • 镜像:jc21/nginx-proxy-manager:latest
  • 网络模式:Host
  • Web 配置:
    • Proxy Hosts: 这就是最常见的反向代理了,还可以自动申请 SSL 证书/自己上传泛域名证书。
    • 其它的暂没用上,先留着后面补充。

说明

  • 网络模式为什么使用 Host?
    因为需要从 IPv6 进行访问,容器内无法开启 IPv6,如果一定是要用 NAT,可以选择控制台/路由中做一下端口转发

MP

  • 描述:自动化观影
  • Wiki:Wiki

Wiki 很详细了,跟着步骤安装就可以了,仅个别地方做提醒,避免多走弯路。

提醒

  1. 该应用的核心是 PT,如果不清楚是什么,或者没有相关平台账号,可以就此止住了,相关内容自行检索;
  2. 站点相关功能(自动追番、下载、搜索等)需通过特定平台账号激活,参考 Wiki【配置】-【认证】部分内容,仅支持提及到的站点认证,如果没有这些账号,也可以止住了;
  3. 任何一环节出现问题或未按照预期响应,请先看日志定位问题;

lucky

Bitwarden

官方

我没用官方的,所以请参考链接~

第三方

  1. 创建数据目录:
1
mkdir bitwarden
  1. 创建容器
1
2
3
4
5
6
7
8
9
10
11
docker run -d --name vaultwarden \
-e DOMAIN=https://bitwarden.evergarden.top
-e SMTP_HOST=smtp.domain.tld \
-e [email protected] \
-e SMTP_PORT=465 \
-e SMTP_SECURITY= force_tls \
-e SMTP_USERNAME=myusername \
-e SMTP_PASSWORD=MyPassw0rd \
-v /bitwarden/:/data/ \
-p 8080:80 \
vaultwarden/server:latest
  • SMTP_HOST: SMTP 服务器地址,阿里云企业邮箱需要管理员先开启允许三方客户端
  • SMTP_FROM: sender
  • SMTP_PORT: tls-587 SSL-465
  • SMTP_SECURITY: 加密方式, tls-starttls SSL-force_tls
  • SMTP_USERNAME: sender 邮箱!
  • SMTP_PASSWORD: 密码/授权码
  • INVITATIONS_ALLOWED: 禁用普通用户邀请注册,管理员不受影响
  • DOMAIN: 访问域名,不设置可能会有一些奇奇怪怪的问题
  • SIGNUPS_ALLOWED: 禁用注册,如果自己使用建议加上,创建容器先不加,账户创建好再加上。
  • ADMIN_TOKEN: 管理后台,地址 <DOMAIN>/admin ,不是必要的就不要配置了,要配置 token 一定要用长且复杂的字符串。可以在 git bash 使用 openssl rand -base64 48 生成一段。
  1. 配置反代
    因为之前已安装了 lucky,因此配置很简单,略。
  2. 第一次注册
    打开访问地址 https://bitwarden.evergarden.top , 注册。后续配置可参考官方 Wiki 说明配置即可。

其它服务

直播

虽然先在看直播的时间少了,但有时候还是想要看一看的,所以 Jellyfin/emby + 直播,算是我的一个重点内容。一半以上的时间花在了找直播源上,笑死(/▽\),真正配置的时间不超过 10min。

以 “直播源”、“m3u” 为关键词可以搜索到很多 Github 的项目收集的各种直播源,不过有一部分已”年久失修“不可用,另一部分虽然一直在更新,不过遗憾的是我本地却无法播放(不排除是挂了代理没有 ipv6 的原因——正好写文章的时候想到,不过也不想验证了,验证了,确实存在代理的原因,但有些源确实播放不了),经过搜索,总算找到了一个可以用的了。

简要说明一下,如果想要在 Jellyfin/Emby 这类软件中添加直播,一般需要两个链接/文件:

EPG 的效果如下:

EPG-20241109

YanG-1989

感谢大佬分享,喜欢可以给大佬点个 Star~

将直播源地址填入 Jellyfin/Emby 的直播页面的【调谐器设备|电视源】,可以是订阅地址,或本地上传的 m3u 文件(ps:记得上传到挂载点才能访问到)

将 EPG 地址填入 Jellyfin/Emby 的【电视指南数据提供方|指南数据源】,格式选择 【XmlTV】,配置完成后,等待刷新完成,之后就可以在首页看到上面的效果了。

常见问题 1:直播无法播放,错误为媒体与服务器不兼容 balabala
原因 1:直播源很多都是 IPv6,代理一般是 IPv4,所以挂代理的情况下无法播放,关闭即可。
原因 2:容器 NAT 网络的容器默认没有 IPv6,也无法播放 IPv6 的直播,要么想办法开启容器 v6,比如 macvlan,要么更换为 Host 模式
原因 n:查询日志获取具体报错信息,然后谷歌。

参考致谢

一些用到过的参考内容,感谢各位大佬的教程: