点击展开更新日志

2024

10-13

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

11-07

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

11-11

  1. 更新"更新日志"时间线格式,去掉单次更新的年份;
  2. 补充 ddns 常见问题。
  1. 修正创建 Macvlan ip 错误的问题。
  2. 补充 npm 登录 502 报错原因。

会有些什么呢?

2025

02-16

更新 Bitwarden 配置。、

源起

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

声明:

以下所有的操作,均为在我个人的威联通 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.logupstream http://127.0.0.1:3000 超时?为啥官方文档压根没提这个端口的事,F12 看一下登录的接口,显然就是 API token 的后端接口,但是这个服务没启动起来。

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

npm 部署日志

可以看到有一个进程 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

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. 任何一环节出现问题或未按照预期响应,请先看日志定位问题;

caddy

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:查询日志获取具体报错信息,然后谷歌。

参考致谢

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