Jitsi Meet: ตั้งเซิร์ฟเวอร์ประชุมวิดีโอขององค์กรด้วย Docker

ติดตั้ง Jitsi Meet ด้วยชุด docker-jitsi-meet ทางการ ใช้ HTTPS จาก Let's Encrypt เปิด UDP 10000 สำหรับภาพและเสียง และตั้งให้เฉพาะพนักงานเปิดห้องประชุมได้

โดย ทีมงาน THAI DATA CLOUD อัปเดต อ่าน 10 นาที

แชร์FacebookXLINELinkedIn
Jitsi Meet — Jitsi Meet: ตั้งเซิร์ฟเวอร์ประชุมวิดีโอขององค์กรด้วย Docker
Jitsi Meet: ตั้งเซิร์ฟเวอร์ประชุมวิดีโอขององค์กรด้วย Docker

คำตอบสั้น ๆ: ติดตั้ง Jitsi Meet ด้วยชุด docker-jitsi-meet ทางการ ใช้ HTTPS จาก Let's Encrypt เปิด UDP 10000 สำหรับภาพและเสียง และตั้งให้เฉพาะพนักงานเปิดห้องประชุมได้

คู่มือนี้อธิบาย Jitsi Meet ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย

Jitsi Meet คือระบบประชุมวิดีโอแบบโอเพนซอร์สที่ใช้งานผ่านเบราว์เซอร์ได้ทันทีโดยไม่ต้องติดตั้งโปรแกรม รองรับแชร์หน้าจอ แชท ยกมือ และตั้งรหัสผ่านห้อง ผู้เข้าร่วมใช้แอปมือถือได้ด้วย เมื่อติดตั้งบนเซิร์ฟเวอร์ของตัวเอง เสียงและภาพของการประชุมจะวิ่งผ่านเครื่องขององค์กร เหมาะกับหน่วยงานที่ต้องการควบคุมข้อมูลการประชุมเองหรือใช้ประชุมภายในบ่อย

คู่มือนี้ใช้ชุด docker-jitsi-meet ทางการ ซึ่งแยกเป็นคอนเทนเนอร์ web, prosody, jicofo และ jvb เมื่อจบคุณจะมี Jitsi Meet ที่ใช้ HTTPS จาก Let's Encrypt ในตัว ส่งภาพและเสียงผ่าน UDP 10000 และเปิดระบบยืนยันตัวตน ให้เฉพาะพนักงานเปิดห้องได้ ส่วนแขกภายนอกเข้าร่วมได้หลังเจ้าของห้องมาถึง

สิ่งที่ต้องเตรียม

  • Cloud Server ที่ใช้ Ubuntu 24.04 พร้อม Docker Engine และ Compose plugin แยกเครื่องสำหรับ Jitsi Meet โดยเฉพาะ เพราะชุดนี้ใช้พอร์ต 80/443 เอง และการส่งต่อวิดีโอใช้ CPU กับแบนด์วิดท์สูง
  • ขนาดเริ่มต้นราว 4 vCPU / RAM 8 GB สำหรับการประชุมพร้อมกันไม่กี่ห้อง ห้องละไม่เกินราว 20 คน เป็นค่าประมาณ ให้วัดการใช้งานจริงแล้วปรับ ปัจจัยหลักคือแบนด์วิดท์ขาออกของเครื่อง
  • ซับโดเมน เช่น meet.example.com ที่ทำ A record ชี้มาที่ IP สาธารณะ 203.0.113.10 แล้ว
  • ไฟร์วอลล์ระดับคลาวด์เปิด TCP 80, TCP 443 และ UDP 10000
  • แพ็กเกจ unzip และ wget
แผนภาพ Jitsi Meet ผู้ใช้เข้าเว็บผ่าน HTTPS 443 และส่งภาพเสียงผ่าน UDP 10000 ไปที่ jvb โดยทุกส่วนเชื่อมกับ prosody
หน้าเว็บและการส่งสัญญาณใช้ TCP 443 ส่วนภาพและเสียงจริงวิ่งผ่าน UDP 10000 ที่ jvb

ขั้นตอนที่ 1: ดาวน์โหลด release ล่าสุดของ Jitsi Meet

โครงการแนะนำให้ใช้ไฟล์ release ไม่ใช่ clone repository เพราะ release ผ่านการทดสอบเป็นชุดแล้ว คำสั่งด้านล่างดึงลิงก์ zip ของ release ล่าสุดจาก GitHub

sudo apt install -y unzip wget
sudo install -d -o $USER /opt/meet
cd /opt/meet
wget $(wget -q -O - https://api.github.com/repos/jitsi/docker-jitsi-meet/releases/latest | grep zip | cut -d\" -f4)
ls

จะได้ไฟล์ชื่อตามรุ่น เช่น stable-11248 แตกไฟล์แล้วเข้าโฟลเดอร์ที่ได้

unzip stable-11248
cd jitsi-docker-jitsi-meet-*

ขั้นตอนที่ 2: สร้าง .env รหัสผ่านภายใน และโฟลเดอร์คอนฟิก

cp env.example .env
./gen-passwords.sh
mkdir -p ~/.jitsi-meet-cfg/{web,prosody/config,prosody/prosody-plugins-custom,jicofo,jvb,jigasi,jibri,transcriber}
mkdir -p ~/.jitsi-meet-cfg/storage/{jibri,prosody,transcripts,web}
mkdir -p ~/.jitsi-meet-cfg/tmp/{web-crontabs,web-load-test}
chmod 777 ~/.jitsi-meet-cfg/storage/{jibri,prosody,transcripts,web}
chmod 777 ~/.jitsi-meet-cfg/tmp/{web-crontabs,web-load-test}

gen-passwords.sh สุ่มรหัสผ่านที่คอมโพเนนต์ใช้คุยกันลงใน .env ห้ามข้ามขั้นนี้ เพราะรหัสผ่านว่างหรือค่าตัวอย่างเป็นช่องโหว่ ส่วนโฟลเดอร์ storage และ tmp ต้องสร้างเองพร้อมสิทธิ์เขียน เพราะตั้งแต่รุ่น stable-11146 คอนเทนเนอร์รันด้วยผู้ใช้ทั่วไป (uid 1000) ถ้าปล่อยให้ระบบสร้างเอง คอนเทนเนอร์จะเขียนไม่ได้และไม่ยอมเริ่ม

ขั้นตอนที่ 3: ตั้งค่าโดเมน HTTPS และการยืนยันตัวตน

เปิด nano .env แล้วแก้หรือลบเครื่องหมาย # หน้าบรรทัดต่อไปนี้

HTTP_PORT=80
HTTPS_PORT=443
TZ=Asia/Bangkok
PUBLIC_URL=https://meet.example.com
JVB_ADVERTISE_IPS=203.0.113.10

ENABLE_LETSENCRYPT=1
LETSENCRYPT_DOMAIN=meet.example.com
[email protected]
ENABLE_HTTP_REDIRECT=1

ENABLE_AUTH=1
ENABLE_GUESTS=1
AUTH_TYPE=internal
  • PUBLIC_URL ต้องเป็นโดเมนจริง ไม่เช่นนั้นลิงก์เชิญและการเชื่อมต่อจะผิด
  • JVB_ADVERTISE_IPS คือ IP ที่ผู้ใช้ส่งภาพและเสียงเข้ามา ต้องเป็น IP สาธารณะของเครื่อง
  • ENABLE_AUTH=1 คู่กับ ENABLE_GUESTS=1 ทำให้เฉพาะผู้มีบัญชีเปิดห้องใหม่บน Jitsi Meet ได้ แต่คนนอกยังเข้าร่วมห้องที่เปิดแล้วได้ ป้องกันคนแปลกหน้าใช้เซิร์ฟเวอร์ของคุณเปิดห้องเอง

ขั้นตอนที่ 4: เริ่มระบบและตรวจใบรับรอง

docker compose up -d
docker compose logs -f web

คอนเทนเนอร์ web จะขอใบรับรองจาก Let's Encrypt ผ่านพอร์ต 80 ในการเริ่มครั้งแรก ถ้าสำเร็จ ล็อกจะไม่มีข้อความ error เรื่อง certificate เปิด https://meet.example.com ต้องเห็นหน้าเริ่มการประชุมของ Jitsi Meet พร้อมแม่กุญแจในแถบที่อยู่

ผลคำสั่ง docker compose ps ของ Jitsi Meet ครบสี่บริการ web prosody jicofo jvb และ curl ที่ได้รหัส 200
ต้องเห็นครบสี่บริการ และหน้าเว็บตอบ 200 ผ่าน HTTPS ก่อนสร้างบัญชีผู้ใช้

ขั้นตอนที่ 5: สร้างบัญชีผู้ที่เปิดห้องประชุมได้

บัญชีแบบ internal ของ Jitsi Meet เก็บใน prosody ซึ่งเป็นเซิร์ฟเวอร์ XMPP ของระบบ สร้างผู้ใช้ทีละคนด้วยคำสั่งนี้ (คำสั่งสำเร็จจะไม่แสดงข้อความใด)

docker compose exec prosody prosodyctl --config /run/prosody/config/prosody.cfg.lua \
  register somchai meet.jitsi 'รหัสผ่านที่ยาวและไม่ซ้ำ'

meet.jitsi คือโดเมน XMPP ภายในของชุดนี้ ให้พิมพ์ตามนี้ ไม่ต้องเปลี่ยนเป็นโดเมนของคุณ ลบผู้ใช้ด้วยคำสั่ง unregister somchai meet.jitsi ในรูปแบบเดียวกัน

ทดสอบโดยเปิดห้องใหม่ ระบบจะแสดงว่ากำลังรอผู้จัด (host) พร้อมปุ่ม I am the host กดแล้วล็อกอินด้วยบัญชีที่สร้าง ห้องจะเปิด จากนั้นส่งลิงก์ให้แขกเข้าร่วมได้

ลำดับการเปิดห้อง Jitsi Meet แบบมีการยืนยันตัวตน ผู้จัดกด I am the host ล็อกอิน แล้วแขกจึงเข้าร่วมได้
คนนอกเข้าห้องได้ แต่สร้างห้องใหม่บนเซิร์ฟเวอร์ของคุณเองไม่ได้

ขั้นตอนที่ 6: อัปเดตและสำรองการตั้งค่า

ข้อมูลที่ต้องเก็บมีเพียง .env (มีรหัสผ่านภายในทั้งหมด) และโฟลเดอร์ ~/.jitsi-meet-cfg สำรองด้วย tar czf ~/meet-config-$(date +%F).tar.gz .env ~/.jitsi-meet-cfg ระบบไม่ได้บันทึกภาพหรือเสียงการประชุมไว้ ถ้าไม่ได้ติดตั้งส่วนบันทึก (Jibri) เพิ่ม

การอัปเดต Jitsi Meet ทำโดยหยุดระบบด้วย docker compose down ดาวน์โหลด release ใหม่ด้วยคำสั่งเดิมในขั้นตอนที่ 1 แตกไฟล์ทับ แล้วเทียบ env.example รุ่นใหม่กับ .env เดิมว่ามีตัวแปรใหม่หรือไม่ จากนั้นรัน docker compose pull && docker compose up -d อ่าน release notes ก่อนทุกครั้ง เพราะบางรุ่นเปลี่ยนโครงสร้างโฟลเดอร์คอนฟิก

ปัญหาที่พบบ่อยเกี่ยวกับ Jitsi Meet

ประชุมสองคนได้ปกติ แต่พอคนที่สามเข้า ภาพและเสียงหายทั้งห้อง?

ใน Jitsi Meet การประชุมสองคนใช้โหมด peer-to-peer ที่ไม่ผ่านเซิร์ฟเวอร์ เมื่อมีคนที่สาม ภาพและเสียงจะเปลี่ยนไปวิ่งผ่าน jvb ที่ UDP 10000 อาการนี้จึงแปลว่า UDP 10000 ถูกบล็อกที่ไฟร์วอลล์ระดับคลาวด์ หรือ JVB_ADVERTISE_IPS ไม่ใช่ IP สาธารณะของเครื่อง แก้แล้วรัน docker compose up -d

ขอใบรับรอง Let's Encrypt ไม่สำเร็จ?

ตรวจว่า A record ชี้มาที่เครื่องนี้แล้ว พอร์ต 80 เปิดจากอินเทอร์เน็ต และไม่มีโปรแกรมอื่นใช้พอร์ต 80/443 อยู่ อย่าสั่ง down/up ซ้ำหลายครั้งติดกัน เพราะ Let's Encrypt จำกัดจำนวนการขอใบรับรองต่อโดเมน ถ้าติดเพดานต้องรอก่อนลองใหม่

เปิด ENABLE_AUTH แล้ว แต่ใครก็ยังเปิดห้องได้?

คอนเทนเนอร์อ่านค่าจาก .env ตอนสร้างเท่านั้น docker compose restart ไม่พอ ต้องรัน docker compose up -d ให้สร้างคอนเทนเนอร์ใหม่ และตรวจว่าบรรทัด ENABLE_AUTH กับ AUTH_TYPE ไม่มีเครื่องหมาย # นำหน้า

ผู้ใช้เปิดไมค์หรือกล้องไม่ได้ ขึ้นข้อผิดพลาด getUserMedia?

เบราว์เซอร์อนุญาตให้ใช้ไมค์และกล้องเฉพาะเว็บที่เป็น HTTPS ให้เข้าผ่าน https://meet.example.com เท่านั้น ไม่ใช่ IP หรือพอร์ต 8000 ตัวเลือกทั้งหมดอ่านได้ที่ Jitsi Handbook: Self-Hosting Guide - Docker

เช็กลิสต์ Jitsi Meet ก่อนใช้งานจริง เช่น เปิด UDP 10000 ตั้ง JVB_ADVERTISE_IPS รัน gen-passwords.sh และเปิด ENABLE_AUTH
ทดสอบด้วยผู้เข้าร่วมอย่างน้อยสามคนจากเครือข่ายต่างกันก่อนประกาศใช้

ต้องการเครื่องที่มีแบนด์วิดท์เพียงพอสำหรับประชุมวิดีโอขององค์กร ดู Cloud Server หรือ ติดต่อทีมงาน THAI DATA CLOUD เพื่อช่วยประเมินขนาดเครื่องตามจำนวนผู้เข้าประชุม

อ่านเพิ่มเติมเกี่ยวกับ Jitsi Meet

แชร์FacebookXLINELinkedIn

มีคำถามเรื่องบริการ? ติดต่อทีมงาน