在 VPS 上部署 Aria2 下载器,通过 IPv6 动态挂载 NAS,实现远程下载直接保存到家庭 NAS 的完整解决方案


🏗️ 系统架构

┌─────────────────────────────────────────────┐
│  浏览器                                      │
│  http://shell.yysresume.work:8080           │
└───────────────┬─────────────────────────────┘
                │
┌───────────────▼─────────────────────────────┐
│  Cloudflare CDN (橙色云朵)                  │
│  加速 Web 界面访问                          │
└───────────────┬─────────────────────────────┘
                │
┌───────────────▼─────────────────────────────┐
│  RackNerd VPS (你的服务器)                  │
│                                             │
│  ┌──────────────────────────────────────┐  │
│  │ AriaNg Web (8080)                    │  │
│  └──────────┬───────────────────────────┘  │
│             │ RPC: 6800                     │
│  ┌──────────▼───────────────────────────┐  │
│  │ Aria2 下载器                         │  │
│  │ aria2.yysresume.work:6800            │  │
│  └──────────┬───────────────────────────┘  │
│             │                               │
│  ┌──────────▼───────────────────────────┐  │
│  │ /mnt/nas_data (CIFS 挂载点)         │  │
│  │ 每小时自动刷新 IPv6 地址             │  │
│  └──────────┬───────────────────────────┘  │
└─────────────┼───────────────────────────────┘
              │ CIFS over IPv6
              │ hnnas.yys.zone (DDNS)
┌─────────────▼───────────────────────────────┐
│  家庭/公司 NAS                              │
│  /nas/share/download                        │
│  文件自动保存到这里                         │
└─────────────────────────────────────────────┘

核心特点:

  • ✅ 远程下载到本地 NAS,不占用 VPS 空间
  • ✅ IPv6 动态解析,支持家庭宽带 DDNS
  • ✅ Web 界面管理,随时随地访问
  • ✅ 开机自启,自动挂载,无需人工干预

✅ 前置条件

硬件/网络要求

  1. VPS 服务器

    • 系统:Debian 11+ / Ubuntu 20.04+
    • RAM:512MB+
    • 磁盘:10GB+(仅存储配置,不存文件)
    • 网络:支持 IPv6
  2. NAS 设备

    • 支持 SMB/CIFS 文件共享
    • 有公网 IPv6 地址
    • 配置 DDNS(如 hnnas.yys.zone)
  3. 域名(可选)

    • Cloudflare 托管
    • 用于 Web 界面和 RPC 访问

软件环境

# 检查系统版本
lsb_release -a

# 检查 IPv6 支持
ip -6 addr show

# 测试 NAS 连通性
ping6 hnnas.yys.zone

🚀 部署步骤

第一步:安装 Docker 环境

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

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

# 启动 Docker
sudo systemctl start docker
sudo systemctl enable docker

# 添加当前用户到 docker 组
sudo usermod -aG docker $USER

# 重新登录使权限生效
exit
# 重新 SSH 登录

验证安装:

docker --version
docker compose version

第二步:配置动态 IPv6 NAS 挂载

2.1 安装必要工具

sudo apt install cifs-utils -y

2.2 创建凭据文件

# 创建凭据目录
sudo mkdir -p /root/.credentials

# 创建凭据文件(替换为你的 NAS 用户名和密码)
sudo tee /root/.credentials/nas-creds > /dev/null <<EOF
username=你的NAS用户名
password=你的NAS密码
EOF

# 设置权限
sudo chmod 600 /root/.credentials/nas-creds

2.3 创建挂载脚本

这是核心脚本,实现动态 IPv6 解析和自动挂载:

sudo tee /usr/local/bin/mount-nas.sh > /dev/null <<'EOF'
#!/bin/bash
DOMAIN="hnnas.yys.zone"  # 改成你的 NAS 域名
MOUNT_POINT="/mnt/nas_data"
SHARE_PATH="/nas"  # 改成你的 NAS 共享路径
CREDS="/root/.credentials/nas-creds"

# 动态解析最新的 IPv6 地址
IPV6=$(host -t AAAA $DOMAIN | grep "has IPv6 address" | head -1 | awk '{print $NF}')

if [ -z "$IPV6" ]; then
    echo "Failed to resolve $DOMAIN"
    exit 1
fi

echo "$(date): Resolved $DOMAIN to $IPV6"

# 如果已挂载,先卸载
if mountpoint -q "$MOUNT_POINT"; then
    umount "$MOUNT_POINT" 2>/dev/null
fi

# 挂载(带性能优化参数)
mount -t cifs -o credentials=$CREDS,vers=3.0,ip=$IPV6,uid=1000,gid=1000,file_mode=0664,dir_mode=0775,cache=loose,rsize=65536,wsize=65536 \
    //$DOMAIN$SHARE_PATH "$MOUNT_POINT"

if mountpoint -q "$MOUNT_POINT"; then
    echo "$(date): Successfully mounted with optimizations"
    exit 0
else
    echo "$(date): Failed to mount"
    exit 1
fi
EOF

# 设置执行权限
sudo chmod +x /usr/local/bin/mount-nas.sh

关键参数说明:

  • credentials=$CREDS - 使用凭据文件,避免明文密码
  • vers=3.0 - SMB 协议版本
  • ip=$IPV6 - 动态解析的 IPv6 地址
  • cache=loose - 宽松缓存模式,提升性能
  • rsize=65536,wsize=65536 - 读写缓冲区 64KB

2.4 测试挂载

# 创建挂载点
sudo mkdir -p /mnt/nas_data

# 测试脚本
sudo /usr/local/bin/mount-nas.sh

# 验证挂载
df -h | grep nas_data
ls -la /mnt/nas_data

预期输出:

Resolved hnnas.yys.zone to 2409:8a44:9874:be20:8e0:afff:fec6:15e1
Successfully mounted with optimizations

第三步:配置开机自启和定时刷新

3.1 创建 systemd 服务

sudo tee /etc/systemd/system/nas-mount.service > /dev/null <<'EOF'
[Unit]
Description=Mount NAS with dynamic IPv6
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/mount-nas.sh
RemainAfterExit=yes
ExecStop=/bin/umount /mnt/nas_data

[Install]
WantedBy=multi-user.target
EOF

3.2 创建定时刷新服务

# 创建刷新服务
sudo tee /etc/systemd/system/nas-mount-refresh.service > /dev/null <<'EOF'
[Unit]
Description=Refresh NAS mount

[Service]
Type=oneshot
ExecStart=/usr/local/bin/mount-nas.sh
EOF

# 创建定时器(每小时刷新)
sudo tee /etc/systemd/system/nas-mount-refresh.timer > /dev/null <<'EOF'
[Unit]
Description=Refresh NAS mount hourly

[Timer]
OnBootSec=5min
OnUnitActiveSec=1h

[Install]
WantedBy=timers.target
EOF

3.3 启用服务

# 重载 systemd
sudo systemctl daemon-reload

# 启用并启动挂载服务
sudo systemctl enable nas-mount.service
sudo systemctl start nas-mount.service

# 启用并启动定时器
sudo systemctl enable nas-mount-refresh.timer
sudo systemctl start nas-mount-refresh.timer

# 查看状态
sudo systemctl status nas-mount.service
sudo systemctl list-timers | grep nas

验证定时器:

# 应该看到类似输出:
# NEXT                        LEFT          LAST  PASSED  UNIT                      ACTIVATES
# Tue 2026-01-20 08:46:19 EST 59min left    n/a   n/a     nas-mount-refresh.timer   nas-mount-refresh.service

第四步:部署 Aria2 + AriaNg

4.1 创建项目目录

mkdir -p ~/aria2-downloader
cd ~/aria2-downloader

4.2 创建 docker-compose.yml

cat > docker-compose.yml <<'EOF'
services:
  aria2:
    image: p3terx/aria2-pro
    container_name: aria2-pro
    restart: unless-stopped
    environment:
      - PUID=1000
      - PGID=1000
      - RPC_SECRET=myariatoken2026  # 改成你的密钥
      - RPC_PORT=6800
      - LISTEN_PORT=6888
      - DISK_CACHE=256M
      - IPV6_MODE=true
    volumes:
      - ./aria2-config:/config
      - /mnt/nas_data/share/download:/downloads  # 改成你的 NAS 路径
    ports:
      - 6800:6800
      - 6888:6888
      - 6888:6888/udp
    network_mode: bridge
    logging:
      driver: json-file
      options:
        max-size: 1m

  ariang:
    image: p3terx/ariang
    container_name: ariang
    restart: unless-stopped
    ports:
      - 8080:6880
    logging:
      driver: json-file
      options:
        max-size: 1m
EOF

4.3 启动服务

# 启动容器
docker compose up -d

# 查看日志
docker compose logs -f aria2

# 查看运行状态
docker compose ps

预期输出:

NAME        IMAGE              STATUS        PORTS
aria2-pro   p3terx/aria2-pro   Up 2 minutes  0.0.0.0:6800->6800/tcp, ...
ariang      p3terx/ariang      Up 2 minutes  0.0.0.0:8080->6880/tcp

第五步:配置域名和 Cloudflare

5.1 添加 DNS 记录

登录 Cloudflare,添加两条 A 记录:

记录 1:Web 界面(开启代理)

类型: A
名称: shell
内容: 你的VPS-IP
代理状态: 已代理(橙色云朵)

记录 2:RPC 连接(仅 DNS)

类型: A
名称: aria2
内容: 你的VPS-IP
代理状态: 仅 DNS(灰色云朵)⚠️ 重要

为什么 RPC 要用仅 DNS?
Aria2 RPC 使用 WebSocket 长连接,Cloudflare 代理可能中断连接。仅 DNS 模式允许直连服务器。

5.2 测试 DNS 解析

# 测试 Web 域名
ping shell.yysresume.work

# 测试 RPC 域名
ping aria2.yysresume.work

第六步:配置 AriaNg Web 界面

6.1 访问界面

浏览器打开:http://shell.yysresume.work:8080

6.2 配置 RPC 连接

  1. 点击右上角 齿轮图标(AriaNg 设置)
  2. 左侧菜单选择 "RPC"
  3. 填写配置:
    RPC 别名:Aria2
    RPC 地址:aria2.yysresume.work
    RPC 端口:6800
    RPC 协议:Http
    RPC 密钥:myariatoken2026
    
  4. 点击 "重载" 按钮
  5. 返回主界面,左下角应显示 "已连接" + 绿色图标

6.3 测试下载

点击 "+ 新建",添加测试链接:

http://ipv4.download.thinkbroadband.com/100MB.zip

观察下载速度和进度,文件会保存到:/mnt/nas_data/share/download/


🔧 常见问题解决

问题 1:挂载失败 - "No route to host"

原因: VPS 无法访问 NAS 的 IPv6 地址

解决方案:

# 1. 检查域名解析
nslookup hnnas.yys.zone

# 2. 测试 IPv6 连通性
ping6 hnnas.yys.zone

# 3. 测试 SMB 端口
telnet hnnas.yys.zone 445

如果端口不通:

  • 检查 NAS 防火墙是否开放 445 端口
  • 检查 NAS 的 SMB 服务是否启用
  • 确认 NAS 允许外部 IP 访问

问题 2:挂载失败 - "Invalid argument"

原因: 挂载参数不兼容

解决方案:

# 测试不同参数组合
sudo mount -t cifs -o username=yys,password=123456,vers=3.0 \
  //hnnas.yys.zone/nas /mnt/nas_data

# 如果失败,尝试 vers=2.1
sudo mount -t cifs -o username=yys,password=123456,vers=2.1 \
  //hnnas.yys.zone/nas /mnt/nas_data

# 查看详细错误
sudo dmesg | tail -20

问题 3:AriaNg 显示"未连接"

原因: RPC 配置错误或端口被阻止

解决方案:

# 1. 测试 RPC 端口
curl http://localhost:6800/jsonrpc

# 2. 检查容器状态
docker compose ps

# 3. 查看 Aria2 日志
docker compose logs aria2 | grep -i error

# 4. 检查防火墙
sudo ufw status
sudo ufw allow 6800/tcp

# 5. 测试域名访问
curl http://aria2.yysresume.work:6800/jsonrpc

浏览器 F12 控制台检查:

  • 查看是否有 CORS 错误
  • 查看 WebSocket 连接状态

问题 4:下载速度慢(只有 15 MB/s)

原因: 网络文件系统协议开销

实际情况:

  • 15-20 MB/s = IPv6 公网 + CIFS 的正常速度 ✅
  • 相当于 120-160 Mbps,已经很不错

如果想进一步优化:

# 方案 1:调整 CIFS 参数(已在脚本中)
cache=loose,rsize=65536,wsize=65536

# 方案 2:改用 NFS(性能提升 20-30%)
# 需要在 NAS 上启用 NFS 服务

速度对比参考:

你现在(IPv6 CIFS):15-20 MB/s ✅
优化后的 CIFS:   20-30 MB/s
NFS 协议:        25-40 MB/s
本地千兆网:      80-110 MB/s
VPS 本地磁盘:    100+ MB/s

问题 5:IPv6 地址变化后挂载失效

原因: 家庭宽带 IPv6 地址定期变化

解决方案: 已通过定时刷新解决 ✅

# 查看定时器状态
sudo systemctl list-timers | grep nas

# 手动触发刷新
sudo systemctl start nas-mount-refresh.service

# 查看刷新日志
sudo journalctl -u nas-mount.service -f

定时器每小时会:

  1. 重新解析域名获取最新 IPv6
  2. 卸载旧挂载
  3. 使用新 IPv6 地址重新挂载

问题 6:RPC 密钥警告

警告信息:

[WARN] Neither --rpc-secret nor a combination of --rpc-user and --rpc-passwd is set.

解决方案:

cd ~/aria2-downloader

# 删除旧配置,让容器重新生成
docker compose down
rm -rf aria2-config
docker compose up -d

# 查看日志,警告应消失
docker compose logs aria2 | grep -i warn

确认 docker-compose.yml 中有:

environment:
  - RPC_SECRET=myariatoken2026

⚡ 性能优化

优化 1:调整 CIFS 挂载参数

已在脚本中实现的优化:

cache=loose           # 宽松缓存模式
rsize=65536          # 读缓冲 64KB
wsize=65536          # 写缓冲 64KB

进一步优化(可选):

# 在 mount-nas.sh 中添加
actimeo=60           # 缓存元数据 60 秒
noatime,nodiratime   # 禁用访问时间更新

优化 2:调整 Aria2 配置

# 编辑配置文件
nano ~/aria2-downloader/aria2-config/aria2.conf

推荐配置:

# 磁盘缓存(减少 I/O)
disk-cache=256M

# 文件预分配
file-allocation=falloc

# 连接数
max-connection-per-server=16
split=16
min-split-size=10M

# 速度限制(0=无限制)
max-overall-download-limit=0
max-download-limit=0

# BT 优化
bt-max-peers=128
seed-ratio=1.0
seed-time=60

# 添加/修改这些配置:
# 限制文件名长度
max-file-not-found=3
max-tries=3

# 自动创建多级目录
auto-file-renaming=true
allow-overwrite=true

重启生效:

docker compose restart aria2

优化 3:改用 NFS 协议

如果 NAS 支持 NFS,可以获得更好的性能(25-40 MB/s)

在 NAS 上启用 NFS:

  • 群晖:控制面板 → 文件服务 → NFS → 启用
  • 威联通:控制台 → 网络与文件服务 → NFS

修改挂载脚本:

sudo nano /usr/local/bin/mount-nas.sh

# 修改 mount 命令:
mount -t nfs -o vers=4,rsize=131072,wsize=131072,hard,timeo=600,actimeo=60 \
    [$IPV6]:/volume1/nas "$MOUNT_POINT"

📖 日常使用

常用管理命令

# ===== NAS 挂载管理 =====

# 查看挂载状态
df -h | grep nas_data

# 手动刷新挂载
sudo /usr/local/bin/mount-nas.sh

# 查看挂载服务状态
sudo systemctl status nas-mount.service

# 查看定时器
sudo systemctl list-timers | grep nas

# 查看挂载日志
sudo journalctl -u nas-mount.service -f

# ===== Aria2 管理 =====

# 查看容器状态
cd ~/aria2-downloader
docker compose ps

# 查看 Aria2 日志
docker compose logs -f aria2

# 重启 Aria2
docker compose restart aria2

# 停止服务
docker compose down

# 启动服务
docker compose up -d

# 更新镜像
docker compose pull
docker compose up -d

# ===== 下载管理 =====

# 查看下载目录
ls -lh /mnt/nas_data/share/download/

# 实时监控下载
watch -n 1 'ls -lh /mnt/nas_data/share/download/'

# 查看磁盘使用
df -h /mnt/nas_data

添加下载任务

方式 1:Web 界面(推荐)

  1. 访问 http://shell.yysresume.work:8080
  2. 点击 "+ 新建"
  3. 粘贴链接(HTTP/HTTPS/BT/磁力链)
  4. 点击确定

方式 2:API 调用

# HTTP 下载
curl -X POST http://aria2.yysresume.work:6800/jsonrpc \
  -d '{
    "jsonrpc":"2.0",
    "method":"aria2.addUri",
    "id":"1",
    "params":["token:myariatoken2026",["http://example.com/file.zip"]]
  }'

# BT 下载(种子文件)
curl -X POST http://aria2.yysresume.work:6800/jsonrpc \
  -d '{
    "jsonrpc":"2.0",
    "method":"aria2.addTorrent",
    "id":"1",
    "params":["token:myariatoken2026","种子文件的base64"]
  }'

监控和维护

每周检查清单:

# 1. 检查 NAS 挂载
df -h | grep nas_data

# 2. 检查服务运行
docker compose ps
sudo systemctl status nas-mount.service

# 3. 检查磁盘空间
df -h

# 4. 查看下载统计
docker compose logs aria2 | grep "Download complete"

# 5. 清理旧日志
docker system prune -f

每月维护:

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

# 更新 Docker 镜像
cd ~/aria2-downloader
docker compose pull
docker compose up -d

# 清理 Docker 缓存
docker system prune -af

备份配置

# 备份脚本
cat > ~/backup-aria2.sh <<'EOF'
#!/bin/bash
BACKUP_DIR=~/aria2-backup-$(date +%Y%m%d)
mkdir -p $BACKUP_DIR

# 备份配置
cp -r ~/aria2-downloader $BACKUP_DIR/
cp /usr/local/bin/mount-nas.sh $BACKUP_DIR/
cp /etc/systemd/system/nas-mount* $BACKUP_DIR/
cp /root/.credentials/nas-creds $BACKUP_DIR/

echo "Backup completed: $BACKUP_DIR"
EOF

chmod +x ~/backup-aria2.sh
~/backup-aria2.sh

📊 性能测试数据

实际测速结果

测试环境:

  • VPS: RackNerd (美国)
  • NAS: 自建(中国,IPv6)
  • 协议: CIFS/SMB 3.0

下载速度:

HTTP 下载:     15-25 MB/s (120-200 Mbps)
BT 下载:       10-20 MB/s (多 peer 情况下)
NAS 写入速度:  15-20 MB/s (实际测得)

优化后:

添加 cache 参数:     +10-20% 提升
增大 rsize/wsize:    +5-10% 提升
改用 NFS:           +20-30% 提升

延迟:

VPS → NAS:          ~230ms (ping6)
挂载建立时间:       5-8 秒
IPv6 地址刷新:      <1 秒

 

📋 aria2 命令

📋 1. 查看等待任务

cat > ~/a2-waiting.sh <<'EOF'
#!/bin/bash
curl -s -X POST http://localhost:6800/jsonrpc \
    -H "Content-Type: application/json" \
    -d '{"jsonrpc":"2.0""method":"aria2.tellWaiting""id":"1""params":["token:myariatoken2026"0100]}' \
    | python3 -c "
import sys json
data = json.load(sys.stdin)
tasks = data.get('result' [])
if not tasks:
    print('✅ 没有等待任务')
else:
    print(f'📋 等待中的任务 ({len(tasks)} 个):')
    print('=' * 80)
    for i task in enumerate(tasks 1):
        gid = task['gid']
        files = task.get('files' [{}])
        path = files[0].get('path' 'N/A')
        print(f'{i}. GID: {gid}')
        print(f'   文件: {path[:70]}...')
        print('-' * 80)
"
EOF
chmod +x ~/a2-waiting.sh

🚀 2. 查看正在下载的任务

cat > ~/a2-active.sh <<'EOF'
#!/bin/bash
curl -s -X POST http://localhost:6800/jsonrpc \
    -H "Content-Type: application/json" \
    -d '{"jsonrpc":"2.0""method":"aria2.tellActive""id":"1""params":["token:myariatoken2026"]}' \
    | python3 -c "
import sys json
data = json.load(sys.stdin)
tasks = data.get('result' [])
if not tasks:
    print('✅ 没有正在下载的任务')
else:
    print(f'🚀 正在下载 ({len(tasks)} 个):')
    print('=' * 80)
    for i task in enumerate(tasks 1):
        gid = task['gid']
        files = task.get('files' [{}])
        path = files[0].get('path' 'N/A')
        completed = int(task.get('completedLength' 0))
        total = int(task.get('totalLength' 1))
        speed = int(task.get('downloadSpeed' 0))
        progress = (completed / total * 100) if total > 0 else 0
        print(f'{i}. GID: {gid}')
        print(f'   文件: {path[:60]}...')
        print(f'   进度: {progress:.1f}% | 速度: {speed/1024/1024:.2f} MB/s')
        print('-' * 80)
"
EOF
chmod +x ~/a2-active.sh

⏸️ 3. 查看已停止的任务

cat > ~/a2-stopped.sh <<'EOF'
#!/bin/bash
curl -s -X POST http://localhost:6800/jsonrpc \
    -H "Content-Type: application/json" \
    -d '{"jsonrpc":"2.0""method":"aria2.tellStopped""id":"1""params":["token:myariatoken2026"0100]}' \
    | python3 -c "
import sys json
data = json.load(sys.stdin)
tasks = data.get('result' [])
if not tasks:
    print('✅ 没有已停止的任务')
else:
    print(f'⏸️  已停止任务 ({len(tasks)} 个):')
    print('=' * 80)
    for i task in enumerate(tasks 1):
        gid = task['gid']
        status = task.get('status' 'unknown')
        files = task.get('files' [{}])
        path = files[0].get('path' 'N/A')
        print(f'{i}. GID: {gid} | 状态: {status}')
        print(f'   文件: {path[:70]}...')
        print('-' * 80)
"
EOF
chmod +x ~/a2-stopped.sh

📊 4. 查看全局统计

cat > ~/a2-stats.sh <<'EOF'
#!/bin/bash
curl -s -X POST http://localhost:6800/jsonrpc \
    -H "Content-Type: application/json" \
    -d '{"jsonrpc":"2.0""method":"aria2.getGlobalStat""id":"1""params":["token:myariatoken2026"]}' \
    | python3 -c "
import sys json
data = json.load(sys.stdin)
stats = data.get('result' {})
down_speed = int(stats.get('downloadSpeed' 0))
up_speed = int(stats.get('uploadSpeed' 0))
active = stats.get('numActive' 0)
waiting = stats.get('numWaiting' 0)
stopped = stats.get('numStopped' 0)
print('📊 Aria2 全局统计:')
print('=' * 50)
print(f'⬇️  下载速度: {down_speed/1024/1024:.2f} MB/s')
print(f'⬆️  上传速度: {up_speed/1024/1024:.2f} MB/s')
print(f'🚀 活动任务: {active}')
print(f'⏳ 等待任务: {waiting}')
print(f'⏸️  已停止: {stopped}')
print('=' * 50)
"
EOF
chmod +x ~/a2-stats.sh

❌ 5. 删除指定任务

cat > ~/a2-remove.sh <<'EOF'
#!/bin/bash
if [ -z "$1" ] then
    echo "用法: $0 <GID>"
    exit 1
fi

curl -s -X POST http://localhost:6800/jsonrpc \
    -H "Content-Type: application/json" \
    -d '{"jsonrpc":"2.0""method":"aria2.forceRemove""id":"1""params":["token:myariatoken2026""'$1'"]}' \
    | python3 -c "
import sys json
data = json.load(sys.stdin)
if 'result' in data:
    print(f'✅ 已删除任务: $1')
elif 'error' in data:
    print(f'❌ 删除失败: {data[\"error\"][\"message\"]}')
"
EOF
chmod +x ~/a2-remove.sh

🔍 6. 按关键词删除任务

cat > ~/a2-remove-keyword.sh <<'EOF'
#!/bin/bash
if [ -z "$1" ] then
    echo "用法: $0 <关键词>"
    exit 1
fi

echo "正在删除包含【$1】的所有任务..."

# 获取所有等待任务
curl -s -X POST http://localhost:6800/jsonrpc \
    -H "Content-Type: application/json" \
    -d '{"jsonrpc":"2.0""method":"aria2.tellWaiting""id":"1""params":["token:myariatoken2026"01000]}' \
    | python3 -c "
import sys json subprocess
keyword = '$1'
data = json.load(sys.stdin)
removed = 0

for task in data.get('result' []):
    path = task.get('files' [{}])[0].get('path' '')
    if keyword in path:
        gid = task['gid']
        result = subprocess.run([
            'curl' '-s' '-X' 'POST' 'http://localhost:6800/jsonrpc'
            '-H' 'Content-Type: application/json'
            '-d' '{\"jsonrpc\":\"2.0\"\"method\":\"aria2.forceRemove\"\"id\":\"1\"\"params\":[\"token:myariatoken2026\"\"' + gid + '\"]}'
        ] capture_output=True)
        print(f'✅ 删除: {path[:50]}... (GID: {gid})')
        removed += 1

print(f'\n总共删除了 {removed} 个任务')
"

# 获取所有活动任务
curl -s -X POST http://localhost:6800/jsonrpc \
    -H "Content-Type: application/json" \
    -d '{"jsonrpc":"2.0""method":"aria2.tellActive""id":"1""params":["token:myariatoken2026"]}' \
    | python3 -c "
import sys json subprocess
keyword = '$1'
data = json.load(sys.stdin)

for task in data.get('result' []):
    path = task.get('files' [{}])[0].get('path' '')
    if keyword in path:
        gid = task['gid']
        subprocess.run([
            'curl' '-s' '-X' 'POST' 'http://localhost:6800/jsonrpc'
            '-H' 'Content-Type: application/json'
            '-d' '{\"jsonrpc\":\"2.0\"\"method\":\"aria2.forceRemove\"\"id\":\"1\"\"params\":[\"token:myariatoken2026\"\"' + gid + '\"]}'
        ] capture_output=True)
        print(f'✅ 删除: {path[:50]}... (GID: {gid})')
"
EOF
chmod +x ~/a2-remove-keyword.sh

🧹 7. 清理已完成任务

cat > ~/a2-purge.sh <<'EOF'
#!/bin/bash
curl -s -X POST http://localhost:6800/jsonrpc \
    -H "Content-Type: application/json" \
    -d '{"jsonrpc":"2.0""method":"aria2.purgeDownloadResult""id":"1""params":["token:myariatoken2026"]}' \
    | python3 -c "
import sys json
data = json.load(sys.stdin)
if 'result' in data:
    print('✅ 已清理所有已完成/错误的任务')
else:
    print('❌ 清理失败')
"
EOF
chmod +x ~/a2-purge.sh

📦 8. 查看所有状态

cat > ~/a2-all.sh <<'EOF'
#!/bin/bash
echo "🚀 正在下载:"
echo ""
~/a2-active.sh
echo ""
echo "⏳ 等待中:"
echo ""
~/a2-waiting.sh
echo ""
echo "📊 统计:"
echo ""
~/a2-stats.sh
EOF
chmod +x ~/a2-all.sh

🎯 使用方法:

# 查看等待任务
~/a2-waiting.sh

# 查看正在下载
~/a2-active.sh

# 查看已停止
~/a2-stopped.sh

# 查看统计
~/a2-stats.sh

# 删除指定任务
~/a2-remove.sh <GID>

# 按关键词删除
~/a2-remove-keyword.sh "关键词"

# 清理已完成
~/a2-purge.sh

# 查看所有
~/a2-all.sh

💡 添加别名(可选)

cat >> ~/.bashrc <<'EOF'
alias a2w='~/a2-waiting.sh'
alias a2a='~/a2-active.sh'
alias a2s='~/a2-stopped.sh'
alias a2t='~/a2-stats.sh'
alias a2r='~/a2-remove.sh'
alias a2rk='~/a2-remove-keyword.sh'
alias a2p='~/a2-purge.sh'
alias a2all='~/a2-all.sh'
EOF

source ~/.bashrc

以后就可以简单使用:

a2w          # 查看等待
a2a          # 查看下载中
a2t          # 查看统计
a2r abc123   # 删除任务
a2rk "测试"  # 按关键词删除
a2p          # 清理
a2all        # 查看所有

每个都是独立的脚本!

 


 

🎯 总结

系统优势

节省 VPS 空间 - 文件直接写入 NAS,不占用昂贵的 VPS 存储
支持动态 IPv6 - 家庭宽带 IP 变化后自动更新
开机自启 - 服务器重启后自动恢复
Web 管理 - 随时随地通过浏览器管理下载
多协议支持 - HTTP/HTTPS/FTP/BT/磁力链全支持
性能优化 - 15-25 MB/s 的写入速度已足够大多数场景

适用场景

  • 🎬 影视资源下载
  • 📦 大文件备份
  • 🎮 游戏 ISO 下载
  • 📚 电子书收集
  • 🎵 音乐库构建

🔗 相关资源

官方文档:

工具网站:

社区支持:

  • Aria2 论坛
  • NAS 论坛 (群晖/威联通官方论坛)

📝 更新日志

v1.0 (2026-01-20)

  • ✅ 初始版本发布
  • ✅ 实现动态 IPv6 挂载
  • ✅ 集成 Aria2 + AriaNg
  • ✅ 性能优化和故障排除

🙏 致谢

感谢以下项目的开发者:

  • Aria2 - 强大的下载工具
  • P3TERX - 优秀的 Docker 镜像
  • AriaNg - 现代化的 Web 界面

作者: 基于实际部署经验整理
最后更新: 2026-01-20


附录:完整脚本汇总

mount-nas.sh (完整版)

#!/bin/bash
#
# 动态 IPv6 NAS 挂载脚本
# 功能:自动解析 DDNS 域名,使用最新 IPv6 地址挂载 NAS
# 作者:实战部署总结
# 版本:v1.0
#

# ===== 配置区域 =====
DOMAIN="hnnas.yys.zone"           # 你的 NAS DDNS 域名
MOUNT_POINT="/mnt/nas_data"       # 本地挂载点
SHARE_PATH="/nas"                 # NAS 共享路径
CREDS="/root/.credentials/nas-creds"  # 凭据文件路径

# ===== 日志函数 =====
log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S'): $1"
}

# ===== 主逻辑 =====
log "Starting NAS mount process..."

# 1. 解析域名获取 IPv6 地址
IPV6=$(host -t AAAA $DOMAIN | grep "has IPv6 address" | head -1 | awk '{print $NF}')

if [ -z "$IPV6" ]; then
    log "ERROR: Failed to resolve $DOMAIN"
    exit 1
fi

log "Resolved $DOMAIN to $IPV6"

# 2. 检查并卸载旧挂载
if mountpoint -q "$MOUNT_POINT"; then
    log "Unmounting old mount..."
    umount "$MOUNT_POINT" 2>/dev/null
    sleep 1
fi

# 3. 执行挂载
log "Mounting with IPv6: $IPV6"
mount -t cifs \
    -o credentials=$CREDS,vers=3.0,ip=$IPV6,uid=1000,gid=1000,file_mode=0664,dir_mode=0775,cache=loose,rsize=65536,wsize=65536 \
    //$DOMAIN$SHARE_PATH "$MOUNT_POINT"

# 4. 验证挂载结果
if mountpoint -q "$MOUNT_POINT"; then
    log "SUCCESS: NAS mounted successfully"
    df -h "$MOUNT_POINT" | tail -1 | awk '{print "Capacity: "$2", Used: "$3", Available: "$4", Use%: "$5}'
    exit 0
else
    log "ERROR: Mount failed"
    # 输出详细错误信息
    dmesg | tail -5
    exit 1
fi

docker-compose.yml (完整版)

# Aria2 远程下载系统
# 版本:v1.0
# 更新:2026-01-20

services:
  # Aria2 下载核心
  aria2:
    image: p3terx/aria2-pro
    container_name: aria2-pro
    restart: unless-stopped
    
    environment:
      # 用户权限(与挂载目录权限一致)
      - PUID=1000
      - PGID=1000
      
      # RPC 配置
      - RPC_SECRET=myariatoken2026  # 修改为强密码
      - RPC_PORT=6800
      
      # 下载配置
      - LISTEN_PORT=6888
      - DISK_CACHE=256M
      - IPV6_MODE=true
    
    volumes:
      # 配置文件持久化
      - ./aria2-config:/config
      
      # 下载目录 -> NAS 挂载点
      - /mnt/nas_data/share/download:/downloads
    
    ports:
      # RPC 端口
      - 6800:6800
      # BT/PT 监听端口
      - 6888:6888
      - 6888:6888/udp
    
    network_mode: bridge
    
    # 日志配置
    logging:
      driver: json-file
      options:
        max-size: 1m
        max-file: "3"

  # AriaNg Web 界面
  ariang:
    image: p3terx/ariang
    container_name: ariang
    restart: unless-stopped
    
    ports:
      - 8080:6880
    
    # 日志配置
    logging:
      driver: json-file
      options:
        max-size: 1m
        max-file: "3"

🎉 部署完成!享受你的远程下载系统吧!