家庭服务器 NAS 部署教程:从零到一完整指南

0. 准备工作

硬件:

  • 一台旧电脑(4核CPU + 8G内存 + 256G SSD + 4T HDD)
  • 网线(必须,WiFi 不稳定)

软件:

  • Ubuntu Server 24.04 LTS(推荐)
  • Docker + Docker Compose
  • Cloudflare 账号(免费域名 + DNS)
  • 一个域名(如 hsh-chao.top

1. 安装 Ubuntu Server

  1. 下载 Ubuntu Server 24.04 LTS 镜像
  2. 制作 USB 启动盘(用 Rufus)
  3. 插入旧电脑,开机按 F12 选择 USB 启动
  4. 按向导安装:
    • 语言:English(推荐,避免路径中文问题)
    • 网络:有线连接(DHCP 自动获取 IP)
    • 用户名:nas(密码设置强一点)
    • 磁盘:使用整个磁盘
  5. 安装完成后重启,拔掉 USB

验证:

# 在本机终端测试 SSH 连接
ssh nas@<你的IP>

2. 安装 Docker

# 更新系统
sudo apt update && sudo apt upgrade -y

# 安装 Docker
curl -fsSL https://get.docker.com | sudo sh

# 将用户加入 docker 组(免 sudo)
sudo usermod -aG docker $USER

# 重新登录生效
exit

验证:

docker --version
docker run hello-world

3. 创建目录结构

# 创建数据目录
mkdir -p ~/docker/{immich,vaultwarden,alist,syncthing,ghost,qbittorrent,clamav,portainer,kuma}

# 创建 Docker Compose 文件
nano ~/docker/docker-compose.yml

4. Docker Compose 配置

复制以下内容到 docker-compose.yml

version: "3.8"

services:
  # 照片管理
  immich-server:
    image: ghcr.io/immich-app/immich-server:release
    container_name: immich-server
    ports:
      - "2283:2283"
    volumes:
      - ./immich/upload:/usr/src/app/upload
    environment:
      - DB_PASSWORD=你的数据库密码
      - DB_DATABASE_NAME=immich
      - DB_HOSTNAME=immich-postgres
      - REDIS_HOSTNAME=immich-redis
      - UPLOAD_LOCATION=./immich/upload
    depends_on:
      - immich-postgres
      - immich-redis
    restart: unless-stopped

  immich-postgres:
    image: postgres:14-vectorchord0.4.3-pgvectors0.2.0
    container_name: immich-postgres
    environment:
      - POSTGRES_PASSWORD=你的数据库密码
      - POSTGRES_DB=immich
    volumes:
      - ./immich/postgres:/var/lib/postgresql/data
    restart: unless-stopped

  immich-redis:
    image: valkey/valkey:9
    container_name: immich-redis
    restart: unless-stopped

  # 密码管理
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    ports:
      - "8080:80"
    environment:
      - SIGNUPS_ALLOWED=false
      - DOMAIN=https://vault.你的域名.com
    volumes:
      - ./vaultwarden/data:/data
    restart: unless-stopped

  # 文件管理
  alist:
    image: xhofe/alist:latest
    container_name: alist
    ports:
      - "8082:5244"
    environment:
      - PUID=1000
      - PGID=1000
    volumes:
      - ./alist:/opt/alist/data
    restart: unless-stopped

  # 文件同步
  syncthing:
    image: linuxserver/syncthing:latest
    container_name: syncthing
    ports:
      - "8384:8384"
      - "22000:22000/tcp"
      - "22000:22000/udp"
    environment:
      - PUID=1000
      - PGID=1000
    volumes:
      - ./syncthing/config:/config
      - ./syncthing/data:/data
    restart: unless-stopped

  # 博客
  ghost:
    image: ghost:5
    container_name: ghost
    ports:
      - "2368:2368"
    environment:
      - url=https://blog.你的域名.com
    volumes:
      - ./ghost/content:/var/lib/ghost/content
    restart: unless-stopped

  # 下载工具
  qbittorrent:
    image: lscr.io/linuxserver/qbittorrent:latest
    container_name: qbittorrent
    ports:
      - "8085:8080"
      - "6881:6881/tcp"
      - "6881:6881/udp"
    environment:
      - PUID=1000
      - PGID=1000
    volumes:
      - ./qbittorrent/config:/config
      - ./qbittorrent/downloads:/downloads
    restart: unless-stopped

  # 反向代理
  caddy:
    image: caddy:2
    container_name: caddy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./caddy/Caddyfile:/etc/caddy/Caddyfile
      - ./caddy/data:/data
    restart: unless-stopped

  # 监控
  uptime-kuma:
    image: louislam/uptime-kuma:2
    container_name: kuma
    ports:
      - "3001:3001"
    volumes:
      - ./kuma:/app/data
    restart: unless-stopped

  # 容器管理
  portainer:
    image: portainer/portainer-ce:latest
    container_name: portainer
    ports:
      - "9000:9000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./portainer:/data
    restart: unless-stopped

5. 启动服务

cd ~/docker
docker compose up -d

# 查看状态
docker ps

6. 配置域名(Cloudflare)

  1. 登录 Cloudflare → 添加 A 记录
  2. 记录类型:A
  3. 名称:vault(对应 Vaultwarden)
  4. 内容:你的服务器 IP
  5. 代理状态:关闭(灰色云朵)
  6. 重复以上步骤,添加其他子域名:
    • immich(相册)
    • files(Alist)
    • sync(Syncthing)
    • blog(Ghost)
    • kuma(监控)
    • portainer(容器管理)

7. 配置 HTTPS(Caddy)

nano ~/docker/caddy/Caddyfile

复制以下内容:

vault.你的域名.com {
    reverse_proxy 127.0.0.1:8080
}

immich.你的域名.com {
    reverse_proxy 127.0.0.1:2283
}

files.你的域名.com {
    reverse_proxy 127.0.0.1:8082
}

sync.你的域名.com {
    reverse_proxy 127.0.0.1:8384
}

blog.你的域名.com {
    reverse_proxy 127.0.0.1:2368
}

kuma.你的域名.com {
    reverse_proxy 127.0.0.1:3001
}

portainer.你的域名.com {
    reverse_proxy 127.0.0.1:9000
}

重启 Caddy:

docker restart caddy

8. 访问测试

服务 地址
Vaultwarden https://vault.你的域名.com
Immich https://immich.你的域名.com
Alist https://files.你的域名.com
Syncthing https://sync.你的域名.com
Ghost https://blog.你的域名.com
Kuma https://kuma.你的域名.com
Portainer https://portainer.你的域名.com

9. 自动化运维(可选)

自动更新

# 创建更新脚本
nano ~/update.sh
#!/bin/bash
cd ~/docker
docker compose pull
docker compose up -d
echo "更新完成: $(date)" >> ~/update.log
chmod +x ~/update.sh

# 添加定时任务(每天凌晨 4 点)
crontab -e
# 添加:0 4 * * * /home/nas/update.sh

自动 DDNS(如果家宽 IPv6 变化)

# 安装 ddns-go
docker run -d --name ddns-go --restart=always --net=host jeessy/ddns-go

访问 http://你的IP:9876 配置 DDNS。


10. 安全加固

# 安装 Fail2Ban
sudo apt install fail2ban -y

# 配置 SSH 限制
sudo nano /etc/ssh/sshd_config
# 添加:MaxAuthTries 3
# 添加:AllowUsers nas

# 重启 SSH
sudo systemctl restart sshd

完成!

恭喜!你已经有了一个完整的家庭服务器:

  • 照片管理:Immich(AI 识别 + 地图)
  • 密码管理:Vaultwarden(跨平台同步)
  • 文件管理:Alist(多存储聚合)
  • 文件同步:Syncthing(P2P 同步)
  • 博客:Ghost(Markdown 写作)
  • 下载:qBittorrent(BT 下载)
  • 监控:Uptime Kuma(服务状态)
  • 容器管理:Portainer(可视化界面)

所有服务都有 HTTPS 加密,支持外网访问!


遇到问题? 评论区留言,我会一一解答。

💬 评论区