開源 自主 可控 雙模

會議在手,主權我有

搭配 Jitsi Meet 基底的開源視訊會議系統,打造 Webex/Zoom 風格的會議入口,但一切由你掌控:多帳號 / 角色 / 2FA、預約、大廳、完整稽核與 SIEM 外拋。連線模式支援 8x8 JaaS(雲端託管)或自建 Jitsi Meet,一鍵切換。

8x8 自 2018 年起為 Jitsi / Jitsi Meet 的開發與維護公司;8x8 JaaS(Jitsi as a Service)即其官方雲端託管的 Jitsi 服務。

License PHP 8.4 Docker OWASP zero deps
jt-vc-portal 等候 / 倒數頁
等候 / 倒數頁:非開放時段顯示翻頁時鐘倒數,主持人進入即自動放行
Why

為什麼需要 jt-vc-portal?

把會議邀請連結到處轉貼、沒有權限與記錄,難以管理也難以稽核。

沒有入口閘道時

  • 邀請連結散落各處,誰建的、給了誰無從追查
  • 來賓可任意進入,缺乏開放時段與身分控制
  • 沒有登入與行為記錄,無法稽核或外拋 SIEM
  • 綁死單一雲端服務,難以切換或自建省成本
  • 就算魔改 prosody 擠出帳號管理,設定繁瑣又難維護

用 jt-vc-portal 後

  • 統一入口:主持人登入才能建會議室,行為全程稽核
  • 預約時段、來賓需具名、主持人在線上才放行
  • 多帳號 / 角色 / 2FA;登入記錄可外拋 syslog/CEF/GELF
  • 雙模式:8x8 JaaS自建 Jitsi Meet,一鍵切換不動程式碼
  • 帳號 / 角色 / 權限網頁化管理,免碰 prosody 設定檔
Features

核心功能

企業會議入口需要的均已內建,零外部 PHP 套件。

雙連線模式

8x8 JaaS(RS256 + kid)或自建 Jitsi Meet(HS256 / 免 JWT),管理介面一鍵切換。

會議室管理

建立 / 進入、亂數命名、近期清單、一鍵複製邀請、QR Code 彈窗。

預約時段

設定開放時段;未到顯示翻頁時鐘倒數,主持人提前進入即自動放行。

Email 邀請

填與會者 email,寄送含 .ics 行事曆的邀請信,可自訂主旨 / 內文範本。

來賓流程

來賓需自填名稱才進場;非開放時段顯示等候 / 倒數 / 已結束頁。

大廳模式

建立會議室可選;主持人進場自動開啟,來賓需經主持人逐一允許才能進入。

多帳號 / 角色 / 2FA

admin 看全部、host 只看自己建的;支援 TOTP 雙因素認證。

完整稽核 + SIEM

登入、建室、邀請、設定變更全記錄,可即時外拋 syslog / CEF / GELF。

外觀客製

60 種 Jitsi 介面語言、22 種主題、站台名稱 / logo、登入頁路徑偽裝。

會議統計

會議時長排行、尖峰同時人數與參與者進出時間軸;JaaS 模式另接 USAGE webhook 統計 MAU。

錄影調閱(自建 Jibri)

串接 Jibri 主機錄影服務:線上列表 / 播放 / 下載 / 刪除、主機容量、保留政策(時間 / 容量 / 殘留);主持人可調閱自己會議的錄影。

Compare

怎麼選?8x8 JaaS 與自建 Jitsi Meet

兩種模式都能在管理介面一鍵切換、不必改程式,依團隊規模與維運能力選擇即可。

小團隊建議從 8x8 JaaS 起步:JaaS 提供免費 Dev 方案(每月 25 MAU 免費額度),免架站、免維運即可上線,最適合小團隊、試用與內部小規模使用;待規模成長再評估轉自建。

8x8 JaaS(雲端託管)

適合:小團隊、想快速上線、不想維運伺服器。

  • 免費 Dev 方案(25 MAU/月),小團隊幾乎零成本上線
  • 免維運:伺服器、JVB、錄影皆由 8x8 代管
  • 全球節點、品質穩定,幾分鐘即可開通
  • 缺點:依 MAU 計費,規模大成本上升;媒體經第三方雲端,需評估隱私 / 合規

自建 Jitsi Meet

適合:重隱私自主、中小規模、具維運能力。

  • 完全自主掌控,媒體資料不出自家機房
  • 無 MAU 計費,規模越大反而越省
  • 可深度客製、與內網整合
  • 缺點:需自行維運 Jitsi / prosody / jicofo / JVB;錄影搭配自建 Jibri;並發量大需擴充頻寬
項目8x8 JaaS自建 Jitsi Meet
維運負擔無(全代管)需自行維運
上線速度幾分鐘需先架站
費用模式免費 Dev 方案(25 MAU)/ 超過依 MAU 計費自有硬體與頻寬
資料主權經 8x8 雲端完全自有
錄影內建(依方案)搭配自建 Jibri
適合規模不限規模(小團隊到大規模,依 MAU 計費)中小型 / 高隱私需求
JWT 簽章RS256 + kidHS256 或免 JWT
什麼是 MAU?MAU(Monthly Active Users,月活躍使用者)指一個計費週期內「不重複」加入會議的人數——同一人多次開會只算一位。8x8 JaaS 以此計費(免費 Dev 方案每月含 25 位);自建 Jitsi Meet 無此限制。本系統用量統計頁會依訂閱週期統計目前 MAU。
Security

安全性:遵循 OWASP Top 10:2025 實作

從設計到部署逐項把關。

A01
存取控制未授權頁回 404、會議室依擁有者隔離、CSRF token。
A02
安全設定關閉錯誤顯示與版本洩漏、安全標頭、敏感路徑拒絕存取。
A03
供應鏈零外部 PHP 套件;前端 CDN 資源加 SRI 完整性驗證;映像建置時套用最新 OS 安全更新。
A04
加密bcrypt 密碼、JWT 簽章、webhook HMAC、安全 session cookie。
A05
注入輸出跳脫、輸入清洗、Email header injection 防護。
A06
安全設計閘道式架構、預設安全(來賓須具名、主持人在線上才放行)、角色最小權限。
A07
認證TOTP 2FA、fail2ban 登入鎖定(依真實來源 IP)。
A08
資料完整性webhook 以 HMAC 簽章驗證來源,並用 idempotency key 去除重複事件。
A09
記錄與告警完整稽核記錄 + 即時 SIEM 外拋。
A10
例外處理失敗安全降級:讀取失敗回預設、寄信 / 外拋失敗不阻斷主流程、錯誤不外洩。
Gallery

畫面一覽

實際操作畫面一覽。

儀表板
01

儀表板

登入後的主控台:輸入會議室名稱即可一鍵建立或進入會議室,也能亂數產生會議室名稱。下方「近期會議室」清單會顯示每間是誰建立、何時進入、開了多久,以及預約 / 大廳 / 主持人在線上等狀態,所有操作全程稽核。

建立會議室
02

建立會議室

勾選「限定開放時段」即可設定會議開放時間並寄送含 .ics 行事曆的 Email 邀請;也能勾選「大廳模式」讓主持人逐一允許來賓進入。建立後立即取得邀請連結與 QR Code,可直接開始主持或先複製連結稍後使用。

用量統計
03

用量統計

數據中心一頁掌握使用狀況。兩種模式通用:會議場次與時長、本期會議時長時間軸、主持人排行榜、近 30 天活動折線圖。另有 JaaS 模式專屬的本期 MAU 用量與方案上限、各計費週期歷史趨勢,並可手動校正用量基準(自建模式則自動隱藏這兩項、頁籤改稱「會議統計」)。

稽核記錄
04

稽核記錄

登入登出、建立 / 進入會議室、寄送邀請、帳號與設定變更等行為全數留存。可依行為類型、關鍵字與日期範圍篩選,欄位標題可點擊排序,並即時外拋 syslog / CEF / GELF 至 SIEM。

帳號管理
05

帳號管理

支援多個主持人帳號與角色:admin 可看全部會議室與管理頁,host 只看自己建立的。每個帳號可設定顯示名稱、Email、啟用 TOTP 雙因素認證,並可隨時編輯或停用。

系統設定
06

系統設定

集中管理所有設定:連線模式(8x8 JaaS / 自建 Jitsi Meet)、SMTP 寄信、會議記錄保留天數、Log 外拋、站台名稱與 Logo,以及 22 種外觀主題,一頁搞定。

來賓進入
07

來賓進入

來賓憑邀請連結進入,須先輸入顯示名稱才能進場,進入會議時自動帶入該名稱。整個來賓流程都套用站台主題與品牌,與主持端體驗一致。

等候 / 倒數頁
08

等候 / 倒數頁

非開放時段時,來賓會看到優雅的翻頁時鐘倒數與會議起訖時間;一旦主持人提前進入,系統每隔數秒自動偵測並放行,來賓無需重整、不必苦等。

錄影記錄
09

錄影記錄

調閱自建 Jibri 主機產出的會議錄影:線上播放、下載、刪除,並顯示錄影主機磁碟容量與每筆的大小、長度、狀態。可依會議室 / 主持人 / 參與者搜尋,點任一列展開該場的參與者進出時間軸。權限分明——主持人只看自己主持會議的錄影,管理者可管全部;保留政策(依時間 / 容量 / 殘留檔自動清理)也在此一目了然。

會議室自訂
10

會議室自訂

自建 Jitsi Meet 模式專用的會議室介面客製:進入時是否靜音 / 關鏡頭、畫質上限、預設檢視(演講者 / 畫廊)、是否關閉「視訊省頻寬」自動降載,以及逐項勾選工具列要開放的功能(聊天、螢幕分享、舉手、錄影、虛擬背景、共享文件…)。所有設定都在進入會議時自動帶入 Jitsi,無需改動 Jitsi 設定檔。

錄製設定
11

錄製設定

設定會議錄製者在與會者清單顯示的名稱,並串接自建 Jibri 主機的錄影調閱服務——填入服務 URL 與 token 後即顯示連線狀態與已註冊錄製器數,並附上增減錄製器的文件連結。錄影保留政策可依時間(保留 N 天)、容量(保留可用空間或總量上限)或殘留檔自動清理,預設全部停用以策安全。

Install

系統需求與安裝

兩種安裝方式,資料與設定皆持久化、更新不遺失。

項目最低建議
PHP8.28.4
Web 伺服器Apache + mod_rewrite(AllowOverride All)同左 + HTTPS
PHP 擴充openssl、fileinfo、json、mbstring同左
其他可寫入資料目錄;JaaS 模式需 8x8 私鑰Docker 24+

方法一:直接安裝(Apache + PHP)

# 取得程式並啟用 .htaccess
git clone https://github.com/jasoncheng7115/jt-vc-portal.git
cd jt-vc-portal
a2enmod rewrite headers
cp dot.htaccess .htaccess

# 持久化資料目錄(預設 /var/jaas-data,可於 config.php 調整)
sudo mkdir -p /var/jaas-data && sudo chown www-data:www-data /var/jaas-data

# JaaS 模式才需要:放入 8x8 私鑰
sudo mkdir -p keys && sudo cp /path/to/private.key keys/private.key

方法二:Docker 打包部署

git clone https://github.com/jasoncheng7115/jt-vc-portal.git
cd jt-vc-portal
docker build --pull -t jt-vc-portal .

mkdir -p /opt/jt-vc-portal/keys /opt/jt-vc-portal/data
chown 33:33 /opt/jt-vc-portal/data
cp /path/to/private.key /opt/jt-vc-portal/keys/private.key   # JaaS 模式

docker run -d --restart unless-stopped -p 127.0.0.1:58189:58189 \
  -e JTVC_ADMIN_EMAIL="admin@example.com" \
  -e JTVC_ADMIN_PASSWORD="請設定強密碼" \
  -e JTVC_TRUSTED_PROXIES="127.0.0.1,172.16.0.0/12" \
  -v /opt/jt-vc-portal/keys/:/var/www/html/keys \
  -v /opt/jt-vc-portal/data/:/var/jaas-data \
  --name jt-vc-portal jt-vc-portal

方法三:從 Release 載入預建映像

# 不想自己 build,直接下載 Release 打包映像(linux/amd64)
curl -LO https://github.com/jasoncheng7115/jt-vc-portal/releases/download/v1.6.1/jt-vc-portal-1.6.1-docker-amd64.tar.gz
sha256sum -c jt-vc-portal-1.6.1-docker-amd64.tar.gz.sha256   # 驗證完整性
docker load < jt-vc-portal-1.6.1-docker-amd64.tar.gz        # 載入為 jt-vc-portal:latest

mkdir -p /opt/jt-vc-portal/keys /opt/jt-vc-portal/data
chown 33:33 /opt/jt-vc-portal/data
cp /path/to/private.key /opt/jt-vc-portal/keys/private.key   # JaaS 模式才需要

docker run -d --restart unless-stopped -p 127.0.0.1:58189:58189 \
  -e JTVC_ADMIN_EMAIL="admin@example.com" \
  -e JTVC_ADMIN_PASSWORD="請設定強密碼" \
  -e JTVC_TRUSTED_PROXIES="127.0.0.1,172.16.0.0/12" \
  -v /opt/jt-vc-portal/keys/:/var/www/html/keys \
  -v /opt/jt-vc-portal/data/:/var/jaas-data \
  --name jt-vc-portal jt-vc-portal:latest

前端反向代理 HTTPS(建議)

系統對外為 :58189,正式環境建議前面再以 nginx 或 Apache 反向代理掛上 HTTPS。

# nginx 範例
server {
    listen 443 ssl;
    server_name your-domain.com;

    # ssl_certificate     /etc/letsencrypt/live/your-domain.com/fullchain.pem;
    # ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:58189/;
        proxy_set_header Host              $host;
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
系統以 X-Real-IP 取得真實來源 IP(fail2ban 鎖定與稽核用),請務必讓反向代理帶上此 header。公開上線資安重點:設定 JTVC_TRUSTED_PROXIES(逗號分隔 IP/CIDR)只採信可信代理的來源標頭,並以 -p 127.0.0.1:58189:58189 或防火牆限制容器埠只讓反代可達——否則攻擊者可偽造 X-Real-IP 繞過 fail2ban、污染稽核。留空=相容模式(盲信標頭,須搭配埠隔離)。經 Cloudflare 時讓反代由 CF-Connecting-IP 帶入 X-Real-IP。完整 Apache 站台設定範例請見 GitHub README

更新 / 升級

所有設定與資料(帳號、會議室、稽核、用量等)都存在 DATA_DIR 或掛載卷,更新不會遺失,JSON 結構會自動相容升級。更新前仍建議先備份資料目錄與 keys/

# 共同:更新前備份(建議)
cp -a /opt/jt-vc-portal/data /opt/jt-vc-portal/data.bak-$(date +%Y%m%d)

# 方法一:直接安裝
git pull
cp dot.htaccess .htaccess          # 若 .htaccess 有更新
sudo systemctl reload apache2      # 清 opcache

# 方法二:Docker 自行 build
git pull
docker build --pull -t jt-vc-portal .
docker stop jt-vc-portal && docker rm jt-vc-portal
docker run -d --restart unless-stopped -p 58189:58189 \
  -v /opt/jt-vc-portal/keys/:/var/www/html/keys \
  -v /opt/jt-vc-portal/data/:/var/jaas-data \
  --name jt-vc-portal jt-vc-portal

# 方法三:下載 Release 預建映像(不自行 build)
curl -LO https://github.com/jasoncheng7115/jt-vc-portal/releases/latest/download/jt-vc-portal-<新版本>-docker-amd64.tar.gz
docker load < jt-vc-portal-<新版本>-docker-amd64.tar.gz
docker stop jt-vc-portal && docker rm jt-vc-portal      # 再以方法二相同參數重新 docker run
資料與私鑰都在掛載卷 / DATA_DIR,換容器不受影響;登入後可從左上版本號確認已更新到新版。
Appendix

附錄:進階文件

自建 Jitsi Meet 與錄影的完整部署 SOP。

自建 Jitsi Meet 整合

從官方 Docker 版 Jitsi Meet 一路設定到與 jt-vc-portal 搭配:架構、連接埠 / NAT、TLS、JWT 與主持人權限、媒體後援 / TURN。

JITSI-MEET-SETUP.md

Jibri 錄影整合 選配

在自建 Jitsi Meet 上加上 Jibri 錄影:VM 需求、snd-aloop、同時多會議室錄製、錄影中文顯示(CJK 字型)、獨立 Jibri VM 實作。

非必要——不安裝完全不影響 Jitsi Meet 與會議運作,只是不提供錄影功能;需要時再加裝即可。

JIBRI-SETUP.md

免責聲明

本軟體依「現狀」(AS IS)提供,不附任何明示或默示之擔保。使用者須自行負責部署環境之安全性與合規性,包含第三方服務(如 8x8 JaaS)之服務條款與費用。作者不對任何因使用本軟體所生之直接或間接損失負責。本專案以 Apache License 2.0 釋出。