Docker 真的是一個越用越上癮的應用,目前我在效能可以勝任的時候都會盡量 Docker 化

隨便亂搞一通,壞掉了就刪掉,重新再啓動一個容器又能繼續玩~

不會因為手賤搞砸了某東西就影響到整台機器的系統,備份跟搬家也是輕輕鬆鬆~

上次介紹的 Minflux + RSSHub 與 Caddy 反向代理搭配,可以很快搭出一套屬於你自己的 RSS 閱讀器

今天來介紹另外一種也是很夯的反向代理與負載平衡服務「Traefik」,特點是 Go 語言與 Docker 深度結合

這篇就來搭配使用搭建另外一套開源的 FreshRSS 閱讀器吧!

他就像一個交通警察在路口指揮交通~

如果你跑許多應用跟服務,Traefik 可以輕鬆的幫你管理網路應該怎麼走不塞車

而且 Traefik 可以做到類似熱插拔的功能,不需要關閉甚至重新啟動任何服務

只要新增新服務時候貼上對應標籤,Traefik 會自動接管並啓動,完全不影響內部其他服務

Traefik 設定與啓動

廢話不多說,在裝好 Docker 環境以後,我們就可以開始設定 Traefik

# 先在 Docker 內部建立一個專屬網路
$ docker network create reverse-proxy

接著建立安裝會需要用到的資料夾與 docker-compose 設定檔

# traefik 會放 docker-compose, certs 會放自動申請的 SSL 憑證
$ mkdir ~/traefik && mkdir ~/traefik/certs && cd ~/traefik
$ nano docker-compose.yml

拷貝以下內容,貼上後需要修改 16、25 行的 email 跟 volumes 的 certs 路徑,其他可以不用動,保存然後退出

 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
version: '3.3'

services:
    traefik:
      image: traefik
      container_name: traefik
      restart: always
      command:
          - "--api.insecure=true"
          - "--providers.docker=true"
          - "--providers.docker.exposedbydefault=false"
          - "--entrypoints.web.address=:80"
          - "--entrypoints.websecure.address=:443"
          - "--certificatesresolvers.myresolver.acme.httpchallenge=true"
          - "--certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web"
          - "[email protected]"
          - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
      ports:
          - "80:80"
          - "443:443"
          - "8080:8080"
      networks:
          - reverse-proxy
      volumes:
          - "/修改/路徑/traefik/certs:/letsencrypt"
          - "/var/run/docker.sock:/var/run/docker.sock:ro"

networks:
   reverse-proxy:
     external: true

接著就直接啓動

$ sudo docker-compose up -d

啓動後打開瀏覽器 IP:8080 就能看到 Traefik 管理後台

Traefik 啓動之後就可以暫時先不用管他了~

我們只要在後面新建服務時候加上 labes 標籤,Traefik 自動偵測就會接管並自動生效

所以我們下面開始準備 FreshRSS 的 docker compose 檔案設定

$ mkdir ~/freshrss && cd ~/freshrss
$ nano docker-compose.yml

拷貝以下內容,需要修改 34 行的 rss.example.com 為你的域名,保存退出

 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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
version: "3"

services:
    freshrss_postgresql:
      image: postgres
      restart: unless-stopped
      networks:
        - reverse-proxy
      volumes:
        - pgsql-data:/var/lib/postgresql/data
      environment:
        - POSTGRES_USER=freshrss
        - POSTGRES_PASSWORD=somepass9438
        - POSTGRES_DB=frssdb

    freshrss:
      image: freshrss/freshrss
      restart: unless-stopped
      networks:
        - reverse-proxy
      depends_on:
        - freshrss_postgresql
        - rsshub
      volumes:
        - freshrss-data:/var/www/FreshRSS/data
      environment:
        - CRON_MIN=20,50
        - TZ=Asia/Taipei
      labels:
        - "traefik.enable=true"
        - "traefik.port=80"
        - "traefik.frontend.headers.forceSTSHeader=true"
        - "traefik.frontend.headers.STSSeconds=31536000"
        - "traefik.http.routers.whoami.rule=Host(`rss.example.com`)"
        - "traefik.http.routers.whoami.entrypoints=websecure"
        - "traefik.http.routers.whoami.tls.certresolver=myresolver"
    
    rsshub:
        image: diygod/rsshub
        restart: unless-stopped
        networks:
          - reverse-proxy
        environment:
          NODE_ENV: production
          CACHE_TYPE: redis
          REDIS_URL: "redis://redis:6379/"
          PUPPETEER_WS_ENDPOINT: "ws://browserless:3000"
        depends_on:
          - redis
          - browserless
    
    browserless:
        image: browserless/chrome
        restart: unless-stopped
        networks:
          - reverse-proxy
    
    redis:
        image: redis:alpine
        restart: unless-stopped
        networks:
          - reverse-proxy
        volumes:
          - redis-data:/data

volumes:
   freshrss-data:
   pgsql-data:
   redis-data:

networks:
   reverse-proxy:
     external: true

如上面設定,看到了嗎?只需要在你想要開端口出來的應用加上你需要讓 Traefik 接管的服務 labels

接著我們只要啓動這個 docker compose 以後,Traefik 就會自動偵測到然後開始工作囉!

友情提示:在正式啓動以前,記得先去打開本機的防火牆端口,80 跟 443 都要打開

$ docker-compose up -d

以上指令輸入完畢後,第一次啓動需要一點時間,大約幾十秒到幾分鐘

因為 Traefik 正在幫你跟 Let’s Encrypt 申請 SSL 憑證跟驗證 SSL 憑證

稍等片刻後使用瀏覽器 https 打開你的網址即可連到你內部設定的 FreshRSS 80 端口囉!

更棒的是,Traefik 也跟 Caddy 一樣會幫你自動維護 SSL 憑證,無需再去煩惱三個月要過期的事情了~

最近在測試三種不同 RSS 自架服務,分別是 TTRSS、Miniflux 跟今天的 FreshRSS

TTRSS 開發活躍,外掛功能最多,但整體比較臃腫

Miniflux 開發不疾不徐,大約兩、三個月更新一次,總體簡約輕盈,基本功能都有,能滿足普通日常需求

FreshRSS 開發也是蠻活躍,功能跟外掛輸 TTRSS,但是數量多過 Miniflux

我三款都有測試過一段時間,FreshRSS 對於 RSS 寫法似乎要求很嚴格,某些網站如果輸出不是很標準

FreshRSS 會直接顯示 error,但是同樣的訂閱地址拿去 TTRSS 跟 Miniflux 卻沒問題

另外值得一提的是 Reeder 支援直接吃 FreshRSS 的 API,其他 TTRSS 跟 Miniflux 都需要啟用 Fever API 才行