记录一些常用的函数和瞎折腾的过程……

在docker中使用Aria2、AriaNG和FileRun实现完美下载

提醒:本文最后更新于 417 天前,文中所描述的信息可能已发生改变,请谨慎使用。

一直用迅雷下载,发现很多最新的电影因为版权方要求,限制下载,尝试使用Aria2下载,可以突破限制。我使用的docker方式安装,并且配合AriaNG和FileRun,那叫一个完美。具体步骤职下:

一、安装好FileRun,这个不多说,方法很多,可以直接拉取FileRun的docker镜像安装,也可单独建好php、mysql、nginx的容器来运行FileRun的安装文件。我使用的是后者。

二、安装Aria2 Pro,项目地址:https://p3terx.com/archives/docker-aria2-pro.html,docker地址:https://hub.docker.com/r/p3terx/aria2-pro

安装docker启动命令如下:

docker run -d \
  --name aria2-pro \
  --restart unless-stopped \
  --log-opt max-size=1m \
  -e PUID=$UID \
  -e PGID=$GID \
  -e UMASK_SET=022 \
  -e RPC_SECRET=<TOKEN> \
  -e RPC_PORT=6800 \
  -e LISTEN_PORT=6888 \
  -p 6800:6800 \
  -p 6888:6888 \
  -p 6888:6888/udp \
  -v /data/docker/aria2-config:/config \
  -v /www.filerun.com/data/aria2-downloads:/downloads \
  p3terx/aria2-pro

注意:

1、用户和组设定:

PUID=$UID、PGID=$GID这2个定义用户和用户组的环境变量,限定了aria2以什么用户和用户组运行,不指定则默认使用nobady用户和nogroup用户组,但在使用FileRun网盘时,会因权限问题无法删除或改名aria2下载好的文件,所以PUID和GUID要指定为和WEB环境的运行用户和用户组一致,比如WEB环境运行的用户及对应的用户组都是WWW,对应的uid和gid都是1001,那就要指定PUID=1001、PGID=1001,这样在FileRun网盘中就可以正常的进行删除和修改操作了;

以什么用户和用户组来运行一定要设置正确,不然会因为没有权限而无法写入,导致不能下载,如报错:“发生错误(16) 文件创建或删除已有文件失败”。

如要以www-data用户及用户组来运行,查询UID和GID,使用命令:id www-data,就会显示UID和GID的数值,填入上述对应位置即可,另外下载目录也要赋予这个www-data用户和用户组权限,可执行:chgrp -R downloads www-data和chown -R downloads www-data。

2、几个环境变量:

-e UMASK_SET=022 ,设置umask,默认值022;

-e RPC_SECRET=<TOKEN>,设置RPC密钥,用于AriaNg与Aria2的通讯验证使用;

-e RPC_PORT=6800,设置PRC通讯端口(与宿主主机的端口映射一致);

-e LISTEN_PORT=6888,BT 监听端口(TCP)、DHT 监听端口(UDP)设置,即 Aria2 配置中listen-port与dht-listen-port选项定义的端口。如果没有设置,配置文件中的默认值为6888。

3、容器目录挂载,将/downloads挂载到宿主主机的/www.filerun.com/data/aria2-downloads目录,即FileRun的数据目录中,方便下载完成直接在网盘中查看;配置文件挂载到指定的宿主主机目录/data/docker/aria2-config中,宿主主机的目录根据实际情况自行修改;

4、3个端口映射:

-p 6800:6800,为RPC 通讯端口映射;

-p 6888:6888,为BT 监听端口(TCP)映射,即 Aria2 配置中listen-port选项定义的端口;

-p 6888:6888/udp,为DHT 监听端口(UDP)映射,即 Aria2 配置中dht-listen-port选项定义的端口。

5、参数--log-opt max-size=1m,限制日志大小限制为1MB,防止Aria2持续下载产生大量的日志占用磁盘空间,某些docker可视化管理系统可能没有相关选项。

三、安装AriaNg,一个可视化的Aria2下载管理界面,项目地址:https://p3terx.com/archives/aria2-frontend-ariang-tutorial.html,docker地址:https://hub.docker.com/r/p3terx/ariang

docker run -d \
  --name ariang \
  --log-opt max-size=1m \
  --restart unless-stopped \
  -p 6880:6880 \
  p3terx/ariang

上面3个安装完成后,就可以使用http://ip:6880访问AriaNg的web管理界面,进入web界面后需要设置一下与Aria2的通讯。

点击“AriaNg 设置”菜单,再点右边的“PRC(XX.XX.XX.XX:6800)”标签,填入“Aria2 RPC 地址”、“Aria2 RPC 密钥”(安装Aria2时填写的token)即可连接到Aria2,然后就可以愉快的进行下载了。

扩展应用:

如果是在家里的机器上安装的aira2,为了方便在外网连接家里的aira2进行下载,可以使用frp内网穿透服务来实现:

对于AriaNg,仅仅是个给aira2发送下载命令的静态网页,完全可以使用公用的忆经部署好的网页版,
比如由AriaNg开发者提供的Demo页面:

http://ariang.mayswind.net/latest

还有以下这些:

http://ariang.js.org
http://ariang.eu.org
http://p3terx.gitee.io/ariang

所以只需要做好aira2的内网穿透就就可以,具体内网穿透教程可以参考《Docker环境中使用frp内网穿透服务》一文,这里我只贴一下配置文件。

使用nginx的反代,nginx仅开放了80和443端口,我的frpc.ini配置是:

[aira2-pro]
type = http
local_port = 80
custom_domains = aira2-pro.psay.cn
proxy_protocol_version = v2

nginx的配置是:

server {
  listen 80 proxy_protocol;
  server_name aira2-pro.psay.cn;

  # 配合使用proxy_protocol获取真实ip
  real_ip_header proxy_protocol;
  real_ip_recursive on;
  set_real_ip_from 172.18.0.1;

  # Allow large attachments
  client_max_body_size 128M;

  location / {
    proxy_pass http://ariang:6880; # ariang容器名和端口
    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;
  }

  access_log /var/log/nginx/aira2-pro.psay.cn.log;
}

将aira2-pro.psay.cn做A记录到frp的服务器ip,重启nginx和frp,再进入AriaNg(使用上面提到的公共页面)的设置中,将Aria2 RPC地址改为aira2-pro.psay.cn,端口为80(注意端口不再是6800,而是nginx的端口80),填写Aria2 RPC密钥,保存就可以正常连接内网的aira2服务了。

注意,如果要使用frp进行内网穿透,需要注意以下几点,相关内容可参考《Docker环境中使用frp内网穿透服务》:

vhost_http_port和vhost_https_port只能设置一个,但我要运行多个http服务,可以使用subdomain_host进行区别,具体如下:

1、在Docker的Nginx容器中做好端口映射,明确宿主主机和nginx容器之间的端口关系,如:

-p 9080:80
-p 9081:81
-p 9082:82
-p 9083:83
-p 9443:443

2、在frps.ini中添加:

subdomain_host = psay.cn

3、在frpc.ini中修改,主要就是删除custom_domains,并添加subdomain:

[web d.psay.cn]
type = http
# 第一个http服务的宿主主机端口9080,nginx容器的配置文件监听映射端口80
local_port = 9080
# 使用二级域名d.psay.cn区分
subdomain = d

[web a.psay.cn]
type = http
# 第二个http服务的宿主主机端口9081,nginx容器的配置文件监听映射端口81
local_port = 9081
# 使用二级域名a.psay.cn区分
subdomain = a
proxy_protocol_version = v2

[web a2.psay.cn]
type = http
# 第三个http服务的宿主主机端口9082,nginx容器的配置文件监听映射端口82
local_port = 9082
# 使用二级域名a2.psay.cn区分
subdomain = a2
proxy_protocol_version = v2

我贴一个完整配置,docker中运行有Nginx、php、Mysql、Aria2和AriaNG:

1、frp server配置:

[common]
# 客户端连接服务端的端口和允许的IP
bind_addr = 0.0.0.0
bind_port = 9000

# 启用面板指定端口
dashboard_port = 9001

# 设置udp端口,以帮助udp进行nat穿透
bind_udp_port = 9002

# 用于kcp协议的udp端口,它可以与'bind_port'相同。
# 如果不设置,在frps中kcp默认禁用。
kcp_bind_port = 9000

# 面板登录名和密码
dashboard_user = admin
dashboard_pwd = admin

# 定义主域名,此处配置了,客户端中不能配置custom_domains,相应的增加subdomain指定子域
subdomain_host = psay.cn

# 使用http代理并使用9080端口进行穿透
vhost_http_port = 9080
vhost_https_port = 9443

# 认证token
token = ed2c4592529

# 日启并设置日志存储路径
log_file = /etc/frp/frps.log

# 日志级别:trace, debug, info, warn, error
log_level = info

# 日志存储天数
log_max_days = 3

2、frp client配置:

[common]
# server_addr为frp的服务器ip或已解析到该ip的域名
server_addr = x.x.x.x
# server_port与服务端配置bind_port一致
server_port = 9000
# 认证token
token = ed2c4592529

[ssh]
# 开启ssh内网穿透
type = tcp
local_ip = 127.0.0.1
# 内网主机ssh端口
local_port = 22
# 远程连接ssh的端口
remote_port = 22222

[FileRun]
type = http
local_port = 9080
# 二级域名 d.psay.cn
subdomain = d

[AriaNG]
type = http
local_port = 9081
# 二级域名 a.psay.cn
subdomain = a
proxy_protocol_version = v2
# ui界面设置账户密码
http_user = webmaster
http_pwd = webmaster

[Aira2]
type = http
local_port = 9082
# 二级域名 a2.psay.cn
subdomain = a2
proxy_protocol_version = v2

3、Nginx反代AriaNG可视化界面:

server {
  listen 81 proxy_protocol;
  server_name a.psay.cn;

  # 配合使用proxy_protocol获取真实ip
  real_ip_header proxy_protocol;
  real_ip_recursive on;
  set_real_ip_from 172.18.0.1;

  # Allow large attachments
  client_max_body_size 128M;

  location / {
    proxy_pass http://ariang:6880; # aira2容器名和端口
    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;
  }

  access_log /var/log/nginx/a.psay.cn.log;
}

4、Nginx反代FileRun:

server {
  listen 80;
  server_name d.psay.cn;
  index index.html index.php;
  root /usr/share/nginx/html/d.psay.cn;

  location ~ [^/]\.php(/|$) { # 处理php文件交给php容器
    root /var/www/html/d.psay.cn;
    fastcgi_pass php:9000; # php的容器名和端口
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /var/www/html/d.psay.cn$fastcgi_script_name;
    include fastcgi_params;
  }

  location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
    expires 30d;
  }
  location ~ .*\.(js|css)?$ {
    expires 12h;
  }
  location ~ /.well-known {
    allow all;
  }
  location ~ /\. {
    deny all;
  }
  access_log /var/log/nginx/d.psay.cn.log;
}

5、Nginx反代Aria2服务:

server {
  listen 82 proxy_protocol;
  server_name a2.psay.cn;

  # 配合使用proxy_protocol获取真实ip
  real_ip_header proxy_protocol;
  real_ip_recursive on;
  set_real_ip_from 172.18.0.1;

  # Allow large attachments
  client_max_body_size 128M;

  location / {
    proxy_pass http://aria2:6800; # aira2容器名和端口
    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;
  }

  access_log /var/log/nginx/a2.psay.cn.log;
}

完成上述配置,访问AriaNG(a.psay.cn:9080)就可打开ui界面,在里面设置Aria2下载服务器地址(a2.psay.cn:9080)和密钥即可连接,并进行下载了。