Contents

2023年樹莓派重裝 Flexget

最近動物機需要重裝,每次都需要重新設定,而且新的官方設定也會有所變動。因此,我在這裡做了一個簡單的紀錄。
我要有幾個需求

  1. BT下載機
  2. 外接 USB 硬碟
  3. 自動抓取番劇
  4. 線上 Web 存取檔案

我使用 Raspberry Pi 1 來完成這些任務。目前看來,Pi 1 能夠順利完成這些任務。之後我計劃將它放在朋友家,用於網路掛機。

切割磁區和掛載磁區

首先,我們需要查看當前的磁區狀態。這可以通過執行以下命令來完成:

1
sudo fdisk -l

執行上述命令後,你將看到類似以下的輸出:
https://user-images.githubusercontent.com/6058558/226114044-4ee5992f-5d19-4ae5-b9b2-0241a73c3702.png

接著,我們將使用以下命令來格式化我們的磁區:

1
sudo mkfs -t ext4 /dev/sda1

我們需要創建一個掛載磁區。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 我們需要創建一個掛載點
sudo mkdir -p /media/extHDD
# 我們將磁區掛載到我們剛剛建立的掛載點
sudo mount  /dev/sda1 /media/extHDD
# 找出我們的磁區的UUID
sudo blkid
#/dev/sda1: UUID="4411c5bb-2392-45d8-a7ba-7b40275a84fd" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="42f5e0d3-01"
在/etc/fstab加下面設定
UUID="4411c5bb-2392-45d8-a7ba-7b40275a84fd" /media/extHDD ext4 rw,defaults,nofail 0 0 
# 確認/etc/fstab 設定無錯誤
mount -a
#可用 df -mh 確認裝置是否有掛載

安裝 tranmission

1
2
sudo apt update
sudo apt-get install transmission-daemon

如果你需要更詳細的設定步驟,你可以參考以下的教學文章:
How to set up transmission-daemon on a Raspberry Pi and control it via web interface - Linux Tutorials - Learn Linux Configuration

安裝 flexget

我已經寫過很多次在樹莓派安裝 Flexget 的教學,無意間發現官方文件有更新,這次我決定按照官方的教學來操作。

官方文件看到

There may be better options for some of the steps, but this works (2022) well.

這個真的很好笑,可能後面幾年就不能跑了。

1
2
3
4
# Python3
sudo apt install python3-full libpython3-dev
# 我是無法抓 官方寫 Install distutils (necessary?)
# sudo apt install distutils

接著,我們需要下載並安裝 pip:

1
2
3
cd /tmp
wget https://bootstrap.pypa.io/get-pip.py
sudo python3 get-pip.py

然後,我們需要設定 pipx:

1
2
3
python3 -m pip install --user pipx
~/.local/bin/pipx ensurepath
source ~/.bashrc

接下來,我們可以下載並安裝 Flexget:

1
~/.local/bin/pipx install flexget

注意,如果你需要使用 transmission-rpc,你需要執行以下的命令:

1
 pipx inject flexget  "transmission-rpc>=3.0.0,<4.0.0"

接著,我們需要設定 Flexget 在系統開機時自動啟動。你可以參考 Flexget 的官方教學 來進行設定。

1
@reboot /usr/local/bin/flexget daemon start -d

注意,你需要將上述命令中的 /usr/local/bin/flexget 替換為你的 Flexget 的實際路徑。如果你不確定 Flexget 的路徑,你可以使用 which flexget 命令來查詢

1
/home/pi/.local/bin/flexget

最後,我們需要設定 Flexget 的密碼:

1
flexget web passwd <some_password>

設定完成後,你可以透過 http://pi1.local:5050 來登入 Flexget 的網頁介面。

以下是我個人的 Flexget 設定檔範例,你可以參考並根據你的需求進行修改:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
web_server: yes

templates:
  default:
    transmission:
      host: 127.0.0.1 
      port: 9091
      username: admin
      password: admin
      add_paused: no
      path: /media/extHDD/Download/TV/{{task}}
    free_space:
      path: /media/extHDD/
      space: 2000
    from_transmission:
      host: 127.0.0.1 
      port: 9091
      username: admin
      password: admin
      only_complete: yes
    if:
      - "'季度全集' in category": reject

tasks:
  "TV-Re: 從零開始的異世界生活 第二季":
    rss:
      url: https://share.dmhy.org/topics/rss/sort_id/2/rss.xml?keyword=%E7%95%B0%E4%B8%96%E7%95%8C%E7%94%9F%E6%B4%BB+team_id%3A604+BIG5+1080+25
      other_fields: [category]
    accept_all: yes
    template: default
    transmission:
      path: /media/extHDD/Download/TV/202007/{{task[3:]}}

  "TV-英雄王 為了窮盡武道而轉生 而後成為世界最強見習騎士":
    rss:
      url: https://share.acgnx.se/rss-sort-1.xml?keyword=%E8%8B%B1%E9%9B%84%E7%8E%8B+%E6%84%9B%E6%88%80
      other_fields: [category]
    accept_all: yes
    template: default
    transmission:
      path: /media/extHDD/Download/TV/202211/{{task[3:]}}

schedules:
  - tasks: "TV-*"
    schedule:
      day_of_week: mon,tue,wed,thu,fri,sat,sun
      hour: "4,6,8,11,13,15,17,20"
      jitter: 60

另外,我也學會了如何使用 crontab 來設定系統開機時自動啟動 Flexget。

Info
malagege/flexget - Docker Image | Docker Hub 自己參照官方 Dockerfile 產生的,但後來就沒使用,有興趣的人可以用用看。
Info
pipx 第一次安裝,不需要 root 權限就能使用。但做依賴安裝需要搭配 pipx inject 指令去做調整,真的是滿有趣東西。
Warning

我想,您或許會很好奇,咦!那麼通常一般的主機會有多少個 port 呢?!正常來說,所有的 port 是由 1 ~ 65535 這麼多個啦!好啦,那麼在這些 port 上面有沒有保留給系統使用的呢!?是有的!一般而言,只有 root 才可以啟用 1 ~ 1023 以內的 port ,這些 port 就是特殊的埠口,是保留給系統來使用的!至於大於 1024 以上的 port 除了給系統隨機取用來作為連線的需求之外,也可以用來作為服務的 LISTEN 之用。舉例來說,如果您覺得 0~1023 的 port 需要以 root 的身份來啟動,這樣如果該 port 的程序被入侵了,那麼入侵者將擁有 root 的權限,這實在很危險~所以,這個時候您可以以一般身份帳號並使用大於 1024 以上的 port 來啟用某些服務呢!例如 FTP 的 port 預設為 21 ,您也可以將 FTP 以 10021 的 port number 來啟動,並且使用一般身份的帳號來啟用這個 FTP 的服務,會比較安全一點。不過,這樣一來會造成 client 端的困擾,因為一般 FTP Client 軟體都是預設以連接到主機的 port 21 來進行連線的,現在您的主機 FTP 改成 10021 了,除非您的 Client 知道這個設定值,否則 Client 軟體就無法連線成功了。
可以參考: 鳥哥的 Linux 私房菜 – 限制 Linux 對外的埠口 port limit

我這邊在想奇怪一般使用者怎麼能開 port,原來超過1024就不需要 root 權限,這邊不知道 Windows 也是不是這樣?

安裝 docker

Warning
這邊我是為了用 Caddy Server,所以才安裝 Docker,如果你沒有要使用的話可以不用安裝。

Install Docker Engine on Debian

一代機裝完遇到問題,顯示錯誤docker.service: Failed with result 'core-dump'.

arm - Docker ‘core-dump’ error when starting service - Raspberry Pi Stack Exchange

還遇到載不到deb套件。這邊更改DNS就能抓到package,這邊真的很奇怪。

我們將使用官方提供的 shell 腳本來安裝 Docker。在安裝之前,我們需要先修改 DNS 設定:

Warning
假如你網路沒問題,可以跳過設定 DNS。
1
2
3
4
5
vi /etc/resolv.conf
# 第一個設定改成 8.8.8.8 ,後續再改回來
# Generated by resolvconf
nameserver 8.8.8.8 # 192.168.1.203 <--這是我的舊的設定
nameserver 192.168.1.1

接著,我們可以執行以下的命令來安裝 Docker:

1
curl https://get.docker.com | sh

安裝完成後,我們需要將使用者加入 docker 群組,以便使用者可以直接執行 Docker 命令:

1
sudo usermod -G docker -a <username>

請將 <username> 替換為你的使用者名稱。

Caddy Server

Caddy Server 可以讓我們方便地透過網頁介面瀏覽影片。Caddy Server 不會有亂碼問題,而且使用起來也更為方便。

Tip
這邊我用 Docker 啟動 Apache 看檔案目錄會亂碼,所以我才使用 Caddy Server,測試使用發現不會亂馬。

首先,我們需要創建一個新的目錄來存放 Caddy Server 的相關檔案:

1
2
mkdir CaddyServer
cd CaddyServer

接著,我們需要創建一個名為 Caddyfile 的設定檔,並填入以下的內容:

1
2
3
4
5
6
http://:80
root * /srv/
file_server browse
basicauth  {
    user _hashpassword_
}

其中的 _hashpassword_ 需要替換為你的密碼的雜湊值。你可以使用以下的命令來產生雜湊值:

1
caddy hash-password --plaintext <password>

請將 <password> 替換為你的密碼。

然後,我們需要創建一個名為 docker-compose.yml 的 Docker Compose 設定檔,並填入以下的內容:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
version: '3'
services:
  caddy:
    image: arm32v6/caddy
    restart: unless-stopped
    ports:
      - "80:80"
    volumes:
      - /media/extHDD/:/srv
      - $PWD/Caddyfile:/etc/caddy/Caddyfile

最後,我們可以使用以下的命令來啟動 Caddy Server:

1
docker compose up -d

完成以上的步驟後,你就可以透過網頁介面來瀏覽你的影片了。

反向代理設定調整

最後把 Caddyfile 做反向代理,這邊研究很久特別紀錄一下。方便用 80 port也能連 flexget。

Danger
這邊為什麼我設定 80 port,正常對外網路應該要用 443 port。主要這個服務要用在我和我朋友家,我朋友因為從事網路工作,說正常 https 是防止周邊設備網路竊取,我這邊有提 ISP 外面路由可能會竊取封包問題,他說正常他們不太可能會做這些事情,因為進去設備他們都要送什麼簽核單之類的,正常不會有人做擷取動作,這邊就不使用 https。(反正也沒有很重要資料)

設定檔需要設定 base_url為 flexget,因為這邊反向代理http://xxxx/flexget/

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
web_server:
  base_url: flexget

templates:
  default:
    transmission:
      host: 127.0.0.1 
      port: 9091
      username: admin
      password: admin
      add_paused: no
      path: /media/extHDD/Download/TV/{{task}}
    free_space:
      path: /media/extHDD/
      space: 2000
    from_transmission:
      host: 127.0.0.1 
      port: 9091
      username: admin
      password: admin
      only_complete: yes
    if:
      - "'季度全集' in category": reject

tasks:
  "TV-Re: 從零開始的異世界生活 第二季":
    rss:
      url: https://share.dmhy.org/topics/rss/sort_id/2/rss.xml?keyword=%E7%95%B0%E4%B8%96%E7%95%8C%E7%94%9F%E6%B4%BB+team_id%3A604+BIG5+1080+25
      other_fields: [category]
    accept_all: yes
    template: default
    transmission:
      path: /media/extHDD/Download/TV/202007/{{task[3:]}}

  "TV-英雄王,為了窮盡武道而轉生~而後成為世界最強見習騎士♀~":
    rss:
      url: https://share.acgnx.se/rss-sort-1.xml?keyword=%E7%82%BA%E4%BA%86%E7%AA%AE%E7%9B%A1%E6%AD%A6%E9%81%93%E8%80%8C%E8%BD%89%E7%94%9F+%E6%84%9B%E6%88%80+%E7%B9%81
      other_fields: [category]
    accept_all: yes
    template: default
    transmission:
      path: /media/extHDD/Download/TV/202211/{{task[3:]}}

schedules:
  - tasks: "TV-*"
    schedule:
      day_of_week: mon,tue,wed,thu,fri,sat,sun
      hour: "4,6,8,11,13,15,17,20"
      jitter: 60

Caddyfile

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
http://:80

root * /srv/
file_server browse
basicauth  {
    user $2a$14$
}

handle_path /flexget/* {
    rewrite * /flexget{path}
    reverse_proxy host.docker.internal:5050
}

docker-compose.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
version: '3'
services:
  caddy:
    image: arm32v6/caddy
    restart: unless-stopped
    extra_hosts:
      - "host.docker.internal:host-gateway"
    ports:
      - "80:80"
    volumes:
      - /media/extHDD/:/srv
      - $PWD/Caddyfile:/etc/caddy/Caddyfile