你的下一台 NAS,何必是 NAS

引言

早在 2022 年我折腾 Linux 的时候 ,当时就提到了整 NAS 不一定为系统买单

如今在服务器的折腾,云盘挂载的速度实在不尽人意,在冲动下,我下单了 N5095 主板,考虑到我手头上有 4G 内存条有点低,但又不是很想再徒增花费,于是我再次开启折腾之旅

技术选型

首先是系统,在这个低配置下,那当然是使用最轻量的 Alpine Linux 了

然后是如何安装,为了和 WEPE 兼容,使用 Ventoy 做主引导安装系统

服务的部署使用 Docker 保证主机的干净以及再现性

使用的服务如下:

考虑过但未使用的服务如下:

文件架构

对于各个服务的位置,使用我一贯的风格,每个服务一个文件夹,放在 /home

对于 HDD 全部挂载在 /mnt 下,这是比较常见的挂载

通过 mount --bind 绑定挂载以实现将 HDD 上对应文件挂载到对应服务的位置

pic

系统安装

官网下载 Alpine Linux 后放入安装了 Ventoy 的 U 盘中,在主板 BIOS 设置从 U 盘开始引导进入 Ventoy 后,选择 Alpine Linux 并进行引导进入系统

等待加载完成后,登录用户 root,不用输入密码,登录完成后输入安装命令

1
setup-alpine

然后根据引导设置完成安装即可

官方文档: setup-alpine - Alpine Linux

公钥登录

编辑 NAS 相关配置文件 ~/.ssh/authorized_keys,创建配置文件夹

1
mkdir .ssh

进入文件夹

1
cd .ssh

加入自己的公钥

1
vi authorized_keys

自己的公钥在

1
%USERPROFILE%\.ssh

开启公钥登录

1
vi /etc/ssh/sshd_config

在第 41 行,将注释取消变为

1
PubkeyAuthentication yes

打开社区源

打开仓库文件

1
vi /etc/apk/repositories

把注释删掉变为

1
2
3
#/media/dm-0/apks
http://dl-cdn.alpinelinux.org/alpine/v3.22/main
http://dl-cdn.alpinelinux.org/alpine/v3.22/community

安装 Docker

更新软件

1
apk update

安装 Docker

1
apk add docker docker-cli-compose

配置开机启动

1
rc-update add docker default

启动 Docker

1
service docker start

查看是否启动

1
docker ps

添加 swap

因为服务器的镜像默认没 swap 我就添加了来着,但是之后发现默认是有添加的,可以根据需要选择是否添加

添加交换空间文件

1
fallocate -l 8G /swapfile

设置权限为只能 root 访问

1
chmod 600 /swapfile

格式化 swap

1
mkswap /swapfile

启用 swap

1
swapon /swapfile

查看是否生效

1
free -h

挂载硬盘

查看所有块设备

1
fdisk -l

安装 ntfs 支持

1
apk add ntfs-3g

创建挂载文件夹

1
mkdir /mnt/hc550

挂载

1
mount -t ntfs-3g /dev/sdc1 /mnt/hc550

卸载有两种方法,通过路径 (推荐)

1
umount /mnt/hc550

或者通过设备

1
umount /dev/sdc1

自动挂载

获取分区 id,避免重启后设备名变化

1
blkid

编辑 /etc/fstab

1
vi /etc/fstab

添加配置

1
2
# <设备UUID>   <挂载点>  <文件系统>  <选项>                   <dump> <pass>
UUID=xxxxxxxx /mnt/hc550 ntfs-3g    defaults,uid=1000,gid=1000 0 0

测试是否成功,先卸载

1
umount /dev/sdc1

挂载全部,会自动查找配置

1
mount -a

检测是否成功

1
ls /mnt/hc550

SMB 共享

使用 Samba 共享可以将硬盘挂载到 Windows 像操作本地硬盘一样操作文件

/home/samba 创建 docker 配置文件 docker-compose.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
version: '3.1'
services:
  samba:
    image: 'ghcr.io/crazy-max/samba:latest'
    container_name: samba
    network_mode: host
    volumes:
      - '/home/samba/data:/data'
      - '/mnt/hdd4t:/mount/hdd4t'
      - '/mnt/hc550:/mount/hc550'
    environment:
      - 'TZ=Japan/Tokyo'
      - 'SAMBA_LOG_LEVEL=0'
    restart: always

编辑软件配置文件 config.yml

 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
30
31
32
auth:
  - user: yexca
    group: yexca
    uid: 1000
    gid: 1000
    password: passwd

global:
  - "force user = yexca"
  - "force group = yexca"

share:
  - name: HDD4TB
    comment: hdd4t
    path: /mount/hdd4t
    browsable: yes
    readonly: no
    guestok: no
    veto: no
    validusers: yexca
    writelist: yexca
    recycle: yes
  - name: HC550
    comment: hc550
    path: /mount/hc550
    browsable: yes
    readonly: no
    guestok: no
    veto: no
    validusers: yexca
    writelist: yexca
    recycle: yes

Windows 挂载为硬盘

按 Win + R 打开 cmd,输入命令

1
net use Z: \\alpine-nas\HDD4TB /user:yexca passwd /persistent:yes

刷新资源管理器

1
explorer.exe Z:

或者可以通过资源管理器可视化添加

绑定挂载

相较于软链接 (Symbolic Link),绑定挂载 (Bind Mount) 可以兼容 docker

1
mount --bind /mnt/hc550/anime /anime

开机自动绑定挂载需要写入 /etc/fstab,必须在挂载的下方 (因为文件顺序执行)

1
2
/mnt/hc550/anime   /tmp/anime   none   bind   0 0
/mnt/hc550/comic   /tmp/comic   none   bind   0 0

验证

1
df -h

其他服务

对于其他服务,我之前的文章感觉已经写过不少了,不再赘述

相关文章:

2025-10-05: 漫画与音声网站折腾

2023-05-02: 搭建个人音乐网站

2022-09-16: 个人内网折腾

2022-09-14: Fedora 安装 Komga 折腾记录

自定义域名

这里使用 OpenWRT 路由器的 DNS 拦截实现访问特定域名,从而进入自己 NAS 服务

要求是设备的 DNS 服务器是路由器,然后在路由器的 DHCP/DNS 设置里为 NAS 分配静态地址,再添加挟持域名,都指向 NAS 的 IP 地址

Nginx-UI

为了让自定义域名生效,需要使用 Nginx 反向代理 NAS 上的服务

Docker Compose 配置文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
version: '3.1' 
services: 
  nginx-ui:
    image: uozi/nginx-ui:v2.2.0-patch.1
    container_name: nginx_UI
    volumes:
      - /home/nginxUI/nginx:/etc/nginx
      - /home/nginxUI/nginx-ui:/etc/nginx-ui
      - /home/nginxUI/www:/www
    environment:
      - NGINX_UI_IGNORE_DOCKER_SOCKET=true
    ports:
      - 80:80
      - 443:443
    restart: always

容器访问另一个容器的网桥 IP 为 172.17.0.1

假如有一个服务是映射到主机的 8888 端口,添加反向代理时候,代理的地址不是 127.0.0.1:8888 而是 172.17.0.1:8888

关于为什么设置环境变量参见: 2025 新服务器部署记录#安装-nginx-ui

结语

我感觉也算是实现了 2022 年的我说的那些话吧

同时感觉短短三年的时间,虽然我主观上是觉得自己没有什么变化的,可是在阅读自己以前的文章的时候,回忆当时写下那些文字的处境,确确实实感受到了自己的思考方式发生了天翻地覆的变化

当时的我说实话好像是想着使用 True NAS 之类的特化系统,但是没想到我真的实现的时候,使用了以前的我想都不敢想的从零开始,一点点看着自己之前的文章,组成这段,可以说真切感受到了 “价值”

折腾不息,热爱不止

yexca-261