Chạy một media server tại nhà thật tuyệt — cho đến khi ổ cứng của bạn đầy ắp những file Blu-ray remux 50GB và bạn nhận ra không có cách nào tự động chuyển đổi chúng. Đó là tình huống của tôi khoảng một năm trước. Tôi có một hệ thống Jellyfin với hàng trăm bộ phim và series, và NAS 8TB của tôi đã ở mức 80% dung lượng. Đó là lúc Tdarr xuất hiện.
Tdarr là một hệ thống chuyển đổi phân tán — quét thư viện media của bạn, áp dụng các plugin xử lý có thể cấu hình (H.265, AV1, chuẩn hóa âm thanh, trích xuất phụ đề), và quản lý toàn bộ pipeline trên nhiều worker node. Tôi đã chạy nó trong môi trường thực tế khoảng 10 tháng nay, kết quả luôn ổn định — đã thu hồi được hơn 2TB dung lượng mà không cần can thiệp thủ công.
Khởi động nhanh: Chạy Tdarr trong 5 phút
Bạn cần có Docker và Docker Compose. Dưới đây là cấu hình tối thiểu để khởi chạy Tdarr server cùng một worker cục bộ ngay lập tức.
Đầu tiên, tạo cấu trúc thư mục:
mkdir -p ~/tdarr/{server,configs,logs,transcode-cache}
Sau đó tạo file docker-compose.yml:
version: "3.8"
services:
tdarr:
image: ghcr.io/haveagitgat/tdarr:latest
container_name: tdarr
restart: unless-stopped
ports:
- 8265:8265 # Giao diện web
- 8266:8266 # Cổng server (các worker kết nối vào đây)
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Tokyo
- UMASK_SET=002
- serverIP=0.0.0.0
- serverPort=8266
- webUIPort=8265
- internalNode=true # Chạy một worker trên cùng container này
- internalNodeID=main-node
- internalNodeName=LocalNode
volumes:
- ~/tdarr/server:/app/server
- ~/tdarr/configs:/app/configs
- ~/tdarr/logs:/app/logs
- ~/tdarr/transcode-cache:/temp
- /path/to/your/media:/media:rw
docker compose up -d
# Giao diện web tại http://your-server-ip:8265
Mở UI và worker tích hợp (LocalNode) sẽ hiện trạng thái online trong vòng 30 giây. Vậy là xong — Tdarr đã chạy rồi.
Tìm hiểu sâu: Tdarr hoạt động như thế nào
Kiến trúc: Server + Node
Tdarr phân chia trách nhiệm rõ ràng:
- Server: Quét thư viện, duy trì cơ sở dữ liệu file và trạng thái xử lý của chúng, xếp hàng các công việc chuyển đổi.
- Node (Worker): Nhận công việc từ hàng đợi của server, chạy FFmpeg hoặc HandBrake, báo cáo kết quả lại.
Server và các node giao tiếp qua cổng server (mặc định là 8266). Node có thể chạy trên các máy hoàn toàn riêng biệt — NAS của bạn, một máy tính cũ, thậm chí Raspberry Pi cho các tác vụ CPU nhẹ.
Libraries và Flows
Sau khi đăng nhập, vào Libraries và thêm đường dẫn media của bạn. Tdarr quét đệ quy và xây dựng danh sách file với đầy đủ metadata codec từ mỗi container.
Sức mạnh thực sự nằm ở Flows — một trình chỉnh sửa pipeline dạng node, mỗi node thực hiện một việc: kiểm tra codec, kiểm tra độ phân giải, chạy FFmpeg, di chuyển file, gửi thông báo. Thư viện cộng đồng có hàng trăm flow xây dựng sẵn để bắt đầu.
Một flow chuyển đổi H.265 điển hình trông như thế này:
- Kiểm tra xem codec có KHÔNG PHẢI HEVC không → nếu đã là H.265, bỏ qua file
- Kiểm tra kích thước file > 500MB → bỏ qua file nhỏ không đáng xử lý
- Chạy FFmpeg với
-c:v libx265 -crf 22 -preset medium -c:a copy - Kiểm tra output nhỏ hơn input → nếu không, hoàn nguyên và đánh dấu là không đáng chuyển đổi
- Thay thế file gốc bằng phiên bản đã chuyển đổi
Các tham số FFmpeg tôi dùng cho H.265 với tất cả stream được giữ nguyên:
-c:v libx265 -crf 23 -preset slow -c:a copy -c:s copy -map 0
Sau khi gán flow cho thư viện, đặt node bắt đầu xử lý. Các file di chuyển qua các trạng thái: Not processed → Queued → Processing → Healthy.
Nâng cao: Node phân tán và chuyển đổi bằng GPU
Thêm worker node từ xa
Đây là nơi Tdarr thể hiện giá trị thực sự trong HomeLab. Tôi chạy một worker trên server chính và một worker khác trên chiếc PC gaming cũ vốn ngồi không phần lớn thời gian trong ngày.
Trên máy thứ hai, chỉ cần deploy image node:
version: "3.8"
services:
tdarr-node:
image: ghcr.io/haveagitgat/tdarr_node:latest
container_name: tdarr-node
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Tokyo
- nodeName=GamePC-Node
- serverIP=192.168.1.100 # IP của Tdarr server của bạn
- serverPort=8266
- transcodercputhreads=8
volumes:
- ~/tdarr-node/configs:/app/configs
- ~/tdarr-node/logs:/app/logs
- ~/tdarr-node/transcode-cache:/temp
- /media/library:/media:rw # Phải khớp với đường dẫn server sử dụng
Yêu cầu quan trọng: đường dẫn media phải có thể truy cập từ tất cả các node tại cùng một mount point. Tôi dùng NFS để mount share media của NAS trên mọi máy tại /media/library. Điều này giữ cho đường dẫn file của Tdarr nhất quán trên toàn cluster.
# Trên mỗi máy worker, mount NFS share
sudo mount -t nfs 192.168.1.50:/mnt/tank/media /media/library
# Để mount bền vững qua các lần khởi động lại, thêm vào /etc/fstab
192.168.1.50:/mnt/tank/media /media/library nfs defaults,_netdev 0 0
Chuyển đổi bằng GPU NVIDIA
Nếu server của bạn có GPU NVIDIA, bạn có thể tăng tốc đáng kể với NVENC. Cài đặt NVIDIA Container Toolkit trước:
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt update && sudo apt install -y nvidia-container-toolkit
sudo systemctl restart docker
Sau đó thêm quyền truy cập GPU vào service Tdarr trong compose:
services:
tdarr:
image: ghcr.io/haveagitgat/tdarr:latest
# ... cấu hình hiện tại ...
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
Trong Flow của bạn, chuyển sang các tham số NVENC:
# NVENC H.265 — nhanh hơn nhiều, file hơi lớn hơn so với CPU preset slow
-c:v hevc_nvenc -preset p4 -cq 24 -c:a copy -c:s copy -map 0
Chuyển đổi bằng GPU nhanh hơn CPU từ 5–10 lần với nội dung 1080p. Tôi dùng GPU cho các tập phim series (số lượng lớn, nhiều file nhỏ) và CPU preset slow cho phim điện ảnh khi chất lượng nén cao hơn đáng để chờ.
Mẹo thực tế từ kinh nghiệm chạy thực tế
Kiểm tra Flow trước khi xử lý hàng loạt
Luôn kiểm tra trên 3–5 file trước. Đặt thư viện ở chế độ thủ công, chọn vài file thử nghiệm và theo dõi transcode log cẩn thận. Xác nhận chất lượng output và kích thước file trước khi áp dụng flow cho toàn bộ thư viện.
Bảo vệ trước các lần chuyển đổi lỗi
Thêm một node kiểm tra kích thước ngay sau bước chuyển đổi FFmpeg:
- Nếu output > 95% kích thước input → hoàn nguyên về bản gốc, đánh dấu là không đáng chuyển đổi
- Nếu FFmpeg thoát với code khác 0 → Tdarr tự động hoàn nguyên file
Tdarr giữ nguyên file gốc cho đến khi xác nhận quá trình chuyển đổi thành công, nên rủi ro mất dữ liệu rất thấp — nhưng kiểm tra kích thước đó sẽ bắt được những trường hợp file thực sự to hơn sau khi chuyển đổi (điều này xảy ra nhiều hơn bạn nghĩ với các nguồn đã được nén sẵn).
Lên lịch chuyển đổi vào giờ rảnh
Các node có thể được tạm dừng và tiếp tục qua API. Tôi lên lịch với cron để tránh chiếm CPU ban ngày:
# Dừng node lúc 8 giờ sáng (bắt đầu giờ làm việc)
0 8 * * * curl -s -X POST "http://192.168.1.100:8265/api/v2/update-node" \
-H "Content-Type: application/json" \
-d '{"nodeID": "main-node", "paused": true}' > /dev/null
# Tiếp tục node lúc 10 giờ tối
0 22 * * * curl -s -X POST "http://192.168.1.100:8265/api/v2/update-node" \
-H "Content-Type: application/json" \
-d '{"nodeID": "main-node", "paused": false}' > /dev/null
Theo dõi dung lượng đĩa cache chuyển đổi
Volume /temp có thể đầy nhanh. Tdarr ghi toàn bộ file output vào đó trước khi thay thế bản gốc, nên với file 4K 20GB bạn cần hơn 20GB trống trong cache. Hãy phân bổ một phân vùng SSD riêng nếu có thể:
# Kiểm tra mức sử dụng cache
df -h ~/tdarr/transcode-cache
# Tdarr tự dọn dẹp sau khi hoàn thành, nhưng hãy dọn thủ công sau khi crash
find ~/tdarr/transcode-cache -name "*.tmp" -mtime +1 -delete
Cài đặt CRF thực sự hiệu quả
Sau nhiều tháng điều chỉnh, đây là những gì tôi đúc kết được:
- Anime / hoạt hình: CRF 20 — các vùng màu phẳng nén cực kỳ tốt với H.265
- Phim thực tế 1080p: CRF 23 — thường giảm 40–60% kích thước, chất lượng không phân biệt được
- 4K HDR: CRF 20 với
-x265-params hdr-opt=1:repeat-headers=1để bảo toàn metadata HDR - DVD rip cũ (480p): Bỏ qua — đã đủ nhỏ, không đáng tốn thời gian xử lý
Chạy Tdarr trên cấu hình phân tán thực sự đã thay đổi cách tôi quản lý lưu trữ. Việc cài đặt ban đầu chỉ mất khoảng 30 phút, nhưng một khi đã chạy thì bạn sẽ quên đi sự tồn tại của nó — nó lặng lẽ chuyển đổi file trong nền khi bạn ngủ. NAS 8TB trước đây ở mức 80% dung lượng của tôi giờ chỉ còn ở mức 55%, và thư viện vẫn tiếp tục lớn thêm. Loại tự động hóa “cài và quên” đó chính xác là điều làm cho HomeLab trở nên xứng đáng để xây dựng.

