Download Server

2024 年 7 月 2 日 星期二(已编辑)
4

Download Server

最近终于有空,把之前想了很久的下载机配置了一下

这次配置的是下载机,可以实现远程挂机下载,下载完成后再用固定的 本地 - Server 的线路把下载好的文件取回

实现效果

以下是目前实现的效果,之后遇到问题还会不断更新:

  • 通过 https://<files.domain> 访问存储在 /var/www/files 文件夹内的下载好的文件,供本地用 aria2、wget 等方式下载
  • 普通下载任务:
    • Server:通过 https://<ariang.domain> 访问 AriaNg 网页,登录账号,添加任务,文件下载到 /disk/aria2Downloads,下载完成后自动创建链接到 /var/www/files
    • 本地使用 aria2 开启 16 线程从 Nginx 文件服务器下载文件,一般可以跑满网络带宽,下载完成后自动运行脚本删除 Server 中存储的文件
  • BT 下载任务:
    • Server:通过 https://<qbit.domain> 打开 qBittorrent 网页,登录账号,添加任务,文件下载到 /disk/qBitDownloads,下载完成后自动创建链接到 /var/www/files
    • 因为 BT 下载多为文件夹,无法使用 aria2 下载,因此根据情况判断:
      • 若下载内容为文件集合,即没有目录结构,使用脚本获取所有文件链接,使用 aria2 和普通任务一样下载
      • 若下载内容有复杂的目录结构,使用 wget 下载
      • 下载完成后前往 https://<qbit.domain> 手动删除任务及文件,删除前保持做种
  • 脚本每分钟自动检查源文件,如源文件被删除则删除对应 /var/www/files 文件夹中的链接

存在不足

  • 本地下载 BT 文件不够优雅:
    • 不含目录结构的 BT 文件需要手动执行脚本获取所有文件列表后使用 aria2 下载
    • 包含目录结构的 BT 文件需要手动使用 wget 下载、手动多开 wget 实现多线程,以及下载完成后需要手动删除 Server 上的文件

以下内容都会按照上面提到的 URL 和路径来配置,当然你也可以修改为其他 URL 和路径

前期准备

  • (如果需要用域名访问或开启 HTTPS)一个域名,并且会配置 DNS
  • 一台 Server,有容量足够大的硬盘

Server 选择

用 VPS 下载文件很容易遇到版权问题,如果用一些普通机器,尤其是美国地区的,稍不小心就会导致 VPS 被停机

因此,如果是需要下载,最好选择 抗 DMCA 投诉 的机器,多分布于欧洲,如卢森堡、摩尔多瓦等

比较推荐的是 BuyVM 家的卢森堡机器,抗 DMCA 投诉

  • 最低配 1C512M,10GB 硬盘,1 Gbps 无限流量,$2/mo.

可以额外加购存储块,最低 256GB 存储块为 $1.25/mo.

其他还有低价的抗 DMCA VPS 如 Alexhost 和 AvenaCloud 等,最低配年付都在 $10 左右,但是硬盘比较小,只适合作为中转使用,或是挂载远程硬盘,操作比较麻烦

配置 VPS

Nginx 搭建文件服务器

首先用 Nginx 搭建一个文件服务器,供本地下载已经下载到 VPS 上的文件

  1. 前期准备

    • 添加 DNS,将 <files.domain> 指向 VPS IP
  2. 安装 Nginx

    apt install nginx
  3. 配置 Nginx

    1. 创建存放文件的目录

      mkdir -p /var/www/files
    2. 允许 80 端口经过防火墙

      ufw allow 80
    3. 编辑 <files.domain> 配置

      vim /etc/nginx/sites-available/<files.domain>
      将以下内容写入到 `<files.domain

      `

      server {
          listen 80;
          server_name <files.domain>;
      
          location / {
              root /var/www/files;
              autoindex on;
              autoindex_exact_size off;
              autoindex_localtime on;
          }
      }
    4. <files.domain> 创建链接

      ln -s /etc/nginx/sites-available/<files.domain> /etc/nginx/sites-enabled/
    5. 检查 Nginx 配置

      nginx -t
      如果得到以下结果,即包含关键字 `successful` 即可
      nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
      : configuration file /etc/nginx/nginx.conf test is successful
    6. 重新启动 Nginx 以应用配置文件

      systemctl restart nginx
    7. 此时可以通过 http://<file.domain> 访问文件服务器

  4. (可选,建议)启用 HTTPS

    1. 安装 certbot

      apt install certbot python3-certbot-nginx
    2. 允许 443 端口通过防火墙

      ufw allow 443
    3. 获取证书

      certbot --nginx -d <files.domain>
    4. 编辑配置文件

      vim /etc/nginx/sites-available/<files.domain>
      • Certbot 应该会自动将配置文件改成以下内容,否则手动编辑:

        server {
            server_name <files.domain>;
        
            location / {
                root /var/www/files;
                autoindex on;
                autoindex_exact_size off;
                autoindex_localtime on;
            }
        
            listen 443 ssl; # managed by Certbot
            ssl_certificate /etc/letsencrypt/live/<files.domain>/fullchain.pem; # managed by Certbot
            ssl_certificate_key /etc/letsencrypt/live/<files.domain>/privkey.pem; # managed by Certbot
            include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
            ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
        }
    5. 重新启动 Nginx

      systemctl restart nginx
    6. 此时可以通过 https://<files.domain> 访问文件服务器

  5. 编辑自动检查链接脚本

    vim /root/.sh/check_links.sh
    写入以下内容:
    #!/bin/bash
    
    # 要检查的目录路径
    DIRECTORY="/var/www/files"
    LOG_FILE="/root/.sh/check_links.log"
    
    # 查找目录中的所有符号链接
    find "$DIRECTORY" -type l | while read -r symlink; do
        # 获取符号链接指向的目标文件
        target=$(readlink "$symlink")
        echo "$(date): Checking link: $symlink > $target" >> "$LOG_FILE"
        # 如果目标文件不存在,则删除该符号链接
        if [ ! -e "$target" ]; then
            echo "$(date): Deleting broken link: $symlink > $target" >> "$LOG_FILE"
            rm "$symlink"
        fi
    done
    echo "$(date): Checking finished" >> "$LOG_FILE"
    chmod +x /root/.sh/check_links.sh
    crontab -e
    在文件末尾加入:
    * * * * * /bin/bash /root/.sh/check_links.sh

配置 aria2

  1. 安装 aria2

    apt install aria2
  2. 配置 aria2

    1. 创建 aria2 相关文件目录

      mkdir -p /root/.aria2
    2. 创建 aria2 配置文件目录

      mkdir -p /etc/aria2
    3. 创建 aria2 下载目录

      mkdir -p /<disk>/aria2Downloads
    4. 编辑 aria2 配置

      vim /etc/aria2/aria2.conf
      输入以下内容:
      # Enable RPC
      enable-rpc=true
      
      # Listen on all network interfaces
      rpc-listen-all=true
      
      # Allow all origins (for web frontends)
      rpc-allow-origin-all=true
      
      # Set RPC listening port
      rpc-listen-port=6800
      
      # Set the maximum number of concurrent downloads
      max-concurrent-downloads=5
      max-connection-per-server=16
      
      # Log file
      log-level=notice
      log=/root/.aria2/aria2.log
      
      # Download path
      dir=/<disk>/aria2Downloads
      
      # Check Integrity
      check-integrity=true
      
      # Resume Download
      continue=true
      
      # Move file when complete
      on-download-complete=/root/.aria2/link_completed.sh
      
      # Seed time
      seed-time=600
    5. 允许 6800 端口通过防火墙

      ufw allow 6800
    6. 创建下载完成时运行脚本 link_completed.sh

      vim /root/.aria2/link_completed.sh
      写入以下内容:
      #!/bin/bash
      
      ln -s "$3" "/var/www/files/"
    7. 为脚本添加执行权限:

      chmod +x /root/.aria2/link_completed.sh
  3. 启动 aria2 并设置开机自启动

    1. 编辑服务文件

      vim /etc/systemd/system/aria2.service
      写入以下内容:
      [Unit]
      Description=Aria2 RPC Service
      After=network.target
      
      [Service]
      ExecStart=/usr/bin/aria2c --conf-path=/etc/aria2/aria2.conf
      Restart=always
      User=root
      Environment="HOME=/root"
      
      [Install]
      WantedBy=multi-user.target
    2. 将 aria2 服务设置为开机自启动

      systemctl enable aria2
    3. 启动 aria2 服务

      systemctl start aria2
    4. 查看 aria2 状态

      systemctl status aria2

配置 AriaNg

  1. 前期准备
    • 添加 DNS,将 <ariang.domain> 指向 VPS IP
  2. 配置 AriaNg

    1. 安装 AriaNg

      wget https://github.com/mayswind/AriaNg/releases/download/1.3.7/AriaNg-1.3.7-AllInOne.zip
      • 前往 Releases · mayswind/AriaNg 查看最新版本

      • All In One 版本拥有所有需要的内容,可以直接用浏览器访问,普通版本根据需要手动安装

    2. 创建网站目录

      mkdir -p /var/www/ariang
    3. 解压 AriaNg 到网站目录

      unzip AriaNg-1.3.7-AllInOne.zip -d /var/www/ariang
      如果没有 unzip 需先安装
      apt install unzip
    4. 添加 Nginx 配置

      vim /etc/nginx/sites-available/<ariang.domain>
      输入以下内容:
      server {
          listen 80;
          server_name <ariang.domain>;
      
          location / {
              root /var/www/ariang;
              index index.html;
          }
      }
    5. <ariang.domain> 创建链接

      ln -s /etc/nginx/sites-available/<ariang.domain> /etc/nginx/sites-enabled/
    6. 检查 Nginx 配置

      nginx -t
    7. 重新启动 Nginx

      systemctl restart nginx
    8. 此时可以通过 http://<ariang.domain> 访问 AriaNg

  3. (可选,建议)启用 HTTPS

    1. 安装 certbot

      apt install certbot python3-certbot-nginx
    2. 获取证书

      certbot --nginx -d <ariang.domain>
    3. 编辑配置文件

      vim /etc/nginx/sites-available/<ariang.domain>
      • Certbot 应该会自动将配置文件改成以下内容,否则手动编辑:

        server {
           server_name <ariang.domain>;
        
           location / {
               root /var/www/ariang;
               index index.html;
        }
        
           listen 443 ssl; # managed by Certbot
           ssl_certificate /etc/letsencrypt/live/<ariang.domain>/fullchain.pem; # managed by Certbot
           ssl_certificate_key /etc/letsencrypt/live/<ariang.domain>/privkey.pem; # managed by Certbot
           include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
           ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
        }
    4. 重新启动 Nginx

      systemctl restart nginx
    5. 配置 aria2

      vim /etc/aria2/aria2.conf
      写入以下内容:
      rpc-secure=true
      rpc-certificate=/etc/letsencrypt/live/<ariang.domain>/fullchain.pem
      rpc-private-key=/etc/letsencrypt/live/<ariang.domain>/privkey.pem
    6. 此时可以通过 https://<ariang.domain> 访问 AriaNg。

配置 qBittorrent

  1. 前期准备

    • 添加 DNS,将 <qbit.domain> 指向 VPS IP
  2. 安装 qBittorrent

    wget https://github.com/c0re100/qBittorrent-Enhanced-Edition/releases/download/release-4.6.5.10/qBittorrent-enhanced-nox_x86_64-linux-musl_static.zip
  3. 将 qBittorrent 解压到安装目录

    unzip qBittorrent-enhanced-nox_x86_64-linux-musl_static.zip -d /usr/local/bin/

    添加可执行权限

    chmod +x /usr/local/bin/qbittorrent-nox
  4. 添加 qBittorrent 服务

    vim /etc/systemd/system/qbittorrent.service

    写入以下内容:

    [Unit]
    Description=qBittorrent-nox service
    After=network.target
    
    [Service]
    User=<username>
    ExecStart=/usr/local/bin/qbittorrent-nox
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
    • <\username>:系统用户名
  5. 重新加载 daemon

    systemctl daemon-reload
  6. 将 qBittorrent 设置为开机自启动

    systemctl enable qbittorrent
  7. 允许 8080 端口通过防火墙

    ufw allow 8080
  8. 启动 qBittorrent

    systemctl start qbittorrent
  9. 现在可通过 http://<vps-ip>:8080 打开 qBittorrent

    • 首次访问会在 Terminal 给出初始账号密码,进入系统后修改
  10. (可选)绑定域名

    1. 添加 Nginx 配置

      vim /etc/nginx/sites-available/<qbit.domain>
      写入以下内容:
      server {
          listen 80;
          server_name <qbit.domain>;
      
          location / {
              proxy_pass http://127.0.0.1:8080/;
              proxy_set_header Host $host;
              proxy_set_header X-Real-IP $remote_addr;
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_set_header X-Forwarded-Proto $scheme;
          }
      }
    2. <qbit.domain> 创建链接

      ln -s /etc/nginx/sites-available/<qbit.domain> /etc/nginx/sites-enabled/
    3. 检查 Nginx 配置

      nginx -t
    4. 重新启动 Nginx

      systemctl restart nginx
    5. 此时可以通过 http://<qbit.domain> 访问 qBittorrent

  11. (可选,建议)启用 HTTPS

    1. 安装 certbot:

      apt install certbot python3-certbot-nginx
    2. 获取证书

      certbot --nginx -d <qbit.domain>
    3. 编辑配置文件

      vim /etc/nginx/sites-available/<qbit.domain>
      • Certbot 应该会自动将配置文件改成以下内容,否则手动编辑:

        server {
            listen 443 ssl;
            server_name <qbit.domain>;
        
            location / {
                proxy_pass http://127.0.0.1:8080/;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
            }
            ssl_certificate /etc/letsencrypt/live/<qbit.domain>/fullchain.pem; # managed by Certbot
            ssl_certificate_key /etc/letsencrypt/live/<qbit.domain>/privkey.pem; # managed by Certbot
            include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
            ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
        }
    4. 重新启动 Nginx

      systemctl restart nginx
    5. 此时可以通过 https://<qbit.domain> 访问 qBittorrent

  12. 配置 qBittorrent

    打开 qBittorrent 网页后前往 工具选项

    • 下载
      • (可选)勾选 为所有文件预分配磁盘空间
      • (可选)勾选 为不完整的文件添加扩展名 .!qB
      • 编辑保存路径为 disk/qBitDownloads
      • 勾选 torrent 完成时运行外部程序,输入 /root/.qBittorrent/link_completed.sh "%F"
    • 连接
      • 记住 用于传入连接的端口 <port>
    • 高级

      • (建议)勾选 Auto Ban Unknown Client From China

        屏蔽迅雷这类的吸血客户端

  13. 防火墙允许端口

    ufw allow <port>
  14. 编辑完成后运行脚本

    vim /root/.qBittorrent/link_completed.sh
    输入以下内容
    #!/bin/bash
    
    FILE_PATH=$1
    
    TARGET_DIR="/var/www/files"
    LOG_FILE="/root/.qBittorrent/link_completed.log"
    DOWNLOAD_PATH="/disk/qBitDownloads"
    
    # 记录日志的函数
    log_message() {
        echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
    }
    
    # 检查目标目录是否存在,不存在则创建
    if [ ! -d "$TARGET_DIR" ]; then
        mkdir -p "$TARGET_DIR"
    fi
    
    echo "$FILE_PATH" >> "$LOG_FILE"
    
    # 移动文件并记录日志
    while true; do
        NEW_PATH=$FILE_PATH
        NEW_PATH="${NEW_PATH%/*}"
        echo "FILE_PATH: $FILE_PATH" >> "$LOG_FILE"
        echo "NEW_PATH: $NEW_PATH" >> "$LOG_FILE"
        if [ "$NEW_PATH" = "$DOWNLOAD_PATH" ]; then
            break
        fi
        FILE_PATH=$NEW_PATH
    done
    echo "处理文件:$FILE_PATH" >> "$LOG_FILE"
    if ln -s "$FILE_PATH" "$TARGET_DIR/"; then
        log_message "Created symlink for $FILE_PATH in $TARGET_DIR/"
    else
        log_message "Failed to create symlink for $FILE_PATH"
    fi
    • 自动找到最顶层的目录然后创建链接

    ``bash chmod +x /root/.qBittorrent/link_completed.sh ```

配置本地下载

aira2

下载的普通文件用 aria2 下载到本地

安装过程与 VPS 类似,需要在下载完成时运行脚本 delete_remote.sh

#!/bin/bash

# 获取下载的文件路径
FILE_PATH=$3

LOG_FILE="/Users/<Local Username>/.aria2/delete_remote.log"

echo "[$(date)] Starting remote file deletion for $FILE_PATH" >> $LOG_FILE

# 定义服务器信息
SERVER="<VPS Username>@<VPS IP>"
PASSWORD="<VPS Password>"
REMOTE_SOURCE_DIR="/mnt/slab/aria2Downloads"

# 获取下载的文件名
FILE_NAME=$(basename "$FILE_PATH")

echo "Deleting link $REMOTE_LINK_DIR/$FILE_NAME and source file $REMOTE_SOURCE_DIR/$FILE_NAME" >> $LOG_FILE

# 删除服务器上的文件
sshpass -p "$PASSWORD" ssh $SERVER <<EOF
rm -f "$REMOTE_LINK_DIR/$FILE_NAME"
rm -f "$REMOTE_SOURCE_DIR/$FILE_NAME"
EOF

# 检查删除操作是否成功
if [ $? -eq 0 ]; then
    echo "[$(date)] Successfully deleted $REMOTE_LINK_DIR/$FILE_NAME and $REMOTE_SOURCE_DIR/$FILE_NAME" >> $LOG_FILE
else
    echo "[$(date)] Failed to delete $REMOTE_LINK_DIR/$FILE_NAME and/or $REMOTE_SOURCE_DIR/$FILE_NAME" >> $LOG_FILE
fi

# 记录操作完成时间
echo "[$(date)] Finished remote file deletion" >> $LOG_FILE

自动删除 aria2 下载的普通文件

此外,还可以用 aria2 下载没有目录结构的 BT 文件,用以下脚本获取所有文件的 URL 列表:

#!/bin/bash

# 检查是否提供了参数
if [ $# -eq 0 ]; then
    echo "Usage: $0 <URL>"
    exit 1
fi

# 获取传入的URL
BASE_URL="$1"
# 结果文件
RESULT_FILE="file_urls.txt"

# 函数:解码 URL
decode_url() {
    printf '%b' "$(echo "$1" | sed 's/%/\\x/g')"
}

# 函数:处理 URL 并递归
process_url() {
    local URL="$1"

    # 获取网页内容,并提取所有的 URL
    curl -s "$URL" | sed -n 's/.*href="\([^"]*\).*/\1/p' | grep -v '^../' | while read -r line; do
        # 处理相对路径,拼接成完整的 URL
        FULL_URL="${URL%/}/${line}"
        # 处理文件夹 URL 递归
        DECODED_URL=$(decode_url "$FULL_URL")
        if [[ "$FULL_URL" == */ ]]; then
            echo "Processing directory: $DECODED_URL"
            process_url "$FULL_URL"
        else
            # 解码 URL 并写入文件
            printf '%s\n' "$DECODED_URL" >> "$RESULT_FILE"
        fi
    done
}

# 清空结果文件
> "$RESULT_FILE"

# 开始处理初始 URL
process_url "$BASE_URL"

echo "All file URLs have been saved to $RESULT_FILE"
sh get_urls.sh <FolderURL>

然后把 file_urls.txt 中的内容粘贴到 aria2 中下载

wget

下载的包含目录结构的 BT 文件用 wget 下载到本地

但是 wget 是单线程下载,因此可以手动对目录中的各个文件夹分别使用 wget 下载

无需担心下载下来以后的目录结构问题,wget 会自动创建并管理从 URL 开始的目录结构,只需对文件夹运行以下命令:

wget -r -N -c -np -R "index.html*" <URL>

下载完成后前往 http://<qbit.domain> 手动删除任务及文件

更新历史

0.4

做种的时候发现经常有迅雷客户端,明明对他上传的速度不低,他却一直保持进度为 0%,从而保持最高的优先级获取下载,而且只下载不上传

因此我得想办法把迅雷这类的吸血客户端给屏蔽了

但是 aria2 的功能有限,无法实现,于是找到了 qBittorrent 的增强版

从此将普通任务和 BT 任务分离,分别由 aria2 和 qBittorrent 下载,还使得运行脚本极大程度简化,aria2 的下载完成运行脚本只剩

#!/bin/bash

ln -s "$3" "/var/www/files/"

而 qBittorrent 的脚本也只需找到最顶层创建链接

#!/bin/bash

FILE_PATH=$1

TARGET_DIR="/var/www/files"
LOG_FILE="/root/.qBitTorrent/link_completed.log"
DOWNLOAD_PATH="/disk/qBitDownloads"

# 记录日志的函数
log_message() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
}

# 检查目标目录是否存在,不存在则创建
if [ ! -d "$TARGET_DIR" ]; then
    mkdir -p "$TARGET_DIR"
fi

echo "$FILE_PATH" >> "$LOG_FILE"

# 移动文件并记录日志
while true; do
    NEW_PATH=$FILE_PATH
    NEW_PATH="${NEW_PATH%/*}"
    echo "FILE_PATH: $FILE_PATH" >> "$LOG_FILE"
    echo "NEW_PATH: $NEW_PATH" >> "$LOG_FILE"
    if [ "$NEW_PATH" = "$DOWNLOAD_PATH" ]; then
        break
    fi
    FILE_PATH=$NEW_PATH
done
echo "处理文件:$FILE_PATH" >> "$LOG_FILE"
if ln -s "$FILE_PATH" "$TARGET_DIR/"; then
    log_message "Created symlink for $FILE_PATH in $TARGET_DIR/"
else
    log_message "Failed to create symlink for $FILE_PATH"
fi

下载完成后的做种,我决定不固定分享率或是做种时间,而是在我手动删除原文件前一直保持做种

在我本地完成原文件的下载后,或是下一次需要进行新的下载而腾出空间时,再手动删除原文件

至于能做多少时间的种或是能上传多少数据,就都随缘了,一般都能达到 2 以上

0.3

突然意识到文件被移动后就无法继续做种,而如果使用拷贝则会占用双份空间

如果使用了挂载的硬盘,这两种方式都无法利用硬盘空间

因此将移动改为了创建软连接,把下载好的文件软链接到 var/www/files

ln -s "$FILE_PATH" "$TARGET_DIR/"

0.2

因为 BT 和普通文件都用 aria2 下载,部分 BT 文件可能包含多个文件,甚至有复杂的目录结构,因此需要遍历每个文件,并找到最上层的文件夹,将整个文件夹移动

此外,还需要区分 BT 任务下载完成 on_bt_download_complete.sh 和普通文件下载完成 on_download_complete.sh,因为在 BT 任务中,on_download_complete.sh 需要等到做种结束才会执行

因此我需要在文件下载完成以后,做种之前执行,也就是 on_bt_download_complete.sh,把文件移动到 Nginx 文件夹以便可以下载

所以这里非常复杂,不仅是 on_download_complete.sh 需要判断类型,避免 BT 任务执行过 on_bt_download_complete.sh 后重复执行,还有 move_completed.sh 需要根据 GID 获取当前任务的所有文件列表,并遍历文件、找到最顶层文件夹移动等

  • on_download_complete.sh ```bash

    !/bin/bash

    GID=1NUMFILES=1 NUM_FILES=2 FILES_LIST=$3

    LOG_FILE="/root/.aria2/on_download_complete.log" ARIA2_RPC_URL="https://<ariang.domain>:6800/jsonrpc"

    记录日志的函数

    log_message() { echo "(date+(date '+%Y-%m-%d %H:%M:%S') -1" >> "$LOG_FILE" }

    获取下载类型并记录日志

    log_message "Downloaded GID: $GID"

    检查 NUM_FILES 是否等于 0

    if [ "$NUM_FILES" -eq 0 ]; then log_message "NUM_FILES = 0, exit" exit 1 fi

    Function to get the info hash of a download

    get_info_hash() { local gid=1 curl -s -X POST -d '{"jsonrpc":"2.0","method":"aria2.tellStatus","id":"1","params":["'"gid"'"]}' "$ARIA2_RPC_URL" | jq -r '.result.infoHash' }

    Check if the completed download is a BitTorrent download

    info_hash=(getinfohash"(get_info_hash "{GID}")

    log_message "infoHash: $info_hash"

    if [ "infohash"="null"];thenecho"DownloadwithGID{info_hash}" = "null" ]; then echo "Download with GID{gid} is not a BitTorrent download." >> "LOGFILE"elseecho"DownloadwithGIDLOG_FILE" else echo "Download with GID{gid} is a BitTorrent download, exit" >> "$LOG_FILE" exit 1 fi

    调用 move_complete.sh 并记录日志

    log_message "Calling move_completed.sh with GID=GID,NUMFILES=GID, NUM_FILES=NUM_FILES, FILES_LIST=FILESLIST"/root/.aria2/movecompleted.sh"FILES_LIST" /root/.aria2/move_completed.sh "GID" "NUMFILES""NUM_FILES" "FILES_LIST"

    if [ $? -eq 0 ]; then log_message "move_completed.sh completed successfully" else log_message "move_completed.sh failed" fi ```

  • on_bt_download_completed.sh

    #!/bin/bash
    
    GID=$1
    NUM_FILES=$2
    FILES_LIST=$3
    
    LOG_FILE="/root/.aria2/on_bt_download_complete.log"
    
    # 记录日志的函数
    log_message() {
        echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
    }
    
    # 调用 move_completed.sh 并记录日志
    log_message "Starting move_completed.sh with GID=$GID, NUM_FILES=$NUM_FILES, FILES_LIST=$FILES_LIST"
    /root/.aria2/move_completed.sh "$1" "$2" "$3"
    if [ $? -eq 0 ]; then
        log_message "move_completed.sh completed successfully"
    else
        log_message "move_completed.sh failed"
    fi
  • move_completed.sh

    #!/bin/bash
    
    GID=$1
    NUM_FILES=$2
    
    TARGET_DIR="/var/www/files"
    LOG_FILE="/root/.aria2/move_completed.log"
    ARIA2_RPC_URL="https://<ariang.domain>:6800/jsonrpc"
    DOWNLOAD_PATH="/root/.aria2/Downloading"
    
    # 记录日志的函数
    log_message() {
        echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
    }
    
    # 检查目标目录是否存在,不存在则创建
    if [ ! -d "$TARGET_DIR" ]; then
        mkdir -p "$TARGET_DIR"
    fi
    
    # 获取文件列表的函数
    get_file_list() {
        local gid=$1
        local rpc_url=$2
        curl -s -X POST -d '{"jsonrpc":"2.0","method":"aria2.getFiles","id":"1","params":["'"$gid"'"]}' "$rpc_url" | jq -r '.result[] | .path'
    }
    
    # 获取文件列表
    FILES_LIST=$(get_file_list "$GID" "$ARIA2_RPC_URL")
    
    echo "$FILES_LIST" >> "$LOG_FILE"
    
    # 移动文件并记录日志
    while IFS= read -r FILE_PATH; do
        while true; do
            NEW_PATH=$FILE_PATH
            NEW_PATH="${NEW_PATH%/*}"
            echo "FILE_PATH: $FILE_PATH" >> "$LOG_FILE"
            echo "NEW_PATH: $NEW_PATH" >> "$LOG_FILE"
            if [ "$NEW_PATH" = "$DOWNLOAD_PATH" ]; then
                break
            fi
        done
        echo "处理文件:$FILE_PATH" >> "$LOG_FILE"
        if mv "$FILE_PATH" "$TARGET_DIR/"; then
            log_message "Created symlink for $FILE_PATH in $TARGET_DIR/"
        else
            log_message "Failed to create symlink for $FILE_PATH"
        fi
    done <<< "$FILES_LIST"

0.1

我将 aria2 的下载目录直接指定为 Nginx 文件夹,即 /var/www/files

但是 aria2 下载中的文件和已下载完成的文件不好区分,只是还未下载完的文件会额外多一个 .aria2 文件

于是我将下载文件夹改成 /root/aria2Downloads,下载完成后用脚本移动到 /var/www/files

#!/bin/bash

mv "$3" "/var/www/files/"

使用社交账号登录

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...