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:
- 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 +).
- Chọn nhà cung cấp của bạn — có thể là indexer Usenet như Newznab/NinjaCentral hoặc torrent tracker như 1337x.
- Nhập passkey hoặc API token của bạn, sau đó nhấp vào Test.
- 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:
- Đi tới Settings > Apps và nhấp vào nút dấu +.
- Chọn ứng dụng đích của bạn (ví dụ: Sonarr hoặc Radarr).
- Đặ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.
- Đặt Prowlarr Server thành
http://prowlarr:9696. Vì cả hai container cùng thuộc bridge networkmedia-network, DNS nội bộ của Docker sẽ phân giải hostname này một cách trực tiếp. - Đặt Radarr/Sonarr Server thành URI của container đó (ví dụ:
http://sonarr:8989). - Trong Sonarr hoặc Radarr, sao chép API key tại Settings > General > Security > API Key rồi dán vào Prowlarr.
- 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.

