o3o
o3o Meet · Hướng dẫn cài đặt

Cài o3o Meet lên máy chủ của bạn

o3o Meet là nền tảng họp và dạy học trực tuyến tự chủ hạ tầng: video/âm thanh WebRTC, bảng vẽ thời gian thực trên bài giảng, ghi hình, phòng chờ, điểm danh, trang quản trị và app Windows cho người chủ trì. Toàn bộ chạy trên máy chủ của chính bạn — dữ liệu, bản ghi hình, danh sách người dùng không rời khỏi máy.

Tổng quan

Cài đặt chỉ cần một dòng lệnh trên máy Ubuntu sạch. Bộ cài tự cài Docker, nginx, certbot; kéo mã nguồn; sinh mọi bí mật; xin chứng chỉ HTTPS; dựng dịch vụ; cài bộ cập nhật; rồi in đường vào trang chào mừng để bạn tự cấu hình logo, tên tổ chức, đăng nhập SSO và giấy phép trên trình duyệt. Thời gian cài trọn bộ khoảng 5–10 phút tuỳ tốc độ mạng của máy chủ.

curl -fsSL https://install.o3o.vn/meet/cai-o3o-meet.sh \
  | sudo bash -s -- --domain meet.congty.vn --email it@congty.vn

Thay meet.congty.vn bằng tên miền đã trỏ về máy và it@congty.vn bằng email nhận thông báo chứng chỉ. Chi tiết từng bước ở dưới.

1. Trước khi cài

Bộ cài kiểm và nhắc, nhưng không làm thay ba việc: chuẩn bị máy, trỏ DNS và mở tường lửa ở nhà cung cấp. Làm đủ ba việc này trước thì lần cài đầu sẽ xong ngay, không phải chạy lại.

Máy chủ

Hạng mụcYêu cầuGhi chú
Hệ điều hànhUbuntu Server 22.04 LTS hoặc 24.04 LTS, bản 64-bit, mới cài sạchMáy ảo / VPS / máy vật lý đều được. Bộ cài dùng nginx của hệ thống và xoá site mặc định; máy đang chạy web khác trên cổng 80/443 thì không nên dùng chung.
QuyềnTài khoản root hoặc có sudoBộ cài từ chối chạy khi không phải root.
CPU · RAM · đĩaTối thiểu 2 vCPU · 4 GB RAM · 40 GB SSDĐủ cho vài lớp/cuộc họp cùng lúc. Nhiều lớp đồng thời hơn thì thêm CPU và băng thông; ghi hình chiếm đĩa (ước chừng dưới 1 GB mỗi giờ ghi ở 720p) — theo dõi /data/recordings.
MạngIP công khai tĩnh gắn thẳng vào máyMáy đứng sau NAT/router vẫn cài được với --sau-nat --ip <IP công khai>, nhưng phải chuyển tiếp đủ các cổng dưới đây.
Kết nối ra ngoàiMáy ra được internet (apt, Docker Hub, Let's Encrypt, kho mã)Máy trong mạng nội bộ không ra được kho: chép cây mã lên rồi cài với --nguon.

Mạng & tường lửa

Mở các cổng sau ở tường lửa của nhà cung cấp (security group / firewall của VPS). Bộ cài không tự mở vì mỗi nhà cung cấp một kiểu.

CổngGiao thứcDùng cho
22TCPSSH quản trị
80, 443TCPWeb, API, WebSocket nét vẽ (/ws), tín hiệu LiveKit (/rtc), xin chứng chỉ
7881TCPMedia WebRTC qua TCP (khi UDP bị chặn phía người dùng)
5349TCPTURN/TLS — cho người dùng sau mạng công ty chặt
3478UDPTURN/UDP
50000–60000UDPMedia WebRTC (hình và tiếng)
Thiếu dải UDP 50000–60000 là triệu chứng khó nhận ra nhấtMọi người vào phòng bình thường, thấy tên nhau, nhưng không ai nghe thấy ai. Nếu sau khi cài gặp đúng hiện tượng này, kiểm tường lửa trước khi nghĩ tới bất cứ thứ gì khác.

Tên miền (DNS)

Tạo một bản ghi A trỏ tên miền về IP công khai của máy, ví dụ meet.congty.vn → 203.0.113.10. Mặc định bộ cài dùng một tên miền duy nhất: LiveKit và máy chủ nét vẽ đi chung tên miền theo đường dẫn, cùng một chứng chỉ.

Muốn tách riêng (một số hệ thống proxy/CDN cần), thêm cờ --tach-ten-mien và tạo thêm ba bản ghi A cho livekit., ws., turn. nằm dưới tên miền chính (livekit.meet.congty.vn…). Cài kèm Keycloak thì thêm id.meet.congty.vn.

Nếu dùng CloudflareĐặt bản ghi ở chế độ DNS only (đám mây xám). Proxy của Cloudflare không chuyển được media WebRTC và TURN.

Kiểm DNS đã lan chưa (kết quả phải là IP máy):

dig +short A meet.congty.vn @1.1.1.1

2. Cài đặt

Đăng nhập SSH vào máy rồi chạy đúng một dòng. Bộ cài in tiến trình theo 7 bước và dừng ngay tại dòng gặp lỗi (có báo số dòng và lệnh hỏng).

curl -fsSL https://install.o3o.vn/meet/cai-o3o-meet.sh \
  | sudo bash -s -- --domain meet.congty.vn --email it@congty.vn

Cài xong, màn hình in ra ba thứ cần giữ lại:

Chạy lại an toànChạy lại đúng lệnh trên bao nhiêu lần cũng được: bí mật đã sinh và chứng chỉ đã có được giữ nguyên, chỉ phần còn thiếu mới làm tiếp. Đây là cách sửa mọi lần cài dở dang (DNS chưa trỏ, mạng đứt giữa chừng…).

Tuỳ chọn dòng lệnh

CờÝ nghĩa
--domain <tên miền>bắt buộcTên miền chính đã trỏ về máy.
--email <email>khuyên dùngEmail nhận cảnh báo chứng chỉ Let's Encrypt sắp hết hạn.
--keycloaktuỳ chọnChưa có máy chủ đăng nhập (SSO)? Cài kèm Keycloak tại id.<tên miền>. Đã có Keycloak/OIDC riêng thì bỏ cờ này và điền ở trang chào mừng.
--tach-ten-mientuỳ chọnBốn tên miền con livekit. ws. turn. thay cho một tên miền chung (cần thêm 3 bản ghi DNS).
--sau-nat --ip <IP>tuỳ chọnMáy sau NAT/router: không tự dò IP, ghim IP công khai cho LiveKit.
--repo <url git>tuỳ chọnKho mã khác kho mặc định (bản nội bộ, bản fork).
--nhanh <token>tuỳ chọnKho riêng: token chỉ-đọc (GitLab read_repository). Token được cất riêng cho root, không nằm trong cấu hình git.
--nguon <thư mục>tuỳ chọnCài từ cây mã đã chép sẵn trên máy (máy không ra được kho). Sau đó nối kho bằng o3o-cap-nhat noi-kho để cập nhật được — xem mục Cập nhật.

Bộ cài làm gì (7 bước)

  1. Phần mềm nền — cài Docker, nginx, certbot, git, dnsutils (chờ tối đa 5 phút nếu máy vừa khởi động còn đang tự cập nhật).
  2. Mã nguồn — kéo kho vào /opt/o3o-meet (hoặc chép từ --nguon).
  3. Sinh cấu hình — tạo /opt/o3o-meet/cai-dat/.env chứa toàn bộ bí mật (quyền 600), cấu hình LiveKit và ghi hình. Chạy lại thì giữ nguyên bí mật cũ; đổi --domain thì chỉ cập nhật tên miền.
  4. nginx — site riêng cho tên miền, chuyển tiếp /rtc tới LiveKit và /ws tới máy chủ nét vẽ.
  5. DNS và chứng chỉ — kiểm từng tên miền có trỏ về máy chưa, xin chứng chỉ Let's Encrypt (webroot), cài hook gia hạn tự động. DNS chưa đúng thì dịch vụ vẫn dựng; chạy lại sau khi DNS đúng.
  6. Dựng dịch vụdocker compose build + up -d: redis, livekit, egress (ghi hình), annotation-server, web-app (và keycloak nếu chọn); cài dịch vụ cập nhật o3o-cap-nhat.
  7. Kiểm tại chỗ — 7 phép ĐẠT/HỎNG kèm log khi hỏng, rồi in đường vào trang chào mừng và mã chủ trì.

3. Sau khi cài

Trang chào mừng

Mở đường dẫn https://meet.congty.vn/chao-mung?khoa=… mà bộ cài in ra. Khoá dùng một lần; lỡ đóng terminal thì đọc lại trên máy chủ: sudo cat /data/config/khoa-cai-dat.txt. Trang gồm 5 bước:

  1. Tổ chức & logo — tên tổ chức hiện trên trang vào, ngôn ngữ, logo PNG/JPEG (logo ngang, logo vuông, biểu tượng).
  2. Đăng nhập SSO & quản trị viên — địa chỉ Keycloak/OIDC (issuer, client id, client secret) và email quản trị viên. Đây là bước quan trọng nhất: trang /admin chỉ vào được bằng SSO với email trong danh sách này.
  3. Máy chủ media — thường bỏ qua. Chỉ điền khi muốn đặt LiveKit ở máy khác hoặc thêm máy chia tải.
  4. Giấy phép — dán khoá giấy phép nếu đã có (có thể nhập sau ở trang admin).
  5. Hoàn tất — hệ thống ghi cờ đã cài rồi mới xoá khoá một lần; ghi không được (đĩa đầy…) thì báo lỗi và giữ khoá để bạn thử lại.
Khai báo ứng dụng trên KeycloakTrang chào mừng hiện sẵn Redirect URI phải thêm vào client (https://meet.congty.vn/api/auth/callback). Cài kèm --keycloak thì tài khoản quản trị Keycloak nằm trong .env (KC_ADMIN_USER / KC_ADMIN_PASSWORD).

Quản trị & đường vào

Đường dẫnDành cho
https://meet.congty.vn/Trang vào phòng cho mọi người
/adminQuản trị viên (SSO): lớp/cuộc họp đã diễn ra, danh sách người tham dự, bản ghi hình, logo, công tắc tính năng, SSO, API LiveKit, máy chủ media, giấy phép, phiên bản & cập nhật
/sotay/Sổ tay vận hành cho người chủ trì
/tai-appTải app Windows cho người chủ trì (vẽ lên mọi phần mềm, bảng nổi, tự cập nhật)

Mã chủ trì dùng chung (in ra cuối bộ cài, lưu ở TEACHER_CODE trong .env) là phương án khi chưa nối SSO: ai có mã này mở được phòng với vai chủ trì. Nối SSO xong nên tắt công tắc này ở /admin › Hệ thống.

4. Giấy phép

o3o Meet chạy được ngay không cần giấy phép ở mức tối đa 2 phòng mở cùng lúc — đủ để dùng thử và cho tổ chức nhỏ. Giấy phép nâng hạn mức số phòng theo tên miền và thời hạn; hết hạn có 30 ngày ân hạn rồi mới về mức 2 phòng. Phòng đang mở không bao giờ bị cắt — giấy phép chỉ chặn mở thêm phòng quá hạn mức.

5. Cập nhật

Vào /admin › Hệ thống, khối Phiên bản & cập nhật: bấm Kiểm bản mới để so với kho, rồi Cập nhật ngay. Việc cập nhật do dịch vụ o3o-cap-nhat trên máy chủ thực hiện (trang web không có quyền chạy docker — cố ý, để ai chiếm được web cũng không chiếm được máy). Mất 1–3 phút; web-app dựng lại nên người đang trong phòng bị ngắt khoảng 10 giây rồi tự nối lại — trang admin hỏi lại và cho biết đang có mấy phòng mở.

Dịch vụ tự kiểm bản mới mỗi ngày. Nhật ký cập nhật hiện ngay dưới nút; lần cập nhật lỗi thì nút đổi thành Thử cập nhật lại.

Máy cài từ --nguon chưa nối kho nên nút báo "chưa nối kho từ xa". Nối một lần trên máy chủ (bí mật và dữ liệu nằm ngoài git, không mất):

sudo o3o-cap-nhat noi-kho https://gitlab.apps.vn/khahuyvu/o3o-meet.git

Chạy tay khi cần: sudo o3o-cap-nhat kiem · sudo o3o-cap-nhat cap-nhat · nhật ký ở /data/config/cap-nhat.log.

6. Đổi tên miền · cài lại

Cài thử bằng tên tạm rồi đổi sang tên thật, hay chuyển tên miền: trỏ DNS mới về máy, rồi chạy lại bộ cài với --domain mới. Bí mật giữ nguyên; tên miền trong cấu hình, chứng chỉ, bản dựng web được làm lại; LiveKit tự khởi động lại với cấu hình mới. Đổi từ một tên miền sang bốn tên miền (thêm --tach-ten-mien) cũng làm y như vậy.

curl -fsSL https://install.o3o.vn/meet/cai-o3o-meet.sh \
  | sudo bash -s -- --domain meet-moi.congty.vn --email it@congty.vn

7. Sao lưu · gỡ cài

Sao lưu hai chỗ là đủ
  • /opt/o3o-meet/cai-dat/.envtoàn bộ bí mật của hệ thống. Ai cầm được tệp này là chiếm được cả hệ thống: cất nơi an toàn, không gửi qua chat/email.
  • /data/ — cấu hình đã điền (config/), điểm danh, phòng, bản ghi hình (recordings/ — hình ảnh người tham dự, có thể là trẻ em: không để công khai).
Mã nguồn trong /opt/o3o-meet kéo lại được từ kho, không cần sao lưu.
Gỡ cài (xoá hết dữ liệu)
cd /opt/o3o-meet/cai-dat
sudo docker compose --env-file .env down -v
sudo systemctl disable --now o3o-cap-nhat
sudo rm -rf /opt/o3o-meet /data /usr/local/bin/o3o-cap-nhat \
  /etc/systemd/system/o3o-cap-nhat.service \
  /etc/nginx/sites-enabled/o3o-* /etc/nginx/sites-available/o3o-*
sudo nginx -t && sudo systemctl reload nginx
Lệnh này xoá cả bản ghi hình và bí mật — sao lưu trước nếu còn cần.

8. Khắc phục sự cố

Ba lệnh xem tình trạng trên máy chủ:

cd /opt/o3o-meet/cai-dat
sudo docker compose --env-file .env ps
sudo docker compose --env-file .env logs --tail 50 livekit egress web-app
sudo systemctl status o3o-cap-nhat --no-pager
Hiện tượngNguyên nhân thường gặpCách sửa
Bước 5 báo ✗ meet.congty.vn → (chưa có), cuối cùng "Chưa có chứng chỉ"DNS chưa trỏ hoặc chưa lan; Cloudflare đang bật proxySửa DNS (DNS only), chờ vài phút, chạy lại đúng lệnh cài. Khoá chào mừng giữ nguyên.
Vào phòng được nhưng không ai nghe/thấy aiTường lửa nhà cung cấp chưa mở UDP 50000–60000 (hoặc 7881/tcp, 3478/udp)Mở cổng ở security group / firewall của VPS. Không cần cài lại.
Phép egress ghi được /data — HỎNG, không ghi hình đượcContainer ghi hình không đọc được cấu hình hoặc không ghi được /data/recordingsBộ cài in 4 dòng log egress ngay dưới phép hỏng. Chạy lại bộ cài (đặt lại quyền). Kiểm: ls -ld /data/recordings phải là drwxrwsr-x root:root.
Bộ cài dừng ở bước 1 với "Could not get lock"Ubuntu vừa khởi động đang tự cập nhật (unattended-upgrades)Bộ cài đã chờ tối đa 5 phút; vẫn hỏng thì chờ thêm rồi chạy lại.
Bộ cài in "DỪNG ở dòng N: …"Một lệnh trong bộ cài hỏng (mạng đứt, đĩa đầy, kho không truy cập được…)Đọc lệnh in kèm, sửa nguyên nhân, chạy lại. Kho riêng cần --nhanh <token>.
/admin báo chưa được mở / không có quyềnChưa điền email quản trị ở trang chào mừng, hoặc SSO chưa đúng clientSửa ADMIN_EMAILS trong .env (cách nhau bằng dấu phẩy) rồi docker compose --env-file .env up -d web-app; kiểm Redirect URI trên Keycloak.
Mất khoá trang chào mừngĐóng terminal trước khi chépsudo cat /data/config/khoa-cai-dat.txt. Tệp không còn = đã hoàn tất chào mừng, vào /admin.
Nút Cập nhật báo "chưa nối kho từ xa"Máy cài từ --nguonsudo o3o-cap-nhat noi-kho <url kho> (xem mục 5).
HTTPS chạy nhưng chứng chỉ sắp hết hạn không tự gia hạnCổng 80 bị chặn sau khi càiMở lại cổng 80; sudo certbot renew --dry-run để kiểm.

Tài liệu thêm