跳到主要內容

利用 Jitsi 建立個人化的視訊會議平台

 

近期因為疫情的關係,越來越多企業開始實施分流或在家工作,視訊會議的需求也日益增加。
在商用解決方案選擇上,有不少企業會選擇知名品牌的產品,例如 Cisco WebexGoogle MeetMicrosoft TeamsZoom 都是很不錯的方案。

KKBOX 集團在去年便試行及做好充分 work from home 的準備,今年五月也因應疫情升溫,全員 work from home 至今兩個月有餘。
當然,取之 Open Source,也要對社群有些貢獻。在這一屆 COSCUP,我們要來介紹 Open Source 圈中也很知名,效果也很不錯的一套視訊會議平台:Jitsi
除了基本的視訊會議功能外,在最後我們也會示範如何透過 Jitsi 畫面輸出到 YouTube/Twitch 或其他支援 RTMP 的平台進行直播。

由於篇幅有限,且 Jitsi 可以調整的細節非常多。今天我們純粹很快速的示範,如何簡單的建置出一個 Jitsi 環境,並提供單場會議內容錄影或直播。
Jitsi 的文件可以在這裡找到。

今天透過 AWS Lightsail 的 $10/month instance(1 core CPU + 2GB RAM + 60GB SSD),作業系統則是 Ubuntu 20.04 來示範。當然,使用其他 VPS 亦可,大同小異,這邊直接跳過 VPS 相關的建置過程。
*firewall 相關資料參考這裡這裡

針對系統做必要的更新

基本的 apt repository 更新:

$ sudo apt update

因為後面要示範的會議錄影及直播需要使用 ALSA loopback device,如果是 EC2 or Lightsail 則需要額外安裝 generic kernel():

$ sudo apt install linux-image-generic linux-headers-generic linux-image-extra-virtual

接著做系統套件們的更新:

$ sudo apt dist-upgrade
$ sudo apt autoremove

如果是 AWS EC2 or Lightsail 則需要另外再將預設的 AWS optimized kernel 移除():

$ sudo apt remove linux-image-aws linux-aws-* linux-image-*-aws

最後將 snd-aloop module 設為開機自動載入,重開機:

$ sudo sh -c "echo 'snd-aloop' >> /etc/modules"
$ sudo reboot

:可以參考這裡*

接著將 Jitsi 官方的 apt repository 與 gpg key 加進來,並安裝 jitsi-meet:

$ sudo sh -c "echo 'deb https://download.jitsi.org unstable/' > /etc/apt/sources.list.d/jitsi-unstable.list"
$ wget -qO - https://download.jitsi.org/jitsi-key.gpg.key | sudo apt-key add -
$ sudo apt update
$ sudo apt install jitsi-meet

過程中會提示輸入 server hostname,在這裡我們輸入 coscup.kk.stream(請自行替換這個 hostname 為你自己的 hostname)。

在安裝過程時先選擇自己簽發憑證(self-signed)

後面再透過 Let’s Encrypt 簽發真正可用的憑證或自行替換購買的憑證:

$ sudo /usr/share/jitsi-meet/scripts/install-letsencrypt-cert.sh

接下來參考這裡相關的說明,開始調整 Jitsi 設定。

調整 Prosody 的設定:

$ sudo vim /etc/prosody/conf.d/coscup.kk.stream.cfg.lua

找到 VirtualHost "coscup.kk.stream" 這一段,將裡面的 authentication = "anonymous" 改成 authentication = "internal_hashed"(關閉匿名使用模式,使用簡單帳號管理機制)

接著在 VirtualHost "coscup.kk.stream" 這一段的後面加上:

VirtualHost "guest.coscup.kk.stream"
    authentication = "anonymous"
    c2s_require_encryption = false

調整 jitsi-meet 的設定:

$ sudo vim /etc/jitsi/meet/coscup.kk.stream-config.js

找到 hosts 的區段,加上 anonymous domain 設定 anonymousdomain: 'guest.coscup.kk.stream',

調整 jicofo 設定:

$ sudo sh -c "echo 'org.jitsi.jicofo.auth.URL=XMPP:coscup.kk.stream' >> /etc/jitsi/jicofo/sip-communicator.properties"

建立一個接下來會用到的 Jitsi 管理者帳號:

$ sudo prosodyctl register <帳號名稱> coscup.kk.stream <密碼>
# 例如 sudo prosodyctl register coscup coscup.kk.stream ilovecoscup

錄影需求,接下來安裝 Jibri 與 FFmpeg 與 Google Chrome 與 Chromedriver

$ sudo apt install jibri ffmpeg
$ wget -qO - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
$ sudo sh -c "echo 'deb http://dl.google.com/linux/chrome/deb/ stable main' > /etc/apt/sources.list.d/google-chrome.list"
$ sudo apt update
$ sudo apt install google-chrome-stable
$ sudo mkdir -p /etc/opt/chrome/policies/managed
$ sudo sh -c "echo '{ "CommandLineFlagSecurityWarningsEnabled": false }' >>/etc/opt/chrome/policies/managed/managed_policies.json"
$ CHROME_DRIVER_VERSION=`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`
$ wget -N http://chromedriver.storage.googleapis.com/$CHROME_DRIVER_VERSION/chromedriver_linux64.zip -P ~/
$ unzip ~/chromedriver_linux64.zip -d ~/
$ rm ~/chromedriver_linux64.zip
$ sudo mv -f ~/chromedriver /usr/local/bin/chromedriver
$ sudo chown root:root /usr/local/bin/chromedriver
$ sudo chmod 0755 /usr/local/bin/chromedriver
$ sudo apt install default-jre-headless curl alsa-utils icewm xdotool xserver-xorg-input-void xserver-xorg-video-dummy

加上 Prosody 錄影相關的 vhost:

$ sudo vim /etc/prosody/conf.d/coscup.kk.stream.cfg.lua

加上這一段

VirtualHost "recorder.coscup.kk.stream"
    modules_enabled = {
        "ping";
    }
    authentication = "internal_plain"

建立兩個帳號給 jibri(密碼自行替換):

$ sudo prosodyctl register jibri auth.coscup.kk.stream jibriauthpass
$ sudo prosodyctl register recorder recorder.coscup.kk.stream jibrirecorderpass

調整 jicofo 的 jibri BREWERY 及 PENDING_TIMEOUT 及 SHORT_ID 參數:

$ sudo sh -c "echo 'org.jitsi.jicofo.jibri.BREWERY=JibriBrewery@internal.auth.coscup.kk.stream' >> /etc/jitsi/jicofo/sip-communicator.properties"
$ sudo sh -c "echo 'org.jitsi.jicofo.jibri.PENDING_TIMEOUT=90' >> /etc/jitsi/jicofo/sip-communicator.properties"
$ sudo sh -c "echo 'org.jitsi.jicofo.SHORT_ID=1' >> /etc/jitsi/jicofo/sip-communicator.properties"

最後開啟 Jitsi 的錄影及 live 功能:

$ sudo vim /etc/jitsi/meet/coscup.kk.stream-config.js

在 testing 區段找到相關地方調整成

        fileRecordingsEnabled: true, 
        liveStreamingEnabled: true, 
        hiddenDomain: 'recorder.coscup.kk.stream',

加上 jibri 設定:

$ sudo vim /etc/jitsi/jibri/jibri.conf

置換成這樣(其中 jibri 及 recorder 這兩個帳號的密碼要跟早先建立的相同)

jibri {
  id = "coscup.kk.stream-1"
  single-use-mode = false
  api {
    http {
      external-api-port = 2222
      internal-api-port = 3333
    }
    xmpp {
      environments = [{
        name = "COSCUP Jitsi Demo"
        xmpp-server-hosts = ["coscup.kk.stream"]
        xmpp-domain = "coscup.kk.stream"
        control-login = {
          domain = "auth.coscup.kk.stream"
          username = "jibri"
          password = "jibriauthpass"
        }
        control-muc = {
          domain = "internal.auth.coscup.kk.stream"
          room-name = "JibriBrewery"
          nickname = "jibri-nickname"
        }
        call-login = {
          domain = "recorder.coscup.kk.stream"
          username = "recorder"
          password = "jibrirecorderpass"
        }
        strip-from-room-domain = "conference."
        usage-timeout = 3 hour
        trust-all-xmpp-certs = true
      }]
    }
  }
  recording {
    recordings-directory = "/srv/recordings"
    finalize-script = ""
  }
  streaming {
    rtmp-allow-list = [
      ".*"
    ]
  }
  ffmpeg {
    resolution = "1920x1080"
    audio-source = "alsa"
    audio-device = "plug:bsnoop"
  }
  chrome {
    flags = [
      "--use-fake-ui-for-media-stream",
      "--start-maximized",
      "--kiosk",
      "--enabled",
      "--disable-infobars",
      "--autoplay-policy=no-user-gesture-required"
    ]
  }
  stats {
    enable-stats-d = true
  }
  webhook {
    subscribers = []
  }
  call-status-checks {
    no-media-timeout = 30 seconds
    all-muted-timeout = 10 minutes
    default-call-empty-timeout = 30 seconds
  }
}

建立錄影用的目錄:

$ sudo mkdir /srv/recordings
$ sudo chown jibri:jibri /srv/recordings

將 jibri 加入存取 video/audio 相關 device 的系統群組:

$ sudo usermod -aG adm,audio,video,plugdev jibri

讓 jibri 開機就跑起來:

$ sudo systemctl enable jibri

重開機,大功告成

$ sudo reboot

接著就能直接以瀏覽器打開 Jitsi,並且可以建立新的會議室:

如果主持人尚未加入,請等待主持人。

如果你就是主持人,則輸入稍早建立的管理者帳號密碼:

接著就可以邀請大家加入會議啦:

也可以建立這場會議的錄影或將其透過 RTMP 往其他直播平台輸出:

留言

這個網誌中的熱門文章

COSCon 中國開源年會特別軌:「COSCUP 議程軌」徵稿開始!

COSCUP 於中國的國際交流特別議程軌開跑了!! 想從台灣交換至中國演講的朋友們別錯過了! COSCon 2023 官網 業界最具影響力的開源年度盛會 2023 第八屆中國開源年會 (COSCon’23) 將於 2023 年 10 月 28 日(星期六)- 29 日(星期日)在四川省成都市高新區菁蓉匯由開源社舉辦。 COSCon 以其獨特定位及日益增加的影響力,吸引越來越多的頂級企業和國際基金會的大力支持。與一般企業、IT 媒體、行業協會或國外基金會在國內所舉辦的行業大會大不相同的是,COSCon 除了吸引跨企業和跨項目社區的不同用戶之外,也專註於吸引國內外大咖開源開發者、貢獻者和提交者的關註及參與項目及其社區。 今年的 COSCon 以「開源:川流不息、山海相映」為主題。 我們相信,開源之水將如山川間的溪流,生生不息,永不枯竭,無論是「峰會」還是「海會」,總有一個能容納心向開源的你。 在「後新冠時代」的第一年,我們將採用「烽火模式」,即在主會議後再在有意向的城市舉辦 After Party,將全球聚集而來「開源火種」在全國傳遞,以促進各個城市的開源文化傳播和開源人交流。 目前擬舉辦 After Party 的城市有北京、上海、成都(如果您所在的城市也希望舉辦 Affer Party 歡迎和我們取得聯系)…… 我們策劃的論壇主題包括但不限於:人工智能、開源商業、雲計算、大數據、區塊鏈、物聯網、開源教育、開源文化、開源治理、開源硬件、開源操作系統、女性論壇、開源公益、Web應用開發、開源百寶箱以及閃電演講等。除了各種會議,我們還將舉辦極具特色的“開源市集”,“開源市集”除了有展商的展台,還有各種有意思的小活動、小遊戲,通過遊戲化、娛樂化的方式普及開源文化,倡導開源精神。 COSCUP 今年與 COSCon 進行講者交流合作,於台灣及中國之間交換講者,建立國際交流的重要機會,讓雙方講者都能夠來往交流,特別是提供台灣的開源人更有機會到中國發表演講。 我想要投稿✋ 徵稿期間:即日起~9/13 止 徵稿對象:願意配合 COSCUP / COSCon 對此專案相關宣傳及訪問者; (及需要有被中國接受的證件才能出國。) 徵稿內容:各式 Open Source 相關議題皆可投稿; 請參考 COSCon 今年徵稿論壇類別 (上述) 。 演講

COSCUP 啄事今蜚會前快報 第一期

COSCUP 啄事今蜚會前快報 第一期 2014年06月18日發行 距離大會剩下一個月的時間, 精彩的議程內容即將就定位,讓小啄帶大家來看看今年有些什麼精彩的吧! 從沒有人到超多人: g0v社群經驗 g0v.tw 是一個跨界的開源社群,由一些熟悉軟體開源文化的人開始,從最初期就致力拓展到其他非資訊領域,因此在社群的推動上有各種不同努力。將近兩年來,關注社群人數爆炸性成長,社群因此經歷數次危機。但透過 g0v 與NGO、政府等實體組織互動、加強社群基礎建設、深化參與的文化,社群核心價值與開幹精神至今能量依然不減。此 talk 將以 g0v 為例,分享跨界社群的成長經驗,以及從開源社群拓展到民主深化的初步成果。 State of the unison: g0v 村情咨文 從 2012 底開始的 g0v 運動,成功集結開放源碼社群,並輸出開源文化至各領域,促使公民高效率協作,解決問題。本次演講將回顧 g0v 社群的成果,包括專案、與 gov 合作、國際交流,以及未來展望。 DevRel 的再思考   俺可以来讲讲大陆开源技术社区这12年. 相似演讲: - 幻灯: https://speakerdeck.com/ zoomquiet/140330-ostc-just4fun - 录音: http://zoomq.qiniudn.com/ CPyUG/140330-OSTC/ 140330_ostc_pm1_zoomquiet.MP3 - 录像: http://v.youku.com/v_show/ id_XNjk2OTcyODQ4.html" 更多議程請見 http://coscup.org/2014/zh-tw/program/

補文:Conference: Impossible! 的 COSCUP 2009

COSCUP 2009 總召 pingooo 在 2009 年寫了三篇有關 COSCUP 的文章,這是 第三篇 ,轉貼到 COSCUP 部落格留個記錄。 唉呀,都 2010 年了,才來寫舉辦 COSCUP 2009 研討會的回顧不會太慢了嗎? 這實在是我自己懶,加上有些帳款比較晚才收到(好像也和我有關 :p),整個 COSCUP 2009 的會計帳前一陣子才結清,要謝謝辛苦對帳的 Layla 和 Jouston。 我另有一篇有關 COSCUP 2009 籌備時期點滴的「 pingooo 總召的碎碎唸 」,是為了大會手冊在大會前三週寫的。辦活動是越接近活動日越緊張,這篇就來寫寫最後那幾週刺激好玩的事、順便 把一些總帳算一算 講講夥伴們不可磨滅的功勞、也履行一下之前說會公開研討會財務的承諾好了。 難得見面的熱血工作夥伴 既歡樂又驚險的大會手冊 COSCUP 物流中心 北京烤鴨爐 COSCUP 花絮照片 COSCUP 名句 好好玩的閃電秀 人客來買唷! 書展 COSCUP 精品街 我們也有吉祥物! 記憶足跡 互相漏氣求進步 數據來了! 誌謝 結束了... 片尾功勞簿 難得見面的熱血工作夥伴 還記得 2008 年底的時候,說話一向一針見血的 Pofeng 發了一封信問幾個朋友 COSCUP 2009 要不要辦,說: 不過我要提醒一下 Ping ; COSCUP 的籌備人力一直不足 休息一年, 我也覺得無妨, 如果 COSCUP 2010 再需要小弟, 小弟也願效犬馬之勞 還好有輔導長 lman 的組織動員能力和各工頭的努力招募,往年一向籌備人力不足的 COSCUP,在 2009 年有了戲劇性的轉變。COSCUP 2009 雖然在台北舉行,但工作夥伴來自各地:台北、基隆、桃園、新竹、台中、嘉義、台南、高雄。都是志工的夥伴們,只能靠工作之餘的時間投入,彼此之間很少見面,完全依賴各種網路工具來討論、協調大小事,這樣也可以辦出一個 兩天兩地450人的歡樂研討會 ,現在想起來還是覺得不可思議!所有夥伴的熱血、主動積極、體諒彼此和相互扶持,是這一切成功的原因。 既歡樂又驚險的大會手冊 在 Ijs 的設計之下,COSCUP 2009 有一本印刷精美的大會手冊,整個研討會的