Chuyển tới nội dung chính
Version: 4.1

Cuộc họp và hội thảo trực tuyến (webmail)

Cuộc họp bổ sung hội nghị truyền hình vào webmail HiTechCloud: cuộc gọi video và âm thanh, chia sẻ màn hình, ghi hình, trò chuyện, biểu cảm, bình chọn, hỏi đáp, giơ tay, phòng chờ, mật khẩu, và một chế độ hội thảo trực tuyến nơi người trình bày nói và tới một nghìn người tham dự xem. Bất kỳ ai có liên kết đều có thể tham gia từ trình duyệt máy tính hoặc di động - không cần tài khoản, không cần ứng dụng, không cần tải về.

Mọi thứ chạy trên máy chủ của chính bạn. Dữ liệu phương tiện đi qua hitechcloud-meet, một dịch vụ nhỏ đi kèm panel, và các bản ghi là tệp trên đĩa của máy chủ. Không có API hay SaaS của bên thứ ba nào tham gia ở bất kỳ thời điểm nào; STUN/TURN, khi bạn muốn dùng, là các máy chủ do bạn chạy.

Cách hoạt động​

hitechcloud-meet là một SFU (đơn vị chuyển tiếp chọn lọc) WebRTC. Trình duyệt của mỗi người tham gia gửi camera, micro và màn hình của mình lên máy chủ một lần; máy chủ chuyển tiếp các luồng đó tới mọi người khác. Không có gì được giải mã hay trộn trên máy chủ, đó là điều cho phép một tiến trình phục vụ các phòng lớn, và giữ một hội thảo 1000 người ở mức "mỗi người trình bày một luồng tải lên" thay vì một mạng lưới kết nối chằng chịt.

Webmail (HiTechCloud Webmail) là giao diện người dùng và cũng là người gác cổng:

  • nó lưu các cuộc họp và đặt lịch cho chúng trên lịch,
  • nó cấp các token tham gia cho phép người tổ chức và khách vào (kiểm tra mật khẩu cuộc họp trước - dịch vụ phương tiện không bao giờ thấy mật khẩu),
  • nó proxy WebSocket báo hiệu tại https://<host>:2096/ws/meet, nên dịch vụ phương tiện cần không có tên máy, cổng hay chứng chỉ công khai riêng,
  • nó lập chỉ mục các bản ghi và truyền chúng từ trang Bản ghi.
browser ── https/wss :2096 ──► nginx ──► webmail backend ──► hitechcloud-meet (127.0.0.1:8893)
browser ── DTLS-SRTP UDP :8894 ─────────────────────────────► hitechcloud-meet (media)

Mã hoá - điều được và không được cam kết​

Âm thanh và video được mã hoá giữa mỗi trình duyệt và máy chủ bằng DTLS-SRTP, giao thức vận chuyển WebRTC chuẩn. Vì máy chủ chuyển tiếp (và có thể ghi) các gói tin, nó nắm giữ các khoá: phương tiện được giải mã trên máy chủ của bạn và mã hoá lại tới từng người tham gia. Đây là mã hoá đường truyền trên hạ tầng bạn kiểm soát, không phải mã hoá đầu cuối giữa các người tham gia. Không có gì rời máy chủ mà không được mã hoá và không có gì rời khỏi nó, trừ khi tới những người trong cuộc họp - nhưng một quản trị viên máy chủ, hoặc bất kỳ ai xâm nhập được máy chủ, về nguyên tắc có thể quan sát một cuộc họp. Nếu mô hình đe doạ của bạn đòi hỏi ngay cả máy chủ cũng không được thấy phương tiện, bạn cần một thiết kế ngang hàng hoặc insertable-streams; sản phẩm này cố ý đánh đổi điều đó để có bản ghi, hội thảo trực tuyến và khả năng mở rộng.

Cài đặt​

Trình cài đặt một dòng thiết lập cuộc họp cùng mọi thứ khác. Trên một máy chủ đã có sẵn:

hitechcloudcli meet install

Lệnh này cài tệp nhị phân hitechcloud-meet vào /usr/local/bin, tạo tài khoản dịch vụ hitechmeet, ghi /etc/hitechcloud/native/meet/meet.conf và một bí mật dùng chung, cài unit systemd hitechcloud-meet, mở cổng phương tiện trong CSF, và chuyển bí mật cho webmail (MEET_SECRET / MEET_URL trong webmail.env). Chạy lại nó là an toàn. Sau đó:

hitechcloudcli meet status

Nếu webmail chưa được cài khi bạn chạy lệnh, hãy chạy lại install sau đó để hai bên dùng chung bí mật.

Cổng​

CổngGiao thứcỞ đâuMục đích
2096TCPcông khai (đã mở sẵn)Webmail: trang, API, WebSocket báo hiệu
8894UDPcông khai - phải mởToàn bộ phương tiện cuộc họp, ghép kênh trên một cổng
8893TCPchỉ loopbackAPI báo hiệu/nội bộ - không bao giờ để lộ ra ngoài

Một cổng UDP phục vụ mọi cuộc họp và mọi người tham gia (mỗi địa chỉ cục bộ một socket, mọi kết nối được ghép kênh trên đó), nên thay đổi tường lửa chỉ là đúng một quy tắc. meet install thêm nó vào UDP_IN của CSF; với tường lửa khác, hoặc một nhóm bảo mật đám mây đặt trước máy chủ, hãy tự mở UDP 8894. Nếu bạn muốn dùng một dải cổng, hãy đặt UDP_PORT=0 và mở UDP_PORT_MIN-UDP_PORT_MAX (mặc định 40000-40100); dịch vụ lấy cổng trống đầu tiên trong đó khi khởi động.

Tuỳ chọn TCP_PORT=<n> cũng nhận phương tiện qua TCP cho những người tham gia có mạng chặn UDP; một máy chủ TURN (bên dưới) là câu trả lời vững chắc hơn.

Máy chủ phía sau NAT​

Nếu máy chủ có địa chỉ riêng trên giao diện mạng và một địa chỉ công khai trên router (hầu hết máy ảo đám mây), dịch vụ phải quảng bá địa chỉ công khai. install điền PUBLIC_IP từ địa chỉ tự phát hiện của panel; hãy kiểm tra bằng meet status và sửa bằng:

hitechcloudcli meet config PUBLIC_IP 203.0.113.5,2001:db8::5

STUN và TURN​

Những người tham gia trên mạng gia đình và văn phòng thông thường kết nối trực tiếp tới PUBLIC_IP:8894. Hai điều có thể ngăn điều đó:

  • NAT đối xứng / tường lửa nghiêm ngặt ở phía người tham gia chặn hoàn toàn UDP (một số mạng doanh nghiệp, một số nhà mạng di động, Wi-Fi khách sạn). Những người tham gia này cần một máy chuyển tiếp TURN.
  • STUN chỉ giúp người tham gia khám phá địa chỉ công khai của chính họ; vì máy chủ có một địa chỉ công khai cố định, STUN là tuỳ chọn ở đây.

Chúng tôi khuyên bạn chạy máy chủ TURN của riêng mình (coturn) cho mọi triển khai phục vụ công chúng. Nó có thể chạy trên cùng máy ở TCP 443 (turns:), vốn đi qua gần như mọi tường lửa, hoặc trên một máy riêng. Sau đó:

hitechcloudcli meet config TURN_SERVERS "turn:turn.example.com:3478|meet|secret,turns:turn.example.com:443?transport=tcp|meet|secret"
hitechcloudcli meet config STUN_SERVERS "stun.example.com:3478"

Định dạng: url|username|credential, ngăn cách bằng dấu phẩy giữa các máy chủ. Chúng được trao cho mọi trình duyệt lúc tham gia. Không có gì ở đây đòi hỏi dịch vụ bên thứ ba; mặc định là rỗng.

Một tên máy riêng?​

Không bắt buộc. Cuộc họp được phục vụ dưới nguồn gốc của webmail (https://mail.example.com:2096): liên kết tham gia trông như https://mail.example.com:2096/meet/join/abc-defg-hij. Nếu bạn thích một địa chỉ đẹp hơn (meet.example.com), hãy trỏ một tên máy về cùng máy chủ và proxy nó tới webmail - bản thân dịch vụ không quan tâm trình duyệt đã dùng nguồn gốc nào. Một tên máy riêng được khuyên dùng cho máy chủ TURN ở cổng 443, vì cổng đó được dùng chung với các website.

Dùng cuộc họp​

Mở Cuộc họp trong thanh bên webmail (Cài đặt → Plugin → Cuộc họp bật hoặc tắt nó theo từng người dùng; nó đang bật cho người dùng hiện có).

  • Cuộc họp mới mở ngay một phòng trong một tab mới.
  • Đặt lịch tạo một cuộc họp cho sau này: tên, loại (cuộc họp hoặc hội thảo trực tuyến), ngày và thời lượng (nó vào lịch của bạn cùng liên kết tham gia), mật khẩu, phòng chờ, tự động ghi khi chủ trì tham gia, giới hạn người tham gia (tối đa 1000), đồng chủ trì và người trình bày (địa chỉ hộp thư trên máy chủ này - họ nhận vai trò của mình khi đăng nhập và tham gia).
  • Sao chép liên kết / Mời chia sẻ https://…/meet/join/<code>; Mời gửi email nó từ hộp thư của bạn.
  • Chi tiết hiển thị các phiên trước: ai đã tham dự, cùng kết quả bình chọn và hỏi đáp của từng lần chạy.

Trong phòng​

Cuộc họpHội thảo trực tuyến
Gửi âm thanh/video/màn hìnhmọi ngườichủ trì, đồng chủ trì, người trình bày
Trò chuyệnmọi ngườimọi người, hoặc chỉ người trình bày (cài đặt)
Biểu cảm, giơ tay, bình chọn, hỏi đápmọi ngườimọi người (hỏi đáp được kiểm duyệt theo mặc định)
Cho vào từ phòng chờ, tắt tiếng/xoá, thăng cấp, ghi, kết thúcchủ trì, đồng chủ trìchủ trì, đồng chủ trì

Chủ trì thăng một người tham dự lên người trình bày (hoặc đồng chủ trì) từ bảng Mọi người; camera của người trình bày bị giáng cấp sẽ dừng ngay. Tiêu điểm đưa một người lên sân khấu của tất cả mọi người; ghim là chế độ xem riêng của bạn. Bố cục tự động chuyển giữa dạng lưới và dạng người nói (màn hình được chia sẻ hoặc tiêu điểm chiếm sân khấu) hoặc bằng tay dưới Thêm.

Video được gửi ở ba lớp chất lượng (simulcast); mỗi người xem nhận lớp phù hợp với kích thước ô trên màn hình của họ, nên một lưới lớn tốn rất ít băng thông.

Ghi hình​

Việc ghi bắt đầu từ Thêm → Bắt đầu ghi, từ bảng cài đặt, hoặc tự động khi chủ trì tham gia nếu cuộc họp được đặt lịch như vậy. Mọi người thấy huy hiệu REC màu đỏ và một dòng trong cuộc trò chuyện. Các tệp được lưu vào

/var/lib/hitechcloud/meet/recordings/<organiser>/<code>-<timestamp>/
manifest.json
01-<participant>-camera.webm audio + video of each participant
02-<participant>-screen.webm each shared screen
composite.webm only if ffmpeg is installed

Việc ghi không bao giờ giải mã phương tiện: camera (âm thanh+video) và màn hình của mỗi người tham gia trở thành tệp WebM riêng (Opus + VP8, đúng những gì trình duyệt đã gửi), nên việc ghi không tốn gì của máy chủ ngoài dung lượng đĩa. Khi đã cài ffmpeg (apt install ffmpeg / dnf install ffmpeg), dịch vụ còn dựng một tệp tổng hợp duy nhất sau cuộc họp: mọi track âm thanh được trộn, với màn hình được chia sẻ (hoặc camera đầu tiên) làm hình ảnh. Trang Bản ghi phát và tải xuống mọi tệp; xoá ở đó là xoá khỏi đĩa.

Phát trực tiếp​

Chủ trì hoặc đồng chủ trì có thể phát cuộc họp lên YouTube Live, Facebook Live, Twitch hoặc bất kỳ máy chủ RTMP / RTMPS nào từ Thêm → Phát trực tiếp. Trình duyệt của chủ trì làm việc đó: nó vẽ mọi camera và màn hình được chia sẻ lên một hình, trộn âm thanh của mọi người, và mã hoá thành H.264. Máy chủ chỉ đổi định dạng chứa và chuyển tiếp đi (hitechcloudcli meet stream).

Làm theo cách đó vì máy chủ này không đủ sức mã hoá. Đo trên máy 2 nhân với ffmpeg 6.1:

CPUTheo kịp thời gian thực?
Máy chủ mã hoá 4 người xếp ô ở 720p301,65 nhânKhông (0,79x)
Máy chủ mã hoá một camera ở 1080p603,40 nhânKhông (0,44x)
Máy chủ chỉ đóng gói lại những gì trình duyệt đã mã hoá (đúng việc nó làm)0,007 đến 0,05 nhânCó

Cần gì và tốn gì:

  • ffmpeg trên máy chủ. hitechcloudcli meet install cài nó từ bản phân phối (ffmpeg-free từ EPEL trên AlmaLinux/Rocky/RHEL); meet status hiển thị một dòng Phát trực tiếp cho biết nó có chạy được ở đây không và, nếu không, vì sao.
  • Băng thông, không phải CPU: mỗi luồng đến từ trình duyệt của chủ trì và rời đi tới nền tảng, 1,3 đến 4,6 Mbit/s mỗi chiều tuỳ chất lượng đã chọn. Tối đa 3 luồng chạy cùng lúc (MEET_MAX_LIVE_STREAMS trong môi trường của webmail).
  • Chủ trì dùng Chrome, Edge hoặc Safari hiện hành. RTMP chỉ mang H.264, và Firefox không thể ghi nó; hộp thoại nói rõ như vậy thay vì hiện một nút.
  • Tab của chủ trì phải luôn mở. Rời cuộc họp là kết thúc luồng.
  • Không dùng với mã hoá đầu cuối. Hộp thoại từ chối, vì luồng sẽ mang hình ảnh và âm thanh không mã hoá qua máy chủ này, đúng điều mà cụm mật khẩu sinh ra để ngăn chặn.

Khoá luồng tới máy chủ một lần, qua kết nối TLS của webmail, và đi tới bộ chuyển tiếp qua đầu vào chuẩn của nó: không bao giờ nằm trên dòng lệnh (nơi mọi người dùng cục bộ đều đọc được trong /proc), không bao giờ trong nhật ký, không bao giờ trên đĩa. Mọi người trong cuộc họp được báo trong cuộc trò chuyện khi một luồng bắt đầu và dừng.

Giới hạn và ghi chú về mở rộng​

  • Codec được cố định là VP8 và Opus, được mọi trình duyệt hỗ trợ và ghi được mà không cần chuyển mã. Safari 12.1+, Chrome, Edge và Firefox trên máy tính và di động đều dùng được.
  • Băng thông mới là giới hạn thực. Một người tham gia gửi 720p tốn khoảng 1,5 Mbit/s tải lên; mỗi người xem nhận các lớp mà ô của họ cần. Một hội thảo 1000 người với hai người trình bày là khoảng 2 × 1,5 Mbit/s vào và tới 1000 × 1,5 Mbit/s ra (≈1,5 Gbit/s ở chất lượng đầy đủ; một phần ba con số đó nếu người tham dự xem một ô nhỏ). Hãy chọn đường truyền lên của máy chủ theo khán giả, không phải theo CPU - SFU chuyển tiếp các gói tin và tốn rất ít CPU cho mỗi luồng.
  • MAX_ROOM_SIZE (mặc định 1000) giới hạn số người tham gia mỗi phòng; MAX_ROOMS (200) giới hạn số phòng đồng thời. Một cuộc họp có thể đặt giới hạn thấp hơn.
  • Dịch vụ là một tiến trình duy nhất trên một máy chủ; không có cụm trên nhiều máy.
  • Người tham gia mất kết nối có thể vào lại từ cùng liên kết; phòng giữ cuộc trò chuyện, bình chọn và hỏi đáp trong 45 giây sau khi người cuối cùng rời đi, và trang Chi tiết của người tổ chức giữ kết quả bình chọn và hỏi đáp vĩnh viễn.
  • Bản ghi tổng hợp là một tiện ích, không phải bản dựng nhiều camera đầy đủ; các tệp theo từng người tham gia mới là bản ghi hoàn chỉnh.

Tham chiếu​

Cấu hình nằm trong /etc/hitechcloud/native/meet/meet.conf (mỗi khoá đều được mô tả trong tệp). Đổi một khoá và khởi động lại:

hitechcloudcli meet config LOG_LEVEL debug
hitechcloudcli meet restart
hitechcloudcli meet log 100

Các lệnh hitechcloudcli meet: install, status, start, stop, restart, config [KEY VALUE], check, token <room> [name] [role] (tạo một token tham gia bằng tay để gỡ lỗi), log [lines], remove.

Dịch vụ: systemctl status hitechcloud-meet; nhật ký: /var/log/hitechcloud/native/meet/service.log.