ติดตั้ง Jellyfin บน VPS: สร้างเซิร์ฟเวอร์สตรีมมิ่งส่วนตัว
Jellyfin คือ open-source media server ฟรี 100% ที่ให้คุณสร้าง "Netflix ส่วนตัว" บน VPS ของตัวเอง รองรับการสตรีมหนัง ซีรีส์ เพลง ภาพถ่าย ไปยังทุกอุปกรณ์ผ่าน Web Browser, Android, iOS, TV App โดยไม่มีค่าสมาชิกและไม่มี DRM ล็อกไฟล์
เมื่อเปรียบกับ Plex — Jellyfin ไม่ต้องสมัคร account, ไม่ส่ง metadata ออก cloud, ไม่มี hardware transcoding paywall ทุก feature เปิดใช้ได้ฟรีตั้งแต่วันแรก
ข้อกำหนดของเซิร์ฟเวอร์
| ทรัพยากร | ขั้นต่ำ | แนะนำ |
|---|---|---|
| CPU | 2 vCPU | 4 vCPU (สำหรับ software transcode) |
| RAM | 2 GB | 4–8 GB |
| Disk | 20 GB OS | SSD + external/NFS สำหรับ media |
| OS | Ubuntu 22.04+ | Ubuntu 24.04 / Debian 12 |
| Port | 8096 (HTTP) | 443 (HTTPS via Nginx) |
ขั้นตอนที่ 1: อัปเดต OS และติดตั้ง dependencies
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl apt-transport-https gnupg
ขั้นตอนที่ 2: เพิ่ม Jellyfin repository และติดตั้ง
# เพิ่ม GPG key ของ Jellyfin
curl -fsSL https://repo.jellyfin.org/ubuntu/jellyfin_team.gpg.key \
| sudo gpg --dearmor -o /usr/share/keyrings/jellyfin.gpg
# เพิ่ม repository (Ubuntu 24.04 ใช้ noble)
echo "deb [signed-by=/usr/share/keyrings/jellyfin.gpg] \
https://repo.jellyfin.org/ubuntu noble main" \
| sudo tee /etc/apt/sources.list.d/jellyfin.list
# ติดตั้ง Jellyfin
sudo apt update && sudo apt install -y jellyfin
noble เป็น bookworm ในคำสั่ง repositoryขั้นตอนที่ 3: เริ่มและเปิดใช้งาน Jellyfin service
sudo systemctl enable jellyfin
sudo systemctl start jellyfin
sudo systemctl status jellyfin
Jellyfin จะรันที่ port 8096 (HTTP) และ 8920 (HTTPS ภายใน) เข้า Web UI ครั้งแรกได้ที่ http://IP-เซิร์ฟเวอร์:8096
ขั้นตอนที่ 4: ตั้งค่า Firewall เปิด port ชั่วคราว
# เปิด port 8096 ชั่วคราวสำหรับ setup wizard
sudo ufw allow 8096/tcp
sudo ufw reload
ขั้นตอนที่ 5: ทำ Setup Wizard
เปิด browser ไปที่ http://YOUR-SERVER-IP:8096 แล้วทำตามขั้นตอน:
- เลือกภาษา — Thai หรือ English
- สร้าง Admin Account — กำหนด username และ password ที่แข็งแรง
- เพิ่ม Media Library — เลือก content type (Movies / TV Shows / Music) และ path ของไฟล์
- ตั้งค่า Metadata Language — เลือก Thai หรือ English สำหรับดึงข้อมูลหนัง
- กด Finish — Jellyfin จะ scan media library อัตโนมัติ
ขั้นตอนที่ 6: เตรียม Media Directory
# สร้างโฟลเดอร์เก็บ media
sudo mkdir -p /media/jellyfin/{movies,tvshows,music,photos}
# ให้ Jellyfin user เข้าถึงได้
sudo chown -R jellyfin:jellyfin /media/jellyfin
sudo chmod -R 755 /media/jellyfin
โครงสร้างไฟล์ที่ Jellyfin อ่านได้ดีที่สุด:
/media/jellyfin/
├── movies/
│ ├── Inception (2010)/
│ │ └── Inception (2010).mp4
│ └── Dune Part Two (2024)/
│ └── Dune Part Two (2024).mkv
└── tvshows/
└── Breaking Bad/
├── Season 01/
│ ├── S01E01 - Pilot.mkv
│ └── S01E02 - Cat's in the Bag.mkv
└── Season 02/
ขั้นตอนที่ 7: ตั้งค่า Nginx Reverse Proxy + SSL
ติดตั้ง Nginx และ Certbot:
sudo apt install -y nginx certbot python3-certbot-nginx
สร้าง Nginx config สำหรับ Jellyfin:
sudo nano /etc/nginx/sites-available/jellyfin
server {
listen 80;
server_name jellyfin.yourdomain.com;
location / {
proxy_pass http://127.0.0.1:8096;
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;
# WebSocket support
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Large file streaming
proxy_read_timeout 7200;
proxy_send_timeout 7200;
client_max_body_size 20G;
}
}
# เปิดใช้ config
sudo ln -s /etc/nginx/sites-available/jellyfin /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
# ออก SSL Certificate ฟรี
sudo certbot --nginx -d jellyfin.yourdomain.com
ขั้นตอนที่ 8: ปิด port 8096 โดยตรง (Security)
# หลัง setup เสร็จ ปิด port โดยตรง ให้ผ่าน Nginx เท่านั้น
sudo ufw delete allow 8096/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw reload
ขั้นตอนที่ 9: ปรับ Jellyfin Networking Settings
เข้า Admin Dashboard → Networking → ตั้งค่า:
- Base URL:
/(ว่างไว้ถ้าใช้ root domain) - Known Proxies:
127.0.0.1 - ปิด Allow remote connections to Jellyfin (ให้ผ่าน Nginx แทน)
ขั้นตอนที่ 10: ติดตั้ง Client Apps
| Platform | App | Download |
|---|---|---|
| Web Browser | Built-in WebUI | ไม่ต้องติดตั้ง |
| Android | Jellyfin for Android | Google Play Store |
| iOS / iPadOS | Swiftfin | App Store |
| Apple TV | Swiftfin | App Store |
| Android TV | Jellyfin for Android TV | Google Play |
| Windows | Jellyfin Media Player | jellyfin.org |
| Kodi | Jellyfin for Kodi Plugin | Kodi Add-on |
ตรวจสอบว่า Jellyfin ทำงานถูกต้อง
# ตรวจสอบ service status
sudo systemctl status jellyfin
# ดู log realtime
sudo journalctl -u jellyfin -f
# ตรวจสอบ port 8096 เปิดอยู่
sudo ss -tlnp | grep 8096
# ทดสอบ API endpoint
curl -s http://localhost:8096/System/Info/Public | python3 -m json.tool
# ตรวจสอบ Nginx proxy ทำงาน
curl -I https://jellyfin.yourdomain.com
curl http://localhost:8096/health — ถ้าได้ Healthy แสดงว่า Jellyfin API ตอบสนองปกติ สามารถ monitor ด้วย Uptime Kuma ได้เลยแก้ปัญหาที่พบบ่อย
Error: "This server's certificate is not trusted"
เกิดเมื่อ client เชื่อมต่อด้วย IP โดยตรงที่ใช้ self-signed cert แก้โดยให้เชื่อมต่อผ่าน domain ที่ออก Let's Encrypt แทน
# ตรวจสอบ certbot renewal
sudo certbot renew --dry-run
# ดู certificate ที่มีอยู่
sudo certbot certificates
Error: "Playback Error" หรือวิดีโอค้างกลางคัน
มักเกิดจาก buffer timeout หรือ proxy timeout สั้นเกินไป ตรวจสอบ Nginx config:
# ใน /etc/nginx/sites-available/jellyfin ให้มี
proxy_read_timeout 7200;
proxy_send_timeout 7200;
client_max_body_size 20G;
# reload หลังแก้
sudo nginx -t && sudo systemctl reload nginx
Error: "Permission denied" เมื่อ scan media
Jellyfin user ไม่มีสิทธิ์อ่านโฟลเดอร์ media ที่เพิ่มใหม่:
# แก้ permission ให้ jellyfin user อ่านได้
sudo chown -R jellyfin:jellyfin /path/to/media
sudo chmod -R 755 /path/to/media
# หรือเพิ่ม jellyfin user เข้ากลุ่มที่มีสิทธิ์
sudo usermod -aG media jellyfin
sudo systemctl restart jellyfin
Error: Jellyfin ใช้ RAM สูงมาก (>2GB)
เกิดจาก software transcoding ไฟล์หลายไฟล์พร้อมกัน จำกัดจำนวน concurrent transcodes:
# ใน Admin > Playback > ปรับ "Simultaneous transcodes limit"
# แนะนำ: 2 สำหรับ VPS 4 vCPU
# หรือ limit memory ผ่าน systemd
sudo systemctl edit jellyfin
[Service]
MemoryMax=3G
Error: "404 Not Found" หลังตั้ง Nginx
มักเกิดจาก Base URL ใน Jellyfin ไม่ตรงกับ Nginx config:
# ใน Jellyfin Admin > Networking > Base URL ต้องว่าง (ถ้าใช้ root /)
# ถ้าใช้ subdirectory เช่น /jellyfin ต้องใส่ /jellyfin ทั้งสองที่
# ตรวจ Nginx config
sudo nginx -t
sudo cat /var/log/nginx/error.log | tail -20
คำถามที่พบบ่อย
Jellyfin ต่างจาก Plex อย่างไร?
Jellyfin เป็น open-source ฟรี 100% ไม่มี account บังคับ ไม่มี feature paywall เช่น hardware transcoding ส่วน Plex มี Plex Pass ที่เสียเงินถึงจะได้ hardware transcode และ offline sync Jellyfin เหมาะสำหรับคนที่ต้องการ privacy เต็มรูปแบบเพราะข้อมูลไม่ออก cloud
VPS ขนาดเล็ก (2GB RAM) เปิด Jellyfin ได้ไหม?
ได้ ถ้าไฟล์ media encode มาเป็น H.264 MP4 และ client รองรับ direct play จะไม่มี transcoding เลย ใช้ RAM แค่ 300–500 MB ปัญหาจะเกิดเมื่อ client ต้องการ transcode ซึ่งกิน CPU สูง แนะนำให้เตรียมไฟล์ให้ถูก format ก่อน upload
จะเชื่อมต่อ external storage (S3/Wasabi) กับ Jellyfin ได้ไหม?
ได้โดย mount S3 bucket ด้วย rclone mount หรือ s3fs แล้วชี้ Jellyfin library ไปที่ mount point Jellyfin จะเห็นเหมือนกับ local folder แต่ latency อาจสูงกว่าเล็กน้อยในการ scan metadata ครั้งแรก