由于家里设备及服务较多,网络较为复杂,很难记住所有细节,容易造成服务中断。因此考虑整理成文档的形式进行保存。

网络

目前家庭网络根据物理层不同,大致分为四种:有线局域网(lan)/无线局域网(wlan)/蓝牙Mesh/Zigbee。

局域网

家庭局域网使用 ASUS AC86U 作为入户网关,前置电信&联通光猫。其中电信200Mbps/联通100Mbps。

路由器上设置双线接入,电信作为主宽带,使用PPPoE拨号,并带有动态公网IP,支持IPv6;联通使用DHCP模式。双宽带做2:1负载均衡,总下行带宽可跑满300Mbps。

网关

必备功能:

  • 双线双拨:用于支持双线接入
  • VPN:用于外部连接内网
    • Instant Guard:可以使用 AUSU Router APP 一键接入。
    • IPSec:手机配之后直接接入
    • ~~ ZeroTier:就是个垃圾,连接实在太慢了,已经删除。~~
  • 阿里DDNS:由于我的域名阿里和腾讯都有,但阿里的API做的实在是太好了,就用阿里的了
  • Let’s Encrypt:帮我保证回家网址具备HTTPS。
  • Clash:华硕路由器上Clash用着还算稳定,仅提供以下设备代理:
    • NAS/手机/iPad/机顶盒/电视机

有线局域网

鉴于有线实在是太香了,家里能连网线的设备都连了网线。目前在弱电箱有一个总交换机,用于解决路由器LAN口不够的问题,另外在电视柜这边有一个电视柜交换机,给电视机/机顶盒/NAS提供有线网络。

无线局域网

目前无线局域网提供了 2.4G/5G 两种模式,WIFI6由于设备不多,暂未升级。

2.4G目前还是比较重要的,几乎所有IoT都仅支持2.4G,目前由于怕麻烦暂时没做网络隔离。

目前卧室的无线网稍微有些差,后续寻找解决方案。

蓝牙Mesh

蓝牙Mesh主要为一系列 IoT 设备服务。蓝牙技术目前能覆盖Zigbee所有功能,因为所有商家都在主推蓝牙连接。

蓝牙Mesh: 卧室:小米米家智能闹钟 客厅:小米开关/小米音箱Play增强版

Zigbee网络

目前家里Zigbee网关仅有绿米网关2,下辖。。。人体感应器 * 1

NAS

NAS 是买的二手蜗牛星际,300块,真香。 虽然叫NAS,但实际上并没有对存储做特殊处理,并且安装的还是Manjaro系统,方便滚动升级。

其中的服务大概就这么些:

  • 存储
    • avahi
    • netatalk
    • smb
  • 下载
    • aria2
    • transmission
  • 网页服务
    • caddy
    • ariang
    • flood
    • 自制服务聚合网站
  • 内容服务
    • plex media server
  • 应用及管理
    • grafana
    • vncserver
    • sshd

NAS上的服务已经比我之前独居时少多了,那时候还有AirPlay和HomeAssisant

硬盘挂载: 当然是fstab自动挂载咯

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a device; this may
# be used with UUID= as a more robust way to name devices that works even if
# disks are added and removed. See fstab(5).
#
# <file system>             <mount point>  <type>  <options>  <dump>  <pass>
UUID=D05C-FA8F                            /boot/efi      vfat    umask=0077 0 2
UUID=7f289ccb-bad6-402f-b671-b6a5426b1586 /              ext4    defaults,noatime,discard 0 1
tmpfs                                     /tmp           tmpfs   defaults,noatime,mode=1777 0 0
UUID=2e398f6e-9ec6-4661-b7cc-cb88f09ff41b /storage  ext4    defaults,noatime,discard 0 0
UUID=dd85e415-35c5-4b3f-851b-ca1bb940f6df /treasure  ext4    defaults,noatime,discard 0 0

存储

既然都叫NAS了,那就从存储说起。

SMB

必备功能,不用多说了吧。

配置位于 /etc/samba/smb.conf

我的配置较为简单:

[global]
workgroup = WORKGROUP
netbios name = MorningServerSmb
server string = MorningServer SMB
security = user
server max protocol = SMB3_11
server min protocol = NT1
server multi channel support = yes
[storage]
path = /storage
writeable = yes
browseable = yes
[treasure]
path = /treasure
writeable = yes
browseable = yes

create mask = 0777
#客户端上传文件的默认权限
directory mask = 0777
#客户端创建目录的默认权限

Avahi

Avahi是一个mDNS服务,多播DNS,主要用于局域网内组播DNS信息的作用。

Netatalk

用于提供 AFP 服务。这是一项古老的苹果协议,AppleTalk 是由 Apple 公司推出的一种多层协议,支持网络路由选择、事务服务、数据流服务以及域名服务,并且通过 Apple 硬件中的 LocalTalk 接口全面实现 Apple 系统间的文件和打印共享服务

当前的兼容性主要为:

  1. Mac OS X v10.4及之后版本取消了依赖AppleTalk进行通信的AFP服务。
  2. 使用经典Mac OS的计算机可以连接到AFP 3.x服务,但有一些限制,例如:Mac OS 8中的最大文件大小为2吉字节。通常来说,Mac OS 9.1或更高版本建议连接到AFP 3.x服务;对9.1版之前的原始Mac OS版本,需要安装AppleShare客户端3.8.8版。
  3. 网络主目录需要AFP 3.0及更高版本,从Mac OS X需要用户主目录上的POSIX权限开始。使用Kerberos的单点登录需要AFP 3.1。
  4. APFS:AFP目前在苹果文件系统(APFS)中已弃用。

— WikiPadia

当然我们在NAS上仍然支持这项古老的服务主要是为了macOS 提供 TimeMachine 备份,需提供至少1.5倍的电脑硬盘容量用于备份,对我目前的macbook pro来说就是 512GBytes * 1.5。

配置位于 /etc/afp.conf

[Global]
mimic model = TimeCapsule6,106 #这个是指定让机器在你Mac系统中显示为什么的图标,这儿显示成TM
log level = default:warn
log file = /var/log/afpd.log
hosts allow = 192.168.31.0/24 #允许访问的主机地址
hostname = MorningServer #主机名,随你喜欢
uam list = uams_dhx.so uams_dhx2.so #认证方式,这玩意我是不太懂,懒得折腾了

[Storage]
path = /storage 
rwlist = morningtzh
force user = morningtzh

[Treasure]
path = /treasure 
rwlist = morningtzh
force user = morningtzh

[PlashSpeed]
path = /plashspeed   
rwlist = morningtzh
force user = morningtzh


[TimeMachine]
path = /treasure/TimeMachine #数据目录
time machine = yes #yes才支持TimeMachine
spotlight = no #关闭spotlight索引,这个在Centos6上是不能开的,缺依赖,7上面可以开,但是不建议,吃资源
rwlist = morningtzh #指定某用户有读写权限
force user = morningtzh #强制指定用户
 vol size limit = 700000 #限制TM存储容量,单位为MB。

下载

下载就比较简单了,一个是经典的 aria2,支持rpc远程调用,另一个是transmission,用于bt下载。

Aria2

目前我暂时美告成 systemd 服务,懒得写,用的也不多,调用命令:

aria2c --conf-path=/storage/.aria2/aria2.conf -D

配置:

## '#'开头为注释内容, 选项都有相应的注释说明, 根据需要修改 ##
## 被注释的选项填写的是默认值, 建议在需要修改时再取消注释  ##

## 进度保存相关 ##

# 从会话文件中读取下载任务
input-file=/storage/.aria2/aria2.session
# 在Aria2退出时保存`错误/未完成`的下载任务到会话文件
save-session=/storage/.aria2/aria2.session
# 定时保存会话, 0为退出时才保存, 需1.16.1以上版本, 默认:0
save-session-interval=60

## 文件保存相关 ##

# 文件的保存路径, 默认: 当前启动位置
dir=/storage/downloads
# 启用磁盘缓存, 0为禁用缓存, 需1.16以上版本, 默认:16M
disk-cache=32M
# 文件预分配方式, 能有效降低磁盘碎片, 默认:prealloc
# 预分配所需时间: none < falloc ? trunc < prealloc
# falloc和trunc则需要文件系统和内核支持
# NTFS建议使用falloc, EXT3/4建议trunc, MAC 下需要注释此项
file-allocation=trunc
# 断点续传
continue=true

## 下载连接相关 ##

# 最大同时下载任务数, 运行时可修改, 默认:5
max-concurrent-downloads=5
# 同一服务器连接数, 添加时可指定, 默认:1
max-connection-per-server=5
# 最小文件分片大小, 添加时可指定, 取值范围1M -1024M, 默认:20M
# 假定size=10M, 文件为20MiB 则使用两个来源下载; 文件为15MiB 则使用一个来源下载
min-split-size=10M
# 单个任务最大线程数, 添加时可指定, 默认:5
split=15
# 整体下载速度限制, 运行时可修改, 默认:0
max-overall-download-limit=0
# 单个任务下载速度限制, 默认:0
max-download-limit=0
# 整体上传速度限制, 运行时可修改, 默认:0
max-overall-upload-limit=0
# 单个任务上传速度限制, 默认:0
max-upload-limit=0
# 禁用IPv6, 默认:false
#disable-ipv6=true
# 连接超时时间, 默认:60
timeout=60
# 最大重试次数, 设置为0表示不限制重试次数, 默认:5
max-tries=5
# 设置重试等待的秒数, 默认:0
retry-wait=0

## RPC相关设置 ##

# 启用RPC, 默认:false
enable-rpc=true
# 允许所有来源, 默认:false
rpc-allow-origin-all=true
# 允许非外部访问, 默认:false
rpc-listen-all=true
# 事件轮询方式, 取值:[epoll, kqueue, port, poll, select], 不同系统默认值不同
event-poll=epoll
# RPC监听端口, 端口被占用时可以修改, 默认:6800
rpc-listen-port=6800
# 设置的RPC授权令牌, v1.18.4新增功能, 取代 --rpc-user 和 --rpc-passwd 选项
#rpc-secret=<TOKEN>
# 设置的RPC访问用户名, 此选项新版已废弃, 建议改用 --rpc-secret 选项
#rpc-user=<USER>
# 设置的RPC访问密码, 此选项新版已废弃, 建议改用 --rpc-secret 选项
#rpc-passwd=<PASSWD>
# 是否启用 RPC 服务的 SSL/TLS 加密,
# 启用加密后 RPC 服务需要使用 https 或者 wss 协议连接
#rpc-secure=true
# 在 RPC 服务中启用 SSL/TLS 加密时的证书文件,
# 使用 PEM 格式时,您必须通过 --rpc-private-key 指定私钥
#rpc-certificate=/path/to/certificate.pem
# 在 RPC 服务中启用 SSL/TLS 加密时的私钥文件
#rpc-private-key=/path/to/certificate.key

## BT/PT下载相关 ##

# 当下载的是一个种子(以.torrent结尾)时, 自动开始BT任务, 默认:true
follow-torrent=true
# BT监听端口, 当端口被屏蔽时使用, 默认:6881-6999
listen-port=51413
# 单个种子最大连接数, 默认:55
#bt-max-peers=55
# 打开DHT功能, PT需要禁用, 默认:true
enable-dht=true
# 打开IPv6 DHT功能, PT需要禁用
#enable-dht6=false
# DHT网络监听端口, 默认:6881-6999
#dht-listen-port=6881-6999
# 本地节点查找, PT需要禁用, 默认:false
#bt-enable-lpd=false
# 种子交换, PT需要禁用, 默认:true
enable-peer-exchange=false
# 每个种子限速, 对少种的PT很有用, 默认:50K
#bt-request-peer-speed-limit=50K
# 客户端伪装, PT需要
peer-id-prefix=-TR2770-
user-agent=Transmission/2.77
# 当种子的分享率达到这个数时, 自动停止做种, 0为一直做种, 默认:1.0
seed-ratio=1.0
# 强制保存会话, 即使任务已经完成, 默认:false
# 较新的版本开启后会在任务完成后依然保留.aria2文件
#force-save=false
# BT校验相关, 默认:true
bt-hash-check-seed=true
# 继续之前的BT任务时, 无需再次校验, 默认:false
bt-seed-unverified=true
# 保存磁力链接元数据为种子文件(.torrent文件), 默认:false
bt-save-metadata=true

aria2 虽然里面配置了bt,但并不会使用,因为有transmission在。另外还有aria2gui,会在网页服务中讲。

Transmission

BT下载器,目前是3.0,最近升级丢失了好多配置信息,之前一直保活的种子也没了,好气。

新版本增加了rpc白名单,转为root用户到配置下去关掉即可,其他倒也没什么要配置的。

配置位于:/var/lib/transmission/.config/transmission-daemon/settings.json

详细配置见ArchWiki:Transmission

网页服务

作为一个Server自然是要有一些网页服务的。主要是针对Caddy的配置。

Caddy 是一款轻量级的网页服务器,他比较特别的功能是可以自动从 Let’s Encrypt 更新域名证书,当然针对内网的管理页面就不用了。

主要提供了:

  • 网页服务
  • 代理
  • php
    • phpmyadmin

ariang和flood分别是aria2和transmission的前端,非常简单好用。

配置位于/etc/caddy/Caddyfile,需要注意,此处是caddy2

# The Caddyfile is an easy way to configure your Caddy web server.
#
# https://caddyserver.com/docs/caddyfile
#
# The configuration below serves a welcome page over HTTP on port 80.
# To use your own domain name (with automatic HTTPS), first make
# sure your domain's A/AAAA DNS records are properly pointed to
# this machine's public IP, then replace the line below with your
# domain name.
#
# https://caddyserver.com/docs/caddyfile/concepts#addresses

{
	# Restrict the admin interface to a local unix file socket whose directory
	# is restricted to caddy:caddy. By default the TCP socket allows arbitrary
	# modification for any process and user that has access to the local
	# interface. If admin over TCP is turned on one should make sure
	# implications are well understood.
	#admin "unix//run/caddy/admin.socket"
	debug
}


http://, home.gangjing.online {
	# Set this path to your site's directory.
	#root /index.html /storage/wwwroot/index.html

	# Enable the static file server.
	root * /storage/wwwroot/morninghome/build
	file_server
	# Another common task is to set up a reverse proxy:
	# reverse_proxy localhost:8080

	# Or serve a PHP site through php-fpm:
	# php_fastcgi localhost:9000

	# Refer to the directive documentation for more options.
	# https://caddyserver.com/docs/caddyfile/directives

	file_server /ariang/* {
		root /storage/wwwroot/
		index index.html
	}

	file_server /media/* {
		root /storage/
		browse
	}

	file_server /downloads/* {
		root /storage/
		browse
	}

	file_server /storage/* {
		root /
		browse
	}

	file_server /treasure/* {
		root /
		browse
	}

	reverse_proxy /grafana/* 127.0.0.1:10198

	reverse_proxy /flood/* 127.0.0.1:10199

	php_fastcgi /phpmyadmin/*  unix//run/php-fpm/php-fpm.sock
}

# Import additional caddy config files in /etc/caddy/conf.d/
#import ./caddy.conf

自制聚合网站

我自己写的,当然要有一章说明啦。其实很简单,用react+antd搭了一个架子,针对内网各个网址都做了一次iframe,再来一个href可以跳转到相应网站。 image.png

IoT

我得把家里所有IoT列出来,自动化策略主要会在后面的解决方案部分。

当前设备

位置设备名称网络类型网关型号
客厅鱼缸WIFI/蓝牙蓝牙网关chuangmi.plug.212a01
客厅Aqara网关WIFI/ZigbeeZigbee网关lumi.gateway.aqhm01
客厅小爱音箱WIFI/蓝牙蓝牙Mesh网关xiaomi.wifispeaker.l05c
房间闹钟WIFI/蓝牙蓝牙Mesh网关zimi.clock.myk01
客厅Aqara Motion SensorZigbeelumi.sensor_motion.aq2
房间台灯蓝牙yeelink.light.mbulb3
书房台灯蓝牙yeelink.light.mbulb3
客厅筒灯中蓝牙yeelink.light.ml1
客厅筒灯左蓝牙yeelink.light.ml1
客厅筒灯右蓝牙yeelink.light.ml1
房间夜灯蓝牙yeelink.light.nl1
门口蓝牙loock.lock.cc2s
房间主灯蓝牙lemesh.light.wy0c07
房间风扇WIFIdmaker.fan.p10
客厅摄像机WIFImijia.camera.v3
房间空调WIFIlumi.acpartner.mcn02
门口门铃WIFImadv.cateye.miowlv2l
书房空调WIFIlumi.acpartner.mcn02
房间电暖器WIFIleshow.heater.bs1s
客厅风扇WIFIdmaker.fan.p10
厨房净水器WIFIyunmi.waterpuri.lx3
房间蚊香蓝牙zimi.mosq.v1
客厅蚊香蓝牙zimi.mosq.v1
客厅米家蓝牙温湿度计蓝牙cleargrass.sensor_ht.dk1
客厅电视WIFImiir.tv.ir01
房间房间温湿度Zigbeelumi.sensor_ht.v1