Triển khai Prowlarr trên Docker: Quản lý Indexer tập trung và tự động đồng bộ cho media stack HomeLab

HomeLab tutorial - IT technology blog
HomeLab tutorial - IT technology blog

Bối cảnh & Lý do: Loại bỏ tình trạng phân mảnh Indexer trong HomeLab

Việc vận hành một máy chủ media tự lưu trữ (self-hosted) thường bắt đầu khá đơn giản. Bạn cài đặt Jellyfin, thêm Sonarr để quản lý phim bộ, rồi triển khai Radarr cho phim lẻ. Chẳng bao lâu sau, bạn tiếp tục cài Lidarr cho âm nhạc và Bazarr cho phụ đề. Đó cũng là lúc việc bảo trì tracker biến thành một cơn ác mộng tốn thời gian.

Giả sử bạn thêm năm indexer trên bốn ứng dụng dòng *arr khác nhau. Điều đó đồng nghĩa với việc bạn phải nhập API key, tinh chỉnh rate limit và chọn category ID tới 20 lần riêng biệt. Mỗi khi một private tracker đổi tên miền hoặc kích hoạt thử thách xác thực từ Cloudflare, bạn lại phải lặp lại chính xác các thao tác tẻ nhạt đó trên từng dashboard một.

Prowlarr ra đời để giải quyết triệt để rắc rối này. Đóng vai trò là một proxy trung tâm và trung tâm cấu hình, nó đứng độc lập giữa các indexer và các dịch vụ hạ tầng của bạn. Bạn chỉ cần khai báo tracker một lần duy nhất trong Prowlarr. Chỉ vài giây sau, Prowlarr sẽ tự động đẩy cấu hình đó sang Sonarr, Radarr và Lidarr thông qua REST API của chúng. Khi một indexer bị lỗi hoặc cập nhật thông tin, bạn chỉ cần xử lý tại một nơi duy nhất. Xong.

Cài đặt: Triển khai Prowlarr bằng Docker Compose

Đóng gói Prowlarr trong container giúp hệ thống máy chủ luôn gọn gàng và đơn giản hóa việc chuyển đổi hạ tầng sau này. Chúng ta sẽ sử dụng image của LinuxServer.io trên một Docker bridge network tùy chỉnh để Prowlarr có thể giao tiếp trực tiếp với các dịch vụ khác thông qua container name.

1. Chuẩn bị cấu trúc thư mục và mạng

Tạo thư mục chứa cơ sở dữ liệu SQLite và các file cấu hình của Prowlarr, sau đó kiểm tra UID và GID của user hiện tại để tránh lỗi phân quyền với Docker volume:

# Tạo thư mục lưu trữ dữ liệu cấu hình persistent
mkdir -p ~/homelab/prowlarr/config
cd ~/homelab/prowlarr

# Kiểm tra user ID và group ID hiện tại của bạn
id
# Đầu ra mẫu: uid=1000(homelab) gid=1000(homelab)

# Tạo shared bridge network nếu chưa tồn tại
docker network create media-network 2>/dev/null || true

2. Khai báo file cấu hình Docker Compose

Tạo file docker-compose.yml trong thư mục của bạn:

services:
  prowlarr:
    image: lscr.io/linuxserver/prowlarr:latest
    container_name: prowlarr
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=America/New_York
    volumes:
      - ./config:/config
    ports:
      - "9696:9696"
    networks:
      - media-network
    restart: unless-stopped

networks:
  media-network:
    external: true

3. Khởi chạy Container

Khởi chạy stack ở chế độ chạy nền và theo dõi log khởi tạo:

docker compose up -d

# Theo dõi log khởi động để kiểm tra quá trình khởi tạo schema cơ sở dữ liệu
docker compose logs -f prowlarr

Hãy chú ý đến dòng thông báo Listening on http://0.0.0.0:9696/. Khi container đã sẵn sàng, hãy truy cập http://<your-server-ip>:9696 trên trình duyệt của bạn.

Cấu hình: Indexer, FlareSolverr và Tự động đồng bộ

1. Thêm và kiểm tra Indexer đầu tiên

Trong dashboard của Prowlarr:

  1. Nhấp vào Indexers ở thanh điều hướng bên trái, sau đó chọn Add Indexer (biểu tượng dấu +).
  2. Chọn nhà cung cấp của bạn — có thể là indexer Usenet như Newznab/NinjaCentral hoặc torrent tracker như 1337x.
  3. Nhập passkey hoặc API token của bạn, sau đó nhấp vào Test.
  4. Dấu tích màu xanh lá cây xuất hiện nghĩa là Prowlarr đã kết nối thành công, xác thực endpoint và nhận diện đầy đủ các tính năng hỗ trợ. Nhấp Save.

2. Vượt qua thử thách Cloudflare bằng FlareSolverr

Các public torrent tracker thường áp dụng Cloudflare Turnstile hoặc thử thách JavaScript khiến các request curl tự động bị từ chối. FlareSolverr khắc phục điều này bằng cách khởi chạy một trình duyệt Chromium headless để tự động giải thử thách và gửi lại session cookie hợp lệ. Hãy thêm trực tiếp dịch vụ này vào file docker-compose.yml của bạn:

  flaresolverr:
    image: ghcr.io/flaresolverr/flaresolverr:latest
    container_name: flaresolverr
    environment:
      - LOG_LEVEL=info
      - TZ=America/New_York
    ports:
      - "8191:8191"
    networks:
      - media-network
    restart: unless-stopped

Chạy lệnh docker compose up -d để khởi chạy container. Trong Prowlarr, chuyển đến Settings > Indexers, nhấn dấu + tại mục Proxies và chọn FlareSolverr. Đặt host thành http://flaresolverr:8191 với timeout là 60 giây, sau đó lưu lại. Giờ đây Prowlarr sẽ tự động định tuyến các thử thách chống bot qua FlareSolverr.

3. Kết nối các ứng dụng hạ tầng qua API

Đây chính là nơi giá trị của tự động hóa được phát huy tối đa. Thay vì cấu hình từng công cụ dòng *arr một cách thủ công, hãy liên kết chúng với Prowlarr:

  1. Đi tới Settings > Apps và nhấp vào nút dấu +.
  2. Chọn ứng dụng đích của bạn (ví dụ: Sonarr hoặc Radarr).
  3. Đặt Sync Level thành Full Sync. Khi kích hoạt tùy chọn này, Prowlarr sẽ quản lý toàn bộ vòng đời của các indexer — tự động thêm mới, cập nhật định nghĩa và xóa bỏ các tracker không còn hoạt động.
  4. Đặt Prowlarr Server thành http://prowlarr:9696. Vì cả hai container cùng thuộc bridge network media-network, DNS nội bộ của Docker sẽ phân giải hostname này một cách trực tiếp.
  5. Đặt Radarr/Sonarr Server thành URI của container đó (ví dụ: http://sonarr:8989).
  6. Trong Sonarr hoặc Radarr, sao chép API key tại Settings > General > Security > API Key rồi dán vào Prowlarr.
  7. Nhấp Test. Khi hệ thống xác nhận kết nối thành công, hãy nhấn Save.

Chuyển sang Sonarr hoặc Radarr và kiểm tra mục Settings > Indexers. Danh sách tracker của bạn sẽ hiển thị ngay lập tức, đi kèm biểu tượng ổ khóa đánh dấu rằng chúng đang được quản lý tập trung bởi Prowlarr.

Kiểm thử & Giám sát: Health Check và Hiệu năng truy vấn

1. Kiểm tra trạng thái đồng bộ hạ tầng

Kích hoạt quá trình đồng bộ thủ công để đảm bảo Prowlarr và các ứng dụng hạ tầng liên lạc thông suốt với nhau. Điều hướng đến System > Tasks, sau đó nhấn vào nút chạy bên cạnh Application Indexer Sync. Theo dõi kết quả xuất ra từ terminal của bạn:

# Kiểm tra log ứng dụng trong quá trình đồng bộ
docker exec -it prowlarr tail -n 50 /config/logs/prowlarr.txt

Tìm dòng [Info] Radarr: Updating indexers và xác nhận rằng mọi định nghĩa indexer đều được đồng bộ thành công mà không gặp lỗi HTTP 401 hoặc 403.

2. Giám sát độ trễ và sự cố kết nối Tracker

Prowlarr chủ động giám sát hiệu năng của từng provider đã kết nối. Nhờ đó, bạn có thể phát hiện các tracker gặp sự cố trước khi chúng làm gián đoạn quy trình tải nội dung tự động:

  • System > Status: Cảnh báo các indexer bị chạm ngưỡng rate limit HTTP 429, timeout khi tra cứu DNS, hoặc bị ngắt kết nối liên tiếp.
  • System > Logs: Hiển thị raw payload và dữ liệu debug mỗi khi một truy vấn API thất bại.
  • Tab History: Thống kê chi tiết thời gian phản hồi truy vấn (ví dụ: 280ms đối với private tracker so với 2400ms đối với các trang công cộng đang quá tải) và hiển thị số lượng bản ghi hợp lệ mà mỗi indexer trả về.

3. Thiết lập Health Check tự động cho Docker Container

Thêm cấu hình health check gốc để đảm bảo Docker tự động khởi động lại container nếu runtime Mono/.NET bị treo:

    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9696/ping"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

Chạy lại lệnh docker compose up -d để áp dụng health check. Giờ đây, media stack của bạn đã có một nguồn dữ liệu duy nhất, ổn định và đáng tin cậy cho mọi truy vấn nội dung — giải phóng bạn khỏi vô số tác vụ bảo trì thủ công trên nhiều dashboard khác nhau.

Share: