10月12, 2024

NAS迁移记录

之前一直在用的NAS是i5-6400的老台式机, 主板不支持NVME的固态导致系统装在机械硬盘里卡得很, 于是今年就趁着618换了一套配置升级了一下, 直到最近才抽空配置完全.

配置单

  • CPU: 12400散片 ¥795
  • 主板: 铭瑄终结者B760M D5 WiFi ¥799
  • 电源: 海韵FOCUS GX650金牌 ¥499
  • 硬盘: 樊想S790C 2T ¥699
  • 内存: 光威天策高级版D5 5200 16G*2 ¥459
  • 风扇: 利民TL-CL12CW-S *4 ¥93.3
  • 机箱: 射手座白 + 散热器 ¥478
  • 硬盘: 西数HC550 WUH721816ALE6L4 16T ¥1895
  • 显卡: 之前的750ti ¥0

总计 ¥5717.3

散热器是射手座店家推荐的同牌子散热器, 作为一个 NAS 机箱配套的散热器居然无法关掉 RGB 灯, 十分幽默.

最终整机待机功耗约60W.

NAS

系统

系统仍然选择了Windows Server 2022 配合 Docker Desktop 搭建服务, 这也为后续的服务部署埋下了不少坑.

初期遇到的唯一问题是 Docker Desktop 无法做到开机不登录自启, 只能通过下载第三方软件注册服务解决. 不过NAS毕竟常年不关机, 就算重启了用 RDP 登录一下即可.

系统激活命令如下:

irm https://get.activated.win | iex

服务

服务大部分是用 Docker Compose 部署的, 通过 nginx 反向代理使用不同域名访问.

Docker Desktop

存储 - SMB

没组 RAID, 直接 Windows 自带的 SMB, 右键 - 属性 - 共享, 没什么好说的.

照片 - immich

immich 里的机器学习在 Windows 下报错, 没继续搞了, 直接用 cpu 版.

https://github.com/immich-app/immich

https://immich.app/docs/install/docker-compose

智能家居 - HomeAssistant

主要用于将手里的米家设备接入到苹果家庭中. HomeAssistant 在原来的 NAS 上是运行在 hyper-v 中的, 这次迁移 NAS 本想着全部用 Docker 完成, 但配置过程中发现苹果家庭将 HomeAssistant 中的桥接器添加到家庭时会发送一个广播, 而 Windows 上的 Docker Desktop 的网络模式不支持 host 模式, 所以无法将设备接入苹果家庭, 只能用回 hyper-v 版本.

https://www.home-assistant.io/installation/linux

https://github.com/al-one/hass-xiaomi-miot

自动化 - n8n

搭好了, 还没研究怎么用.

https://github.com/n8n-io/n8n

https://sspai.com/prime/story/automation-n8n

Git - Gitea

同样碰到了只有 Windows 下才有的坑. Git 服务运行在容器中时, 若想使用 SSH 的标准 22 端口, 则需要配置一个宿主机与容器之间的 SSH 直通, 这样当客户端通过 git 命令访问服务(如 git clone git@git.nas.zireaels.com:Zireael/repo.git)时, 可以访问到位于容器内的 SSH. 但很可惜, 我们的宿主机是 Windows 系统, 无法通过虚假的 SSH shell 等方式直通容器, 所以只能另辟蹊径, 放弃标准的 22 端口, 在 Docker Compose 配置文件中将容器内的 22 端口映射到宿主机上的 222 端口, 然后以修改 ~/.ssh/config 的方式做到客户端无感.

Host git.nas.zireaels.com
  HostName git.nas.zireaels.com
  User git
  Port 222

https://docs.gitea.cn/en-us/installation/install-with-docker

视频 - Jellyfin

在 Windows Docker 下, Jellyfin 只支持 NVENC 解码. 有一个视频丢帧的问题一直没有解决.

https://jellyfin.org/downloads/docker/

下载 - qBittorrent

安装在 Winserver 宿主机上, 用 nginx 反向代理出来.

https://www.qbittorrent.org/download

网络

网络方面是这次 NAS 迁移关注的重点, 需求主要有以下几个:

  1. 避免 ip:port 式访问 NAS 中的服务;
  2. 内网穿透;
  3. 内外网切换时客户端无感, 即对于内外网环境使用同一地址访问服务, 且内网访问走内网流量, 外网访问走外网流量.
  4. https

通过域名访问服务

第一条的实现比较简单, 直接在软路由 dnsmasq 中添加一条dns解析规则, 再通过 nginx 反向代理即可.

内网穿透

内网穿透部分由于之前使用的 frp 将服务暴露在公网且仅使用 token 验证的方法过于不安全, 之前也因此受到攻击, 所以这次换用了 wireguard. 在服务器与软路由上分别配置好后就可经由服务器的流量访问内网服务.

客户端无感

第一条中提到了在软路由中添加一条 dns 解析规则实现域名访问, 但在选用了 wireguard 作为内网穿透的方案后, 这种本地 dns 解析的方案需要将 dns 服务器设置为内网软路由, 将 dns 解析的流量经由 wireguard 发往内网的 dns 服务器. 所以换用了公网 dns 解析的方案, 将域名 nas.zireaels.com 和 *.nas.zireaels.com 解析到了内网 ip.

https证书

沿用服务器上的 Let's Encrypt 免费证书方案, 使用 certbot 申请更新证书, 并将证书路径添加到 nginx 配置文件中.

使用 Docker + crontab 的方式定时更新. 注意 WSL 需要开启 cron 服务, 在 /etc/wsl.conf 中添加以下内容即可自动启动:

[boot]
command="service cron start"

在 crontab 中添加以下条目, 每10天更新一次证书:

0 6 */10 * * docker compose -f /e/Zireael-NAS/Services/certbot/docker-compose.yml up && docker exec nginx nginx -s reload && docker compose -f /e/Zireael-NAS/Services/certbot/docker-compose.yml down

certbot 需要验证域名所有权, 由于我的域名是腾讯云购买解析的, 所以需要安装 certbot 的腾讯云插件:

FROM certbot/certbot
RUN pip install certbot-dns-tencentcloud

Docker Compose 配置文件如下, 第一次申请证书时 entrypoint 为 certbot certonly ... 命令, 后续交由 crontab 自动更新时将 entrypoint 更改为 certbot renew --force-renewal

services:
  certbot:
    image: certbot-tencent
    container_name: certbot
    env_file:
      - .env
    # entrypoint: "certbot certonly --non-interactive --agree-tos --force-renewal --email your@email.com -a dns-tencentcloud -d '*.yourdomain.com'"
    entrypoint: "certbot renew --force-renewal"
    volumes:
      - /your/path/to/save/certifications/letsencrypt:/etc/letsencrypt

本文链接:http://blog.zireaels.com/post/nas.html

-- EOF --

Comments