remote.Tài liệuTrang chủ

Bảng điều khiển web và Web Push

Bảng điều khiển trình duyệt được phục vụ tại https://remote.ivjn.us/console/. Nó hỗ trợ đăng ký với xác minh email, đăng nhập tài khoản/mật khẩu hoặc mã thông báo của nhà điều hành, thiết bị trong phạm vi không gian làm việc, lệnh phát trực tuyến, PTY xterm, ảnh chụp màn hình/vòi/điều hướng/nhập văn bản Android, số liệu, hồ sơ kiểm tra, tạo/xóa thiết bị và thông báo chọn tham gia. Tài khoản chỉ đọc không thể thực thi lệnh hoặc xem màn hình Android. Các thiết bị ngoại tuyến vẫn hiển thị.

Các thiết bị quảng cáo ubus hiển thị tab ubus với đối tượng, phương thức và các tham số đối tượng JSON tùy chọn (gửi trống null). Cuộc gọi sử dụng phiên kín và yêu cầu thiết bị hỗ trợ trực tuyến có quyền truy cập hoạt động. Hủy dừng chờ đợi; nó không thể hoàn tác một phương thức đã được thực thi trên thiết bị. Chuyển đổi thiết bị và mất quyền sẽ xóa các cuộc gọi và kết quả đang chờ xử lý.

Đăng ký tạo ra một không gian làm việc riêng biệt. Email phải được xác minh bằng mã gồm tám chữ số trước khi đăng nhập; bảng điều khiển hỗ trợ gửi lại mã và quay lại xác minh sau khi tải lại. Exchange phải được định cấu hình SMTP (SMTP_HOST, SMTP_PORT, SMTP_FROM và cài đặt xác thực/bảo mật trong .env.example). Nếu không có dịch vụ thư sẵn có, đăng ký sẽ báo lỗi thay vì bỏ qua xác minh.

Thông tin xác thực vẫn còn trong bộ nhớ trang. Làm mới yêu cầu đăng nhập lại. Đăng xuất sẽ đóng phiên, cố gắng xóa đăng ký đẩy của trình duyệt này và thu hồi các phiên đăng nhập bằng mật khẩu. Mã thông báo của nhà điều hành chính vẫn giữ nguyên thời gian tồn tại hiện tại của chúng. Các lần nhấp vào thông báo sẽ tập trung vào bảng điều khiển đang mở mà không cần tải lại thông tin xác thực của nó.

Xây dựng và phục vụ

cd website/console
npm ci
npm test
npm run build

Sao chép dist/ vào thư mục console/ của trang web. Giữ website/assets/ hiện có tại /assets/ cho các phông chữ và nhãn hiệu được chia sẻ. Cung cấp index.html, sw.js và tệp kê khai có xác thực lại/không có bộ đệm. Nội dung đã băm có thể được lưu vào bộ nhớ đệm bất biến. Không lưu trữ /api/* hoặc /ws/*.

Bảng điều khiển sử dụng /api/* và /ws/browser có cùng nguồn gốc. Đảo ngược proxy này thành Exchange, bảo toàn Máy chủ và cho phép nâng cấp WebSocket. Không loại bỏ tiền tố /api hoặc /ws. Máy chủ phát triển Vite ủy quyền API/WS tới 127.0.0.1:18082. Rust Exchange cho phép truy cập trình duyệt có cùng nguồn gốc theo mặc định. Định cấu hình nguồn gốc chính xác với REMOTE_CORS_ORIGINS; chỉ * rõ ràng mới cho phép tất cả nguồn gốc. Nguồn gốc của công nhân sử dụng CORS_ORIGINS và các giá trị mặc định của riêng nó. Xác thực vô danh và vé WebSocket sử dụng một lần vẫn được yêu cầu; cookie nhiều nguồn gốc không được kích hoạt.

Xác thực trình duyệt sử dụng POST /api/ws-ticket với ủy quyền Bearer, tiếp theo là GET /ws/browser và khung JSON đầu tiên {"ticket":"..."}. Vé hết hạn sau 30 giây, chỉ sử dụng một lần và kiểm tra lại trạng thái kích hoạt cũng như hiệu lực thông tin xác thực của nhà điều hành khi sử dụng. Thông tin xác thực tồn tại lâu dài không bao giờ được đặt trong URL WebSocket. Khách hàng bản địa tiếp tục sử dụng /ws/operator.

Tất cả các hoạt động của thiết bị đều sử dụng phiên WebSocket được niêm phong riêng. HTTP cung cấp xác thực, siêu dữ liệu thiết bị, thư mục khóa và cấp cũng như quản trị phiên chuyển tiếp; xem API HTTP cho các hoạt động Agent.

Kích hoạt tính năng đẩy web

Đặt cả hai biến trong môi trường Exchange (thiếu cả hai sẽ tắt tính năng đẩy):

WEB_PUSH_VAPID_PRIVATE_KEY=<base64url-unpadded-32-byte-P256-private-key>
WEB_PUSH_VAPID_SUBJECT=https://remote.ivjn.us

Tạo khóa riêng với python scripts/generate-vapid-key.py. Lưu trữ nó bên ngoài Git trong một tệp môi trường bị hạn chế, giữ cho nó ổn định trong suốt quá trình khởi động lại và sao lưu nó một cách an toàn. Khóa công khai được lấy tự động. Việc thay đổi khóa yêu cầu trình duyệt phải đăng ký lại.

WEB_PUSH_ALLOWED_ORIGINS mặc định có nguồn gốc đáng tin cậy chính xác https://fcm.googleapis.com,https://updates.push.services.mozilla.com,https://web.push.apple.com. Chỉ thêm nhà cung cấp trình duyệt khác sau khi xác minh nguồn gốc đẩy HTTPS của nhà cung cấp đó. Điểm cuối do khách hàng cung cấp không thể mở rộng danh sách cho phép này. Chuyển hướng không bao giờ được theo sau.

Các tuyến đường được xác thực:

Phương pháp và đường dẫn Mục đích
NHẬN /api/webpush/config Đã bật khóa máy chủ ứng dụng công cộng và trạng thái
NHẬN/ĐĂNG /api/webpush/subscriptions Danh sách siêu dữ liệu thuộc sở hữu hoặc đăng ký/upert
XÓA /api/webpush/subscriptions/{id} Xóa đăng ký đã sở hữu
BÀI ĐĂNG /api/webpush/test Xếp hàng kiểm tra hiển thị vào đăng ký của người gọi
BÀI ĐĂNG /api/webpush/messages Gửi cho chính bạn hoặc với tư cách quản trị viên tới một tài khoản khác trong cùng không gian làm việc
BÀI ĐĂNG /api/webpush/devices/{id}/messages Thông báo cho quản trị viên đã đăng ký quản lý thiết bị được xác thực

Đăng ký sử dụng PushSubscription.toJSON(), application_server_key và triggers của trình duyệt. triggers chứa tối đa một đối tượng online và một đối tượng offline. Mỗi đối tượng có kind, tick_count (mặc định 3, phạm vi 1–100) và device_ids tùy chọn. offline thông báo sau khi tick_count liên tiếp bỏ lỡ; online thông báo sau khi tick_count thành công liên tiếp. device_ids là một id thiết bị (một chuỗi), danh sách id thiết bị hoặc bị bỏ qua/null cho mọi thiết bị trong không gian làm việc. Mảng triggers trống đăng ký trình duyệt mà không có thông báo hiện diện tự động. missed_count và success_count không được chấp nhận. Tin nhắn sử dụng operator_id và notification tùy chọn với title, body, url và tag tùy chọn cùng nguồn gốc. /webpush/ là ứng dụng khách tham khảo tối thiểu; bảng điều khiển sản xuất sử dụng nhân viên riêng của nó trong phạm vi /console/.

Di chuyển 0005_web_push.sql bổ sung đăng ký và hộp thư đi bền bỉ. 0008_online_offline_triggers.sql chuyển thông báo thiết bị sang triggers và giảm missed_count / success_count. 202 có nghĩa là đã xếp hàng đợi, chưa được giao hoặc hiển thị. Công việc hết hạn sau 15 phút. Lỗi mạng, 408, 429 và 5xx thử lại tối đa năm lần; 404/410 xóa bản sửa đổi đăng ký phù hợp. Hợp đồng thuê 90 giây cho phép công việc đang chờ xử lý được phục hồi sau sự cố của công nhân. Việc phân phối diễn ra ít nhất một lần và việc hiển thị trên trình duyệt phụ thuộc vào việc phân phối, quyền của nhà cung cấp và chính sách của hệ điều hành. Các sự kiện của thiết bị trước khi xếp hàng lâu dài là nỗ lực tốt nhất trong điều kiện quá tải; các sự kiện đã được xếp hàng vẫn tiếp tục khởi động lại. Giới hạn: 20 đăng ký/tài khoản, 32 tin nhắn xếp hàng/đăng ký và 30 đột biến/phút/tài khoản.

iOS/iPadOS có thể yêu cầu thêm bảng điều khiển vào màn hình chính trước khi bật thông báo. Khả năng tiếp cận dịch vụ Đẩy trình duyệt tách biệt với kết nối Exchange.

Xác thực

Chạy cargo test --workspace, cargo clippy --workspace --all-targets -- -D warnings và các thử nghiệm/bản dựng npm của bảng điều khiển. Để kiểm tra tích hợp PostgreSQL/HTTPS, hãy cài đặt psycopg[binary], đặt WEB_PUSH_TEST_ADMIN_URL thành kết nối PostgreSQL thử nghiệm với quyền TẠO CƠ SỞ DỮ LIỆU, sau đó chạy python scripts/test-webpush.py. Nó tạo và xóa cơ sở dữ liệu dùng một lần; không bao giờ trỏ vào vai trò cơ sở dữ liệu với các đặc quyền ngoài ý muốn.

Gửi từ mọi khách hàng

Web Console có dạng tin nhắn trong thông báo của Trình duyệt. Cài đặt Console dành cho thiết bị di động có các điều khiển gửi/kiểm tra đẩy Web và liên kết Open Web Console. Cài đặt cục bộ Agent trên máy tính để bàn, Cài đặt Android Agent và trang cấu hình tiện ích mở rộng trình duyệt có thể gửi bằng thông tin xác thực của thiết bị. Đặc vụ không có giao diện/OpenWrt sử dụng lệnh bên dưới. Nhận thông báo bằng cách bật chúng trong Web Console/PWA; điều này không thêm các bộ thu FCM/APN gốc.

remote-cli webpush status
remote-cli webpush subscriptions
remote-cli webpush test
remote-cli webpush send --title "Backup ready" --body "Completed"
remote-cli webpush send --operator-id ACCOUNT_UUID --title "Notice" --body "Hello"
remote-agent --config /path/to/config.json webpush --title "Device ready" --body "Completed"
{"notification":{"title":"Backup ready","body":"Completed","url":"/console/","device_id":"edge-1"}}

POST /api/webpush/messages sử dụng xác thực nhà điều hành Bearer. Bỏ qua operator_id để gửi cho mình; người nhận khác cần có sự cho phép của quản trị viên và phải ở trong cùng một không gian làm việc. Phần nội dung JSON ở trên cũng hoạt động với remote-cli webpush send --json-file message.json. Trình kích hoạt hiện diện trống sẽ vô hiệu hóa cảnh báo trực tuyến/ngoại tuyến tự động trong khi vẫn duy trì việc gửi tin nhắn chung.

POST /api/webpush/devices/{id}/messages sử dụng mã thông báo Bearer của thiết bị đó và chấp nhận trực tiếp đối tượng thông báo (title, body, tag tùy chọn). Chỉ những đăng ký đang hoạt động của quản trị viên được kích hoạt và quản lý thiết bị đó mới nhận được nó. Máy chủ đặt device_id, event=device.message, occurred_at và /console/; người gọi không thể chọn tài khoản hoặc mạo danh thiết bị khác. Thiết bị gửi chia sẻ ngân sách 30 yêu cầu/phút/không gian làm việc và tối đa 256 đăng ký mỗi lần gửi. Giới hạn đăng ký tài khoản và hàng đợi vẫn được áp dụng. Không có người nhận hoạt động nào trả về 202 {"queued":0}; queued tính số lượt đăng ký chứ không tính số lần giao hàng.