LACKAWANNA
EXPRESSO

用RaspberryPi搭建Aria2+Caddy2下载站

Building Aria2 + Caddy 2 Download Station with RaspberryPi

# Aria2

我的Raspi-4B安装了官方提供的Rasbian,刷入过程非常简单,下载解压dd三步搞定,可以参考Pi官网。Aria2下载器相信大家也都不陌生,直接使用apt安装即可(记得换源)。

sudo apt update && sudo apt install aria2

安装完毕之后依照惯例创建aria2的各项文件。

由于需要通过SFTP、SMB来管理下载的文件,我们设置aria2以低权限用户aria运行,否则所有文件只能以root身份修改。

groupadd -r aria # 添加用户组aria
useradd -r -g aria -s /usr/sbin/nologin -c "Aria 2" aria # 添加用户aria

sudo mkdir -p /home/aria/aria2 # 创建工作目录
touch /home/aria/aria2/aria2.session # 创建aria2进度文件
touch /home/aria/aria2/aria2.log # 创建aria2日志文件
touch /home/aria/aria2/aria2.config # 创建aria2配置文件

chown aria:aria /home/aria/* # 将工作目录下的文件移交给aria用户

然后nano /home/aria/aria2/aria2.config编辑配置文件。

配置示例
# 下载地址
dir=/home/pi/Downloads
# 启用磁盘缓存, 0为禁用缓存, 需1.16以上版本, 默认:16M
#disk-cache=32M
# 文件预分配方式, 能有效降低磁盘碎片, 默认:prealloc
# 预分配所需时间: none < falloc ? trunc < prealloc
# falloc和trunc则需要文件系统和内核支持
# NTFS建议使用falloc, EXT3/4建议trunc, MAC 下需要注释此项
file-allocation=trunc

continue=true

## 下载连接相关 ##

# 最大同时下载任务数, 运行时可修改, 默认:5
max-concurrent-downloads=5
# 同一服务器连接数, 添加时可指定, 默认:1
max-connection-per-server=16
# 最小文件分片大小, 添加时可指定, 取值范围1M -1024M, 默认:20M
# 假定size=10M, 文件为20MiB 则使用两个来源下载; 文件为15MiB 则使用一个来源下载
min-split-size=10M
# 单个任务最大线程数, 添加时可指定, 默认:5
split=16
# 整体下载速度限制, 运行时可修改, 默认:0
#max-overall-download-limit=0
# 单个任务下载速度限制, 默认:0
#max-download-limit=0
# 整体上传速度限制, 运行时可修改, 默认:0
max-overall-upload-limit=10K
# 单个任务上传速度限制, 默认:0
max-upload-limit=20
# 禁用IPv6, 默认:false
disable-ipv6=false

## 进度保存相关 ##

# 从会话文件中读取下载任务
input-file=/home/aria/aria2/aria2.session
# 在Aria2退出时保存`错误/未完成`的下载任务到会话文件
save-session=/home/aria/aria2/aria2.session
# 定时保存会话, 0为退出时才保存, 需1.16.1以上版本, 默认:0
save-session-interval=60

## RPC相关设置 ##

# 启用RPC, 默认:false
enable-rpc=true
# 允许所有来源, 默认:false
rpc-allow-origin-all=true
# 允许非外部访问, 默认:false
rpc-listen-all=true
# 在 RPC 服务中启用 SSL/TLS 加密时的证书文件(.pem/.crt)
#rpc-certificate=/etc/letsencrypt/live/aria.wannaexpresso.com/fullchain.pem
# 在 RPC 服务中启用 SSL/TLS 加密时的私钥文件(.key)
#rpc-private-key=/etc/letsencrypt/live/aria.wannaexpresso.com/privkey.pem
# 事件轮询方式, 取值:[epoll, kqueue, port, poll, select], 不同系统默认值不同
#event-poll=select
# RPC监听端口, 端口被占用时可以修改, 默认:6800
#rpc-listen-port=6800
# 设置的RPC授权令牌, v1.18.4新增功能, 取代 --rpc-user 和 --rpc-passwd 选项
#rpc-secret=secret
# 设置的RPC访问用户名, 此选项新版已废弃, 建议改用 --rpc-secret 选项
#rpc-user=<USER>
# 设置的RPC访问密码, 此选项新版已废弃, 建议改用 --rpc-secret 选项
#rpc-passwd=<PASSWD>

## BT/PT下载相关 ##

# 当下载的是一个种子(以.torrent结尾)时, 自动开始BT任务, 默认:true
#follow-torrent=true
# BT监听端口, 当端口被屏蔽时使用, 默认:6881-6999
listen-port=51413
# 单个种子最大连接数, 默认:55
#bt-max-peers=55
# 打开DHT功能, PT需要禁用, 默认:true
#enable-dht=false
# 打开IPv6 DHT功能, PT需要禁用
enable-dht6=true
# DHT网络监听端口, 默认:6881-6999
#dht-listen-port=6881-6999
# 本地节点查找, PT需要禁用, 默认:false
#bt-enable-lpd=false
# 种子交换, PT需要禁用, 默认:true
enable-peer-exchange=true
# 每个种子限速, 对少种的PT很有用, 默认:50K
#bt-request-peer-speed-limit=50K
# 客户端伪装, PT需要
#peer-id-prefix=-TR2770-
#user-agent=Transmission/2.77
# 当种子的分享率达到这个数时, 自动停止做种, 0为一直做种, 默认:1.0
#seed-ratio=0
# 强制保存会话, 话即使任务已经完成, 默认:false
# 较新的版本开启后会在任务完成后依然保留.aria2文件
#force-save=false
# BT校验相关, 默认:true
#bt-hash-check-seed=true
# 继续之前的BT任务时, 无需再次校验, 默认:false
bt-seed-unverified=true
# 保存磁力链接元数据为种子文件(.torrent文件), 默认:false
bt-save-metadata=true
bt-tracker=udp://62.138.0.158:6969/announce,udp://87.233.192.220:6969/announce,udp://111.6.78.96:6969/announce,udp://90.179.64.91:1337/announce,udp://51.15.4.13:1337/announce,udp://151.80.120.113:2710/announce,udp://191.96.249.23:6969/announce,udp://35.187.36.248:1337/announce,udp://123.249.16.65:2710/announce,udp://210.244.71.25:6969/announce,udp://78.142.19.42:1337/announce,udp://173.254.219.72:6969/announce,udp://51.15.76.199:6969/announce,udp://51.15.40.114:80/announce,udp://91.212.150.191:3418/announce,udp://103.224.212.222:6969/announce,udp://5.79.83.194:6969/announce,udp://92.241.171.245:6969/announce,udp://5.79.209.57:6969/announce,udp://82.118.242.198:1337/announce

然后建立自启动sudo touch /etc/systemd/system/aria2.service

[Unit]
Description=Aria2 Service
After=network.target

[Service]
User=aria
ExecStart=/usr/bin/aria2c --conf-path=/home/pi/.config/aria2/aria2.config
ExecStop=/bin/kill $MAINPID

[Install]
WantedBy=multi-user.target
# 将aria2c的拥有者设置为aria
cd /usr/bin
chown aria:aria aria2c
chmod g+s aria2c

利用下面的systemctl命令来开启aria2的自启动:

sudo systemctl daemon-reload # 重新加载修改过的service文件
sudo systemctl enable aria2 # 开启自启动
sudo systemctl start aria2 # 启动服务
sudo systemctl status aria2 # 查看日志

Notes: 查看日志,如果出现问题,可以利用sudo -u aria aria2c /home/aria/aria2/aria2.config来进行调试。

Aria2到这里就配置好了。

# AriaNG

GitHub下载Aria2的前端AriaNG。解压index.html到你喜欢的目录。这时可以打开尝试连接127.0.0.1:6800/jsonrpc,来检查Aria2是否配置正确。

# Caddy 2

Caddy已经更新到了2.0(撒花),因此这里我们也与时俱进一把。

# 依照官方指南安装Caddy

  1. GitHub下载*linux_armv7*版本的caddy,解压后利用sudo mv caddy /usr/bin复制到/usr/bin。

  2. caddy version来检验安装是否成功。

  3. 添加用户组caddy

    groupadd --system caddy
    
  4. 创建一个名为caddy的用户,并为他指派工作目录。

    useradd --system \
     --gid caddy \
     --create-home \
     --home-dir /var/lib/caddy \
     --shell /usr/sbin/nologin \
     --comment "Caddy web server" \
     caddy
    
  5. 下载caddy.service文件,利用sudo mv caddy.service /etc/systemd/system/caddy.service将其复制到目标目录。

    # 啊哈你获得了一个三连!
    sudo systemctl daemon-reload
    sudo systemctl enable caddy
    sudo systemctl start caddy
    

    用以上的命令在后台常驻caddy。 其他一些有用的命令如下:

    systemctl status caddy # 查看运行状态
    journalctl -u caddy # 查看全部日志
    sudo systemctl reload caddy # 重新加载Caddy配置文件
    sudo systemctl stop caddy # 关停
    
  6. Caddy 2的运行可以通过Caddyfile配置文件或者API控制,我们这里使用比较简单的Caddyfile。官方给出的后台服务caddy.service调用的是/etc/caddy/下的Caddyfile。

    sudo touch /etc/caddy/Caddyfile
    sudo nano /etc/caddy/Caddyfile
    

    编辑内容为如下:

    Your.Raspberry.Pi.IP{
      root * /path/containing/arianghtml
      file_server
      reverse_proxy /jsonrpc 127.0.0.1:6800
    }
    
    • Your.Raspberry.Pi.IP就是你的树莓派在家庭网络中的地址。
    • /path/containing/arianghtml就是你刚才解压index.html的目录。
    • reverse_proxy /jsonrpc 127.0.0.1:6800表示将aria2的端口反向代理到443端口,可以解决aria2没有证书,无法在https页面上使用的问题。
sudo systemctl reload caddy # 重新加载Caddyfile

此时打开浏览器访问https://Your.Raspberry.Pi.IP,在AriaNG设置填入Your.Raspberry.Pi.IP:443/jsonrpc,就可以连接你的树莓派下载站了。

# 外网访问

外网访问我只在此简单叙述,需要实现请另外查阅其他资料。

# 解决方案一:公网IP+DDNS+域名

在你的路由器上配置DDNS,将动态的IP通过DNS服务转化为静态的地址。由于运营商会封闭家用网路的443和80端口,因此你需要将AriaNG架设在其他端口。

这里会遇到的问题是Caddy自动获取证书至少需要443端口畅通,这是做不到的,因此只能利用DNS Challenge配合Certbot手动获取证书

需要提醒的是如果用Cloudflare,Raspberry Pi的Certbot插件还不支持Zone Key,只能使用CF的Global Key。

获取证书之后可以这样配置Caddyfile

Your.Raspberry.Pi.IP, Your.Domain:OtherPorts{
  tls /path/to/fullchain.pem /path/to/privkey.pem
  root * /path/containing/arianghtml
  file_server
  reverse_proxy /jsonrpc 127.0.0.1:6800
}

# 解决方案二: ZeroTier

利用ZeroTier组建虚拟局域网,便可以用Zerotier提供的IP地址访问树莓派,也可以在路由器安装,配置好后可以用家庭网络的IP访问树莓派,配置的过程非常容易。

# 其他解决方案

其他方案还有FRP、花生壳等,感兴趣可以自行研究。

# 总结

事实上现在也并不怎么下载东西,折腾仅仅是为了折腾。不过折腾也能乐在其中……