Tài chính · VND
Công việc của nhóm
Giữ công việc 3 giây để tải bản lưu hoặc xóa. Bàn phím: Shift + F10.
Bản demo · Dữ liệu lưu trên trình duyệt này
Chào bạn 👋
Mỗi công việc, một cuộc trò chuyện.
Giữ công việc 3 giây để tải bản lưu hoặc xóa. Bàn phím: Shift + F10.
Bản demo · Dữ liệu lưu trên trình duyệt này
Trải nghiệm với tài khoản demo
Tài khoản demo riêng, tự hết hạn sau 24 giờ.Mã chỉ hiện lần này. Ai có mã có thể đặt lại mật khẩu của bạn. Mỗi lần dùng sẽ tạo mã mới.
Mã PaanChat
PaanChat nhận kết quả từ đối tác định danh được phép tích hợp, không nhận ảnh căn cước hoặc ảnh mặt. Họ tên và trạng thái xác minh sẽ được gửi vào danh sách superadmin.
Đối chiếu thông tin nội bộ với đầu mối có thẩm quyền; không chứng nhận căn cước.
Máy chủ lưu hồ sơ, quan hệ bạn bè và tin nhắn riêng để cung cấp dịch vụ. Mật khẩu được băm; phiên đăng nhập dùng cookie cần thiết. Công việc demo lưu trên trình duyệt theo tài khoản. Không dùng cookie theo dõi. Danh bạ đã chọn chỉ dùng đối chiếu trong lần yêu cầu. Hồ sơ đối chiếu được mã hóa, giới hạn truy cập và tự xóa nội dung khi hết hạn. Tin nhắn riêng hiện chưa có mã hóa đầu cuối.
Xóa hồ sơ, ảnh đại diện, quan hệ bạn bè và tin nhắn riêng trên máy chủ. Dữ liệu công việc demo trên trình duyệt cần xóa riêng trong mục Công việc.
Giữ bản lưu trên Google Drive của bạn để chuyển sang thiết bị mới.
Bản lưu gần nhất:
ZIP lịch sử đã giải mã chứa dữ liệu riêng tư; chỉ giữ trên thiết bị của bạn. Giải nén toàn bộ thư mục rồi mở index.html để xem chat, công việc và file. Tin nhắn riêng trong bản lưu chỉ để đọc.
Bạn tự tải file lên Drive. PaanChat không nhận mật khẩu Google và không tự tải bản sao lưu lên Drive.
Nếu Drive chặn tải tự động, tải file .wcbackup bằng Drive rồi chọn Nhập file sao lưu.
Mở Google Drive · Hướng dẫn tải file lên Drive · Hướng dẫn chia sẻ file
Tin nhắn riêng tải từ máy chủ khi đăng nhập; bản sao lưu giữ lịch sử để đọc. Công việc do bạn tạo được sao lưu và hợp nhất theo ID, không ghi đè dữ liệu mới. Công việc chung tiếp tục lấy từ đồng bộ nhóm. File chưa tải được sẽ được báo trong kết quả.
Các bản sao công việc có ID riêng được giữ độc lập. Công việc, bước và tin nhắn đã xóa không được đưa trở lại từ bản sao lưu; khi nội dung khác nhau, giữ bản hiện có.
Các tính năng quản trị hiển thị theo quyền được cấp.
PaanChat · ADMIN
Quản lý tài khoản, thông tin nhóm và vận hành hệ thống.
Mở nhóm để xem thành viên, hồ sơ, khóa hoặc cấm thành viên. Chat công việc chỉ mở được khi có dữ liệu trong tài khoản trên thiết bị này. Xóa nhóm chuyển vào mục Đã xóa; công việc và file cục bộ được giữ lại. Nhóm bị khóa hoặc xóa không gửi thêm chat qua ứng dụng khi kết nối.
Chỉ duyệt sau khi đối chiếu với đầu mối có thẩm quyền. Quyết định này không chứng nhận căn cước hay danh tính nhà nước.
Tự hiển thị nội dung có từ đang bật. Gõ từ để tìm ngay, không cần quét.
Chat và nội dung công việc của tài khoản đang đăng nhập. Không gửi nội dung lên máy chủ.
Tìm nội dung khớp trong dữ liệu cũ. Kết quả được ghi nhận để xem xét.
Thêm và bật ít nhất một từ lọc trước khi quét.
Chỉ hiển thị mã nguồn, người gửi và từ khớp; không mở toàn văn chat riêng. Kết quả tự hết hạn sau 90 ngày.
Cảnh báo tự động tìm theo danh sách từ đang bật, kể cả khi chế độ chặn nội dung mới đang tắt. Gõ từ để tìm tạm thời; từ đang gõ chưa được lưu vào danh sách. Kết quả chỉ hiện đoạn có từ khớp. Chat công việc được kiểm tra trong tài khoản trên thiết bị này; máy chủ chỉ tìm tin nhắn riêng, tên hiển thị và tên nhóm đã lưu. Không đọc file, ảnh hoặc tài chính.
So khớp cụm từ không phân biệt hoa/thường hoặc dấu. Khi gõ, có thể tìm theo phần đầu của từ. Danh sách tự cập nhật mỗi 20 giây khi đang mở. Quét dữ liệu là công cụ ghi nhật ký bổ sung, xử lý 250 bản ghi/lượt; có thể tiếp tục trong 7 ngày.
Xem thiết kế nhiều máy chủ và cập nhật đồng bộ · Hướng dẫn cụm, Cloudflare và subdomain
Người dùng gửi PAANCHAT - mã xác minh đến SIM quản trị. App Android chỉ chuyển SMS đúng mẫu về máy chủ; trình duyệt tự đăng nhập hoặc mở bước nhập mật khẩu mới.
Android APKAPK quản trị nằm trong runtime/android-bridge sau khi chạy npm run android:build. Không phát app cầu nối cho người dùng thường. Chỉ nhận SMS khớp PAANCHAT - mã; không đọc lại hộp thư, không tự gửi SMS, không lưu mật khẩu người dùng. Cần HTTPS và thời gian điện thoại đúng. Nhận SMS không chứng minh danh tính pháp lý; mất SIM hoặc bị giả mạo SMS vẫn là rủi ro phải quản lý.
Người dùng tải file .wcbackup đã nén và mã hóa về máy, tự tải lên Drive rồi lưu liên kết vào tài khoản PaanChat. Hệ thống lấy file từ liên kết khi họ đăng nhập thiết bị mới. Không cần dự án Google Cloud, OAuth hoặc mật khẩu Google.
Các bản sao công việc có ID riêng được giữ độc lập. Công việc, bước và tin nhắn đã xóa không được đưa trở lại từ bản sao lưu; khi nội dung khác nhau, giữ bản hiện có.
Bản .wcbackup dùng AES-256-GCM, khóa riêng theo tài khoản do máy chủ quản lý. Máy chủ có thể giải mã sau khi người dùng đăng nhập; đây không phải mã hóa đầu cuối. Chỉ tài khoản sở hữu được phép giải mã và nhập dữ liệu.
Sao lưu hệ thống phải giữ cơ sở dữ liệu, dữ liệu file, cấu hình và kho bí mật ở nơi được bảo vệ. Các node cùng cụm cần dùng kho bí mật nhất quán. Mất toàn bộ khóa của cụm có thể khiến file .wcbackup không giải mã được; file trên Drive không thay thế bản sao lưu khóa.
Dùng HTTPS khi triển khai tên miền để bảo vệ dữ liệu giữa trình duyệt và máy chủ. Trong mạng LAN HTTP, nén và mã hóa vẫn thực hiện trên máy chủ.
Đây là hướng lưu cho ứng dụng native sẽ xây dựng sau, chưa phải chức năng đã cài trong bản web.
Chưa kết nối. Đây là cấu hình chuẩn bị, chưa phải API VNeID hoạt động. Cần đơn vị vận hành, quyền khai thác dịch vụ, tài liệu kỹ thuật và thông tin kết nối do bên cung cấp cấp. PaanChat không nhận mật khẩu VNeID, ảnh căn cước hoặc ảnh mặt.
Thông tin dịch vụ xác thực điện tử quốc gia
Trạng thái PaanChat: đã có nơi lưu cấu hình chuẩn bị; chưa có đối tác, credential hoặc adapter chính thức. Lưu cấu hình không bật đăng nhập VNeID.
Chuẩn bị thông tin tổ chức, người đại diện, đầu mối kỹ thuật và quyền riêng tư; mô tả mục đích đăng nhập, dữ liệu tối thiểu cần nhận và thời hạn lưu. Xác nhận thành phần hồ sơ hiện hành trực tiếp với bên tiếp nhận.
Mở Cổng xác thực điện tử quốc gia, xem quy trình đăng ký và liên hệ Trung tâm RAR qua đầu mối được công bố trên cổng. Hoàn tất thẩm định và điều kiện kết nối theo hướng dẫn của đơn vị cung cấp.
Cổng đăng ký và đầu mối chính thứcYêu cầu giao thức đăng nhập, môi trường thử/nghiệm thu, mã ứng dụng, phương thức kiểm tra kết quả, các trường được phép nhận, cơ chế thu hồi và quy trình xử lý sự cố. Không suy đoán endpoint từ các trang đăng nhập công khai.
Mục tài liệu của cổngĐiền các thông tin đã được cấp vào biểu mẫu bên dưới và ghi tham chiếu phê duyệt. Client secret, khóa riêng và dữ liệu căn cước không đưa vào ghi chú. Cấu hình chuẩn bị được mã hóa trên máy chủ; thay đổi có nhật ký và kiểm tra phiên bản.
Đội kỹ thuật triển khai HTTPS, URL chuyển hướng đã đăng ký, kiểm tra tính toàn vẹn và nguồn kết quả, ràng buộc phiên, hạn dùng và chống phát lại. Liên kết tài khoản bằng định danh ổn định từ đối tác; không tự ghép tài khoản chỉ vì trùng tên hoặc số điện thoại.
Thử đăng nhập thành công, hủy, sai nguồn, hết hạn, phát lại, mất kết nối và tài khoản PaanChat bị khóa. Công bố thông báo xử lý dữ liệu, hoàn thành nghiệm thu theo bên cung cấp rồi mới bật trên môi trường thật. VNeID không mặc nhiên cấp quyền superadmin.
Danh mục trên là các bước triển khai của PaanChat; hồ sơ, giao thức và yêu cầu nghiệm thu phải theo tài liệu chính thức được cấp. Tham khảo quy định định danh và xác thực điện tử tại Nghị định 69/2024/NĐ-CP và văn bản sửa đổi Nghị định 320/2026/NĐ-CP, đồng thời kiểm tra văn bản sửa đổi còn hiệu lực với đơn vị cung cấp.
Cấu hình cấp 1, lưu file cấp 2 và hướng dẫn triển khai theo từng máy.
Địa chỉ chính thức dự kiến: https://paanchat.com. Hồ sơ cấu hình đã có; chỉ chuyển từ LAN sau khi tạo tunnel và nối DNS thành công.
paanchat.com: Trang chủ giới thiệu · paanchat.com/download: Tải ứng dụng · chat.paanchat.com: Chat web. Cùng tunnel trỏ về localhost cổng 7557; ứng dụng dùng PUBLIC_URL=https://chat.paanchat.com.
cloudflared tunnel login
cloudflared tunnel create workchat-paanchat
npm run domain:configure -- UUID
cloudflared tunnel route dns UUID paanchat.com
cloudflared tunnel route dns UUID chat.paanchat.com
Nếu DNS đã có bản ghi cùng tên, kiểm tra trước khi thay; không dùng tùy chọn ghi đè tự động.
npm run start:domain
cloudflared tunnel --config deploy/paanchat/cloudflared.yml run UUID
Cloudflare: bật chuyển hướng HTTP sang HTTPS; không đặt Cache Everything cho ứng dụng và bỏ cache /api/*, /auth/*, /health/*, /superadmin trên chat.paanchat.com. SSE cần giữ kết nối. Các callback đăng nhập/thanh toán sau này phải dùng tên miền HTTPS này.
Cloudflare Tunnel phục vụ web; gọi qua mạng khác vẫn cần STUN/TURN riêng. Khi thêm node, dùng chat.paanchat.com làm PUBLIC_URL chung, node1.paanchat.com, node2.paanchat.com… làm địa chỉ node. Trong cấu hình cụm, đặt Tên miền là paanchat.com và Subdomain dùng chung là chat; nhiều tunnel cần cấu hình cân bằng tải và kiểm tra sức khỏe.
Dữ liệu công việc chỉ có ở trình duyệt LAN chưa tự chuyển sang tên miền mới. Xuất bản lưu hoặc bật đồng bộ nhóm trước khi chuyển; dữ liệu phía máy chủ và ID tài khoản vẫn được giữ.
Hướng dẫn Cloudflare Tunnel ↗Chọn từng máy để xem dịch vụ, tài nguyên và lịch sử hoạt động.
Chưa tải được trạng thái mới. Đang hiển thị báo cáo cuối cùng; chưa xác nhận tình trạng hiện tại của các node.
Chưa có dữ liệu theo dõi.
Agent báo về khoảng 15 giây/lần; sau 65 giây không báo về, node được đánh dấu mất liên lạc. Lịch sử được lấy mẫu mỗi phút, ghi thêm khi trạng thái thay đổi và lưu tối đa 6 giờ. Máy đang phục vụ vẫn có thông số trực tiếp khi chưa cài agent.
Database, file đã đồng bộ và khóa phục hồi trong một gói có mật khẩu.
Dùng khi sao lưu hoặc chuyển sang cụm mới. Node bổ sung kết nối database chung. Công việc và file chỉ lưu trên trình duyệt chưa nằm trong gói này; cần đồng bộ hoặc xuất công việc trước.
Máy phát hành chạy npm start để theo dõi mã nguồn. Các sửa đổi được gom sau 3 giây yên; kiểm tra mã rồi tạo phiên bản và gói ký số. Node đã cài bằng gói ký số cùng bên phát hành sẽ tải từ máy quản lý hoặc peer qua VPN, cập nhật từng máy và kiểm tra dịch vụ trước khi giữ bản mới.
Đang kiểm tra phiên bản…
Bộ tự cập nhật thay mã ứng dụng; giữ database, danh tính node và khóa VPN. Một node có thể ngừng ngắn khi thay bản; nhiều node cần ít nhất một peer khỏe. Cần PostgreSQL HA, nhiều origin Cloudflare và nghiệm thu khởi động/VPN trên từng hệ điều hành. Migration xóa/đổi dữ liệu cần kế hoạch riêng; không tự rollback database. Giữ khóa phát hành ngoài gói và hạn chế ai được sửa mã trên máy phát hành.
Xem sơ đồ hoặc làm theo từng bước. Các node ứng dụng có cùng vai trò.
Hình sao mô tả các bước quản lý từ Superadmin. VPN giữa các máy cấp 1 nên có đường trực tiếp hoặc dự phòng để tránh phụ thuộc một máy trung tâm.
Database chung có bản sao trên nhiều máy: một primary ghi dữ liệu tại một thời điểm, standby nhận bản sao; PostgreSQL/Patroni chọn máy thay thế theo quorum. Kho file phân bố theo mã file, ưu tiên ba bản và chỉ xác nhận khi có ít nhất hai. Thêm node ứng dụng giúp tăng khả năng xử lý; database dung lượng lớn vẫn cần thiết kế phân vùng riêng.
Chọn ít nhất ba máy độc lập cho database HA. Node ứng dụng có thể là macOS, Windows hoặc Linux x64/ARM64; hạ tầng PostgreSQL/Patroni/etcd hiện dùng bộ triển khai Linux bên dưới. Máy phải có quyền cài dịch vụ, đủ ổ đĩa, giờ chính xác và tắt chế độ ngủ.
Dùng tên miền bạn sở hữu, ví dụ chat.tenmien.vn. Cloudflare đưa HTTPS vào ứng dụng. WireGuard cần endpoint UDP trực tiếp; subdomain web qua Tunnel không thay thế UDP. Kiểm tra router, CGNAT, firewall và mạng VPN không trùng LAN. Người dùng không cần cài VPN của cụm.
Trên máy có mã nguồn đã duyệt, chạy lệnh bên dưới để tạo thư mục mới chứa mã, thư viện production từ lockfile và manifest ký Ed25519. Khóa ký riêng ở deploy/secrets/release-signing.pem, không nằm trong gói; sao lưu khóa này ngoài máy vận hành. Bản đầu cần lấy từ nguồn tin cậy và đối chiếu vân tay bên phát hành.
npm run node:packageNếu cần mang dữ liệu: bấm Đóng gói dữ liệu mới, đặt mật khẩu riêng, tải workchat-data.wcb vào thư mục gói vừa tạo. Gói chứa snapshot database, file đã đồng bộ và khóa phục hồi; không mang danh tính riêng/khóa WireGuard của máy nguồn. Không sao chép trực tiếp SQLite đang ghi hoặc file WAL. Dữ liệu chỉ ở trình duyệt cần đồng bộ/xuất trước.
Mở terminal tại thư mục gói. Chạy với quyền quản trị của hệ điều hành. Bộ cài kiểm tra runtime Node theo SHA-256, dùng thư viện đã đóng gói, tạo danh tính node và khóa VPN riêng, cài dịch vụ khởi động cùng máy, rồi hiện link cấu hình localhost.
# macOS / Linux
sh install-node.sh
# Windows · PowerShell mở bằng Run as Administrator
powershell -ExecutionPolicy Bypass -File .\install-node.ps1Lần đầu cần Internet để tải Node và gói hệ điều hành. Linux tự cài wireguard-tools qua trình quản lý gói hỗ trợ; Windows tải bộ cài WireGuard chính thức và kiểm tra chữ ký Authenticode. macOS tự cài công cụ khi đã có Homebrew; nếu thiếu Homebrew hoặc công cụ phát triển cần bổ sung theo hướng dẫn chính thức rồi chạy lại. Nếu chưa cài VPN được, node vẫn có trang cấu hình nhưng báo cần cài thêm. Không tự bật VPN khi chưa có peer/IP.
Mở link localhost do bộ cài in ra, đặt tên máy. Trong Superadmin qua HTTPS, tạo mã ghép 10 phút và dán vào trang localhost. Đối chiếu mã node/vân tay với máy thật. Node sẽ xuất hiện cùng RAM, ổ đĩa, IP, phiên bản và khóa VPN công khai.
Bấm VPN trên thẻ node để điền IP riêng, UDP và peer, tải workchat-vpn.json. Copy file này về đúng máy, chạy lại bộ cài với tùy chọn sau. Khóa riêng ở máy đó, không tải lên Superadmin. Các cấu hình chỉ tạo tuyến /32 giữa các IP riêng, không nhận script PostUp/PreUp.
# macOS / Linux
sh install-node.sh --vpn ./workchat-vpn.json
# Windows
powershell -ExecutionPolicy Bypass -File .\install-node.ps1 -Vpn .\workchat-vpn.jsonMỗi cặp máy cần cấu hình hai chiều; ít nhất một đầu phải có UDP tiếp cận được. Cho phép UDP của WireGuard, giới hạn cổng database/app/file trong VPN. Khởi động lại từng máy và kiểm tra wg show, handshake và kết nối IP riêng. macOS launchd bật tunnel khi boot; cần nghiệm thu mất kết nối và reboot trên máy thật.
Nếu chỉ thêm node: dùng endpoint PostgreSQL của cụm hiện có; không nhập backup vào database đang chạy. Dựng ba database Linux bằng cấu hình HA bên dưới: primary ghi, standby đồng bộ, etcd duy trì quorum và watchdog ngăn hai primary. Mỗi app dùng proxy database có đường dự phòng; đọc hướng dẫn nâng cao để cấu hình chứng thư, quyền và PITR.
Nếu chuyển từ máy SQLite ban đầu: kiểm tra gói dữ liệu trên trang localhost, dữ liệu được giải mã vào thư mục restored-data mới trong state. Dừng ghi ở máy nguồn khi chốt bản cuối, chuyển snapshot vào PostgreSQL trống bằng lệnh migration; dùng cùng PRIVATE_DATA_KEY và ARCHIVE_SIGNING_KEY trong secrets.json. Kiểm tra số bản ghi và khóa trước khi bật các node. Tệp objects là ciphertext phải nạp vào các kho file mới; không đổi khóa mã hóa giữa chừng.
npm run migrate:postgres -- /path/restored-data/workchat.sqlite --dry-run
npm run migrate:postgres -- /path/restored-data/workchat.sqlite --applyGói PostgreSQL chứa snapshot logic postgres.jsonl để phục hồi vào database trống cùng phiên bản mã nguồn; dùng lệnh bên dưới sau khi kiểm tra gói, cấu hình DATABASE_URL/CA và dừng các app của database đích. Instance của database mới được giữ riêng, node nhập lại ở trạng thái tạm dừng. Backup không tự hợp nhất vào cụm đang có. Cơ chế nhập/hợp nhất đoạn chat từng công việc vẫn là chức năng riêng.
node scripts/restore-postgres.mjs /path/restored-data --applyChuẩn bị ít nhất ba kho file. Trong Cấu hình node, nhập IP VPN, endpoint PostgreSQL đúng cụm và CA hoặc xác nhận database chỉ chạy trong VPN đã mã hóa. Superadmin gửi cấu hình mã hóa riêng cho node, không yêu cầu nhập lại toàn bộ khóa chung. Khi đã sẵn sàng, bật node và đợi trạng thái app/kho file/router hoạt động.
Mỗi native node có router tại 127.0.0.1:3000, app IP-VPN:3002, kho file IP-VPN:3100. Cloudflare Tunnel trên từng máy trỏ vào router localhost. Cấu hình load balancer/pool cho các subdomain của cùng tên miền; dùng một PUBLIC_URL thống nhất và cookie/session chung. Cần tài khoản/domain Cloudflare thật để triển khai phần này.
Router kiểm tra app mỗi 5 giây, ưu tiên node khỏe có ít kết nối và chia lượt khi bằng nhau. Node mới được duyệt được đưa vào danh sách router ở lần agent nhận cấu hình tiếp theo; app/file cần chạy và truy cập được qua VPN. Mỗi router có số kết nối riêng, nên tải cân bằng theo thực tế kết nối, không cam kết mọi máy luôn có cùng số request.
File mới dùng rendezvous hashing để chọn tối đa ba kho ưu tiên, thử kho khác nếu lỗi và chỉ xác nhận khi đủ hai bản. Đọc có thể tìm ở các kho còn lại. Thêm kho làm file mới phân bố lại; file cũ cần chạy repair để có bản tại vị trí mới. Giữ các kho cũ cho đến khi kiểm tra xong; không xóa node đang giữ bản duy nhất.
npm run storage:repairKiểm thử hai người trên các node khác nhau: gửi tin, file, thay đổi công việc, tải lại và đối chiếu. Nếu mất kết nối sau khi ghi, giữ nguyên mã thao tác để thử lại; router không tự gửi lại thao tác ghi vì kết quả commit có thể đã tồn tại.
Ngắt từng máy ứng dụng, database primary và một kho file; thử đăng nhập/gửi tin/file qua các máy còn lại, kiểm tra failover và dữ liệu. Mất quorum thì database cần dừng ghi an toàn. Reboot từng OS, kiểm tra dịch vụ và tunnel lên lại. Thử phục hồi backup trên môi trường cách ly trước khi chuyển domain.
Bảng Theo dõi cập nhật mỗi 15 giây, báo mất liên lạc sau 65 giây, ghi lịch sử tối đa 6 giờ. Tạm dừng/thu hồi chỉ tới máy đang liên lạc; máy offline có thể tiếp tục dùng cache. Nếu mất quyền kiểm soát máy, thu hồi VPN/database và xoay khóa dùng chung. Có backup độc lập/PITR, không chỉ dựa vào các bản sao đang chạy.
Sau khi sửa mã nguồn và kiểm thử, chạy node:package với cùng khóa phát hành. Copy gói ký số sang từng máy và chạy bộ cài từ bản đã tin cậy; cập nhật một máy thử trước, theo dõi rồi mới đến máy tiếp theo. Bộ cài xác minh chữ ký/hash, chặn bên phát hành khác và bản cũ, giữ danh tính/dữ liệu, chờ agent hoạt động và giữ bản app trước đó. Nếu bộ cài bị ngắt đột ngột, kiểm tra tiến trình cài trước khi gỡ file install.lock tại thư mục hệ điều hành. Nếu bước cài hoặc khởi động agent lỗi, khôi phục mã cũ; migration database cần kế hoạch tương thích và backup riêng.
Để xác minh bằng mã đã cài, dùng runtime và scripts/install-node.mjs của máy đó với --source trỏ gói mới; không chạy script lấy từ nguồn chưa tin cậy bằng quyền quản trị. Bản đầu cần đối chiếu vân tay phát hành ngoài gói. Khi máy phát hành chạy npm start, thay đổi mã được gom sau 3 giây yên, kiểm tra và tạo bản ký số tự động. Node cài gói ký số cùng khóa phát hành tự tải bản mới từ máy quản lý hoặc peer VPN, chờ lượt, đổi mã và kiểm tra agent/app/kho file/router. Lỗi khởi động quay về mã cũ; dữ liệu và khóa VPN giữ riêng. Máy chỉ cài mã nguồn trực tiếp cần chạy bộ cài gói ký số một lần để có bootstrap cập nhật. Cần nghiệm thu OS/VPN/Cloudflare, kiểm thử tải và migration tương thích; không tự rollback database.
macOS · Windows · Linux — mỗi máy chạy cùng ứng dụng và kho file.
Copy thư mục PaanChat đã kiểm thử sang máy mới. Mở Terminal hoặc PowerShell tại thư mục đó. Bộ cài tải Node.js đã ghim phiên bản và kiểm tra SHA-256, cài thư viện, tạo mã node mới rồi đăng ký tự khởi động.
macOS / Linux — tài khoản thường có quyền sudo:
sh ./install-node.sh
Windows — mở PowerShell bằng Run as administrator:
powershell -NoProfile -ExecutionPolicy Bypass -File .\install-node.ps1
Dữ liệu node được tạo riêng ở máy đích. Bộ cài giữ .env và danh tính máy cũ ngoài triển khai. Gói ký số mang thư viện production; workchat-data.wcb đi kèm được giữ mã hóa, chỉ giải mã vào thư mục mới sau khi nhập mật khẩu ở localhost. Chạy lại bộ cài trên cùng máy giữ mã node và dữ liệu.
| Hệ điều hành | Thư mục cài | Tự chạy |
|---|---|---|
| macOS | /Library/Application Support/WorkChatNode | LaunchDaemon |
| Linux | /var/lib/workchat-node | systemd |
| Windows | %ProgramData%\WorkChatNode | Task Scheduler · SYSTEM |
Linux cần systemd và curl; macOS dùng launchd/curl sẵn có. Hỗ trợ CPU x64 và ARM64. Lần đầu cần Internet để tải runtime và công cụ hệ điều hành; thư viện production đã có trong gói ký số. Tự chạy cần hệ điều hành đã khởi động và ổ đĩa đã mở khóa; tắt chế độ ngủ khi làm máy chủ.
HTTP qua IP LAN hiện tại dùng phát triển giao diện. Ghép máy khác cần tên miền HTTPS để bảo vệ mã ghép. Có thể thử trên localhost; không dùng chế độ thử cho Internet.
Mỗi node nên dùng một proxy PostgreSQL khác trong cụm HA, cổng 6432 theo bộ triển khai Linux, cùng trỏ tới database primary hợp lệ. Tránh để tất cả node phụ thuộc một proxy duy nhất. Tên miền HTTPS chung và cân bằng tải phải tiếp tục hoạt động khi một máy mất mạng.
Trang hiển thị hostname, OS, CPU, RAM, dung lượng trống, IP, phiên bản, vân tay khóa, chế độ tự chạy, thời điểm báo về và trạng thái thật của app/kho file. IP mạng chỉ là thông tin tham khảo; người quản trị chọn IP VPN.
Agent báo về khoảng 15 giây/lần. Trên 65 giây không báo được sẽ hiện Mất liên lạc. Khi khởi động lại và trang quản lý đang offline, node chạy cấu hình đã duyệt lưu mã hóa tại máy; database, VPN và các bản sao file vẫn phải truy cập được.
Tạm dừng hoặc Thu hồi dừng ứng dụng/kho file tại lần liên lạc tiếp theo, giữ dữ liệu tại máy. Máy đang mất mạng chưa nhận được lệnh. Thu hồi không xóa khóa đã cấp khỏi máy cũ; khi máy bị mất quyền kiểm soát, cần thu hồi VPN/database, xoay khóa dùng chung và kiểm tra lại toàn cụm.
Các node ứng dụng/kho file có cùng vai trò. PostgreSQL HA vẫn có primary/standby và quorum để tránh ghi dữ liệu mâu thuẫn. Bộ cài chuẩn bị WireGuard và có thể áp dụng file VPN tải từ Superadmin; PostgreSQL HA và tài khoản Cloudflare cần cấu hình hạ tầng riêng; cấu hình hạ tầng Linux ở phần nâng cao bên dưới.
Nghiệm thu trên máy thật: reboot từng OS, kiểm tra app/kho file, gửi tin và file qua các node, ngắt một máy rồi đối chiếu dữ liệu, thử khôi phục từ backup. Trên Windows, file được flush trước khi ghi nhận nhưng Node không cung cấp directory fsync; cần thử mất điện trên NTFS và có backup độc lập. Tự đồng bộ phiên bản qua Internet cần bộ phát hành ký số và cơ chế triển khai riêng; hiện cập nhật bằng chạy lại bộ cài với mã nguồn đã duyệt.
Apple · launchd · systemd · Microsoft · Boot trigger · Node.js · SHA-256
Chỉ node đã ghép mới có trong danh sách. Tối đa hiển thị 250 node gần nhất. Trạng thái dựa trên lần báo về, không chứng nhận toàn cụm đã nghiệm thu.
Cấu hình dưới đây là bản dự kiến. Lưu hoặc tải cấu hình không thay đổi máy chủ đang chạy. Cần triển khai và nghiệm thu trên các máy thật trước khi chuyển dữ liệu.
Các địa chỉ này là bản xem trước, chưa xác nhận node đã kết nối.
stat -c '%g' /dev/watchdog
Điền tên miền gốc thuộc Cloudflare, subdomain chung (ví dụ chat), mạng VPN và IP từng máy. Chỉ nhập UUID Tunnel, không nhập token hoặc file credential.
Build từ mã nguồn đã kiểm thử, đẩy lên registry của đơn vị vận hành; ghi lại digest, xác minh chữ ký phát hành rồi điền image@sha256:… trong cấu hình. Dùng cùng digest PaanChat trên mọi máy ứng dụng và kho file.
docker build -t REGISTRY/workchat:RELEASE .
docker build -t REGISTRY/workchat-patroni:RELEASE deploy/cluster/patroni
docker push REGISTRY/workchat:RELEASE
docker push REGISTRY/workchat-patroni:RELEASE
Thay REGISTRY và RELEASE bằng registry/phiên bản của bạn. Bấm Lưu cấu hình node, sau đó Tải cấu hình triển khai. File workchat-topology.json không chứa khóa bí mật. Tại thư mục mã nguồn, dùng Node.js 24 trở lên để sinh bộ triển khai:
# Chỉ dùng cho cụm mới chưa có dữ liệu/khóa cũ:
node deploy/cluster/prepare.mjs /duong-dan/workchat-topology.json /duong-dan/workchat-deploy
# Chuyển/cập nhật cụm có dữ liệu: truyền bộ khóa chung đã bảo quản:
node deploy/cluster/prepare.mjs /duong-dan/workchat-topology.json /duong-dan/workchat-deploy-moi /kho-bi-mat/shared-keys.json
Bộ tạo từ chối ghi đè thư mục có sẵn; sinh thư mục quyền 0700, file quyền 0600. shared-keys.json chứa các khóa dùng chung và mật khẩu database, chỉ lưu trong kho bí mật của người vận hành. Khi chuyển dữ liệu cũ, PRIVATE_DATA_KEY và ARCHIVE_SIGNING_KEY phải khớp khóa cũ; không tạo bộ khóa mới thay thế.
Copy node1/ sang máy node1, node2/ sang máy node2, node3/ sang máy node3 qua SSH/SCP bảo mật. Nếu chọn máy lưu file riêng, copy file1/, file2/, file3/ sang ba máy cấp 2 tương ứng. Chỉ chuyển file cần thiết cho từng máy, không đưa shared-keys.json hoặc file .env lên web/Git.
Firewall phải chặn các cổng nội bộ từ Internet. Chỉ cho các IP VPN của cụm kết nối đúng dịch vụ; HTTP nội bộ đi trong WireGuard đã mã hóa.
| Dịch vụ | Cổng | Phạm vi |
|---|---|---|
| etcd | 2379, 2380 | Giữa ba máy cấp 1 |
| PostgreSQL / Patroni | 5432, 8008 | Giữa ba máy cấp 1 |
| Ứng dụng PaanChat | 3002 | Proxy trên ba máy cấp 1 |
| Kho file | 3100 | Máy cấp 1 tới máy lưu file |
| Proxy web | 3000 | Chỉ localhost |
| Proxy database | 6432 | Localhost & node trong VPN |
Trong thư mục nodeN trên mỗi máy cấp 1, khởi động database và proxy. Đợi đủ ba etcd, một PostgreSQL primary và standby đồng bộ; kiểm tra bằng công cụ Patroni của người vận hành.
docker compose -f compose.json up -d etcd postgres proxy
Kho file cùng cấp 1: chạy lệnh đầu trên cả ba máy nodeN. Kho file riêng: chạy lệnh đầu trong thư mục fileN trên cả ba máy cấp 2. Sau khi kho file sẵn sàng, chạy lệnh thứ hai trên ba máy cấp 1:
docker compose -f compose.json up -d storage
docker compose -f compose.json up -d app
Kiểm tra readiness bằng IP VPN của từng app, ví dụ dưới. /health/ready trả 200 khi app kết nối database có standby đồng bộ. Endpoint này không chứng nhận kho file đủ bản sao; cần thử tải file thật và kiểm tra repair.
curl --fail http://10.60.0.11:3002/health/ready
Chuyển dữ liệu SQLite cần tạm dừng ghi, backup nhất quán, giữ đúng khóa cũ, chạy migration dry-run rồi apply vào PostgreSQL chưa có người dùng. Xem phần Chuyển dữ liệu cũ trong hướng dẫn đầy đủ trước khi thực hiện. Không thay .env của máy đang phục vụ chỉ để thử cấu hình mới.
Load Balancing là dịch vụ riêng của Cloudflare; cấu hình tài khoản/gói trước khi bật. Tài liệu chính thức: DNS, tunnel và load balancing
Hướng dẫn đầy đủ: migration, giới hạn hiện tại và nghiệm thu · Patroni: replication và quorum
Nhân viên dùng tài khoản PaanChat đã đăng ký và có mật khẩu. Chỉ cấp các quyền cần dùng; quyền thao tác cần quyền xem tab. Nhân viên không được tự nâng quyền hoặc cấp quyền ngoài phạm vi của mình.
Thư viện gồm nguồn chính thức liên quan đã chọn. Quét kiểm tra kết nối và thay đổi của các nguồn này, không xác nhận đã bao quát mọi văn bản hay đủ điều kiện cấp phép. Hồ sơ tạo ra là dự thảo để bổ sung, đối chiếu mẫu hiện hành và ký trước khi nộp.
Quét giấy đăng ký kinh doanh hoặc căn cước người đại diện để lấy thông tin soạn hồ sơ.
Có thể lưu thông tin đang soạn. Các mục có * cần có trước khi tạo hồ sơ. Không nhập mật khẩu hoặc khóa tích hợp vào biểu mẫu.
Tải HTML để mở xem và in thành PDF. Mỗi bản giữ thông tin doanh nghiệp tại lúc tạo; sửa doanh nghiệp không thay đổi hồ sơ cũ.
Hiện hỗ trợ tối đa 32 MB mỗi file. Dung lượng gói có thể lớn hơn. Thay đổi hạn mức áp dụng cho tài khoản đang dùng gói; file đã lưu được giữ lại. Upload file lớn qua nhiều phần sẽ được phát triển tiếp.
/api/billing/webhook, đối soát số tiền, mã đơn và thông báo trùng. Khóa bí mật lưu ngoài mã nguồn; dùng cùng cấu hình trên các node.Thao tác này cấp gói trực tiếp, không ghi nhận thanh toán. Chọn Cơ bản để đưa về gói miễn phí.
Sau mỗi 5 công việc có một quảng cáo; danh sách dưới 5 việc đặt quảng cáo ở cuối. Chỉ hiển thị chiến dịch được bật và trong lịch chạy. Quảng cáo có nhãn riêng, không trở thành tin nhắn và không xuất vào bản lưu chat.
Giá tính theo ngày cho từng vị trí. Chọn cả hai vị trí sẽ cộng hai mức giá. Giá đơn đã tạo được giữ nguyên. Chưa thu tiền khi chưa kết nối cổng thanh toán.
Nhật ký thay đổi và quét dữ liệu lưu tối đa 90 ngày. Không ghi mật khẩu hoặc toàn văn tin nhắn.
Bấm vào biểu tượng để mở mini app. Các app sắp ra mắt sẽ hiện thông tin phát triển.
Một việc mới, một cuộc trò chuyện mới.
Chọn nhóm để xem công việc và quản lý thành viên.
Nhóm được lưu cùng công việc trên trình duyệt theo tài khoản này.
Phân công vai trò và quyền trong công việc này.
Trưởng nhómPhó nhóm
Đang mở camera…
Đang mở ảnh…
public/mini-apps/<tên-app>/.PaanChat
Media truyền bằng WebRTC, không ghi âm hoặc lưu video. Chất lượng phụ thuộc thiết bị và đường truyền.