NAS入坑笔记 | 网盘+相册+影视库+软路由 ALL IN ONE
NAS入坑笔记 | 网盘+相册+影视库+软路由 ALL IN ONE

前言

在一个平平无奇的下午,当学弟向我要文件而OneDrive无力地转圈圈的那一刻,我决定入坑NAS。

起初我并不晓得NAS有什么别的功能,我单知道它可以代替网盘和相册,至于后面的影视库和软路由,完全是意料之外的惊喜。

中年人幻想的NAS使用场景应该是有老婆有孩子有新家之后打造一个专门的机柜来供奉它,作为家庭的网络和数据中心,存一些宝宝照片和4K影片,局域网内所有设备互联互通,还能直接访问Google……然后作为家里的信息化专员,被老婆夸能干,还要给我一个爱的抱抱……当我流着哈喇子从办公桌上抬起头时,望见黑黢黢的屏幕里反射出的呆头晃脑没睡醒的女人,突然意识到一个可悲的事实,我可能一辈子不会有老婆……

于是我决定不再等待我那未曾谋面的老婆,提前完成这个计划——趁着双11下单了绿联DXP4800和两块希捷酷狼的4T硬盘。

本来以为一个周末能玩腻,结果一个多月过去了,功能越折腾越多,坑越挖越深,光是这篇文章就断断续续写了一个多月,终于在春节前草率完结——先写个不完美的垃圾出来,然后信任读者的悟性。

硬件选购

NAS

简单做了功课,消费级NAS的主流市场已三分天下:群晖、极空间、绿联(其他品牌由于名字不合眼缘被笔者非常主观地抛弃)。如果你是等等党可以再等一下尚未出世的小米NAS。

群晖的性价比是极低的,虽然他是老牌厂商但谁买谁是冤大头,毕竟NAS这个东西,完全和电脑机箱一样可以自己组装搭配,硬件买贵不划算,而且从科学的角度讲,群晖的塑料壳从散热上就是劣势,工业界有个说法,温度每升高10℃,电子器件寿命减半,那为什么不用更低的价格买个金属机壳呢?如果你是软件党,就是迷信群晖的系统,那完全可以装个黑群晖,但,我依然觉得群晖的软件系统也已经过时了。下面是群晖和绿联的UI对比,前两张是群晖APP摘自小红书,后两张绿联APP是笔者亲自截图。

最关键的一点是,群晖的功能非常分散,没有统一的入口,可能你需要装N个APP才行,这对于强迫症来说恐怕是难以忍受的,更别说分享给你的假想老婆使用了,恐怕一个平底锅就飞过来了。

而绿联的网盘、相册、影视库全部集成在了同一个APP中,用户只需要一个账号就能具备全部访问权限,除此之外还有音乐库、docker、虚拟机、下载器等功能,都是ALL IN ONE,只有软路由需要单独配置,不过这个一般不用老婆操作,只要我们自己搭建就好啦,其他家庭成员只需要使用面向小白的用户UI,从这个角度来看绿联云APP的功能已经全覆盖了。

至于极空间,在软件方面和绿联应该是相同的理念,但是由于外观不合眼缘被笔者非常主观地抛弃了(个人认为极空间的前盖板非常累赘,长得和投影仪一样没有区分度)。

1736263143724.png
(左一绿联,右一极空间)

综上所述,绿联是目前国产消费级NAS之优选。但,我还是很期待小米整个白色机箱出来,再把工艺和性价比卷一卷。不过总有一拨人,依然把群晖当作精神领袖,丝毫嗅不到新的风向,就像油车被新能源卷死的前夜那样。如果只是单纯喜欢经典,那很正常,毕竟每个人喜好不同,但我最看不惯的是某些群晖用户非要跑到其他品牌用户面前拉屎,连人家UI都没见过,就diss绿联只会做充电宝云云……大家都是同样的硬盘同样的插槽,用同样的通信协议控制电压电流,有个说法是NAS稳定性取决于供电电压波动和电源纹波,要论电源,绿联做了这么多年充电宝充电器,都是相通的东西,其技术积累恐怕已经胜过某些组装厂了。

UPS

说到供电,UPS(Uninterruptible Power System,不间断电源)还是有必要备一个的,毕竟机械硬盘怕掉电损伤,搞不好跳个闸,停个电,拔个插头,心里总是不安稳。由于UPS需要和NAS通信,不一定是通用的,根据NAS官方的推荐列表来选购就可以了,比如我买的是施耐德APC BK650M2-CH。UPS通常不止一个插座,你可以理解为带电池的大号插排,路由器的插头也可以安排上,这样断电后也许还能继续联网给你报信。

NAS入坑了,UPS还会远吗?_1_巫鸦筑巢_来自小红书网页版.jpg

刚安排上UPS,就经历了一次清晨七点园区停电维护,UPS顺利通过了考验。根据我的经验,即使通知停电一天,实际停电时间一般也不超过几分钟,可能就是合个闸的时间,不会一直断电,只是当天可能会反复断电几次,每次都很短暂,所以NAS自动关机时间可以设置长一点,比如五分钟或者十分钟,只要撑过施工期来电了就不用关机了,避免服务中断。就算一直停电,UPS也会在电池耗尽前给NAS发出警告,这个时候NAS就会停止硬盘读写然后自动关机(绿联称作待机模式),相当于软着陆。

软件配置

成品NAS的方便之处就在于操作系统和必备软件都给你安装好了,而且提供可视化界面,省去了大量折腾时间。不过NAS的系统都是基于Linux的,为了解决各种bug,还是需要有一定的动手能力的。不过别担心,本文整理了最初阶的常用知识,点此速查:Docker入门笔记SSH命令笔记完整的NGINX配置。另外别忘了还有万能的ChatGPT!

总体架构

先给出整体轮廓,后面再介绍配置细节。

系统架构

NAS (4).png

网络架构

网络 (1).png

文件架构

AList.png

网盘

这个功能就是系统自带的文件管理器,没什么好说的,傻瓜式操作。支持分享和收集、权限管理,有回收站功能。NAS网盘的空间取决于硬盘容量,速度取决于你家宽带,可视为无穷大不限速。

双十一玩具开箱_5_巫鸦筑巢_来自小红书网页版.jpg

我目前只有两块4T硬盘,组的是RAID1。RAID1是一比一备份,逻辑上最容易理解,其他的RAID方式过于先进和灵异了,我暂时还没搞懂它们的工作原理,但我相信简单即可靠。除此之外,我的用户文件夹是定期自动备份到阿里云盘的,所以我的鸡蛋同时放在三个篮子里。如果你只需要备份到百度网盘,官方的网盘工具已经可以实现了,但需要开通百度的NAS会员(我已经氪金试过了,目前这个网盘工具bug较多,不推荐),后期也极有可能支持阿里云盘,但如果你不想花钱的话,就装个AListTaoSync吧。

Docker入门笔记

在docker里新建一个名为sync的项目,docker-compose配置如下:

services:
​
    alist:
        image: xhofe/alist:latest
        container_name: alist
        network_mode: host
        # ports:
        #     - 5244:5244
        volumes:
            - ./alist/data:/opt/alist/data
            - /volume1:/volume1
            - /home:/home
        environment:
            - PUID=0
            - PGID=0
            - UMASK=022
            - TZ=Asia/Shanghai
        restart: unless-stopped
​
    tao_sync:
        image: dr34m/tao-sync:latest
        container_name: taoSync
        network_mode: host
        # ports:
        #     - 8023:8023
        volumes:
            - ./taoSync/data:/app/data
        restart: always
语法解读

image是镜像源,默认从DockerHub拉取,如果下载不了参考绿联的加速URL配置

container_name容器名随意取。

network_mode可以是host也可以是bridge,host模式与宿主机同IP,bridge模式是宿主机的子网,推荐host,简单粗暴,可以解决后期大多数网络玄学问题。而且下载器、p2p、ipv6等场景必须host,简单起见,我建议所有docker都用host。host模式下无需配置容器层面的端口映射,直接访问IP:端口号就是。bridge模式下要把宿主机IP端口映射到子网IP端口。

volumes存储映射是重中之重,前面是NAS里的路径,后面是容器里的路径。./是相对路径,相对于docker-compose.yaml所在目录,不要漏掉这个小点,非常容易被忽视!只有/开头的是绝对路径。一些语法如下:

volumes:
  - ./data:/app/data                # 相对路径
  - ../logs:/app/logs               # 上一级目录
  - ../../configs:/app/configs      # 上上级目录
  - /var/app/config:/app/config     # 绝对路径
  - ~/app-files:/app/files          # 用户主目录路径
  - ${BASE_PATH}/shared:/app/shared # 环境变量路径
  - ./readonly:/app/readonly:ro     # 只读挂载

environment环境变量其实大部分有默认值,我们只需填写原先为空的值,或者改动原有的值。PUID=0PGID=0意味着是root用户。UMASK=022意味着root用户可读+写+执行,其他用户只读。

restart自动重启按需选择即可,一般是always

注意事项

在绿联系统中,创建docker-compose时的存储映射可以写根目录下任意路径,而创建单个docker容器只能受限于共享文件夹,所以你要备份用户文件夹的话只能通过docker-compose创建!

如果你还分不清docker-compose和docker容器,那么我再解释一下,docker-compose是多个docker的项目合集(当然也可以是一个),创建语法需遵循yaml格式,而创建单个docker容器的语法是不同的,以taoSync为例:

docker run -d --name taoSync --network host -v $(pwd)/taoSync/data:/app/data --restart always dr34m/tao-sync:latest

这个需要在SSH命令行里输,如果你不喜欢命令行,绿联Docker也有可视化的傻瓜式操作。

不过我还是建议首选docker-compose,因为路径不受限,后期维护也方便。而且compose重新部署时会自动跳过正在运行且配置无变化的容器,不会影响现有进程,服务不会中断。

AList配置

局域网访问192.168.1.102:5244进入登录页面,初始账号密码一般在docker日志里查看。

1735451847044.png

修改密码后添加两个存储,配置如图。

1735451989086.png

刷新令牌从这里获取:阿里云盘 Open | AList文档

TaoSync配置

局域网访问192.168.1.102:8023进入登录页面,默认账号为admin,初始密码一般在docker日志里查看,如果没有显示这个日志,可以到同级目录的data/log/sys_xxx.log文件查看,通常在第一行。

1735453466604.png

登录后先前往系统设置修改密码。

引擎管理里面添加alist,地址一般是http://192.168.1.102:5244,令牌到AList管理-设置-其他中复制。

1735454096411.png

由于我使用了子目录反向代理,地址才会变成http://192.168.1.102:5244/alist,刚开始用别学我。

最后新建作业,每天11点自动同步的配置如下,你也可以改成其他时间和频率。

1735453710686.png

Q&A

 既然存到NAS,为什么还要备份到阿里云盘?
因为我经常PT下载和刷流,硬盘读写还是比较频繁的,还是会担心磁盘磨损挂掉。多一重备份多一重保险。
 既然备份到阿里云盘,为什么还需要NAS?
一是为了避开网盘的限速和审查,资料自主可控。这就和中国为什么要自建北斗一个道理,你的资料握在别人手里,哪怕是大厂也有隐私泄露和冻结的风险,尤其是某些爱看不良影片的宅男。
二最最关键的是,网盘是没有CPU和内存的,它只能存文件,不能运行服务,像MP这种中枢是没有办法运行在网盘上的,处理不了需要计算的任何自动化程序,就算1+1也算不了,没有思考这个功能!要想跑代码,要么服务器,要么NAS。
 已经有服务器了还有必要入NAS吗?
有,两者的应用场景有很大区别。
服务器硬件配置不高但费用蛮贵的,硬件是按年租用,流量也要计费,一般适合展示博客这种计算量很小的轻量级文本处理,优点是稳定,公网IP,非常稳定。
NAS存储空间非常非常大,而且配置没有天花板,你想配多高就能配多高,一次购买终身享用,毕竟家庭宽带本来就是刚需支出,就算你不买NAS也要交宽带费,所以NAS的网费可忽略不计,硬件处理能力强可玩性就很高了,可以同时运行很多很多服务,甚至可以常年跑个WIN11虚拟机,不管你走到哪都可以远程使用这个电脑。
所以可玩性NAS>服务器,但NAS一般私有,最佳应用场景是家庭局域网,或者小范围的家人朋友,很少对外提供服务,所以交流互动对外可见性和稳定性上,服务器>NAS。
 已经有NAS了还有必要入服务器吗?
看情况,NAS虽然也可以搭建网页,但80和443端口被封禁,你的域名就必须带其他端口号访问或者部署CDN,不太优雅,且SEO大打折扣,如果只是写写个人笔记不在乎有无读者还行,但如果你要写一个能够稳定访问的blog,还是建议入服务器。
 有没有一种可能,alist挂载阿里云盘充当硬盘,服务器或电脑作为控制中枢,不用买NAS了?
有可能,但笔者还没折腾过。

相册

这个也是傻瓜式操作,不需要额外折腾docker了。

支持本地AI分类和基于文件夹的分类,常见的识人识物地图等功能都有,可多人共享。

影视库

为什么要自建影视库?Netflix、优酷/爱奇艺不香吗?南瓜电影、荐片播放器不香吗?资源网站+迅雷下载不香吗?

首先,NAS影视库是私人的、免费的、无广告的、提前下载好的、随时随地可以播放的、局域网无卡顿的(外网播放受限于宽带速度)、国内外资源都有的、永远不会审核下架的、全平台所有设备通用的(不用来回拷贝)、自动化下载和整理的、具有权限分级管理的、界面精美的、情绪价值拉满的幸福小窝呀!

网飞确实是个好东西,但费用和国内稳定性不太友好,优酷/爱奇艺的界面已经逐渐变得屎上雕花了,以至于我这个25岁的老年人看了都嫌视觉疲劳,而且没有咱爱看的重口味剧呀,南瓜电影的界面和内容我还是喜欢的,和网飞一个风格,荐片播放器确实是个神器,有点像暴风影音和快播的后继者,我目前还在用,迅雷下载只能下BT,而BT和PT比起来也只是冰山一角……为了解决各种影视资源割据的局面,你希望有一个工具把它们通通整合起来,兼收并蓄,一统天下,而NAS影视库就能够实现你的愿望。

影视库可不是一个装满视频文件的杂乱路径,而是具有智能刮削归纳功能的选片数据库。影片下载来源可以多种多样,但最终都会集中展示出来。先来欣赏一下影视库的颜值~

效果展示

手机端
电脑端/网页端
1735569493877.png
1735569686891.png
1735570205915.png
电视端
1735570735556.png
1735570716169.png

值得一提的是,绿联云影视全平台都有客户端,不但支持安卓电视,还支持Apple TV

下面讲讲怎么搭建影视库,不过在此之前,有必要先澄清几个概念。

名词解释

  • 直链:从服务器下载,人越多越慢,因为水管就那么粗,N个人同时打开水龙头。
  • P2P:peer to peer,从有资源的用户那下载,去中心化,人多力量大,可能有好几个用户同时给你输血。
  • 种子:P2P资源的地图,告诉你去哪下找谁下,后缀通常为.torrent
  • 磁力链接:P2P资源的身份证,你拿着这个身份证挨家挨户找资源,被问的用户也会帮你去别人家问。通常以magnet:?xt=urn:btih:开头。
  • 保种:P2P的核心是分享,你从别人那下资源,别人也会找你下资源,你下载的同时也在上传分享,下载完成后保留种子文件和资源文件,别人就能继续从你这儿获取资源。
  • BT:Bittorrent,一种协议,是所有人都可以下载的公开种子,不记名,也没有分享率的限制,你可以下完资源就删种,提起裤子就不认人,也不会有什么惩罚,仅仅是道德上比较自私,缺乏互联网精神而已。但如果大家都这么自私,BT资源就会面临后继无人的断种风险。
  • PT:Private Tracker,仅限同一个PT站的用户可以下载,并且标记用户,可以追溯到是谁下了种子、下了谁的资源,甚至每个用户的下载进度、下载量、上传量、分享率都可以统计出来,PT资源有严格的规则,自私鬼是不被允许的,一旦你上传量小于下载量,你马上就要面临被封禁的风险,所以每个用户都会保证自己的分享率大于1,这就形成了良好的社区氛围,有利于种子的长期存活。
  • 下载器/上传器:用于下载和上传P2P资源的软件。支持的协议包括BT、PT和磁力链接等。迅雷不能下PT。
  • 文件整理:对下载的文件进行分类归档和重命名,便于影视库识别。Linux系统有个神奇的魔法叫做硬链接,文件复制后只占一份空间,非常适合影视资源的二次整理,而不破坏种子文件结构。后面会细讲。
  • 刮削:你下载的资源只有一个文件名,那么海报、剧情简介、演员表从哪来呢?影视库会根据这个文件名去自动匹配影片信息,这个识别资源并抓取海报等信息的过程就叫刮削。
  • 刷流:PT站要求分享率大于1,但实际上用户都会先把分享率刷高到远大于1,因为如果你要下载资源你必须先有足够的上传余量,所以平时即使不下载也会不停刷上传量,以备日后下载之需。
  • 辅种:多个PT站有同一个资源时,难道要下两遍资源?多占空间呀!辅种能够让你脚踏两条船,一份资源两头上传,只需要下载两个PT站的种子就可实现资源共用。

资源类型

  • 录制来源(和分辨率没有直接关系!)
    • CAM/TS/TC:影院盗录,画质较差。TC相对较好。
    • TVRip/HDTV:电视转制/高清电视转制。HDTV较好。
    • DVDRip/HDRip:正版DVD转制/高清DVD转制。HDRip较好,一般简写为HD。
    • WEBRip/WEB-DL:流媒体网站转制。画质不错。推荐下载。
    • BluRay/BDRip:蓝光光盘转制。画质最佳。推荐收藏。
  • 视频编码(和文件格式没有直接关系!)
    • H.264/AVC:兼容性强,最通用。
    • H.265/HEVC:压缩率更高,文件体积减少约30%~50%。
    • AV1:开源新标准,压缩率最高,文件体积减少约50%~60%。
  • 文件格式
    • MP4:兼容性强,最通用。
    • MKV:支持多音轨和多字幕,画质高,文件大。
    • AVI:旧格式,逐渐被淘汰。
    • WMV:微软格式,适合 Windows。
    • MOV:苹果格式,适合 Mac/iOS。
  • 分辨率
    • 480p (SD) (标清):720×480
    • 720p (HD) (高清):1280×720
    • 1080p (Full HD) (全高清):1920×1080
    • 1440p (2K):2560×1440
    • 2160p (4K) (UHD) (超高清):4096×2160
    • 4320p (8K):7680×4320

综上所述,考虑兼容性的话,推荐WEB-DL或BluRay来源、H.264编码、MP4格式、1080p的资源;考虑品质的话,推荐BluRay来源、H.265编码、MKV格式、4K的资源。

 蓝光为什么叫蓝光?
蓝光之所以叫“蓝光”,是因为它使用了波长更短的蓝色激光(蓝紫色激光,波长约为 405 纳米)作为读取和写入数据的光源。这与传统 DVD 和 CD 使用的红色激光(波长约为 650 纳米)形成了鲜明对比。

蓝光全称是 Blu-ray Disc,其中 “Blu” 是“Blue”的简化拼写,代表蓝色光束。为避免“Blue”与商标的冲突,故去掉了字母“e”,创造出“Blu-ray”这个独特词汇。

特性CD/DVD (红光)Blu-ray (蓝光)
激光波长650 纳米(红光)405 纳米(蓝光)
单层容量CD:700MB,DVD:4.7GB25GB(单层),50GB(双层)
数据读取速率较低较高

蓝光资源细分:

特性蓝光原盘Remux蓝光压制
质量无损,原始编码无损提取,保持原始编码有损压缩,重新编码
内容包含电影、菜单、花絮、广告等仅包含影片仅包含影片
体积25GB~100GB15GB~50GB2GB~15GB
封装格式ISO或BDMV文件夹MKVMKV或MP4
兼容性需支持蓝光导航的播放器兼容大多数播放器兼容性最广泛
适合人群收藏完整光盘内容的用户追求无损观影但不需菜单的用户注重体积和画质平衡的用户

搭建工具

以下每项功能至少选择一个。

  • PT站:馒头(kp.m-team.cc)、我堡(ourbits.club)、彩虹岛(chdbits.co)等
  • 下载器/上传器:utorrent、qBittorrent、Transmission、下载中心(绿联自带,Tr内核)
  • 文件整理&刮削&刷流&辅种&自动签到:nastool(已停更)、MoviePilot(nastool继任者)、ptool
  • 影视库展示&播放器&刮削:Jellyfin(免费)、EMBY(收费)、PLEX(收费)、影视中心(绿联自带)
  • 辅种:IYUUReseed

我目前的搭配是:馒头+我堡+Transmission+MoviePilot+影视中心。

(在这里特别感谢苯苯提供的MT邀请码,带我打开了PT的新世界!)
(彩虹岛也准备入但还没搞到邀请码,如果有友友能赐邀定当不胜感激!)
(这是纯PT资源的流程,当然你也可以找些BT资源和荐片播放器作为补充。)

工具介绍

可以看出,某些工具存在功能重叠,例如影视库软件和MoviePilot都有刮削功能,只需启用其中一个即可,也有初学者常把这两者搞混,因为很多帖子一提到影视库就开始讲MoviePilot,以至于有人以为MoviePilot就是影视库,实则不然,这里澄清下,MoviePilot只是一个自动化中枢,是搭建影视库的中间环节,它需要连接PT站查询资源,又要给下载器传达指令,还要把最终文件交付给影视库,配置起来最复杂,但它本身既不能播放影片也不能展示海报墙。另外,MoviePilot的插件集成了IYUU辅种功能,所以不需要单独部署辅种工具了。

绿联自带的影视中心:精美海报墙+全平台播放器,胜过Jellyfin,刮削很快很准,界面简洁易用,支持影视库权限管理,可以瞒着你假想的老婆建一个R级影视库,她是看不到的。

绿联自带的下载中心:Transmission内核,可以作为轻量级的PT或BT下载器,有保种功能,但没法和MoviePilot联动,基本靠手动,也可以作为普通下载器下任何东西,类似浏览器下载。

Transmission和qBittorrent都是非常主流的下载器,但qBittorrent占用内存大且界面更复杂,据说保种数量过多时会卡死,我个人更偏爱性能稳定且简单易用的Transmission。

PT站的选择看这篇即可:PT 下载从入门到养老篇一:站点介绍及生存指南 | 回声

辅种工具

以下是笔者在初期探索过程中踩坑记录的笔记,不是重点,有了MoviePilot后就不用ptool了。

IYUU:基于种子,扫描下载器中正在做种的种子,如果种子删除了就没用了,通过爱语飞飞(IYUU)服务器匹配站点种子进行辅种,将同资源种子添加到下载器。NAS并不一定需要部署IYUU。

Reseed:基于文件,扫描指定路径下的文件名和大小,生成一个JSON文件,然后上传到Reseed服务器匹配站点种子进行辅种,将同资源种子添加到下载器。NAS不需要部署Reseed。(注:Reseed不开放注册,需要TJUPT校园网用户或我堡认证登录。)

简单来讲,辅种有三个步骤:扫描、匹配、下种。

其中最关键的匹配由第三方服务器完成,我们本地NAS需要的软件功能是扫描和下种,需要对下载器进行连接和操控,这个软件可以是IYUU的自动化容器(Docker应用,有web界面),也可以是Reseed的手动索引工具(Linux或Windows软件,可挂载到Windows上操作),也可以是ptool的自动化程序(Linux或Windows软件,无图形界面)。ptool可连接IYUU或Reseed服务器,所以我说NAS不需要部署IYUU或Reseed。而且亲测IYUU容器蛮臃肿的,内存消耗比qBittorrent还大……

Docker部署

如果第一次玩docker请先参阅上文的Docker入门笔记

在docker里新建一个名为media的项目,docker-compose配置如下:

services:

    moviepilot:
        stdin_open: true
        tty: true
        image: jxxghp/moviepilot-v2:latest
        container_name: moviepilot
        network_mode: host
        # ports:
        #     - target: 3000
        #       published: 3000
        #       protocol: tcp
        volumes:
            - /volume1/download:/download
            - ./moviepilot/config:/config
            - ./moviepilot/core:/moviepilot/.cache/ms-playwright
            - /var/run/docker.sock:/var/run/docker.sock:ro
        environment:
            - NGINX_PORT=3000
            - PORT=3001
            - PUID=0
            - PGID=0
            - UMASK=000
            - TZ=Asia/Shanghai
            - AUTH_SITE=iyuu
            - IYUU_SIGN=改成你自己的IYUU密钥
            - SUPERUSER=改成你自己的用户名
            - MOVIEPILOT_AUTO_UPDATE=release
        restart: always

    transmission:
        stdin_open: true
        tty: true
        image: linuxserver/transmission:latest
        container_name: transmission
        network_mode: host
        volumes:
            - /volume1/download:/download
            - ./transmission/config:/config
            - /volume1/download/torrent:/watch
        environment:
            - PUID=0
            - PGID=0
            - UMASK=000
            - TZ=Asia/Shanghai
            - TRANSMISSION_WEB_HOME=/config/web
            - PASS=改成你自己的密码
            - USER=改成你自己的用户名
            - RPCPORT=9091
        restart: always

特别要注意的是,- /volume1/download:/download这个路径必须在moviepilot和transmission中映射一致。

由于MP的更新非常频繁(佩服作者旺盛的精力),笔者的compose配置可能相对滞后,建议同时参考MP官方的安装指引

Transmission的前端皮肤需要单独下载:TrguiNG,下载页面上最新的ZIP文件,解压后将文件夹重命名为 web并存放到 /config 路径下。

1735819422561.png

Transmission配置

局域网访问192.168.1.102:9091进入登录页面,账号密码是创建docker时的环境变量。

1735817923393.png

点击右上角设置。

1735821252929.png

重点关注下载设置和网络端口设置。

默认保存路径不是很重要,因为MP也可以设定路径,但都是基于/download这个母路径,所以必须映射一致!

“在未完成的文件名后加上.part后缀”是有必要勾选的,可以避免在文件下载过程中触发MP自动整理,否则未完成的影片可能会被交付到影视库但无法播放。

网络端口设置和你的路由器工作模式有关,如果只有一个主路由,建议把随机端口和UPnP都启用,但如果存在旁路由且构成双重NAT(即两层网关嵌套),UPnP可能会失败,同时导致随机端口无法打通外网,这个时候建议禁用随机端口,使用固定端口并手动在路由器里做好端口映射。

而UPnP是自动端口映射,由TR向路由器发出申请,但是通常只支持一层网关,因为即使旁路由知道57223端口指向192.168.1.101,主路由还是不知道,除非主路由把一切端口都甩给旁路由(指定DMZ主机,但似乎网络会卡)。

所以说简单即可靠,如果把软路由作为主路由能够避免绝大多数网络玄学问题,但前提是得有天线,支持WIFI,而NAS虚拟化出的openwrt容器一般是没有无线网卡的,只能作为旁路由,是一种妥协而非最优。

端口映射

为什么要做端口映射?每个终端都有上万的的端口,每个端口提供不同的服务。比如有个用户要下你盘里的资源,他先到访你家路由器,说是要找57223端口,路由器说我家里10台设备人人都有57223端口,我咋知道你要找谁?甚至路由器本身也有57223端口,该不会是找俺吧?于是该用户啥也没找到骂骂咧咧走开了。你苦等了几天发现资源无人问津,终于想起来给路由器交代这事:以后有人来找57223端口,你就把他带到192.168.1.101这个地址。

怎么做端口映射?先登录路由器,局域网访问192.168.1.1

电信光猫兼路由器的用户名一般为useradmin,密码在路由器背面标签纸上。

然后找到高级设置-端口映射。

1735822711883.png

9091端口是TR的web控制页面,设置端口映射后可以从外网访问。详见本文软路由部分。

57223是我随便选的端口号,用于TR的P2P连接,建议UDP和TCP都选上,做好映射后务必回到TR设置中测试端口是否连接成功。如果连接失败,通常表现为只能下载不能上传,或者上传速度很小约等于0。

我这里填的局域网IP为192.168.1.101,实际上我的NAS有两个地址101、102应该都可以。至于为什么默认网口为102时在101做端口映射也能成功是一个比较玄学的问题。

MoviePilot配置

局域网访问192.168.1.102:3000进入登录页面,初始用户名已在环境变量里设置,如果没设置默认为admin,密码一般在docker日志里查看。

1735829290614.png

登录后先去改密码。

1735831151122.png

仪表盘可以看到下载和上传速率。

1735829969120.png

“推荐”页面都是未下载的资源,并不是你的影视库,只是推荐你可以下点新片子了。

1735830052679.png

“资源搜索”可以更精确地寻找你想下载的影片。

订阅是指已经有上映信息但你的PT站还未收录的资源,一旦收录后会自动下载。

1735830826183.png

下面开始讲几处重要的配置。

连接下载器
1735902000227.png
连接PT站

可以手动添加也可以自动添加。

手动添加的话你要一个个去找站点请求头中的Cookie信息或者Authorization信息,还是有点麻烦的,而且时间长了会过期,又要重新添加。

自动添加可以把你桌面浏览器里的Cookie信息自动上传到MP,需要安装浏览器插件CookieCloud

1735903409565.png

配置完点击保存。如果没有及时同步,可以到服务列表手动执行。

同步完成后应该就能在站点管理看到你的PT站了。

1735904238420.png

这一步做完以后可以先去推荐页下载几个资源试试,看看MP能否正常从PT站获取数据并给TR添加下载任务。

自动整理

文件整理是实现影视库统一的关键。

1735904960522.png

核心配置如下:

1735905769645.png

换句话说,文件整理的功能就是资源搬运,从各个下载目录搬运到影视库目录,并且做一些目录分类、文件重命名之类的预处理。

搬运方式
  • 硬链接:连体双胞胎。砍掉一个头还活着。一份文件生成多个文件入口,但只占用一份存储空间,只有所有入口都删除后才能释放文件占用空间;可以修改硬链接后的文件名但不会影响原文件做种(不能修改文件内容);要求在同一磁盘/存储空间/映射路径下才能硬链接。
  • 软链接:可以跨盘。类似于快捷方式,原文件删除后软链接即会失效;使用软链接时的原文件路径需要与生成软链接时的原文件路径保持一致,否则无法使用,也就是在docker环境下,映射前后的目录路径需要一致。

实际测试下来硬链接是正常的,软链接没法在SMB上使用。推荐硬链接。

为什么不能直接移动或复制呢?

复制占用两份空间太浪费。移动的话就没法继续保种了。保种的文件是既不能动目录结构也不能改名字的,否则就会被认为是不同的资源,做种前下载器会校验文件特征码的,必须完全一致才能做种。

监控方式
  • 下载器监控:仅针对MP官方添加的下载任务有效,如推荐、搜索、订阅功能添加的下载任务,即使是刷流插件添加的任务也不行,下载器监控需要MOVIEPILOT标签才会被接管。
  • 目录监控:适用于插件或者外部播放器添加的资源,只要文件夹里进来一个新视频就会触发搬运(还没下载完的不完整文件一定要添加额外的后缀名)。目录监控为实时。请避免对网盘目录使用目录监控,容易触发大量API请求导致被流控。
    • 性能模式:适用于NAS本地目录
    • 兼容模式:性能降低且NAS不能休眠,但可以兼容挂载的远程共享目录如SMB

整理记录可以在【媒体整理】里查看。

1735913281982.png
手动整理

如果自动整理出错或失败,也可以手动整理。

1735915382650.png
1735916065017.png

集数定位:使用表达式来确定集数的位置,{ep}占位符代表集数。例如:(BD)十二国記 第45話「東の海神 西の滄海 五章」(1440x1080 x264-10bpp flac).mkv(BD)十二国記 第32話「風の万里 黎明の空 九章」(1440x1080 x264-10bpp flac).mkv 共3个文件需要批量整理,此处可以填(BD)十二国記 第{ep}話{a}(1440x1080 x264-10bpp flac).mkv{ep}表示集,{a}表示随意用一个变量来替代不需要的但又不一致的部分,如果除了集数外没有其余不一样的内容,则只标定{ep}就行。

整理规则

一些例子:

原始文件名预处理文件名
猎罪图鉴2-03.mp4猎罪图鉴第2季第03集
白夜破晓02.mp4白夜破晓第02集
白夜破晓27v2.mp4白夜破晓第27集

像荐片之类的第三方播放器,下载的文件名可能不规范,无法被MP直接识别,因此我们需要增加预处理规则:

1736603039206.png

在设定-词表-自定义识别词添加以下正则表达式:

([^\d]+)(\d+)-(\d{1,2})\.mp4$ => \1第\2季第\3集
([^\d]+)(\d{1,2})v\d+\.mp4$ => \1第\2集
([^\d]+)(\d{1,2})\.mp4$ => \1第\2集

注意先后顺序不能变,越复杂的规则应当优先匹配。

如果不确定规则是否生效,可以在MP右上角-捷径-识别,输入文件名称测试。

订阅规则

如果你订阅的资源上线了,而且不止一个,比如有1080p、2K、4K、蓝光原盘、H264、H265等等类型,你选哪个呢?你让下载器下哪个呢?

规则就是事先给这些资源指定一个优先级顺序,如果同时命中多个资源MP就会按你的偏好下载最合适的资源。

我设置的规则如图。因人而异,看自己需求。

1736000516119.png
1736000593295.png
1736000659073.png
1736000836894.png

如果不确定规则是否生效,可以在MP右上角-捷径-规则,输入资源标题测试。

插件配置

我目前使用的插件共11个。

1735993257501.png

首先点击右下角的插件仓库设置,扩充一下插件源:

https://github.com/jxxghp/MoviePilot-Plugins/,https://github.com/thsrite/MoviePilot-Plugins/,https://github.com/honue/MoviePilot-Plugins/,https://github.com/InfinityPacer/MoviePilot-Plugins/,https://github.com/dandkong/MoviePilot-Plugins/,https://github.com/Aqr-K/MoviePilot-Plugins/,https://github.com/AnjoyLi/MoviePilot-Plugins/,https://github.com/WithdewHua/MoviePilot-Plugins/,https://github.com/HankunYu/MoviePilot-Plugins/,https://github.com/baozaodetudou/MoviePilot-Plugins/,https://github.com/almus2zhang/MoviePilot-Plugins/,https://github.com/Pixel-LH/MoviePilot-Plugins/,https://github.com/lightolly/MoviePilot-Plugins/,https://github.com/suraxiuxiu/MoviePilot-Plugins/,https://github.com/gxterry/MoviePilot-Plugins/,https://github.com/hotlcc/MoviePilot-Plugins-Third/,https://github.com/boeto/MoviePilot-Plugins/,https://github.com/xiangt920/MoviePilot-Plugins/,https://github.com/yubanmeiqin9048/MoviePilot-Plugins/,https://github.com/loongcheung/MoviePilot-Plugins/,https://github.com/xcehnz/MoviePilot-Plugins/,https://github.com/imaliang/MoviePilot-Plugins/,https://github.com/wikrin/MoviePilot-Plugins/

完整的插件仓库地址可在官方Wiki找到,可能会不定期更新。

下面挑几个重要的插件讲讲。

站点刷流

刷流是最重要的插件。它会帮你自动找限免资源然后下载保种以刷取上传量。

1735993493093.png

150-190指的是刷流资源的文件体积超过190GB后自动删到150GB。一般是按时间倒序删,先把最旧的种子删掉。

200指的是刷流资源的文件体积超过200GB后停止刷流。

当然这里有个逻辑问题,因为超过190GB就开始删种,所以永远到不了200GB,在1点到7点之间会一直刷下去。

但如果你把保种体积改为180GB,那么超过180GB就停止刷流,文件体积将停留在180GB多一点永远触发不了动态删除。

所以动态删除确实有逻辑漏洞,你也可以不用动态删除,配置一些普通的删除规则。

1735993672950.png
1735993768578.png
1735993811275.png

我堡的站点独立配置如下:

[{
    "sitename": "我堡",
    "seeder": "400",
    "pubtime": "360"
}]

独立配置是为了均衡一下馒头和我堡的上传量,因为馒头是热门大站,如果采用完全一样的设置我堡的上传量占比将少得可怜。

IYUU自动辅种

首先要配置IYUU站点绑定这个插件。

1735994147907.png
1735994201684.png

0 */4 * * * 表示每天每隔 4 小时的整点执行一次任务,即每天的 0:00、4:00、8:00、12:00、16:00 和 20:00。

站点自动签到

PT站不仅有分享率的要求,长期不登录也会被删号,所以必须定期签到。保种不等于签到。

1735994266537.png

不过有的网站似乎自动签到是无效的,最好还是定期手动登录看看,以保万无一失。

下载器助手

下载器助手有三大功能:

  1. 自动做种:通常在通过IYUU等工具辅种后,下载器中种子校验完毕但不会立即变成做种状态,可以通过本插件定时扫描下载器中“已完成但未做种”的种子并设为做种状态。
  2. 站点标签:如果下载器中种子很多,要想统计各站点的种子数量变得麻烦,可以通过本插件定时(或者通过监听下载添加事件)给种子添加站点标签。
  3. 自动删种:定时删除丢失文件的错误种子,或者通过监听源文件删除事件匹配对应的种子自动删除。
1735994331345.png
清理硬链接

由于硬链接有多个文件入口,如果只在影视库中删除,是删不干净的,所以我们需要一个插件,当影视库中的资源被删除时,同步删除所有硬链接资源。不过当刷流任务被删除时,是不影响影视库里的资源的,因为这个监控是单向的,以影视库为主导。君可以杀臣,臣不能杀君。

1735994603509.png
ChatGPT

开启插件后,消息交互时以#号开头,或者以号结尾,或者超过10个字符,则会触发ChatGPT回复。

开启辅助识别后,内置识别功能无法正常识别种子/文件名称时,将使用ChatGTP进行AI辅助识别,可以提升动漫等非规范命名的识别成功率。

1735996365413.png

API和KEY可以用这个项目申请:chatanywhere/GPT_API_free

捷径工具箱

有的小伙伴可能用了很久MP还不知道它自带的捷径工具箱有多好用,入口就在右上角第一个图标。

1735998496627.png

其中网络测试工具是最常用的,可以测试你的软路由配置有没有成功,我这里全绿当然是有魔法加持啦~

这里的日志对排查问题也是很有帮助的。

最强大的其实是消息中心,这里是可交互的,可以通过发消息搜索片名,如果配置了ChatGPT插件还能直接跟ChatGPT对话!

但网页版交互还是不够方便,如果能在微信或者TG上交互,那就更爽了,而MP确实是有这个功能的!

在微信和TG之间,我选了微信,因为考虑到国内网络的稳定性和家人的使用,还是微信更方便。

但微信需要有域名和公网服务器才行,如果没有的话还是TG的搭建门槛低。请自行斟酌。

下面就来教你怎么把MP的消息推送到微信并通过微信菜单控制MP!

连接微信

首先注册或登录企业微信网页版。

名字随意,比如我的企业叫“鸦鸦影视”。

在企业微信管理后台找到第一个要填写的参数:企业ID

1736065444926.png

然后转到应用管理-创建应用。名称图标都随意,如果取名困难就填MoviePilot,logo可以用MP图标

创建完成后又可以填两个参数:应用AgentId应用Secret

1736066247740.png

然后在应用管理-接受消息-设置API接收。随机获取TokenEncodingAESKey填入MP。

1736067746974.png

这次填完以后,先在MP里确定保存。注意确定后还要保存。要保存。重要的话说三遍!

后面开始上难度了。

1736085998430.png
回调地址

回到企业微信网页版,URL填写http(s)://DOMAIN:PORT/api/v1/message/?token=你的API令牌(在MP设置-基础设置)

比如我的地址是http://nas.crowya.com:3000/api/v1/message/?token=我的API令牌(配置了端口转发)

也可以是https://nas.crowya.com:666/mp/api/v1/message/?token=我的API令牌(配置了反向代理)

如果地址正确,浏览器直接访问这个地址会返回{"status": "OK"}的提示信息。

这个地址还是有些门槛的,因为需要你有一个域名,并且配置了DDNS,详见本文软路由部分。

IP+端口号是不可以的,这是企业微信的限制。能在企业微信正常保存即设置成功。

代理地址

现在只缺一个代理地址还没填了。注意MP的代理地址和企业微信的URL是不同的!

2022年6月后新建的企业微信应用需要有固定公网IP的代理才能接收到消息,需要使用有固定IP的VPS搭建代理服务。

由于企业微信的限制,这门槛又高了不少。

NAS一般是没有固定IP的,言下之意就是得有公网服务器。

不过貌似也有小伙伴在NAS上搭建代理成功的[1],这个我没有测试。

因为我正好有阿里云服务器,就直接在服务器上搭建了。

由于大多数人都不熟悉Nginx配置,这里我们依然用大家喜闻乐见的docker方式部署。

可以借助宝塔面板的docker工具创建容器,这里用的是命令创建:

docker run -d \
    --name wxchat \
    --restart=always \
    -p 8080:80 \
    ddsderek/wxchat:latest

其中8080可改成其他端口,记得在防火墙放行!

1736080007799.png

如果因为网络问题拉取镜像失败,请转到设置添加以下配置(加速URL)后重试。

{
  "registry-mirrors": [
    "https://dockerproxy.cn",
    "https://docker.1panel.live",
    "https://docker.nastool.de",
    "https://docker.agsv.top",
    "https://docker.agsvpt.work",
    "https://docker.m.daocloud.io",
    "https://dockerhub.anzu.vip",
    "https://docker.chenby.cn",
    "https://docker.jijiai.cn"
  ]
}
1736079747799.png

搭建完成以后,访问http://你的公网IP或域名:8080出现“微信代理搭建成功!”,这个地址就是填入MP的代理地址

最后将代理服务器IP填入应用管理-企业可信IP。如果你是管理员就把自己的企业微信ID加入管理员白名单

1736081476425.png
微信交互

最后掏出手机微信扫码,关注你自己的企业号就可以使用了。还可以邀请家人加入你的企业。

1736083477428.png

至此微信交互应该可以用了,可以发几条消息测试一下发送和接收是否都正常。微信收发的消息也会在MP捷径工具箱的消息中心同步显示。有时候会出现只能发送不能接收的情况,可能是因为微信对非固定IP代理的限制。

如果一切顺利,耐心等待一段时间后微信底部会自动出现功能菜单。

PT站新手考核经验

前面讲的都是自动刷流的方法,如果新手该开始接触PT站可能没法一下子配置这么多东西,其实我也是摸索了一个月才完全折腾到稳定,刚开始的一周是手动刷流的,其实手动刷流这个过程也会积累很多经验,学到很多东西,逐步找到感觉。

我的NAS目前没有IPV6也没有固定公网IP,但这并不影响PT站的可用性,顶多就是速度慢一点。虽然我的上传速度只有500KB/s左右,但每天24小时不间断运行,日积月累愚公移山,一周左右也能通过新手考核,所以小伙伴们要有信心,时间肯定是够的,只要别触犯规则就行了。

 注册未满 30 天者,且分享率低于 0.3 会立即被禁用帐号
分享率低于 1 会有五天警告期,期限内未改善将会禁用且删除账号。

这是最重要的两条规则,所以刚拿到账号一定不要下任何非免资源,哪怕50%也不可以!先把上传量刷上去,这个时候只能下完全free的资源!至少等上传量有个几GB才能小心翼翼地去下一些小体积种子。

1731160115483.png

上传量和下载量任务一般很快就能做完,最后就是刷魔力值。点击魔力值右边的[使用]可以看到魔力值获取途径和当前时魔(每小时可获得的魔力值数量)。

1736087585782.png

其中做种体积是决定性因素,只要体积够大基本时魔就大,不过体积和时魔并不是线性关系,更像是log函数,体积超过700GB后收效甚微[2]。其次就是尽量下官方种子,有额外加成。单纯刷种子数量(做电子书战士)我觉得不划算,找资源很费劲而且收效甚微。最容易获得的是这个二级验证加成,只要开启账号登录的二级验证就能+10%,立竿见影,非常划算,强烈推荐。总的来说时魔超过50就可以躺平了。

1736089585876.png

官方解释:

  • 简言之,为做种人数少、档案体积大的种子做种能获得更多魔力值。
  • 捐赠者每次将得到2倍的魔力值
  • +单种子官方奖励加成(每个种子给予0.1%加成,总计体积每GB给予0.01%加成,无需24小时)
  • +等级奖励加成
  • +持续在线做种奖励加成(每100个种子给予「当前基本奖励值」5%的额外加成,仅统计连续做种超过24小时的种子,单种大小少于10MB不计算)
  • +启用二级验证加成

By the way, 如果你手动刷流用的是绿联自带的下载中心保种的,那么后期就会面临如何迁移到Transmission的问题,这里面有一个坑我已经踩过啦,绿联下载的文件迁移到TR需要手动删掉一层目录才能通过校验(原先有两层同名文件夹),但也有部分文件,例如.ts后缀的是直接裸露在下载目录的,这种直接移动就好了。

软路由

软路由是局域网中的重要中枢,可以实现魔法上网、解锁VIP、去广告等功能,且所有连接WiFi的用户自动具备这些功能,客户端无需做任何配置,但服务端需要锲而不舍的折腾精神。如果要参考笔者的网络配置,请先回顾下文章开头的网络架构

以MoviePilot为例,学习完本章节后你会得到以下四个访问地址:

  1. http://192.168.1.101:3000(局域网地址)
  2. http://222.64.209.221:3000(公网地址,端口映射)
  3. http://nas.crowya.com:3000(公网域名,DDNS+端口映射)
  4. https://nas.crowya.com:666/mp/(公网加密域名,反向代理+DDNS+端口映射)

软路由、硬路由、旁路由、主路由,这些都是什么意思?

  • 软路由没有特别标准的定义,主要特征是具备强大的CPU和灵活的软件系统(最出名的是OpenWrt),自由度很高可以深度定制。例如用旧电脑做软路由、虚拟机跑软路由、docker运行软路由,或者购买基于OpenWrt系统深度定制的成品路由器(例如小米路由器)都是软路由。
  • 硬路由一般硬件性能较弱,功能单一,不支持开放系统。例如电信光猫,其实路由器只是它的兼职,它的本职工作是光纤信号转换,即光信号转电信号。
  • 主路由:局域网中的最上游网关。例如电信光猫的智能网关。
  • 旁路由:也没有标准的定义。一般指下游网关,即二级网关。也可能是相对于NAS系统的虚拟化运行,显得这个路由系统是依附在宿主机上的妾室,地位低(但功能上是中流砥柱,所有奏折先经过它批阅)。旁路由是可以没有天线的,自身并不一定需要支持WiFi,如果局域网中有其他支持WiFi的路由器,可以互补。

光猫

光猫为什么叫光猫,难道发明它的人也是猫奴?no no no,光猫的正式名称叫调制解调器,英文是 modem,这下明白了吧,就是音译。

我猜有的人还分不清网线和光纤,以为网线就是光纤,no no no,带水晶头的网线是铜线,传输的是电信号,光纤比网线细很多,一般在光猫背面,入户就这一根,剩下的在你家里走的网线一般都是电信号线。

1736263694704.png

其实光纤优点比电线多很多,成本低、传输距离远,可谓物美价廉,那为啥不都用光纤?因为光信号解调难,电信号就像英语,是电子界通用语言,光信号就像中文,难学,如果家里都用光纤,那么你的终端电脑上就要自带光电翻译器了,还不如一开始先解调了,全屋设备共享电信号。

如果你嫌弃光猫兼职的路由器性能不够强,功能不够开放,自己又买了一台性能强劲的软路由,怎么办?只能作为二级网关吗?

如果你的软路由自带天线的话,其实没必要再启用光猫的路由功能了,可以到电信网关设置里把路由模式改桥接模式,这样的话它就只起一个光信号转电信号的功能,然后用软路由去拨号,这样软路由作为主路由,简洁明了,避免了双重路由带来的性能损失。

电信光猫的局域网地址一般是192.168.1.1,账号密码见背后贴纸。

1736349137057.png

这个页面可以设置端口映射,我的常用列表如图。配置步骤详见上文端口映射

1736350405098.png

不过这个页面只有基础设置和端口映射,要想路由改桥接,需要进入底下的快速装维入口,其地址为192.168.1.1:8080

1736349468526.png

这里其实有两种账户,一种是普通账户useradmin,就是背面贴纸上的密码,另一种是超级管理员账户telecomadmin,密码一般不会告诉用户,如果你想折腾更高级的功能比如DMZ或者关闭UPnP的话,可能很想搞到这个密码,我当初折腾了半天没搞出来,后来咸鱼4块钱就查到了……早知如此,不如一开始就咸鱼好了,目前不清楚他们的信息来源,不过查密码需要接收一个验证码转发给商家。

如果你只是想路由改桥接,那么普通账户也可以改的,没必要琢磨这个超级管理员账户了。

1736350031709.png

不过,由于笔者的软路由是docker运行的虚拟化容器,没有天线,只能作为旁路由,需要主路由的天线接收WiFi,所以还是采用了双重路由的臃肿结构。我这里就没有改。读者可以自行定夺采用哪种方式。本文接下来讲解的方式是旁路由模式的OpenWrt。

OpenWrt

Open Wireless Router,OpenWrt是一个开源的基于Linux的路由器系统。既然属于Linux系统,那么你有三种方法运行它:在一堆真实的硬件上装操作系统(实体路由器)、虚拟机运行(虚拟出整个系统)、docker运行(和宿主机共享Linux基础设施,仅虚拟化独有功能,前提是宿主机也是Linux系统)。从成本来看,显然docker运行的性能开销是最小的。

  • 实体路由器:独立的CPU和内存。
  • 虚拟机运行:共享CPU,内存独立。宿主机可以是任意系统。
  • docker运行:共享CPU和内存。宿主机必须也是Linux。

虽然网络上大部分教程都是虚拟机跑OpenWrt的,但我实际用下来感觉docker版的功能完全相同,而且更节省内存。除非你NAS不是Linux,否则我想不出docker有什么缺点[3]。有人说docker的macvlan不能和宿主机通信,这可能是和虚拟机唯一的区别,但使用起来似乎并无影响。因此我选择docker版镜像。

镜像下载

这里需要解释一下,由于OpenWrt的自由化程度实在太高,以至于几乎没有适用于所有用户的统一镜像,最佳方式是自己定制编译一个,不过如果你想偷懒的话,也可以直接下载Kwrt的通用镜像。虽然是第三方,但确实比官网好用。在此感谢苯苯的教程让我知道了这个项目。

没编译的参数其实也是可以进入系统后期修改的。如果你想提前编译好,可以参考我的设置:

1736429932088.png

我选择的定制软件包:luci-app-acme luci-app-ddns-go acme-acmesh-dnsapi luci-app-unblockneteasemusic

旁路由模式下后台地址建议设为200以上,因为通常前150个地址是路由器自动分配的,如果你设置的静态地址数字小了,有概率和自动分配重复!如果你是主路由,直接设为192.168.1.1就行,这个地址专门就是为主路由预留的,不会被分配。

子网掩码不用改。它的作用是判断同一网段。255.255.255.0的二进制是11111111.11111111.11111111.00000000

1736431033005.png

后台密码随便改,自己记住就行。默认主题建议argon,我每个都试了一遍,还是argon最优雅[4],没bug。

Docker不要勾选,openwrt系统也可以安装docker,毕竟它也是个完整的linux系统,但是我们已经有nas运行的docker了,没必要用到openwrt里面的docker。但如果你只有一台软路由,也可以用openwrt系统作为轻度nas使用。

iStoreOS就是一个好看点的主页和傻瓜式商店而已,但商店里的插件基本和openwrt软件包重复,没有装的必要。但如果你只有一台软路由,倒是可以装个iStoreOS获得好看的桌面,作为轻度nas使用。路由狗没研究过。

文件系统SquashFS好像比Ext4多了个恢复出厂设置的功能。但好像会影响自动更新。

ROOTFS.TAR.GZ记得勾选上(docker容器的编译仅限赞助用户,为了写这篇教程,我给作者赞助了两次咖啡,第一次过期了忘记截图😭)。

最后构建新固件,排队等下载,一般docker镜像在90MB左右。

Docker部署

首先在NAS的控制面板里打开SSH功能。(注:Docker版的openwrt镜像只能SSH导入,绿联导入会失败,不信邪的可以自己试一下)

WIN11菜单右键打开终端。

1736433964668.png

导入openwrt镜像:(导入前要先把镜像上传到NAS文件管理器,文件名和路径改成你自己的)

docker import /volume1/download/ug_download/kwrt-12.10.2024-x86-64-generic-rootfs.tar.gz openwrt

回到绿联的docker-本地镜像检查一下是否导入成功:

1736434359155.png

接下来需要创建一个虚拟网络。创建macvlan网络有两种方式,一种是SSH:

docker network create -d macvlan –subnet=192.168.1.0/24 –gateway=192.168.1.1 -o parent=eth0 openwrt

另一种是绿联的可视化操作,创建完成后应该能在docker-网络里看到如下信息:

1736434748122.png
 注意这里的网卡必须是LAN1或LAN2,不能是BR-LAN或者VBR-LAN,任何桥接过的网卡都不可以,亲测有bug!

最后在docker里新建一个名为proxy的项目,docker-compose配置如下:

services:

    openwrt:
        image: openwrt
        container_name: openwrt
        networks:
            openwrt:
                ipv4_address: 192.168.1.201
        privileged: true
        command: /sbin/init
        restart: always

networks:
    openwrt:
        external: true

容器启动时会有硬盘插拔的提示,不用太担心,这个应该是openwrt通过热插拔事件自动挂载磁盘。我的理解是,它的权限很高,和NAS共用硬盘空间,所以不需要作任何存储映射。

SSH命令笔记

如果部署完成后访问192.168.1.201进不去系统,多半是openwrt的network配置不当,可以通过SSH修改。这里介绍几个最常用的命令。

1736574370615.png

我的/etc/config/network完整配置如下:

config interface 'loopback'
	option device 'lo'
	option proto 'static'
	option ipaddr '127.0.0.1'
	option netmask '255.0.0.0'

config globals 'globals'
	option packet_steering '1'

config device
	option name 'br-lan'
	option type 'bridge'
	list ports 'eth0'
	option promisc '1'

config interface 'lan'
	option device 'eth0'
	option proto 'static'
	option ipaddr '192.168.1.201'
	option netmask '255.255.255.0'
	option ip6assign '60'
	option gateway '192.168.1.1'
	option delegate '0'
	list dns '223.5.5.5'

如需修改,可使用vivim命令:vi /etc/config/network,然后按i进入编辑模式。

编辑完成后,按esc切回命令模式,然后输入:wq保存并退出。如果输错了不想保存直接退出,输入:q!

如果要修改的东西太多手动编辑太麻烦,可以用EOF命令覆写整个文件:

cat > /etc/config/network << 'EOF'
#两个EOF之间为整个文件内容,便于复制粘贴
EOF

注意前面一个'EOF'必须用单引号包裹,否则文件内的特殊符号需要转义。

最后通过/etc/init.d/network reload或者/etc/init.d/network restart重载网络配置。如果还是不行重启容器试试。

初步配置

局域网访问192.168.1.201进入登录页面,密码是编译时设置的,如果没改就是root

1736437938306.png

先去改个主题配色给自己提供点情绪价值吧~在系统-进阶设置-Argon主题设置。

1736437850476.png

系统-设置向导是最关键的配置,每项都要好好核对!

网络-接口也是重中之重,部分和设置向导重合,其余设置也需要核对。

1736438698656.png

如果openwrt作为旁路由,没有WiFi天线,建议把接口的br-lan改为eth0。eth0只支持有线网口,br-lan可以理解为有线+无线。

1736438958802.png

DHCP

Dynamic Host Configuration Protocol,自动分配局域网IP地址,例如手机接入WiF瞬间分配到192.168.1.6,同时分配了上游网关和DNS服务,上游网关决定了网络拓扑,局域网内只能有一个DHCP服务。谁开启了DHCP,谁就是终端的默认网关。

根据排列组合有以下几种情况:

  1. 主路由网关指向旁路由,旁路由网关指向旁路由:如果旁路由没有WAN口,局域网无网络。
  2. 主路由网关指向旁路由,旁路由网关指向主路由:不可以,死循环,局域网无网络。
  3. 主路由网关指向主路由,旁路由网关指向旁路由:旁路由不起作用,旁路由无网络。
  4. 主路由网关指向主路由,旁路由网关指向主路由:
    • 主路由开启DHCP,旁路由关闭DHCP:旁路由不起作用,设备会自动连接到主路由,并通过主路由收发信息。除非在终端设备上手动设置静态IP,并指定网关为旁路由。
    • 主路由关闭DHCP,旁路由开启DHCP:旁路由起作用,设备会自动连接到旁路由,经由旁路由→主路由双重路由后连接到公网。

所以我选择的配置是:关闭主路由的DHCP,开启旁路由的DHCP,并将旁路由的网关指向主路由。

如何关闭主路由的DHCP?电信网关访问192.168.1.1-高级设置-局域网设置。

1736350510164.png

然后在openwrt-网络接口-DHCP服务器-常规设置,确保“忽略此接口”没被选中。自动分配地址范围设为192.168.1.2~192.168.1.100,共99个地址,应该足够给家里的设备分配了。NAS建议设为静态地址,如192.168.1.101。这样能确保分配不重复。

1736439353563.png

DNS

Domain Name System,域名翻译官,根据域名查询IP,可以给正确的也可以给错误的,多个DNS可以上下游嵌套,通过DNS劫持可以破解一些软件功能或者去广告。但同时,某些墙也可以通过DNS污染让你偏离航向,找不到正确的访问地址。总之DNS是一把双刃剑。

当终端自动获取IP地址时,同时也会设定网关和DNS,DNS通常和网关地址相同,但有个区别,上游网关是唯一的,而DNS则是饱和式救援,可以设置多个DNS服务器,通常为本地DNS路由器地址+公共DNS服务器地址。常见的公共DNS如下:

  • 国内常用公共DNS
    • 阿里云:223.5.5.5
    • 中国电信:114.114.114.114
  • 国外常用公共DNS
    • 谷歌:8.8.8.8
    • Cloudflare:1.1.1.1

如果是国内网络环境,首选DNS不要用国外DNS,建议阿里云,如果能访问国际网络,建议都填上,但也不是越多越好,建议别超过4个。

至于路由器上的本地DNS,一个典型应用场景是去广告,例如插件AdGuardHome。但是查了些资料后目前并不推荐使用了,原因如下[5]

“效果不佳,现在应用的广告都内置httpdns,路由器部署AdGuardHome连httpdns都没法拦截,更别说用dotdoh的大厂了。”
“现在app的广告都已经和内容使用一个域名了,单纯的dns已经没有办法去广告了,更别提广告还是走的https加密,就算是代理软件也没办法的。”
“浏览器插件或客户端过滤当前设备大概能过滤⁴⁄₆~⁵⁄₆,因为可以针对性的过滤路径或文件。而通过网关装adghome能有就²⁄₆~³⁄₆就不错了。通过流量过滤我的感觉是介于两者之间,能过滤一部分的手机开屏广告和一部分的浏览器弹出广告,算是一个配置既不太麻烦效果也能接受的均衡点吧。”

简言之,现在广告的矛已经升级了,普通的盾已经防不住了。而且AdGuardHome是比较庞大臃肿的,拖累性能,增加延时,过滤效果却一般。而且如果小白配置不当还有可能连不上网络,得不偿失。如果确实对去广告有强烈需求,还是建议在终端拦截,成功率更高一些。

DDNS

Dynamic Domain Name System,即动态域名解析,将你的域名自动解析到软路由或NAS的公网IP,这样你就得到了一个固定的访问域名,即使没有固定的公网IP(通过授权密钥修改域名解析,会自动更新)。

举例:访问nas.crowya.com解析到222.64.209.221。(前提是你有一个域名。我的域名是在阿里云买的。)

其中222.64.209.221是我的路由器公网IP,但并不固定,隔段时间会变,或者重启路由器也会变。这也是家庭宽带和公网服务器最大的不同之一,没有固定IPV4。想要固定IPV4需要和运营商申请,但不一定同意。有些校园网用户或个人要求开通的可能会有固定IPV6。IPV6都是固定的,因为地址数量多,用不完,根本用不完。IPV4之所以不固定的根本原因是地址数量稀缺,全球终端都挤爆了,通过回收再分配可以节约一点号段,就和手机号、车牌号类似。

由于DDNS是个特别普及的功能,实现方式有很多,提供服务的厂商也很多,这里讲讲绿联自带的DDNS和openwrt的DDNS-GO插件。两者功能重复,建议只启用其中一个。我选择的是DDNS-GO,因为软路由是上游网关,它的IP地址更可靠,下游终端可能会因为挂代理测出来的IP不准。

绿联DDNS

在控制面板-设备连接-远程访问,启用DDNS支持并填入阿里云域名和AccessKey。

1736611789606.png
1736612082066.png
DDNS-GO

首先在openwrt软件包安装DDNS-GO插件并启用,访问后台地址,设置密码并登录。

1736612825913.png
1736612592700.png

UPnP

Universal Plug and Play,自动端口转发,常用于P2P下载等非固定端口,打一枪换一炮的游击策略,端口号通常很大,例如54490,过会儿又变成了59668,局域网内只能有一个UPnP服务。我选择关闭电信网关的UPnP启用openwrt的UPnP,但似乎没什么意义,因为UPnP似乎没法透过双重路由,但即使是倒过来启用电信网关的UPnP关闭openwrt的UPnP,似乎也会有一些奇奇怪怪的BUG,这个还待研究……有条件的话最好还是用openwrt做主路由,从根源上避免双重NAT。

启用或关闭电信网关的UPnP需要超级管理员密码,详见上文光猫部分。

1736350175143.png

openwrt的UPnP一般不用特别设置,默认就是启用的。

1736614009537.png

OpenClash

首先梳理一下clash的来龙去脉,clash有好多好多版本,例如Windows端的CFW,安卓端的clash,还有docker版clash内核,openwrt的OpenClash插件,还有三大面板dashboard,yacd,metacubexd……为了分清这些软件的区别,首先要建立前端和后端的概念。

你看到的可视化web页面、软件的UI界面、控制中心、管理后台、各种设置项,都是前端,只要不是通过代码或配置文件来交互的,都是前端。而后端是看不见摸不着的,只能通过代码、命令、配置文件、API等指令来执行具体功能,对人类来说很难操作,但是对机器来说小菜一碟,它又不需要花俏的界面,它只负责执行命令。

clash最初只有一个内核,也就是后端,它只接受.yaml格式的配置文件。这个配置无法自动更新,并且对小白不太友好,所以才会有各种各样的开发者开发出了前端+后端的傻瓜式软件版本,例如CFW。也有的开发者是只做了前端,采用前后端分离的方式,可以自由搭配,例如docker版clash+yacd的组合。

  • clash后端内核:docker版clash、mihomo(clash-meta)
  • clash前端面板:官方版dashboard,yacd(最优雅),metacubexd
  • clash前端+后端:Clash for Windows(CFW)、安卓版clash、OpenClash(Linux)

但是出于某些不可抗力,最初的clash内核源码(Dreamacro/clash)已于2023年11月删库保平安。虽然内核停更了,但各大前端和前后端软件还在,并且用户非常广泛。目前有个叫mihomo的项目(MetaCubeX/mihomo),基本上继承了clash的衣钵,并且在继续更新。就像moviepilot代替nastool一样换个马甲东山再起。OpenClash也还在继续更新,并且支持clash-meta。clash-meta是mihomo的另一个马甲。

时至今日,虽然红颜薄命命运多舛,clash依然是最流行的代理软件。不过也有一些别的选择,例如docker版v2rayA,配置简单,可以自动更新GFW列表和机场订阅,并且支持同时连接多个节点负载均衡,但是内存占用和openwrt差不多,已经被我打入冷宫了。

要想在NAS上搭建代理,主要有以下两种方案:

  • docker版clash+yacd:无法自动更新机场订阅。仅限IP:PORT提供代理服务,不支持局域网代理。
  • openwrt版OpenClash:可以自动更新机场订阅。既支持IP:PORT代理,也支持局域网代理。

显然openwrt版OpenClash的功能是大于docker版clash+yacd的,但是配置也更复杂一点。都折腾到这份上了,总有一天还是得升级到OpenClash的。建议一步到位,直接上手OpenClash。

修改GitHub下载地址

初次使用可能会遇到内核下载失败的问题,在覆写设置-常规设置里面换个CDN地址试试。

1736655338784.png
添加订阅并启用自动更新
1736655001574.png
修改运行模式和DNS劫持

有两种模式搭配可选:(在插件设置-模式设置和DNS设置里修改)

  • Fake-IP模式+防火墙转发:(暂时没搞明白啥原理)
  • Redir-Host模式+Dnsmasq转发:推荐,感觉兼容性更好。此模式下亲测可以成功解锁网易云音乐。
1736656266287.png
添加自定义分流规则

如果直接修改配置文件,更新订阅时是会被覆盖的,为了永久保留自定义规则,需要到覆写设置-规则设置下面添加。

1736657069848.png
添加第三方规则订阅

先到规则附加页面底部-管理第三方规则集,下载几个常用规则,然后回到概览添加分流策略。

1736658419129.png

插件设置-第三方规则订阅-勾选自动更新。保存并应用配置。

1736658783546.png

解锁网易云音乐

解锁网易云灰色歌曲和VIP歌曲。原理是采用Bilibili/JOOX/酷狗/酷我/咪咕/pyncmd/QQ/Youtube等渠道替换音源。

安装软件包名为luci-app-unblockneteasemusic的插件,注意核对名称,解锁网易云音乐有多个软件包,其他包名可能版本较旧无法使用。

目前已亲测在iPad网易云音乐HD版和安卓网易云荣耀定制版上有效。最新的网易云官方版无效,只能是定制版。荣耀定制版可以在其他品牌手机上运行,但是需要安装荣耀账号服务。为了解决这个麻烦事,有酷安大神提取出了不需要荣耀账号的版本,且针对小米手机优化,界面也十分精简。推荐安装这个版本:下载地址

1736688962971.png

不论是iOS还是安卓都需要安装CA证书。iOS在设置-通用-VPN与设备管理-配置描述文件。小米手机可以先保存到文件管理器,然后在设置-WLAN-高级设置-安装证书,或者直接在设置搜索证书。

如果需要验证解锁有没有成功,可以用周杰伦的专辑测试,例如“十一月的肖邦”,解锁前全是灰的。

如果openclash和解锁网易云音乐冲突,请将openclash运行模式改为Redir-Host模式+Dnsmasq转发或者Fake-IP模式+防火墙转发,并且在openclash插件设置-开发者选项增加一条防火墙规则:(这个配置我足足摸索了一个星期!)

nft insert rule inet fw4 dstnat ip daddr @neteasemusic counter jump netease_cloud_music_redir

1736690106017.png

保存并应用配置后到防火墙检查一下规则是否生效:NAT动作链”dstnat”第一行应该是网易云音乐的相关规则,并且优先级很高(数字越小越高,不限正负)。这一点非常重要,直接决定了解锁成败与否。

1736690503119.png

ACME

ACME 的全称是 Automatic Certificate Management Environment,即“自动化证书管理环境”。用于自动申请和续签SSL证书,是开启HTTPS加密访问的前提。

注意luci-app-acmeacme.sh的教程有所不同,本文讲的是具有可视化面板的luci-app-acmeacme.sh的教程请看官方Wiki

1736944638123.png

这里的邮箱必须填上,否则无法申请证书。然后在证书配置添加并编辑。

1736944756462.png

DNS验证目的是为了确保你是这个站点的主人,即验证所有权,否则你一下子给一百个陌生人的域名申请证书怎么办,防止滥用,毕竟人家是免费的。如果DNS验证不了,请检查软件包是否安装了acme-acmesh-dnsapi,请注意,如果你是用KWRT在线编译的openert,默认是不带这个软件包的,建议手动补充到定制软件包列表。这个问题足足困扰了我半个星期才解决!感谢这个帖子指点迷津:openwrt 咋更新证书?luci-app-acme-OPENWRT专版-恩山无线论坛

1736944895735.png

如果Ali_Key和Ali_Secret填了没效果应该是插件bug,可以在DNS API凭证那一栏手动新增两行:

Ali_Key="你的Ali_Key"

Ali_Secret="你的Ali_Secret"

高级设置一般不用改,保存并应用之后,检查一下证书列表有没有新条目。成功的话会显示证书路径:

私钥:/etc/ssl/acme/nas.crowya.com.key

公钥证书:/etc/ssl/acme/nas.crowya.com.fullchain.crt

记住这两个路径就行了,后面在NGINX配置里会用到。也许你在这个路径下还看到了其他几个.crt文件,其他.crt只是中间产物,最后会合并成一个完整的证书链文件fullchain.crt(ACME插件自动帮你完成了拼接和软链接复制)。

如果证书列表没有更新,可能是还没到执行时间,一般来说每天零点才会执行检查更新证书的命令,不过你也可以通过SSH手动执行:

/etc/init.d/acme start

NGINX

最后一步是修改nginx配置,这个配置又足足困扰了我半个星期,日思夜想,夜不能寐,差点又要放弃HTTPS了,网上的教程查不到有用的,chatgpt也抓不住关键,硬生生把我从小白逼成了nginx配置专家。

启用HTTPS

这个步骤需要用到前面申请的SSL证书。目的是为了开启主域名nas.crowya.com的HTTPS访问。

先说一下,进阶设置里的nginx配置并不是原汁原味的nginx配置,是需要先经过UCI编译的,一定要仔细研读_lan的写法,有很多细节需要注意!

编辑器下面有一行说明:开头的数字符号(#)或分号的每一行(;)被视为注释;删除(;)启用指定选项。

虽然如此,我也不建议添加任何注释,因为UCI的注释很容易和nginx注释搞混,万一因为注释的问题编译失败是有可能打不开openwrt网页的,当然我已经失败N次了,补救办法也是有的,后面再讲。

仔细看这条option access_log 'off; # logd openwrt'这里的注释可是在引号里面的!万一你写到引号外面就凉凉了!这就是为什么我说UCI的注释很容易和nginx注释搞混!

原本的配置包括_lan等都不要删掉,建议只在后面新增,不要动原来的配置,即使chatGPT骗你删掉也别信,它懂个屁!如果你删了恭喜你再次喜提打不开openwrt网页。

系统-进阶设置-NGINX的UCI配置后面追加:

config server 'nas_crowya_com_https'
    list listen '443 ssl http2'
    list listen '[::]:443 ssl http2'
    list listen '666 ssl http2'
    list listen '[::]:666 ssl http2'
    option server_name 'nas.crowya.com'
    list include 'conf.d/luci.locations'
    option ssl_certificate '/etc/ssl/acme/nas.crowya.com.fullchain.crt'
    option ssl_certificate_key '/etc/ssl/acme/nas.crowya.com.key'
    option ssl_session_cache 'shared:SSL:32k'
    option ssl_session_timeout '64m'
    option access_log 'off'
​
config server 'nas_crowya_com_http'
    list listen '80'
    list listen '[::]:80'
    option server_name 'nas.crowya.com'
    option return '301 https://$host$request_uri'
    option access_log 'off'

第一段配置的含义是访问nas.crowya.com的443或666端口启用SSL加密传输。第二段配置的含义是访问nas.crowya.com的80端口自动重定向到HTTPS端口。443是浏览器默认的通用HTTPS端口,会自动隐藏省略。666是为了规避家庭宽带对443的封禁,额外增设一个加密端口,但这个端口会出现在地址栏无法隐藏,后面也会提到。两个SSL证书地址从ACME插件复制过来即可。

list include 'conf.d/*.locations'这句是从default_server那边抄过来的,这句必须要有,否则访问nas.crowya.com就是404。/etc/nginx/conf.d/luci.locations这个文件主要是指定主页地址(openwrt)。当然你也可以自己做一个主页[6],不一定打开就是openwrt,可以是个NAS资源导航,然后用别的空闲端口去映射openwrt。这一步我也卡了很久,因为我以为主页是可省略项,它能自动找到default_server的主页,实则不然,主页是必须要指定的,即使和default_server一样也要再写一遍。

其实这个配置就是反向代理的一种。你访问nginx,nginx访问luci.locations里指定的路径和页面(openwrt)。后面会细说。

如果你一不小心配置写炸了导致openwrt网页进不去,我把原始配置摘出来了。SSH输入以下内容可以恢复原始配置:

cat > /etc/config/nginx << 'EOF'
config main 'global'
    option uci_enable 'true'
​
config server '_lan'
    list listen '443 ssl default_server'
    list listen '[::]:443 ssl default_server'
    option server_name '_lan'
    list include 'restrict_locally'
    list include 'conf.d/*.locations'
    option uci_manage_ssl 'self-signed'
    option ssl_certificate '/etc/nginx/conf.d/_lan.crt'
    option ssl_certificate_key '/etc/nginx/conf.d/_lan.key'
    option ssl_session_cache 'shared:SSL:32k'
    option ssl_session_timeout '64m'
    option access_log 'off; # logd openwrt'
​
config server '_redirect2ssl'
    option server_name '_redirect2ssl'
    option return '302 https://$host$request_uri'
    list listen '80'
    list listen '[::]:80'
​
config server 'default_server'
    option server_name 'openwrt/'
    list include 'conf.d/*.locations'
    option access_log 'off; # logd openwrt'
    list listen '80 default_server'
    list listen '[::]:80 default_server'
EOF

注:两个EOF之间是原始配置,外面那个命令是覆写文件。

最后重启一下nginx:/etc/init.d/nginx reload/etc/init.d/nginx restart或者在系统-启动项手动点击。

反向代理

以前看到“反向代理”这四个字就头大,一直没搞清楚师傅到底是做什么工作的。这次终于做了点功课,就算挫骨扬灰都不可能再搞混了!

根本区别是这个代理架设在客户端还是服务端!如果是用户想委托中介,架设在客户端,就是正向代理;如果是服务商想委托中介,架设在服务端,就是反向代理。一个是打酱油的小孩,一个是商场的导购。假设你身患残疾出不了门,委托小孩帮你去买瓶酱油,这个过程是正向代理。商场预判了各种顾客的需求,招聘了一个导购员放在商场入口,然后小孩问姐姐,酱油在哪里,她告诉小孩在一楼食品区XX货架,但是小孩太矮够不着,于是导购姐姐帮忙从货架上拿下来递给小孩,这个过程是反向代理。

可是,个人家庭用户有什么服务端呢?什么情况下会用到反向代理呢?web服务也是服务!只要不是直接通过文件路径访问的,间接通过域名跳转,都涉嫌反向代理。设想这样一个场景:你的NAS里装着MP和openwrt等应用,只能局域网访问,或者外网通过不加密的http端口映射访问,那么你到海南旅游的时候怎么才能安全地访问家里的应用呢?这时你想到了你那豪宅中的保姆,打个加密电话给他,“喂,帮我看看MP入库了什么新电影?”于是保姆通过内网打开MP,并把页面内容保存下来,加密传输给你。当然,这个保姆也可以是一段程序代码,也就是nginx。注意这个过程实现了加密,反向代理一般就是为了开启HTTPS。

  • 反向代理:远程CALL你家里的保姆NGINX帮你打开内网页面,你和保姆加密通讯。
  • 正向代理:让你身边的助理Clash去外网Google一个东西,简称代理。

前面的UCI配置只是实现了openwrt主页的HTTPS访问,那还有那么多应用怎么开启加密传输呢?这里涉及到两个概念:

  • 子域名反向代理:通过xxx.nas.crowya.com的域名访问应用web页面,需新建xxx.locations文件并在UCI配置新增server,配置复杂但兼容性好,几乎所有应用都支持。
  • 子目录反向代理:通过nas.crowya.com/xxx的域名访问应用web页面,仅需更改luci.locations文件,配置简单,仅部分知名应用支持,如MP、ALIST等,需要开发者专门适配,否则可能会出现静态资源路径混乱,CSS/JS无法加载等情况。

我的经验是,除非应用的官方Wiki给出了子目录反代的配置说明,其他情况下子域名反代始终是更稳妥的选择。

下面分别给两个例子,可作为模板使用。其他应用的反向代理详见完整的NGINX配置

子域名反向代理(以TaoSync为例)

新建/etc/nginx/conf.d/ts.locations,文件内容如下:

location / {
                proxy_pass http://192.168.1.102:8023;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
}

在NGINX的UCI配置后面追加:

config server 'ts_nas_crowya_com_https'
    list listen '443 ssl'
    list listen '[::]:443 ssl'
    list listen '666 ssl'
    list listen '[::]:666 ssl'
    option server_name 'ts.nas.crowya.com'
    list include 'conf.d/ts.locations'
    option ssl_certificate '/etc/ssl/acme/*.nas.crowya.com.fullchain.crt'
    option ssl_certificate_key '/etc/ssl/acme/*.nas.crowya.com.key'
    option ssl_session_cache 'shared:SSL:32k'
    option ssl_session_timeout '64m'
    option access_log 'off'
​
config server 'ts_nas_crowya_com_http'
    list listen '80'
    list listen '[::]:80'
    option server_name 'ts.nas.crowya.com'
    option return '301 https://$host$request_uri'
    option access_log 'off'

访问地址:https://ts.nas.crowya.com:666

子目录反向代理(以MoviePilot为例)

/etc/nginx/conf.d/luci.locations文件后面追加:

location /mp/ {
                proxy_pass http://192.168.1.102:3000/;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
}

访问地址:https://nas.crowya.com:666/mp/

反向代理的斜杠/语法

反向代理的斜杠/非常关键,加和不加以及在哪里加的效果完全不同,可以说是玄学范畴,只能以最终测试为准。

具体使用方法可参考这篇文章:Nginx反向代理之路径替换 – 钟小嘿 – 博客园

建议要么两者都加斜杆,要么都不加,这样转发的地址一般不会错。
使用一句标准的话来说,总结如下:(与location是否有斜杆关系不大)
第一,若proxy_pass代理地址端口后无任何字符,则转发后地址为:代理地址+访问的uri。
第二,若proxy_pass代理地址端口后有目录(包括”/”),则转发后地址为:代理地址+访问的uri去除location匹配的路径。
但有些情况可能是错的,配置时需要谨慎。

绕过80和443端口

在局域网访问是感受不到运营商对80和443端口的封禁的,换句话说,80和443端口在局域网可以正常访问。但是一旦到了公网,比如用手机流量访问,80和443端口就打不开了,这是因为国内限制家庭用户搭建web服务,而80和443正是默认的web服务端口,分别对应HTTP和HTTPS,全天下浏览器都晓得,因此首当其冲。

解决方法汇总:

  1. 使用其他显性端口:随便选一个别的端口(不能和其他服务重复),例如666,将666端口转发到443端口。公网访问时始终携带端口号,例如https://nas.crowya.com:666。稍稍影响美观,但666在西方是恶魔数字,在中国是吉祥数字,比较有个性。
  2. 隐藏端口号的方法:在1的基础上隐藏端口号,理论上只有80和443端口会被浏览器自动隐藏,但多走些弯路也能达到隐藏的效果。
    • 服务器中转方案[7]:前提是你有一台公网服务器,将服务器的443转发到NAS的666可以实现不带端口号的访问,但可能会涉及流量中转,消耗服务器带宽,而且不是人人都有服务器的。
    • 隐性URL方案[8]:域名解析里新增一条解析记录,记录类型选择”隐性url”。和服务器中转原理类似,域名商提供一个中转域名,用iframe把带端口的地址给包了起来。相当于套娃,监控里看监控里的电视。兼容性差,有些页面似乎会无法显示。
    • CDN方案[9]:有些cdn的回源可以设置自定义端口,用cdn可以解决去掉端口号的问题,缺点就是不能直接回源。

隐性url有一个很大很大,甚至是致命的问题,首先,隐性url解析是基于iframe实现的,这对搜索引擎的蜘蛛非常不友好,注重seo的兄弟千万不能使用,第二,在浏览器中显示的域名永远都是隐性url记录的解析值,无论你怎么点内部链接,浏览器永远就显示那个域名,用户看了会摸不着头脑。可以这样理解:我建个博客,域名为123.com,使用了隐性url解析,我打开一篇文章,发现url还是原来的123.com,大受震撼。我登陆wordpress后台,url输入123.com/wp-admin,(刻进DNA的链接),发现页面正常跳转,但是浏览器显示的url还是原来的123.com???有用户看到的话,绝对以为闹鬼了。那么蜘蛛要来爬你的站,发现一个域名指向了一堆不同的页面,你让他怎么想?它还会来爬吗?

笔者目前采用的是显性端口号,因为隐藏端口号大费周章却没多大意义,最终还是放弃了。因为我的NAS还是个人使用为主,公网服务器我也有,没必要为一个端口号死磕到底,博客地址不带端口号就够了。

完整的NGINX配置

NGINX的UCI配置:(包含了openwrt、TaoSync、DDNS-GO、路由器页面的子域名反向代理)

config main 'global'
    option uci_enable 'true'
​
config server '_lan'
    list listen '443 ssl default_server'
    list listen '[::]:443 ssl default_server'
    list listen '666 ssl default_server'
    list listen '[::]:666 ssl default_server'
    option server_name '_lan'
    list include 'restrict_locally'
    list include 'conf.d/luci.locations'
    option uci_manage_ssl 'self-signed'
    option ssl_certificate '/etc/nginx/conf.d/_lan.crt'
    option ssl_certificate_key '/etc/nginx/conf.d/_lan.key'
    option ssl_session_cache 'shared:SSL:32k'
    option ssl_session_timeout '64m'
    option access_log 'off; # logd openwrt'
​
config server '_redirect2ssl'
    option server_name '_redirect2ssl'
    option return '302 https://$host$request_uri'
    list listen '80 default_server'
    list listen '[::]:80 default_server'
​
config server 'default_server'
    option server_name 'openwrt/'
    list include 'conf.d/luci.locations'
    option access_log 'off; # logd openwrt'
    list listen '80'
    list listen '[::]:80'
​
config server 'nas_crowya_com_https'
    list listen '443 ssl http2'
    list listen '[::]:443 ssl http2'
    list listen '666 ssl http2'
    list listen '[::]:666 ssl http2'
    option server_name 'nas.crowya.com'
    list include 'conf.d/luci.locations'
    option ssl_certificate '/etc/ssl/acme/nas.crowya.com.fullchain.crt'
    option ssl_certificate_key '/etc/ssl/acme/nas.crowya.com.key'
    option ssl_session_cache 'shared:SSL:32k'
    option ssl_session_timeout '64m'
    option access_log 'off'
​
config server 'nas_crowya_com_http'
    list listen '80'
    list listen '[::]:80'
    option server_name 'nas.crowya.com'
    option return '301 https://$host$request_uri'
    option access_log 'off'
​
config server 'ts_nas_crowya_com_https'
    list listen '443 ssl'
    list listen '[::]:443 ssl'
    list listen '666 ssl'
    list listen '[::]:666 ssl'
    option server_name 'ts.nas.crowya.com'
    list include 'conf.d/ts.locations'
    option ssl_certificate '/etc/ssl/acme/*.nas.crowya.com.fullchain.crt'
    option ssl_certificate_key '/etc/ssl/acme/*.nas.crowya.com.key'
    option ssl_session_cache 'shared:SSL:32k'
    option ssl_session_timeout '64m'
    option access_log 'off'
​
config server 'ts_nas_crowya_com_http'
    list listen '80'
    list listen '[::]:80'
    option server_name 'ts.nas.crowya.com'
    option return '301 https://$host$request_uri'
    option access_log 'off'
​
config server 'ddns_nas_crowya_com_https'
    list listen '443 ssl'
    list listen '[::]:443 ssl'
    list listen '666 ssl'
    list listen '[::]:666 ssl'
    option server_name 'ddns.nas.crowya.com'
    list include 'conf.d/ddns.locations'
    option ssl_certificate '/etc/ssl/acme/*.nas.crowya.com.fullchain.crt'
    option ssl_certificate_key '/etc/ssl/acme/*.nas.crowya.com.key'
    option ssl_session_cache 'shared:SSL:32k'
    option ssl_session_timeout '64m'
    option access_log 'off'
​
config server 'ddns_nas_crowya_com_http'
    list listen '80'
    list listen '[::]:80'
    option server_name 'ddns.nas.crowya.com'
    option return '301 https://$host$request_uri'
    option access_log 'off'
​
config server 'lan_nas_crowya_com_https'
    list listen '443 ssl'
    list listen '[::]:443 ssl'
    list listen '666 ssl'
    list listen '[::]:666  ssl'
    option server_name 'lan.nas.crowya.com'
    list include 'conf.d/lan.locations'
    option ssl_certificate '/etc/ssl/acme/*.nas.crowya.com.fullchain.crt'
    option ssl_certificate_key '/etc/ssl/acme/*.nas.crowya.com.key'
    option ssl_session_cache 'shared:SSL:32k'
    option ssl_session_timeout '64m'
    option access_log 'off'
​
config server 'lan_nas_crowya_com_http'
    list listen '80'
    list listen '[::]:80'
    option server_name 'lan.nas.crowya.com'
    option return '301 https://$host$request_uri'
    option access_log 'off'
​
config server 'lanplus_nas_crowya_com_https'
    list listen '443 ssl'
    list listen '[::]:443 ssl'
    list listen '666 ssl'
    list listen '[::]:666  ssl'
    option server_name 'lanplus.nas.crowya.com'
    list include 'conf.d/lanplus.locations'
    option ssl_certificate '/etc/ssl/acme/*.nas.crowya.com.fullchain.crt'
    option ssl_certificate_key '/etc/ssl/acme/*.nas.crowya.com.key'
    option ssl_session_cache 'shared:SSL:32k'
    option ssl_session_timeout '64m'
    option access_log 'off'
​
config server 'lanplus_nas_crowya_com_http'
    list listen '80'
    list listen '[::]:80'
    option server_name 'lanplus.nas.crowya.com'
    option return '301 https://$host$request_uri'
    option access_log 'off'

/etc/nginx/conf.d路径存在以下文件:

  • ddns.locations
  • lan.locations
  • lanplus.locations
  • luci.locations
  • ts.locations

luci.locations文件内容:(包含了TR、MP、alist、clash和yacd的子目录反向代理)

location /cgi-bin/luci {
        index  index.html;
        include uwsgi_params;
        uwsgi_read_timeout 300s;
        uwsgi_param SERVER_ADDR $server_addr;
        uwsgi_modifier1 9;
        uwsgi_pass unix:////var/run/luci-webui.socket;
}
location ~ /cgi-bin/cgi-(backup|download|upload|exec) {
        include uwsgi_params;
        uwsgi_read_timeout 300s;
        uwsgi_param SERVER_ADDR $server_addr;
        uwsgi_modifier1 9;
        uwsgi_pass unix:////var/run/luci-cgi_io.socket;
}
​
location /luci-static {
        error_log stderr crit;
}
​
location /ubus {
        ubus_interpreter;
        ubus_socket_path /var/run/ubus/ubus.sock;
        ubus_parallel_req 2;
        ubus_script_timeout 600;
}
​
location /tr {
                proxy_pass http://192.168.1.102:9091;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
}
​
location /mp/ {
                proxy_pass http://192.168.1.102:3000/;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
}
​
location /alist/ {
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header Host $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header Range $http_range;
                proxy_set_header If-Range $http_if_range;
                proxy_redirect off;
                proxy_pass http://192.168.1.102:5244/alist/;
                client_max_body_size 20000m;
}
​
location /clash/ {
                proxy_pass http://192.168.1.201:9090/;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
}
​
location /yacd/ {
                proxy_pass http://192.168.1.201:9090/ui/yacd/;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
}

ddns.locations文件内容:(DDNS-GO子域名反向代理)

location / {
                proxy_pass http://192.168.1.201:9876;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
}

lan.locations文件内容:(电信网关子域名反向代理)

location / {
                proxy_pass http://192.168.1.1;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
}

lanplus.locations文件内容:(电信网关超级管理员页面子域名反向代理)

location / {
                proxy_pass http://192.168.1.1:8080;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
}

ts.locations文件内容已在子域名反向代理(以TaoSync为例)给出,此处不再赘述。

虚拟机

笔者使用频率较低,参考这篇教程即可:绿联NAS虚拟机安装Windows,打造辅助工作站 – 哔哩哔哩

主页导航

安装了这么多应用,如何快速管理呢?除了绿联自带的应用入口,还有一些docker应用是没有入口的,这里推荐一个浏览器主页插件iTab,可以很方便地进入应用后台管理页面,而且颜值极高,支持动态壁纸和小组件,图标数据云端同步,全平台通用。

1735446698657.png

不止是NAS应用,你常用的网站导航也可以单独做一个分类,通过右侧菜单或鼠标滚轮切换,而且所有图标都可以隐藏掉只剩一个搜索框,强迫症狂喜,不论是极简主义还是囤积患者都可以找到平衡。任何小伙伴没用过这个插件我都会伤心的,真的很好用自发推荐。

Honeycam 2024-12-29 12-15-24.webp

注:如果自动获取网站图标失败,可以手动去开发者工具箱找找图片,或者去iconfont-阿里巴巴矢量图标库搜搜看。

后记

这篇文章写的累死我了。。。

尤其是网上找不到教程被迫自己摸索的时候,无数次沮丧、失望、绝望、奔溃,那一刻我真的懂了没有可行性论证的前提下做事是多么困难多么艰辛,就像一旦有人验证过原子弹可行,你有了这个思想钢印,造原子弹就是信手拈来水到渠成的事情,但是对于未知的事情下定决心去做真的好难!好难!!好难!!!我动摇了无数次,每次遇到一点报错都要怀疑这条路是不是根本走不通或者硬件本身是不是不支持……幸好我的完美主义足够病入膏肓,这条路非行不可,这点要感谢我的偏执型人格,虽然平时很嫌弃她,但上头的时候还是很给力的……

从PT站看人性弱点

当你搭建完NAS的生产力环境、折腾完MoviePilot和影视库、通过了PT站新手考核,你就被PT站套牢了。

因为你不眠不休、日思夜想、熬夜折腾的这段时间和付出的心血,都是你的沉没成本。

这个时候如果有人发出一句灵魂拷问:这世上真的有什么资源是PT独有的吗?BT找不到吗?第三方播放器没有吗?

我沉默了。PT并不是独一无二的,但却是最矫情的。即便注册就要捐赠几百,即便一个月不登录就要被删号,即便刚入站就要经过一个月考核期,我还是爱她爱的死心塌地,每个月都坚持签到,这是为什么?如果把PT站拟人化,她不就是一个不断索取的公主病小仙女吗?

这时我才想起了那个不哭不闹、从来不向我提任何要求的BT。但是我怎么就,从来没有珍惜过她呢?我觉得她傻,好欺负,所以下完电影就删种……唉,人性呐,轻易得到的就不会珍惜。历经千辛万苦得到的,即使平平无奇,也不舍得丢掉。

PT的生态之所以如此完善,恐怕也是因为千千万万个被沉没成本套牢的用户,其中不乏一些优秀的开发者,用爱发电。

小提示:您还可以点击下方 [ 标签 ] 阅读相关文章。您可以通过 RSS 订阅本站文章更新,订阅地址:https://crowya.com/feed

评论

  1. Ginc
    Windows Edge
    山东省 联通/数据上网公共出口
    5 小时前
    2025-1-21 20:02:05

    绿联还是太年轻,系统还不是很完善,我选的威联通,跟群晖相比配置高很多,日常使用没有什么问题

    • 博主
      Ginc
      Windows Edge
      上海市卢湾区 电信
      2 小时前
      2025-1-21 22:43:01

      可能和入坑的时机也有关系,绿联的新系统在去年刚发售的时候确实拉跨了一阵子,下架之后回炉重造,可以说是销售事故了,然后紧接着一波密集更新,现在bug修的差不多了,我刚好是在它更新到稳定之后上的车,体验还不错。当然威联通也是很主流的牌子。这个市场越来越热闹了。

  2. Windows Firefox
    湖北省武汉市 电信
    9 小时前
    2025-1-21 15:56:28

    下一台NAS或许就是绿联,群辉这类老牌技术没问题,但不思进取,挤牙膏的做发,有点难啊,最近还将 Video Station 取消了。

发送评论 编辑评论

|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇