# 在 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)