Cài Jellyfin trên VPS bằng Docker để stream media
Dựng Jellyfin trên VPS bằng Docker với compose 15 dòng, block storage và quyền file đúng. Biết khi nào direct play đủ dùng, khi nào CPU transcoding quá tải.
Bạn sẽ xây dựng gì
Một media server Jellyfin trên VPS: một container, ba volume và một disk block storage chứa phim và chương trình của bạn, có thể truy cập từ mọi browser hoặc Jellyfin app. Việc cài đặt chỉ cần một file compose gồm 15 dòng. Mọi lỗi phát sinh sau đó đều đến từ 2 nguyên nhân: container không thể đọc file do quyền truy cập, và bạn yêu cầu một VPS không có GPU transcode video dù phần cứng này không phù hợp cho việc đó. Phần lớn nội dung của guide tập trung vào 2 vấn đề này, vì đây là nguyên nhân của hầu hết support ticket.
Jellyfin miễn phí và hoàn toàn open source, không yêu cầu account, không có tính năng thu phí và không thu thập telemetry. Vì vậy, Jellyfin gần như luôn xuất hiện trong các danh sách những thứ đáng tự host trong năm 2026. Jellyfin phát media mà bạn sở hữu. Jellyfin không cung cấp content, và guide này không hướng dẫn cách có được content đó.
Thực tế về transcoding trước khi thuê bất kỳ thứ gì
Đọc phần này trước, vì nó quyết định bạn nên mua gì. Media server thực hiện một trong hai việc khi bạn nhấn phát. Direct play phát file nguyên trạng: VPS đọc các byte từ disk rồi đẩy chúng qua network, gần như không tốn CPU. Transcoding mã hóa lại video ngay khi phát, chẳng hạn đổi độ phân giải, codec hoặc chèn cứng phụ đề; đây hoàn toàn là công việc của CPU.
VPS thông thường không có GPU. Vì vậy, mọi video transcode đều chạy trên CPU bằng libx264/libx265, và software encoding rất tốn tài nguyên. Một lần transcode H.264 1080p có thể làm bão hòa vài vCPU dùng chung; transcode 4K hoặc HEVC thường không theo kịp thời gian thực, khiến playback bị dừng và buffer liên tục. Hardware transcoding, yếu tố giúp việc này trở nên rẻ trên máy gia đình có Intel iGPU hoặc card Nvidia, đơn giản là không khả dụng trừ khi provider cho thuê GPU instance.
Vì vậy, chiến lược trên VPS là: tránh transcoding. Giữ thư viện ở các codec mà client có thể phát native: video H.264, audio AAC hoặc AC3, trong container MP4 hoặc MKV. Chọn các client app hỗ trợ direct play: native Jellyfin app cho Android TV, iOS và Roku, cùng với Infuse, Kodi và Jellyfin Media Player trên desktop. Khi làm vậy, VPS không phải chạy ffmpeg transcode trong lúc playback, và một máy 2 vCPU vừa phải có thể stream cho nhiều người cùng lúc. Nếu dự định transcode, bạn sẽ cần máy lớn hơn và đắt hơn nhiều; ngay cả khi đó, 4K vẫn là lựa chọn không thực tế.
Bạn cũng cần tính bandwidth, vì đây là bất ngờ còn lại. Direct play gửi file ở đúng bitrate của file. File 1080p đã nén thường dùng 8-12 Mbps; 1080p Blu-ray remux dùng 20-30 Mbps; 4K HDR dùng 40-80 Mbps. Ba người direct-play các file 10 Mbps sẽ tiêu thụ 30 Mbps upload liên tục từ VPS. Kiểm tra 2 thông số trong gói dịch vụ: tốc độ port (có thể đẩy 30 Mbps upstream không?) và giới hạn transfer hàng tháng. Một bộ phim dài 2 giờ ở mức 10 Mbps tạo khoảng 9 GB traffic đi ra, nên hạn mức 1 TB/tháng có tính phí chỉ đủ cho hơn 100 bộ phim như vậy mỗi tháng, tương đương 3 hoặc 4 bộ phim mỗi ngày. Một hộ gia đình xem 4K, với bitrate cao gấp 4 đến 8 lần, sẽ tiêu hết hạn mức nhanh hơn nhiều. Tính cả mọi traffic khác đi ra từ cùng máy vào cùng ngân sách đó, bao gồm một RustDesk relay tự host, vốn truyền toàn bộ phiên remote desktop mỗi khi 2 peer không thể kết nối trực tiếp.
Điều kiện cần
- Một KVM VPS Ubuntu 24.04 mới với quyền root hoặc sudo, đã cài Docker và Compose plugin.
- Một volume block storage dành cho media, có dung lượng phù hợp với thư viện của bạn (xem phần ước tính dung lượng bên dưới). Đĩa root nhỏ đi kèm VPS không phải nơi để lưu phim.
- Một domain nếu bạn muốn public HTTPS, hoặc WireGuard VPN trên cùng VPS nếu bạn muốn giữ toàn bộ hệ thống ở chế độ private.
- Media mà bạn có quyền stream hợp pháp, gồm các bản rip của chính bạn, bản ghi của chính bạn và các file thuộc quyền sở hữu của bạn.
Gắn block storage trước
Attach volume trong panel của provider, sau đó tìm và mount volume đó. Lấy tên device từ lsblk; tên này sẽ có dạng /dev/sdb hoặc /dev/vdb, không bao giờ là root disk.
lsblk
sudo mkfs.ext4 /dev/sdb # ONLY on a new, empty volume: this ERASES it
sudo mkdir -p /mnt/media
sudo blkid /dev/sdb # copy the UUID shown for this deviceMount theo UUID, không dùng /dev/sdb, vì thứ tự device letter có thể thay đổi sau mỗi lần reboot và bạn có thể format hoặc mount nhầm disk. Thêm một dòng vào /etc/fstab:
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /mnt/media ext4 defaults,nofail 0 2sudo mount -a
df -h /mnt/medianofail rất quan trọng: nếu block volume bị detach, máy sẽ không boot được và chuyển vào emergency shell. Sai lầm nghiêm trọng nhất ở bước này là chạy mkfs.ext4 trên volume đã có dữ liệu, vì lệnh đó sẽ xóa toàn bộ dữ liệu. Chỉ format volume mới. Nếu disk đã chứa library của bạn, bỏ qua bước đó và chuyển thẳng đến dòng fstab.
Sắp xếp media theo cấu trúc Jellyfin yêu cầu
Jellyfin đối chiếu metadata dựa trên tên thư mục và tên file. Nếu cấu trúc không đúng, phim sẽ xuất hiện dưới dạng file không có tên và poster, hoặc tập phim bị ghép nhầm series. 4 quy ước này xử lý gần như toàn bộ việc đó: mỗi phim nằm trong một thư mục riêng và có filename tương ứng, được đặt tên theo dạng Name (Year) (Jellyfin xem năm là tùy chọn, nhưng có năm giúp việc đối chiếu chính xác hơn nhiều); thư mục season được đặt tên theo dạng Season 01, không phải S01; file tập phim dùng dạng S01E01; còn special được đặt trong Season 00.
/mnt/media
├── Movies
│ ├── Blade Runner (1982)
│ │ └── Blade Runner (1982).mkv
│ └── Arrival (2016)
│ └── Arrival (2016).mkv
└── Shows
└── Severance (2022)
├── Season 01
│ ├── Severance - S01E01.mkv
│ └── Severance - S01E02.mkv
└── Season 00
└── Severance - The Lexington Letter.mkv(Year) trong tên phim không phải phần trang trí. Nó giúp phân biệt các bản làm lại để bộ đối chiếu chọn đúng tựa phim. Giữ Movies và Shows trong các thư mục cấp cao nhất riêng biệt, vì mỗi thư mục sẽ trở thành một Jellyfin library cho một loại nội dung cụ thể. Trộn chúng với nhau sẽ làm provider metadata đối chiếu sai. Jellyfin vẫn có thể index thêm một thư mục ảnh thứ ba, nhưng trải nghiệm này hạn chế hơn so với một photo server chuyên dụng. Vì vậy, nếu album ảnh quan trọng với bạn, hãy dùng một máy riêng chạy PhotoPrism hoặc Immich và để máy này chỉ phục vụ phim và TV.
Quyền: nguyên nhân hàng đầu khiến thư viện không có dữ liệu
Đây là hiểu lầm khiến nhiều người mất cả buổi tối. Image jellyfin/jellyfin chính thức không dùng các biến môi trường PUID/PGID; các biến này thuộc image của LinuxServer.io (lscr.io/linuxserver/jellyfin). Với image chính thức, bạn chỉ định user bằng khóa user: trong compose. Nếu bỏ qua khóa này, container sẽ chạy dưới quyền root. Dù dùng cách nào, nguyên tắc vẫn giống nhau: uid/gid mà container chạy dưới đó phải có quyền đọc và traverse mọi thư mục media.
Chúng ta sẽ chạy dưới uid/gid 1000, là user không phải root đầu tiên trên một máy Ubuntu mặc định. Hãy xác nhận uid/gid của bạn rồi đặt owner:
id # confirm your user is uid=1000 gid=1000
sudo chown -R 1000:1000 /mnt/media
sudo find /mnt/media -type d -exec chmod 755 {} \;
sudo find /mnt/media -type f -exec chmod 644 {} \;
mkdir -p ~/jellyfin/config ~/jellyfin/cache
sudo chown -R 1000:1000 ~/jellyfinThư mục cần có bit execute (bit x trong 755), không chỉ quyền đọc. Nếu thiếu bit này, container không thể vào thư mục dù vẫn có thể liệt kê tên thư mục. Lỗi khiến cả thư viện không có dữ liệu thường nằm ở thư mục cha: nếu uid của container không thể traverse chính mount đó, nó sẽ không bao giờ tới được /media/Movies hoặc /media/Shows. Khi đó, mọi thư viện sẽ cùng lúc không có dữ liệu và log sẽ ghi Access to the path ... is denied. Chỉ cần một thư mục media bất kỳ không thể đọc là thư mục đó sẽ được ghi log và bỏ qua. Vì vậy, một loạt file được copy vào dưới quyền root có thể âm thầm biến mất khỏi thư viện. Đây là lý do chúng ta chown đệ quy và đặt bit execute trên mọi thư mục, thay vì chỉ sửa một thư mục.
Tệp docker-compose
services:
jellyfin:
image: jellyfin/jellyfin:12
container_name: jellyfin
user: "1000:1000"
restart: unless-stopped
ports:
- "127.0.0.1:8096:8096"
volumes:
- ./config:/config
- ./cache:/cache
- /mnt/media:/media:ro
environment:
- JELLYFIN_PublishedServerUrl=https://jellyfin.example.comGiải thích từng dòng: jellyfin/jellyfin:12 theo dõi nhánh release 12.x hiện tại (12.2 tại thời điểm 2026-10-10). user: "1000:1000" đặt uid/gid mà process Jellyfin sử dụng. Nó không thay đổi ownership hoặc mode của bất kỳ file nào, vì Docker giữ nguyên uid/gid của host trên các directory được mount. Vì vậy, chown ở trên phải khớp với giá trị này. /config chứa toàn bộ dữ liệu của server, gồm account, library, metadata và trạng thái đã xem. Directory này phải có quyền ghi và là dữ liệu bạn cần backup. /cache là vùng làm việc tạm thời, có thể xóa. Media mount là :ro (read-only) có chủ đích: Jellyfin mặc định lưu artwork và metadata trong /config, nên không bao giờ cần ghi vào library của bạn. Chế độ read-only cũng bảo vệ file khỏi thao tác xóa nhầm hoặc plugin lỗi. Port được bind vào 127.0.0.1 một cách có chủ đích. Web login của Jellyfin dùng HTTP thuần, nên chúng ta không public port 8096 ra Internet. JELLYFIN_PublishedServerUrl là địa chỉ server quảng bá để autodiscovery trong mạng nội bộ, thông qua LAN UDP broadcast. Client trên Internet không nhìn thấy địa chỉ này và chỉ dùng URL bạn nhập vào app. Hãy đặt giá trị này thành địa chỉ mà client cần sử dụng, đồng thời chuẩn bị nhập URL đó thủ công trên các thiết bị remote.
Khởi động từ directory chứa compose:
docker compose up -d
docker logs -f jellyfinLần chạy đầu tiên: trình hướng dẫn thiết lập và các thư viện
Vì cổng chỉ bind vào localhost, hãy truy cập trình hướng dẫn qua SSH tunnel từ laptop thay vì mở thêm rule trên firewall:
ssh -L 8096:127.0.0.1:8096 you@your-vps-ipBây giờ mở http://localhost:8096 trong trình duyệt. Trình hướng dẫn sẽ yêu cầu chọn ngôn ngữ, sau đó tạo admin user với mật khẩu mạnh. Tài khoản này dùng để quản trị server, vì vậy không được dùng lại mật khẩu tạm thời. Thêm library đầu tiên: chọn loại nội dung Movies, trỏ đến /media/Movies (đường dẫn bên trong container, không phải đường dẫn trên host), rồi lặp lại với Shows tại /media/Shows. Hoàn tất để Jellyfin bắt đầu scan. Nếu thiết lập đúng, poster và tiêu đề của một library nhỏ sẽ xuất hiện trong vòng 1–2 phút. Sau này, bạn có thể thêm hoặc chỉnh sửa library tại Dashboard → Libraries, rồi buộc scan lại bằng Scan All Libraries. Các poster này cũng là lý do nên xem thử frontend thay thế sau khi những chức năng cơ bản đã hoạt động, vì Halcyon dựng lại cùng library thành một cửa hàng video kiểu thập niên 90 có thể đi dạo từ artwork mà Jellyfin đã tải xuống.
Nếu bạn có dùng transcoding, hãy mở Dashboard → Playback → Transcoding và đặt đường dẫn tạm cho transcode thành /cache/transcodes để dữ liệu phát sinh được ghi vào cache volume thay vì làm đầy /config. Giữ tăng tốc phần cứng ở None, vì không có GPU để thực hiện việc tăng tốc.
Truy cập từ xa: reverse proxy TLS hoặc giữ trong VPN
Bạn có 2 cách an toàn để truy cập Jellyfin từ bên ngoài và có 1 cách không an toàn cần tránh. Cách không an toàn là publish trực tiếp port 8096 ra Internet: thông tin đăng nhập truyền dưới dạng cleartext và port này sẽ bị brute-force trong vài giờ.
Tùy chọn A, reverse proxy TLS. Đặt Jellyfin trên một subdomain phía sau Traefik với TLS tự động cho các ứng dụng Docker của bạn, hoặc phía sau nginx với chứng chỉ Let's Encrypt được cấp bằng Certbot. Jellyfin dùng WebSocket để cập nhật theo thời gian thực, nên proxy phải forward các header upgrade. Traefik tự xử lý việc này; nginx cần khai báo rõ các header đó và phải dùng HTTP/1.1 với upstream, nếu không quá trình upgrade sẽ không xảy ra:
location / {
proxy_pass http://127.0.0.1:8096;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}Đặt JELLYFIN_PublishedServerUrl thành địa chỉ https:// để cơ chế autodiscovery nội bộ quảng bá đúng URL, còn các app từ xa dùng địa chỉ bạn cung cấp. Đồng thời thêm fail2ban để làm chậm các lần brute-force nhằm vào trang đăng nhập. Khi server đã public, trỏ Uptime Kuma đến URL đó để bạn biết server downtime trước người xem. Trỏ notification của nó đến một server ntfy tự host để khi một lần kiểm tra thất bại, bạn nhận được push notification trên điện thoại thay vì một email chỉ đọc vào sáng hôm sau. Việc đưa trang đăng nhập lên Internet public cũng là lúc phù hợp để audit phần còn lại của máy, thay vì mặc định rằng chỉ port 443 đang nhận kết nối: sudo ss -tlnp liệt kê mọi port đang listen và process đứng sau port đó. Nếu bạn cũng deploy code của mình trên máy, open-kritt quét repository và dependency để tìm lỗ hổng; công cụ này audit source code, không quét các port đang listen.
Tùy chọn B, giữ riêng tư trong VPN. Không publish port 8096 ra Internet public; chỉ truy cập Jellyfin qua một tunnel WireGuard kết thúc trên chính máy này. Với hộ gia đình, đây là lựa chọn bảo mật đơn giản nhất: không cần certificate, không public dịch vụ và không có bề mặt brute-force. Việc bind vào localhost trong compose file vẫn chưa đủ, vì port được publish trên 127.0.0.1 chỉ có thể truy cập từ chính VPS, không phải từ các VPN peer. Thay vào đó, publish port trên địa chỉ tunnel của server, chẳng hạn "10.8.0.1:8096:8096", bằng WireGuard server IP của bạn; hoặc giữ localhost rồi đặt một proxy listen trên địa chỉ tunnel ở phía trước, sau đó kết nối qua VPN. Xem hướng dẫn thiết lập WireGuard VPN cho một VPS riêng tư để cấu hình tunnel.
Dung lượng lưu trữ và backup
Hãy dự trù theo chất lượng, không theo số lượng file. Phim 1080p đã nén thường chiếm 4-15 GB mỗi phim; bản remux 1080p chiếm 20-40 GB; một season TV 1080p chiếm 15-40 GB; nội dung 4K chiếm 40-100 GB mỗi phim. Một thư viện có vài trăm phim cùng một số show cần volume 2-4 TB. Mua dư dung lượng cho block volume ngay từ đầu thường rẻ hơn di chuyển dữ liệu sau này.
/config chứa toàn bộ trạng thái của server, nên đây là thư mục bắt buộc phải backup. Hãy tạo snapshot hoặc stop server rồi tar thư mục này, sau đó lưu bản sao bên ngoài server:
docker compose down
sudo tar czf jellyfin-config-$(date +%F).tgz -C ~/jellyfin config
docker compose up -d/cache và thư mục transcode có thể xóa và tạo lại. Bạn có thể backup media trên /mnt/media riêng, hoặc chấp nhận rằng chúng có thể được rip lại. Với dung lượng lớn, đa số chọn cách sau. Các lần upgrade là docker compose pull && docker compose up -d; tag :12 ở trên vẫn nằm trong dòng 12.x, nên chuyển sang major version tiếp theo là một thay đổi tag có chủ đích. Hãy đọc qua release notes của Jellyfin trước khi thực hiện, vì schema của library được migration khi lên major version. Jellyfin bỏ tiền tố "10." khỏi version từ 12.0 (tháng 9 năm 2026): 12.0 tương ứng với version trước đây sẽ được gọi là 10.12, không có dòng 11.x, và 10.11.x là dòng cuối cùng dùng scheme cũ. Nếu một compose file cũ của bạn vẫn ghi jellyfin/jellyfin:10, nó bị cố định ở 10.11 (tag đó lần cuối được cập nhật vào 2026-06-06, lên 10.11.11) và sẽ không bao giờ pull 12.x. Chuyển sang :12 không chỉ là sửa tag: 12.0 thay đổi database schema và ghi lại dữ liệu trong lần boot đầu tiên. Vì vậy, hãy stop server và tạo backup như trên trước, vì đó là cách duy nhất để quay lại. 12.0 upgrade trực tiếp từ 10.10.7 hoặc bất kỳ bản 10.11.x nào. Sau đó cần full library scan, và quá trình này lâu hơn đáng kể so với bình thường. Một tag được pin cùng với một state directory đã backup là toàn bộ công thức cho mọi container luôn chạy. Đây cũng là pattern dùng để giữ memory và lịch chạy của agent tự host qua các lần reboot.
Các trường hợp lỗi và chuỗi thông báo bạn sẽ thấy
Thư viện trống sau khi scan. Log tại Dashboard → Logs (hoặc ~/jellyfin/config/log/log_*.log) hiển thị:
System.UnauthorizedAccessException: Access to the path '/media/Movies' is denied.uid của container không thể đọc path đó. Nguyên nhân có thể là media thuộc sở hữu của root hoặc uid khác với giá trị user: của bạn, directory thiếu quyền execute, hoặc mount parent không cho uid đó đi qua. Cách khắc phục: chown -R 1000:1000 /mnt/media, directory 755, file 644, rồi scan lại.
Playback làm CPU chạy hết công suất và bị buffer. docker stats jellyfin cho thấy CPU gần bằng 100% nhân với số core, còn Dashboard → Playback hiển thị session ở trạng thái Transcode với tốc độ thấp hơn 1.0x. Client không direct-play, nên VPS phải transcode bằng CPU chậm hơn thời gian thực và không theo kịp. Nguyên nhân có thể là codec hoặc container không được hỗ trợ, phải burn-in subtitle, hoặc phải tone-map HDR. Cách khắc phục: chuyển sang client hỗ trợ direct-play, giữ source ở H.264/AAC, dùng subtitle dạng text (SRT) thay vì subtitle dạng image (PGS/VOBSUB). Hầu hết Jellyfin client không tự render được subtitle dạng image nên buộc phải burn-in. Không phát 4K HDR trên máy chỉ có CPU.
"Không có stream tương thích." Thông báo đầy đủ thường là "Client này không tương thích với media và server không gửi định dạng media tương thích." Client từ chối source và quá trình transcode dự phòng cũng không khởi động được. Nguyên nhân có thể là command ffmpeg bị lỗi, file không đọc được, hoặc profile của user chặn chuyển đổi video. Cách khắc phục: đọc dòng ffmpeg trong Dashboard → Logs, xác nhận file có thể playback, kiểm tra quyền playback của user nếu bạn phụ thuộc vào transcoding, rồi thử client thứ hai để loại trừ lỗi codec của browser.
Phim không có poster hoặc poster sai. Metadata không khớp. Nguyên nhân có thể là folder hoặc filename không khớp với title do metadata provider liệt kê, phim remake hoặc title phổ biến nhưng không có year để phân biệt các phiên bản, folder season có tên S01 thay vì Season 01, hoặc episode không theo dạng S01E01. Cách khắc phục: đổi tên theo layout ở trên, rồi chọn Refresh metadata → Replace all, hoặc dùng Identify cho một item để chọn đúng entry trên TMDB/TVDB.
FAQ
VPS có thể transcode video mà không cần GPU không?
Có, nhưng chỉ dùng CPU và chi phí rất cao. Một lần software transcode 1080p có thể làm bão hòa nhiều vCPU, còn 4K hoặc HEVC thường không theo kịp thời gian thực nên phát video bị buffering. Cách hiệu quả là tránh transcoding: lưu thư viện ở định dạng H.264/AAC và dùng client app hỗ trợ direct-play, để VPS chỉ truyền dữ liệu. Chỉ thuê GPU instance khi bạn thực sự cần transcoding theo thời gian thực.
Tại sao thư viện Jellyfin trống sau khi scan?
Gần như luôn là do quyền truy cập. Image jellyfin/jellyfin chính thức chạy bằng user: mà bạn đã đặt (hoặc root). Nếu uid đó không có quyền đọc các file, log scan sẽ ghi Access to the path ... is denied rồi bỏ qua chúng. Sửa owner bằng chown -R 1000:1000 /mnt/media, cấp quyền execute cho các thư mục bằng 755 rồi scan lại. Đồng thời kiểm tra cả thư mục cha, vì nếu uid của container không thể traverse chính /mnt/media thì nó không bao giờ đến được các thư mục thư viện và kết quả luôn trống. Nguyên nhân phổ biến thứ hai là layout thư mục không đúng với yêu cầu của Jellyfin.
Làm thế nào để truy cập Jellyfin từ xa an toàn?
Có 2 lựa chọn tốt. Đặt Jellyfin sau một TLS reverse proxy trên subdomain để mã hóa thông tin đăng nhập và stream, đồng thời thêm fail2ban. Không bao giờ expose port 8096 dạng plain, vì cách này gửi password dưới dạng cleartext. Hoặc giữ Jellyfin hoàn toàn private và chỉ truy cập qua VPN; đây là lựa chọn an toàn và đơn giản nhất cho gia đình. Cấu hình public address trực tiếp cho các app. Autodiscovery là broadcast trong local network nên không đến được các client truy cập từ Internet.
VPS chạy Jellyfin cần bao nhiêu disk và bandwidth?
Dung lượng disk phụ thuộc vào chất lượng: dự trù 4-15 GB cho mỗi phim 1080p đã nén, 20-40 GB cho mỗi remux và 40-100 GB cho 4K. Vì vậy, hầu hết thư viện cần một block volume 2-4 TB. Bandwidth phụ thuộc vào bitrate khi direct-play: 8-12 Mbps cho mỗi stream 1080p và cao hơn nhiều đối với 4K. Hãy xác nhận port speed đủ cho số người xem đồng thời và theo dõi monthly transfer cap. Nếu dự định transcode, hãy chừa thêm CPU headroom. Nếu dự định direct-play, hãy ưu tiên bandwidth hơn số core.
Chạy Jellyfin trên VPS có hợp pháp không?
Bản thân Jellyfin là phần mềm miễn phí, mã nguồn mở và việc chạy phần mềm này hoàn toàn hợp pháp. Điều quan trọng là nội dung: chỉ stream media mà bạn sở hữu hoặc được cấp phép lưu trữ, chẳng hạn bản rip từ đĩa của bạn, bản ghi hoặc các file mà bạn có quyền sử dụng. Jellyfin không kèm media và không cung cấp cách lấy media. Đây là trình phát cho thư viện mà bạn đã sở hữu.