# 在 AWS 上使用 Docker 安裝 Jitsi 為了在 AWS 上安裝 Jitsi 的 Docker 套件,著實的花了不少時間研究和測試,特地記錄一下目前穩定的安裝方法。 ## 目標 這篇文章會達到的目標包括 * 在 AWS 的機器上使用 docker 套件安裝 Jitsi server * 針對 Jitsi 開啟使用 JWT 方式做登入 * 利用 iframe 的方式使用 JWT 開啟預設的會議室,與顯示特定的人名 ## 本文的設定符合以下條件 * 一個 AWS 的機器,且已裝好 Nginx * 準備好一個 Domain Name,本文以 =={DN}== 表示,例如 *meet.jitsi.com* ## 安裝 Jitsi 1. 下載最新的版本,複製預設的 env 檔案,並設定密碼 ```shell git clone https://github.com/jitsi/docker-jitsi-meet && cd docker-jitsi-meet cp env.example .env ./gen-passwords.sh ``` 2. 修改 .env 部份 * CONFIG=~/.jitsi-meet-cfg ==這裡自己決定想要放 config 的地方,Log 也會放在這== * HTTP_PORT=8000 ==預設 HTTP PORT== * HTTPS_PORT=8443 ==預設 HTTPS PORT,如果不特別設定的話也會剛好是首頁連接 PORT== * TZ=Asia/Taipei * **#PUBLIC_URL=https://{DN}** ==一定要 mark 起來,因為 nginx 有自己的 httpd reverse proxy,就算 nginx 不用加任何設定也沒關係== * ENABLE_LETSENCRYPT=1 ==使用 LETSENCRYPT 加密方式== * LETSENCRYPT_DOMAIN={DN} ==填入自己這台伺服器的網域名稱== 3. 在 config 裡手動創建其他必要的資料夾,若 jigasi 和 jibri 沒用到的話可以不用開 ```shell sudo mkdir -p ~/.jitsi-meet-cfg/{web/letsencrypt,transcripts,prosody,jicofo,jvb,jigasi,jibri} ``` 4. 修改 docker-compose.yml ```dockerfile= volumes: - ${CONFIG}/web:/config - /etc/letsencrypt:/etc/letsencrypt //只要修改這裡即可 - ${CONFIG}/transcripts:/usr/share/jitsi-meet/transcripts ``` 5. 上線兼啟動 ``` docker-compose up -d ``` *等容器全部啟動需要一點時間,光 web 在產生 key 時就要等待了,如果不確定什麼時候可以使用的話看 web 的 log ,等輸出 service done 時就一定可以使用。* ## 檢查 Jitsi 伺服器運作 在網址列輸入 ==https://{DN}:8443== 應該就可以看到 Jitsi 伺服器的首頁了。 但如果有需要再加上限制帳密的話,需要再繼續修改以下內容 主要有三種方法,這裡記錄兩種,第一種是直接對 Jitsi 註冊帳密來驗證,另一種是帳密放在別的伺服器中,而 Jitsi 使用 JWT 的方式來驗證 ==記得,如果修改 .env 檔案後,一定要把 config 全部砍掉後重建重啟,才會吃到新的 .env 檔案== ## 設定需要註冊帳密才能登入 1. 在 .env 檔案上加入帳密的相關設定 ```shell ENABLE_AUTH = 1 ENABLE_GUESTS = 0 AUTH_TYPE=internal ``` 2. 利用 prosody 的 container 註冊帳密 ```shell docker-compose exec prosody /bin/bash prosodyctl --config /config/prosody.cfg.lua register TheDesiredUsername meet.jitsi TheDesiredPassword ``` **meet.jitsi 這串文字不能修改,因為對於容器內而言這是固定的** ## 設定使用 JWT 方式才能登入 1. 在 .env 檔案上加入帳密的相關設定 ```dockerfile= ENABLE_AUTH = 1 ENABLE_GUESTS = 0 AUTH_TYPE = jwt JWT_APP_ID = meet_good_id //這裡輸入你想要的 APP ID JWT_APP_SECRET = meet_good_pw //這裡輸入你想要的 APP 密碼 ``` 2. 利用 JWT.io 生出 token 測試 進入 [JWT](https://jwt.io/#debugger-io) 網站後,填入 App ID 和 App 密碼,可以產生最基本的 token 3. 確定是否可開啟 開啟會議室時,一樣會先出現需要登入的帳密框,這時候直接在網址後面加上 ==?jwt={token}== 就可以進入了 ## 使用 iframe 內嵌 Jitsi 會議室 為了開發網站快速,其實可以在已經做好的網頁裡直接帶資訊並開啟一個新的 Jitsi 會議室 1. 確定已經設定好 JWT 認證 2. 在產生 token 時,可以夾帶額外要顯示在會議室介面上的資訊 HEADER ``` { "alg": "HS256", "typ": "JWT" } ``` PAYLOAD ``` { "context": { "user": { "avatar": "https:/gravatar.com/avatar/abc123", // 大頭照 "name": "John Doe", // 使用者名稱 "email": "jdoe@example.com" // 電子信箱 } }, "aud": "jitsi", "iss": "<your app id>", // APP ID "sub": "meet.jitsi.com.demo", // Domain Name "room": "*" // 聊天室名稱 } ``` VERIFY SIGNATURE ``` HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), your-256-bit-secret // 這裡要貼上 APP 密碼 ) ``` ==其中,使用者名稱,電子信箱,聊天室名稱都會直接顯示在會議室系統上面的個人資訊上== 3. 直接在 iframe 的屬性上指定會議室網址及 JWT ```htmlembedded= <iframe src="https://{DN}:8443/abcroom?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjb250ZXh0Ijp7InVzZXIiOnsiYXZhdGFyIjoiaHR0cHM6Ly9yb2JvaGFzaC5vcmcvam9obi1kb2UiLCJuYW1lIjoiaG93bWF1Y2giLCJlbWFpbCI6Im5vY2FsbG1lQGhvdG1haWwuY29tIn19LCJhdWQiOiJnb29kX2lkX2F1ZCIsImlzcyI6Im1lZXQyX2dvb2RfaWQiLCJzdWIiOiJtZWV0Mi53ZWljYW1wdXMuY29tIiwicm9vbSI6ImFiY3Jvb20ifQ.du2DZKEU5nf_zvEjnz59-ThsYugVzkyFRZqKOIRpt80" width="80%" height="80%" scrolling="auto" allow="microphone; camera"></iframe> ``` ==最後面要記得加上 allow 屬性,因為在 iframe 裡要自動讓瀏覽器端可以自動使用麥克風與相機權限== ## 使用 iframe 已知 issue * 若在沒有 DNS (HTTPS) 只有 http 的狀況下,若有多個 camera 或 audio 設備時,畫面下方的 camera 或 audio 設備選單會看不到,必須使用右下角的 settings 才看得到,而且也可以選擇。選擇完後可以正常使用沒有問題。 ## 重點 1. 每修改一次 .env 或 docker-compose.yml 之後,需要先把 ~/.jitsimeet-config 資料夾刪除並重建後才會生效,而且要記得重建資料夾 ## 參考資料 [用docker安裝視訊會議 jitsi-meet](https://kafeiou.pw/2020/04/04/2354/) [Docker Jitsi](https://github.com/jitsi/docker-jitsi-meet) [JWT](https://jwt.io/#debugger-io) [Rocket Chat part 3: Installing Jitsi with JWT for secure video conferencing](https://medium.com/@szewong/rocket-chat-part-3-installing-jitsi-with-jwt-for-secure-video-conferencing-b6f909e7f92c) [Jitsi Meet API](https://github.com/jitsi/jitsi-meet/blob/master/doc/api.md#api)