你的下一台 NAS,何必是 NAS

📢 本文由 Gemini-2.5-pro 翻譯

引言

早在 2022 年我折騰 Linux 的時候(簡體中文) ,當時就提到了搞 NAS 不一定得為系統買單。

如今在伺服器的折騰中,雲端硬碟掛載的速度實在不盡人意,在衝動下,我下單了 N5095 主機板。考量到我手頭上的 4G 記憶體有點低,但又不是很想再徒增花費,於是我再次開啟了我的折騰之旅。

技術選型

首先是系統,在這個低配置下,那當然是使用最輕量的 Alpine Linux 了。

然後是如何安裝,為了和 WEPE 相容,使用 Ventoy 做主引導來安裝系統。

服務的部署使用 Docker 來保證主機的乾淨以及可重現性。

使用的服務如下:

考慮過但未使用的服務如下:

檔案架構

對於各個服務的位置,使用我一貫的風格,每個服務一個資料夾,放在 /home 下。

對於 HDD 全部掛載在 /mnt 下,這是比較常見的掛載方式。

透過 mount –bind 綁定掛載以實現將 HDD 上對應的檔案掛載到對應服務的位置。

pic

系統安裝

官網下載 Alpine Linux 後放入安裝了 Ventoy 的隨身碟中,在主機板 BIOS 設定從隨身碟開始引導,進入 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

(自己的公鑰在 %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

其他服務

對於其他服務,我之前的文章感覺已經寫過不少了,不再贅述。

相關文章(簡體中文):

自訂網域

這裡使用 OpenWRT 路由器的 DNS 攔截實現存取特定網域,從而進入自己 NAS 服務。

要求是裝置的 DNS 伺服器是路由器,然後在路由器的 DHCP/DNS 設定裡為 NAS 分配靜態 IP,再新增挾持網域,都指向 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