手边空闲的树莓派一直不知道可以做什么,前几天就想能不能搭一个Bt下载服务器让它帮我自动下载资源,搜了一下还真的有现成的一套开源软件可以用。

rTorrent是一款linux上的种子下载器。但是它只提供了文字界面用户接口,如果每次需要ssh登录到服务器,上传种子,再输入指令下载未免有点麻烦。好在已经有大佬为它开发了一个nodejs版的图形界面了,可以直接拿来使用,就可以很方便地管理种子了。效果如图:

image-20210119153632348

安装配置 rTorrent

安装使用 rTorrent

通过 apt-get 安装。如果你使用的是CentOS红帽系的系统,可以试试能不能直接通过yum安装。

sudo apt-get install rtorrent

尽量不要使用root运行rtorrent。可以创建一个普通用户来配置rTorrent。

配置rTorrent只需要在当前用户主目录下创建一个名为.rtorrent.rc的文件,就可以在里面写配置项了。一份参考的配置文件如下:

# 最小允许peer数
#min_peers = 3
 
# 最大允许peer数
#max_peers = 500
 
# 最大同时上传用户数
#max_uploads = 10
 
# 最大下载1024k/s
#download_rate = 1024
 
# 最大上传200k/s
#upload_rate = 200
 
# 默认下载目录
directory = ~/cdn
 
# 下载历史目录(此目录中包括下载进度信息和DHT节点缓存)
session = ~/.rtorrent/session
 
# 配置自动监视, 把bt种子扔进~/download目录就自动下载
#schedule = watch_directory,5,5,load_start=~/download/*.torrent
 
# 配置自动监视,把bt种子从~/universe目录拿走就自动停止下载
#schedule = untied_directory,5,5,stop_untied=
 
# 硬盘空间低于100M就自动停止一切下载
schedule = low_diskspace,5,60,close_low_diskspace=100M
 
# 在总上传量达到200M的情况下上传/下载率达到200%,或者在总上传量不足200M情况下上传/下载率达到2000%,则停止上传
#schedule = ratio,60,60,"stop_on_ratio=200,200M,2000"
 
# bt监听端口
port_range = 9400-9500
 
# 随机从上面范围内选择端口
port_random = yes
 
# 修改编码以避免中文乱码
encoding_list=UTF-8
 
######开启DHT######
#dht = on
 
# DHT所用的UDP端口
dht_port = 9501
 
# 种子交换功能
#peer_exchange = yes

# SCGI port, used to communicate with Flood
scgi_port = 127.0.0.1:5000

# Check the hash after the end of the download
check_hash = yes

有几个需要特别关心的配置项:directory:默认下载目录。scgi_port:和Flood交换数据的端口。

然后中断输入rtorrent尝试运行。

rTorrent 基本操作:

回车:输入种子路径,添加新种子

上下方向键:选择列表中的种子

选中一个列表中的种子后:

Ctrl+S 激活,开始下载

Ctrl+O 设置下载路径(仅能给未激活的种子)

Ctrl+D 停止下载。如果已经停止,再按组合键则删除种子

Ctrl+Q 退出

安装使用 screen

因为rTorrent为用户提供一个交互式的文字界面,所以可以用screen工具让rTorrent跑在后台,不会因为ssh下线而停止。

sudo apt-get install screen

screen 基本操作:

screen -S xxx 创建名为 xxx 的新窗口

screen -r xxx 进入名为 xxx 的窗口。如果只有一个窗口,则可以省略名字。

screen -d xxx 删除名为 xxx 的窗口

在窗口内,Ctrl+A+D 切出窗口(退出但后台运行);Ctrl+D 删除窗口(退出且后台不运行)

我还为screen设置了一些alias,就好用多了:

# 用户主目录下的 .bashrc 文件末尾添加
alias sr="screen -r" # 快速恢复窗口
alias sl="screen -ls" # 查看窗口

新建服务

为了防止服务器意外关机,将rTorrent做成服务,并设置开机运行。

sudo vim /etc/systemd/system/rtorrent.service

# 以下为服务配置
# ExecStartPre 考虑到开机重启的时候可能因为 rtorrent.lock 的缘故导致启动失败,应该先删除该文件
[Unit]
Description=rTorrent
After=network.target

[Service]
User=pi
Type=forking
KillMode=none
ExecStartPre=rm -f /home/pi/.rtorrent/session/rtorrent.lock
ExecStart=/usr/bin/screen -d -m -S rtorrent /usr/bin/rtorrent
ExecStop=/usr/bin/killall -9 /usr/bin/rtorrent
WorkingDirectory=/home/pi/bt/

[Install]
WantedBy=default.target

# 保存退出
sudo systemctl start rtorrent # 测试是否能正常运行
sudo systemctl enbale rtorrent # 设置开机启动

写这篇文章的时候刚好遇到学校宿舍停电检修,庆幸已经做成服务了:)

安装配置 Flood

安装 nodejs

Flood 是使用 NodeJS 编写的,所以要先安装 NodeJS 和 npm。

sudo apt-get install nodejs npm

npm 不走代理的话在国内下载速度实在感人,推荐使用淘宝的 cnpm。使用 npm 安装 cnpm,然后以后用到 npm 的地方全部可以用 cnpm 代替。不出意料的话也挺慢的,可以使用上面刚装好的 screen 让他自己在后台装着。。

screen -S cnpm
# 进入新窗口后输入
sudo npm install -g cnpm --registry=https://registry.npm.taobao.org
# 然后可以 Ctrl+A+D 去做别的事情了

安装 Flood

git clone https://github.com/jfurrow/flood.git
cd flood
cp config.template.js config.js #使配置文件生效
vim config.js
# 找到设置可访问主机列表的地方,把可访问ip改为0.0.0.0。这样才可以远程访问Flood
cnpm install #要很久
cnpm install -g node-gyp
cnpm run build # 要很久

做成服务

和 rTorrent 一样做成服务会方便很多:

sudo vim /etc/systemd/system/flood.service

#以下是服务配置文件
[Unit]
Description=floop
After=rtorrent.service

[Service]
User=pi
WorkingDirectory=/home/pi/flood/
ExecStart=/usr/local/bin/cnpm start
Restart=always
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=notell
Environment=NODE_ENV=production

[Install]
WantedBy=multi-user.target

# 保存退出

sudo systemctl start flood
sudo systemctl enable flood

记得将 Flood 的目录改成你的。

使用纯 Nginx 做下载目录索引和视频在线播放

资源是下载下来了,但是在服务器上,如果想看里面的视频还需要再下到自己电脑上。这里可以用 nginx 给下载目录做一个自动索引,再借助一些设置,使得点到 mp4 格式的视频时可以在线播放。

sudo vim /etc/nginx/nginx.conf

# 修改配置文件,添加两个server。思路是一个用来提供索引,一个用来提供视频内容。
http{
    # 8400 端口的服务器用来展示目录
    server{
        listen 8400;
        set $name 'http://pi.claws.top:8500';
        # 如果请求的是mp4文件,则发送一个带有video标签的网页。
        location ~\.mp4$ {
            default_type text/html;
            add_header Content-Type 'text/html; charset=utf-8';
            return 200 '<video controls><source src=\"$name$request_uri\"></video>';
        }
        location / {
            root /home/pi/cdn;
            autoindex on;
            autoindex_exact_size off;
            autoindex_format html;
            charset utf-8,gbk;
        }
    }
    # 8500 端口的服务器用来提供视频内容
    server{
        listen 8500;
        location / {
            root /home/pi/cdn;
        }
    }
}

回头有时间了准备专门写一个前端,然后把nginx自动索引的返回格式改成json就可以实现一个真正的视频站了。