Linux : Share SMB untuk Media Server dengan Samba (Studi Kasus Jellyfin)

Membuka folder server dari Windows terdengar seperti hal sepele: ketik alamat, tekan Enter, file muncul. Kenyataannya, di balik layar ada tiga hal yang harus cocok sekaligus β€” protokol, identitas, dan angka pemilik file. Kalau satu saja meleset, hasilnya bukan error yang jelas, melainkan folder kosong, akses ditolak, atau file yang tidak pernah muncul di aplikasi pemutar.

Artikel ini membangun satu share SMB dari nol di Linux, lalu menyambungkannya ke media server Jellyfin. Semua langkah memakai kasus nyata: film dan series yang dikirim dari laptop Windows ke server rumah atau server sekolah.

🎯 Tujuan

Setelah membaca dan mempraktikkan artikel ini, kamu bisa:

  • menjelaskan perbedaan SMB sebagai protokol dan Samba sebagai program di Linux;
  • membuat share SMB yang hanya bisa diakses dari jaringan lokal;
  • membuat user Samba yang terpisah dari user login Linux;
  • menjelaskan kenapa UID dan PUID harus sama supaya file terbaca media server;
  • menguji share dari Windows dan dari Linux, termasuk menguji hak tulis;
  • mendiagnosis pesan NT_STATUS_NO_SUCH_USER, port 445 tertutup, dan file yang tidak muncul di Jellyfin;
  • memahami kenapa port 445 tidak boleh dibuka ke internet.

πŸ“ Konteks nyata

Bayangkan sebuah gudang film milik sekolah. Gudangnya ada di ruang server, tapi yang mau mengambil film adalah guru di ruang lain lewat jendela loket.

Loket itu punya tiga aturan. Pertama, bahasa yang dipakai harus sama β€” kalau petugas gudang hanya paham bahasa Indonesia dan pengunjung hanya bisa bahasa isyarat, transaksi tidak jalan. Kedua, pengunjung harus punya kartu akses yang terdaftar. Ketiga, rak di dalam gudang punya nomor pemilik; kalau kartu akses menunjukkan nomor yang berbeda, petugas tetap boleh menyerahkan barang, tetapi mesin pemutar di ruang lain tidak mengenali rak itu.

Di dunia server, "bahasa" itu SMB, "kartu akses" itu user Samba, dan "nomor pemilik rak" itu UID. Tiga-tiganya harus dibereskan. Tutorial yang hanya mengajarkan satu di antaranya akan menghasilkan setup yang terlihat jalan di satu komputer, lalu gagal begitu dipakai aplikasi lain.

  • πŸ”₯ Kasus nyata: Sebuah lab multimedia memasang share SMB dan berhasil menyalin 40 film dari laptop guru. Semua file terlihat di Windows. Tetapi Jellyfin tidak menampilkan satu film pun. Penyebabnya bukan share-nya, melainkan file dimiliki UID 1001 sementara Jellyfin berjalan sebagai UID 1000. Perbaikannya hanya satu perintah chown, tapi butuh tiga jam untuk ditemukan karena tidak ada yang memeriksa angka pemilik file.

🧠 Konsep singkat

πŸ”Ή SMB itu protokol, Samba itu programnya

SMB (Server Message Block) adalah bahasa yang dipakai Windows untuk membuka file dan printer di jaringan. Bahasa ini sudah ada sejak era DOS dan masih dipakai sampai Windows 11.

Samba adalah program di Linux yang bisa berbicara SMB. Jadi saat Windows membuka \\192.168.100.101\Media, Windows mengirim permintaan SMB, dan Samba yang menjawab.

  • πŸ’‘ Tips: Kalau kamu mencari tutorial dan menemukan kata "CIFS", itu nama lain dari keluarga protokol yang sama. mount -t cifs berarti memasang share SMB sebagai folder di Linux.

πŸ”Ή Tiga angka yang menentukan berhasil atau gagal

Angka Di mana Fungsi
UID sistem /etc/passwd Pemilik file di disk
User Samba database tdbsam Nama dan password saat login share
PUID container environment Docker UID yang dipakai aplikasi di dalam container

Ketiganya berbeda tempat, tetapi harus menunjuk ke angka yang sama. Inilah sumber sebagian besar masalah "file sudah dicopy tapi tidak terbaca".

πŸ”Ή Perjalanan satu file dari Windows ke Jellyfin

  1. Windows mengirim file lewat SMB ke server.
  2. Samba menulis file ke folder share, lalu memberi pemilik sesuai force user atau user yang login.
  3. Jellyfin membaca folder yang sama dari dalam container.
  4. Container Jellyfin berjalan sebagai PUID tertentu; kalau UID file berbeda dan permission terlalu ketat, file dianggap tidak ada.
  5. Jellyfin mencocokkan nama file dengan pola episode atau film, lalu menampilkannya di library.

🧩 Istilah penting

  • Share β€” folder di server yang dibuka untuk jaringan. Di artikel ini namanya Media.
  • smb.conf β€” file konfigurasi utama Samba, biasanya di /etc/samba/smb.conf.
  • tdbsam β€” database internal Samba untuk menyimpan user dan password share. Terpisah dari password login Linux.
  • smbpasswd β€” perintah untuk menambah, mengubah, dan mengaktifkan user Samba.
  • testparm β€” pemeriksa konfigurasi Samba. Wajib dijalankan sebelum restart service.
  • force user β€” memaksa semua akses share dicatat sebagai user tertentu.
  • create mask β€” pengaturan permission untuk file baru yang dibuat lewat share.
  • PUID/PGID β€” UID dan GID yang dipakai aplikasi di dalam container Docker.
  • mount point β€” folder kosong di komputer klien tempat share dipasang, misalnya /mnt/media.

πŸ”§ Praktik: membangun share Media

Praktik ini memakai satu server Linux (bisa mesin fisik, VM, atau container LXC) dan satu komputer Windows di jaringan yang sama.

Komponen Contoh alamat Keterangan
Server Linux 192.168.100.101 Tempat Samba dan Jellyfin
Klien Windows 192.168.100.88 Komputer yang membuka share
Jaringan lokal 192.168.100.0/24 Batas akses yang diizinkan

πŸ”Ή Langkah 0 β€” Siapkan bahan

Sebelum mulai, pastikan:

  • kamu punya akses sudo di server;
  • server dan klien berada di subnet yang sama, misalnya sama-sama 192.168.100.x;
  • folder media sudah direncanakan, misalnya /srv/media;
  • port 445 tidak dipakai aplikasi lain.
  • ⚠️ Hati-hati: Jangan menyimpan share di folder home pribadi. Permission home biasanya 700, sehingga user Samba tidak bisa menembusnya meskipun share sudah benar.

πŸ”Ή Langkah 1 β€” Cek server dan ruang disk

Jalankan di server:

hostname -I
df -h /
uname -a

Hasil yang diharapkan: satu alamat IP lokal, filesystem root dengan ruang kosong cukup, dan informasi kernel.

  • πŸ§ͺ Uji cepat: Kalau hostname -I menampilkan lebih dari satu alamat, catat alamat yang satu subnet dengan klien. Salah memilih alamat adalah penyebab umum "server tidak ditemukan".

πŸ”Ή Langkah 2 β€” Buat struktur folder

sudo mkdir -p /srv/media/Movies
sudo mkdir -p /srv/media/Series
sudo mkdir -p /srv/media/Anime
ls -ld /srv/media /srv/media/*

Struktur ini penting karena Jellyfin memakai jenis library berbeda untuk film dan series. Mencampur keduanya dalam satu folder membuat metadata kacau.

πŸ”Ή Langkah 3 β€” Tentukan UID media server

Kalau Jellyfin berjalan di Docker, cari PUID-nya:

docker inspect jellyfin --format '{{json .Config.Env}}'

Cari baris PUID=1000 dan PGID=1000. Kalau Jellyfin berjalan langsung di host, cek user service-nya:

ps -o user= -C jellyfin
id jellyfin

Catat angkanya. Contoh di artikel ini: UID 1000.

  • πŸ“Š Angka penting: Di banyak distro, user pertama yang dibuat saat instalasi mendapat UID 1000. Karena itu banyak container memakai PUID 1000. Tetapi jangan berasumsi β€” selalu periksa.

πŸ”Ή Langkah 4 β€” Pasang Samba

sudo apt update
sudo apt install -y samba
smbd -V
systemctl status smbd --no-pager

Hasil yang diharapkan: versi Samba tercetak, dan service smbd berstatus aktif.

  • πŸ’‘ Tips: Di keluarga Red Hat, paketnya bernama samba juga, tetapi service-nya smb dan nmb, bukan smbd dan nmbd.

πŸ”Ή Langkah 5 β€” Buat user sistem dan user Samba

User Samba harus punya pasangan user sistem. Nama boleh sama, password-nya terpisah.

sudo useradd -M -s /usr/sbin/nologin media
id media

Hasil yang diharapkan: uid=1000(media) atau UID lain. Kalau UID yang muncul bukan 1000, catat β€” nanti dipakai di force user.

Buat password Samba:

sudo smbpasswd -a media
sudo smbpasswd -e media
sudo pdbedit -L

Hasil yang diharapkan: pdbedit menampilkan satu baris berisi media:1000:.

  • ⚠️ Hati-hati: smbpasswd -a tanpa -e bisa meninggalkan akun dalam keadaan disabled. Selalu jalankan smbpasswd -e dan buktikan dengan pdbedit -L.
  • ⚠️ Hati-hati: Kalau terminal mengeluarkan peringatan locale seperti Cannot set LC_ALL, perintah bisa gagal diam-diam. Periksa hasilnya, jangan percaya "tidak ada output berarti sukses".

πŸ”Ή Langkah 6 β€” Backup lalu edit smb.conf

sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak
sudo nano /etc/samba/smb.conf

Tambahkan blok berikut di bagian paling bawah file:

[Media]
   path = /srv/media
   browseable = yes
   read only = no
   valid users = media
   force user = media
   force group = media
   create mask = 0664
   directory mask = 0775
   hosts allow = 192.168.100.0/24
   hosts deny = 0.0.0.0/0

Arti tiap parameter:

Parameter Nilai contoh Kalau salah
path /srv/media Share kosong atau tidak bisa dibuka
valid users media Semua user ditolak
force user media File tak terbaca aplikasi lain
create mask 0664 File jadi 0600, user lain gagal baca
  • πŸ”₯ Kasus nyata: Menulis force user = 1000 β€” angka, bukan nama β€” membuat Samba menolak koneksi dengan NT_STATUS_NO_SUCH_USER. Samba mencari nama user, bukan UID. Tulis nama user yang memang ada.
  • πŸ’‘ Tips: Jika file harus bisa dibaca aplikasi lain tetapi tidak boleh diubah, ganti read only = no menjadi yes dan biarkan penulisan lewat jalur lain.

πŸ”Ή Langkah 7 β€” Validasi konfigurasi

testparm -s

Hasil yang diharapkan: ringkasan konfigurasi tanpa pesan error, dan blok [Media] muncul dengan parameter yang benar.

  • ⚠️ Hati-hati: Jangan restart service sebelum testparm bersih. Konfigurasi rusak bisa membuat semua share hilang, bukan hanya yang baru.

πŸ”Ή Langkah 8 β€” Jalankan service

sudo systemctl enable --now smbd nmbd
sudo systemctl restart smbd
systemctl is-active smbd nmbd
ss -tlnp | grep ':445'

Hasil yang diharapkan: dua service active, dan port 445 dalam keadaan LISTEN.

  • πŸ§ͺ Uji cepat: Kalau ss menunjukkan 445 LISTEN tetapi klien tetap tidak bisa connect, masalahnya bukan Samba β€” lanjut ke langkah firewall.

πŸ”Ή Langkah 9 β€” Buka firewall hanya untuk LAN

Misalnya server memakai ufw:

sudo ufw status verbose
sudo ufw allow from 192.168.100.0/24 to any port 445 proto tcp comment 'SMB media LAN'
sudo ufw reload
sudo ufw status | grep 445

Hasil yang diharapkan: satu baris 445/tcp ALLOW 192.168.100.0/24.

  • ⚠️ Hati-hati: Jangan memakai ufw allow 445/tcp tanpa batas sumber. Itu membuka share ke seluruh jaringan yang bisa menjangkau server, termasuk jaringan tamu.
  • πŸ“Š Angka penting: Port yang dipakai SMB: 445/TCP untuk transfer file modern, 139/TCP untuk NetBIOS lama, dan 137–138/UDP untuk browsing nama. Untuk kebutuhan artikel ini, cukup 445/TCP.

πŸ”Ή Langkah 10 β€” Uji dari server sendiri

sudo apt install -y smbclient
smbclient -L 127.0.0.1 -U media
smbclient //127.0.0.1/Media -U media -c 'ls; put /etc/hostname uji-smb.txt; ls'
ls -ln /srv/media

Hasil yang diharapkan: share Media terdaftar, perintah put berhasil, dan file uji-smb.txt muncul dengan pemilik angka 1000 1000.

  • πŸ’‘ Tips: ls -ln menampilkan UID dan GID dalam bentuk angka. Inilah cara tercepat membuktikan apakah force user bekerja.

Hapus file uji setelah selesai:

rm -f /srv/media/uji-smb.txt

πŸ”Ή Langkah 11 β€” Uji dari Windows

  1. Buka File Explorer.
  2. Ketik di address bar: \\192.168.100.101\Media
  3. Saat diminta kredensial, isi user media dan password Samba yang tadi dibuat.
  4. Buat folder baru bernama uji-windows.
  5. Copy satu file kecil ke dalamnya.

Dari PowerShell, kamu juga bisa menguji port lebih dulu:

Test-NetConnection 192.168.100.101 -Port 445

Hasil yang diharapkan: TcpTestSucceeded : True.

  • ⚠️ Hati-hati: Kalau Windows menyimpan kredensial lama, koneksi bisa gagal terus. Buka Control Panel β†’ Credential Manager β†’ Windows Credentials, hapus entri untuk alamat server, lalu coba lagi.

πŸ”Ή Langkah 12 β€” Sambungkan ke Jellyfin

Contoh layanan Jellyfin dengan Docker Compose:

services:
  jellyfin:
    image: jellyfin/jellyfin:latest
    container_name: jellyfin
    restart: unless-stopped
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Jakarta
    volumes:
      - ./config:/config
      - ./cache:/cache
      - /srv/media:/media
    ports:
      - "8096:8096"

Jalankan:

docker compose up -d
docker ps --filter name=jellyfin

Lalu di web Jellyfin:

  1. Buka http://IP-SERVER:8096.
  2. Selesaikan wizard admin.
  3. Dashboard β†’ Libraries β†’ Add Media Library.
  4. Content type Movies β†’ folder /media/Movies.
  5. Ulangi untuk Shows β†’ folder /media/Series.
  6. Simpan dan tunggu scan selesai.
  • πŸ“Š Angka penting: Jalur yang dipilih di Jellyfin adalah jalur di dalam container, bukan jalur di host. Kalau host memakai /srv/media dan container memetakannya ke /media, maka library harus menunjuk /media/Movies.

πŸ”Ή Langkah 13 β€” Aturan penamaan film dan series

Film, satu folder per judul:

Movies/
└── Dune Part Two (2024)/
    β”œβ”€β”€ Dune Part Two (2024).mkv
    └── Dune Part Two (2024).id.srt

Series, satu folder per judul, episode memakai pola SxxExx:

Series/
└── Doctor X - Age of the White Mafia (2021)/
    └── Season 01/
        β”œβ”€β”€ Doctor X - Age of the White Mafia - S01E01.mp4
        └── Doctor X - Age of the White Mafia - S01E02.mp4
  • ⚠️ Hati-hati: Nama seperti Eps1.mp4 atau episode 1.mp4 sering tidak dikenali. Tanpa pola S01E01, Jellyfin bisa mengabaikan file atau menaruhnya di tempat yang salah.

βœ… Verifikasi

Jalankan pemeriksaan berikut sebelum menyatakan praktikum selesai.

Pemeriksaan Perintah Hasil benar
Service hidup systemctl is-active smbd active
Port terbuka ss -tlnp | grep 445 LISTEN
User Samba ada pdbedit -L media:1000:
Tulis dari klien buat file di Explorer file muncul di server

Periksa juga kepemilikan file:

ls -ln /srv/media/Movies

Hasil yang diharapkan: kolom ketiga dan keempat berisi 1000 1000, sama dengan PUID/PGID Jellyfin.

Terakhir, buka Jellyfin dan pastikan film atau episode muncul di library, bukan hanya di file manager.

πŸ§ͺ Lab sengaja dibuat rusak

Bagian ini untuk praktikum. Kamu akan merusak konfigurasi dengan sengaja, mengamati gejalanya, lalu memperbaikinya. Tujuannya bukan menghafal error, tetapi mengenali pola.

πŸ”Ή Percobaan A β€” force user memakai angka

Ubah satu baris di smb.conf:

force user = 1000

Lalu:

sudo systemctl restart smbd
smbclient //127.0.0.1/Media -U media -c 'ls'

Gejala yang muncul: tree connect failed: NT_STATUS_NO_SUCH_USER.

Pertanyaan: kenapa Samba tidak menerima angka, padahal UID memang 1000?

Perbaikan: kembalikan menjadi force user = media, lalu restart dan uji ulang.

πŸ”Ή Percobaan B β€” port 445 ditutup

sudo ufw delete allow from 192.168.100.0/24 to any port 445 proto tcp

Dari Windows, jalankan Test-NetConnection ke port 445.

Gejala: TcpTestSucceeded : False dan Explorer menampilkan "Windows cannot access".

Pertanyaan: apa bedanya "port tertutup" dengan "user salah"? Bagaimana membedakannya dari pesan error?

Perbaikan: tambahkan kembali rule ufw, lalu ulangi.

πŸ”Ή Percobaan C β€” PUID tidak cocok

Ubah compose Jellyfin menjadi PUID=1001, lalu jalankan ulang container. Buat file baru lewat SMB, dan periksa ls -ln.

Gejala: file tetap ada, tetapi Jellyfin tidak menampilkan atau tidak bisa memutar isinya.

Pertanyaan: siapa yang sebenarnya "tidak punya izin" β€” Samba, Jellyfin, atau kernel?

Perbaikan: samakan PUID dengan pemilik file, atau perbaiki kepemilikan dengan chown -R 1000:1000 /srv/media.

⚠️ Kesalahan umum & troubleshooting

  • NT_STATUS_NO_SUCH_USER β€” force user diisi angka, user Samba belum dibuat, atau smbd belum di-restart setelah user ditambahkan. Periksa pdbedit -L.
  • NT_STATUS_LOGON_FAILURE β€” password salah atau user belum diaktifkan. Jalankan smbpasswd -e.
  • Port 445 tertutup β€” periksa ufw di server, firewall Windows di klien, dan kebijakan ISP. Jangan langsung menyimpulkan Samba rusak.
  • Share terlihat, isi kosong β€” path salah atau permission folder induk terlalu ketat. Uji dengan namei -l /srv/media.
  • Tidak bisa menulis β€” read only = yes masih aktif, atau force user tidak punya izin tulis.
  • File ada di SMB tetapi tidak muncul di Jellyfin β€” library belum ditambahkan, jalur library salah, UID tidak cocok, atau nama file tidak memakai pola yang dikenali.
  • Share tidak muncul saat browse Network β€” layanan nmbd mati atau browsing NetBIOS diblokir. Akses langsung lewat \\IP\Media tetap bisa.
  • Perangkat lama tidak bisa connect β€” SMB1 dinonaktifkan secara default sejak Samba 4.11. Jangan mengaktifkannya kembali; ganti perangkat atau pakai jalur lain.
  • πŸ’‘ Tips: Saat debugging, selalu tanyakan: masalahnya di jaringan, autentikasi, atau izin file? Tiga kategori ini punya alat pemeriksa yang berbeda.

πŸ” Catatan keamanan & etika

  • Jangan pernah meneruskan port 445 dari internet ke server. SMB adalah salah satu target serangan ransomware paling sering, termasuk worm yang menyebar otomatis.
  • Untuk akses dari luar rumah, gunakan VPN seperti WireGuard. Setelah terhubung VPN, perangkatmu berada di jaringan lokal dan bisa membuka share dengan aman.
  • Batasi share dengan hosts allow ke subnet lokal saja.
  • Buat satu user Samba per orang. Jangan memakai satu akun bersama untuk semua siswa β€” log menjadi tidak berguna saat terjadi masalah.
  • Untuk arsip yang tidak boleh berubah, gunakan share read only = yes.
  • Simpan salinan smb.conf sebelum mengubah apa pun.
  • Etika: share berisi film pribadi tetap tanggung jawab pemilik server. Jangan menyebarkan materi berhak cipta ke luar izin yang sah.

🏭 Dipakai di dunia kerja

  • Sekolah: lab multimedia menyimpan materi ajar di server dan guru mengirim video lewat share SMB tanpa harus membawa flashdisk.
  • Kantor: tim desain menyimpan aset besar di share terpusat, sementara aplikasi presentasi membaca folder yang sama.
  • Rumah produksi: editor memakai share untuk menaruh footage, dan server media membuat proxy untuk ditinjau klien.
  • Rumah tangga: keluarga menyimpan film di satu server dan menontonnya lewat TV, HP, atau laptop tanpa menyalin file berkali-kali.

πŸ“Œ Kesimpulan

Share SMB yang benar bukan sekadar "folder dibuka". Ia adalah kesepakatan tiga hal: protokol yang sama, identitas yang terdaftar, dan angka pemilik yang cocok dengan aplikasi pembacanya. Kalau ketiganya konsisten, file yang dikirim dari Windows langsung muncul di Jellyfin tanpa langkah tambahan.

Langkah berikutnya: buat satu user Samba untuk setiap anggota keluarga atau siswa, lalu uji hak aksesnya satu per satu β€” di situlah kamu akan benar-benar memahami beda antara "bisa login" dan "boleh menulis".

πŸ”— Materi terkait

πŸ“š Referensi