零刻 Me mini安装黑群晖+洗白+内网穿透

1. 安装黑群晖:

  • 安装好所有的SSD,我安装了6块 Kingston NV3 1TB M.2 NVMe Internal SSD

  • 安装阶段要接个外接显示器,还需要接个键盘

Note:
如果你之前安装过很多次,并失败了,才看到这篇文章,需要先进memini的默认系统(我的Ubuntu系统),使用如下命令,把这些磁盘重新reset,来去除以前的安装残留。
进入Ubuntu系统的终端软件:

    1. 停掉并删除旧的 md 阵列
      mdadm --stop --scan
      mdadm --zero-superblock /dev/nvme0n1 /dev/nvme1n1 /dev/nvme2n1 /dev/nvme3n1 /dev/nvme4n1 /dev/nvme5n1 2>/dev/null
    1. 删除每块盘的分区表(仅 NVMe,不动 U 盘)
      1
      2
      3
      4
      5
      >for i in /dev/nvme[0-5]n1; do
      echo "Cleaning $i"
      dd if=/dev/zero of=$i bs=1M count=20
      >done
      >sync

按照这个文档的内容 ,先做个启动盘,其它内容也可以顺便做参考

  • 然后插入启动盘

  • 启动的时候按ESC 进Bios(启动的时候按F7可以选择启动盘):
    在UEFI Hard Disk Drive BBS priorities中
    第一启动项设置成:UEFI OS (SanDisk Cruzer)
    第二启动项:Ubuntu

  • me mini 我选择使用 SA6400 系统,安装是成功的

  • 我的SSD 是 Kingston NV3 1TB M.2 NVMe Internal SSD ,所以需要额外选择如下插件:
    插件选择

  • 对于零刻me mini,Advanced option 中需要检查如下三项的值是否是对应的值, 如果不是可以按回车修改:
    LKM version: prod
    Switch direct boot : true
    Use EMMC as the system disk : false

其它按照上面的文档做就可以。

2. 关于洗白:

  • 如果有淘宝买的洗白码(10元以内),可以这个时候选择Cmdline menu, 然后输入自己的SN和两个MAC,当然安装完成之后再去输入也行。

  • 如果想让Advanced Media Extensions 套件支持AVC 和 VC1 解码,请看如下资源:

    洗白教程

从这之后,就你的零刻me mini nas 就可以不用接显示器和键盘了,用电脑登陆群晖管理页面就可以了

3. 关于内网穿透

所谓内网穿透,也就是让外部(互联网)能够访问到位于内网中的服务或设备的一种技术手段。

  • 访问 https://test-ipv6.com 来看看是有ipv6 还是 ipv4,我只有公网ipv4

  • 在路由器设置端口转发,也就是DSM 5001 的端口请求转发到memini(192.168.1.29)的5001 处理
    我用的Orbi路由器:

  1. 访问 http://192.168.1.1 → Advanced → Advanced Setup → Port Forwarding/Port Triggering → Add Custom Service

端口转发

这个时候会列出所有内部在线设备名让你选择,memini就是零刻nas。

  1. 添加规则:
    Service Name: DSM
    External Port: 5001
    Internal IP: (你的 NAS 内网 IP,比如 192.168.1.29)
    Internal Port: 5001
    Protocol: TCP

完成后,就可以用 https://<你的公网IPv4>:5001 来访问你的群晖登录页面了。

4. 如何使用域名访问:

  1. 在DuckDNS中申请免费域名(如果没有),复制保存自己的token到记事本之类
    duckdns

  2. 打开 DSM → 控制面板 → 外部访问 → DDNS → 新增

服务商选择 custom

输入:
服务提供商:: www.duckdns.org
Query URL: https://www.duckdns.org/update?domains=你的域名&token=你的TOKEN&ip=__你的公网IPv4__
email 就是你注册duckdns 用的email
password 我就复制了token,好像无所谓
测试一下连接,应该是normal 就对了。

  1. 现在就可以用手机5G的情况下用域名访问了: https://frankxu.duckdns.org:5001

5. 如何给域名申请免费HTTPS证书,这样在访问的时候就没有“不安全连接”小锁🔒了。

  1. 打开 DSM → 控制面板 → 安全性 → 证书 (Security → Certificate)
    选择“新增”
    选择:Add a new certificate → Get a certificate from Let’s Encrypt

  2. 填写如下信息:

项目 填写内容
域名 (Domain name) frankxu.duckdns.org
邮箱 (Email) 你的常用邮箱
备用域名 (Subject Alternative Name) 留空即可

点击应用(Apply),可能需要等一下,最后是这样的:
证书

  1. 注意:端口 80(HTTP)在路由器上也要能访问 NAS,否则 Let’s Encrypt 无法验证域名所有权。
    所以需要在无线路由器增加80端口的转发(我的memini的内网ip是:192.168.1.29):
Service Name External Port Internal Port IP Protocol
HTTP 80 80 192.168.1.29 TCP

6. 如何使用域名访问DSM 和 Synology photo子路径,而不输入端口号(比如:https://frankxu.duckdns.org/photo https://frankxu.duckdns.org):

关于安装Synology photo 套件,并配置端口号就很简单了,不在这里赘述。

  1. 在路由器增加 port forwarding:
    443 的 端口转发,转发到 零刻 memini的内网ip
    删掉之前的5001的端口转发,因为我们不打算输入端口了。
    如果之前配置了5443的photo端口转发,也要删掉了。
    不需要配置Http端口的转发,如果我们只使用更安全的Https

  2. 到这里你的路由器的转发规则大概是这样的 (22端口是SSH,可以不用, 80端口是证书, 443 是 免端口输入的转发):
    portforwarding

  3. ssh到你的memini nas修改nginx.conf

  • 首先:
    sudo -i

  • 备份:
    cp -a /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak.$(date +%F-%H%M%S)

  • 编辑:
    vi /etc/nginx/nginx.conf

  • 找到/listen 443 default_server ssl 也就是监听 443 的 server {}
    在server里面,其他 location 之后,加入下面这一段(因为Synology Photos套件的端口我设置的是5443)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    location ^~ /photo {
    proxy_pass https://127.0.0.1:5443;
    proxy_http_version 1.1;
    proxy_read_timeout 300;

    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_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    proxy_ssl_server_name on;
    proxy_ssl_verify off;
    }

    将如下这段:

    1
    2
    3
    4
    5
    location / {
    root /var/tmp/nginx/html;
    add_header Cache-Control 'no-cache';
    rewrite (.*) /redirect.html break;
    }

替换成如下,因不能有两个location / 配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
location = /redirect.html {
root /var/tmp/nginx/html;
add_header Cache-Control 'no-cache';
}

location / {
proxy_pass https://127.0.0.1:5001;
proxy_http_version 1.1;
proxy_read_timeout 300;

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_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;

proxy_ssl_server_name on;
proxy_ssl_verify off;

proxy_redirect ~^https?://([^/]+):5001(/.*)$ https://$host$2;
}
  • 重启ngix
    nginx -t && nginx -s reload

  • 将System default / 默认证书 选择成你生成的域名证书
    选择证书

最后,你现在就能:
https://你的域名 → 应直接进入 DSM

https://你的域名/photo → Photos 正常

我没有使用DSM里面的反向代理来配置443 到 localhost 5001 到规则,原因是 443 将来还要被其它子类用到,比如audio,photo,如果都想从公网443直接转到各自的端口,目前在反向代理中只能配一条443的,目前无解,哪怕是不同的域名。

6. 如何防止重启后/etc/nginx/nginx.conf 更新被覆盖

  • 首先ssh 到 me mini 主机

  • 然后:

sudo -i

  • 先备份当前系统文件(带时间戳,可回滚)
    cp -a /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak.$(date +%F-%H%M%S)

  • 创建模板目录
    mkdir -p /usr/local/etc

  • 复制一份作为模板(我们等会用它做“自修复”的源)
    cp -a /etc/nginx/nginx.conf /usr/local/etc/nginx.conf.custom

  • 验证一下模板已就位
    ls -l /usr/local/etc/nginx.conf.custom

  • 开机脚本

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
28
29
cat >/usr/local/etc/rc.d/zz-restore-nginx-proxy.sh <<'EOF'
#!/bin/sh
# Restore custom nginx.conf at boot (to keep reverse-proxy rules)

CONF="/etc/nginx/nginx.conf"
TEMPLATE="/usr/local/etc/nginx.conf.custom"
STAMP="$(date +%F-%H%M%S)"
BACKUP="/usr/local/etc/nginx.conf.stock.$STAMP"

# 只有当模板存在时才执行
if [ -f "$TEMPLATE" ]; then
# 备份当前由系统生成的 nginx.conf
cp -a "$CONF" "$BACKUP"

# 覆盖为我们的模板版本
cp -a "$TEMPLATE" "$CONF"

# 验证并重载;失败则回滚避免服务不可用
if nginx -t; then
nginx -s reload
else
echo "[restore-nginx] custom conf failed test, rolling back"
cp -a "$BACKUP" "$CONF"
nginx -t && nginx -s reload
fi
fi

exit 0
EOF
  • 赋予可执行权限
    chmod +x /usr/local/etc/rc.d/zz-restore-nginx-proxy.sh

  • 立即手动测试一次脚本(不必重启)
    /usr/local/etc/rc.d/zz-restore-nginx-proxy.sh

  • 如果你的配置因为重启丢了,请先安装 5 修改/etc/nginx/nginx.conf

比如:

  • Audio Station

    1
    2
    3
    4
    5
    6
    7
    location ^~ /audio {
    proxy_pass https://127.0.0.1:8801;
    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_ssl_verify off;
    }
  • 把“现在这份可用的配置nginx.conf”更新为模板(非常重要
    cp -a /etc/nginx/nginx.conf /usr/local/etc/nginx.conf.custom

  • 手动跑一次脚本验证覆盖与重载流程没问题
    /usr/local/etc/rc.d/zz-restore-nginx-proxy.sh

  • (可选)重启做持久性验证:开机后两个地址仍正常,说明以后就不会“丢配置”了。

6. 但是在手机app DS audio 里面配置的时候是不支持 公网域名/audio 这种方式滴

解决方案是再申请一个域名frankxu-audio

  • 在“自定义 DDNS 服务提供商”再建一个新条目,名字换成 DuckDNS-2(或任意)

把 Query URL 改成(完全照抄):

https://www.duckdns.org/update?domains=__HOSTNAME__&token=__PASSWORD__&ip=__MYIP__

  • 然后 新增一条 DDNS 记录:

Service Provider:你刚才保存的 DuckDNS-2

Hostname:frankxu-audio

邮箱:你的邮箱

Password/Key:填你的 DuckDNS token

确定后 Test Connection 应该显示 Normal

(保留你原来的 frankxu 那条;两个域名都能自动更新)

  • DSM 反向代理为 Audio Station 建规则

控制面板 → 登录门户 → 反向代理 → 创建

来源 (Source)

Protocol:HTTPS

Hostname:frankxu-audio.duckdns.org

Port:443

目的地 (Destination)

Protocol:HTTPS

Hostname:localhost

Port:8801

保存

  • 申请并分配证书

控制面板 → 安全性 → 证书

新增 → Get a certificate from Let’s Encrypt

域名:microxu-audio.duckdns.org

邮箱任填

成功后,点 设置 → 把 frankxu-audio.duckdns.org 这张证书指派给刚才的反向代理规则
选择audio转发域名证书

路由器端口转发保持:443→NAS(以及 80→NAS 便于 LE 续期)。不用开放 8801。

  • DS audio 填写方式

服务器:frankxu-audio.duckdns.org:443

勾选 HTTPS

账号/密码:你的 DSM 账户

好了,现在跟白群晖没有区别,开始你的表演吧……