HƯỚNG DẪN TRIỂN KHAI WEBSITE VÀ TÍCH HỢP LAY-OTP
==================================================

1. Cấu trúc thư mục khuyến nghị

/home/USERNAME/app/
├── public/                 <- mã công khai của website
├── lay-otp-data/           <- chỉ dữ liệu/runtime OTP, không chứa mã PHP
├── data/, codes/, uploads/ <- hệ thống tự tạo khi chạy lần đầu
├── .htaccess
└── index.php

Trên cPanel/Apache có thể giải nén nguyên cấu trúc. Tệp .htaccess ở thư mục gốc
đã chặn truy cập trực tiếp vào lay-otp-data và các thư mục dữ liệu riêng tư.

An toàn nhất là đặt DocumentRoot trực tiếp vào thư mục public. Nếu dùng Nginx,
.htaccess không có tác dụng; phải đặt document root vào public hoặc thêm rule
chặn tuyệt đối /lay-otp-data/, /data/, /codes/, /uploads/ và các thư mục riêng.

2. Nâng cấp từ bản lay-otp cũ

- Thư mục public/lay-otp-data cũ đã được chuyển thành lay-otp-data ở thư mục gốc.
- Khóa mã hóa được lưu tại lay-otp-data/config/master-key.json. Bản PHP cũ được tự chuyển đổi rồi xóa.
- Khi website đọc cấu hình lần đầu, hệ thống tự kế thừa cấu hình chung và nhóm cũ.
- Sau khi kiểm tra thành công, cấu hình chung được quản lý tại admin/settings.php.
- Tên nhóm và Link Key được quản lý tại phần thêm/sửa sản phẩm text.
- File lưu code của sản phẩm chính là dulieu.json.
- File kiểm tra code đã sử dụng chính là da-ban.json.

Khi cập nhật lên website đang chạy, luôn sao lưu trước các thư mục/tệp dữ liệu
thật. Không ghi đè data, codes, uploads hoặc lay-otp-data bằng dữ liệu mẫu.

3. Cấu hình OTP

Trong admin/settings.php, mở tab "Cấu hình OTP" và nhập:
- URL API máy chủ VPS.
- API secret dùng chung.
- Các timeout, rate limit, IP/CIDR callback và thời gian lưu kết quả.
- Sao chép URL callback hiển thị trên trang này để cấu hình cho VPS.

Trong thêm/sửa sản phẩm loại text:
- Bật "Cho phép user lấy SĐT/OTP trong chi tiết đơn hàng".
- Nhập Tên nhóm OTP và Link Key.
- Chọn File lưu code và File kiểm tra code đã sử dụng.

Đơn hàng mới sẽ lưu bản chụp nhóm OTP. Đơn hàng cũ vẫn thử đọc cấu hình sản phẩm
hiện tại khi chưa có bản chụp.

4. Luồng user

- User mở chi tiết đơn hàng đã thanh toán thành công.
- Bảng "Kết quả từ máy chủ" hiển thị từng code đã mua.
- Nút "Lấy Mã" gửi code phía máy chủ; trình duyệt không gửi Link Key hoặc code thô.
- Một code trong cùng nhóm chỉ có một request đang xử lý tại một thời điểm.
- Kết quả SĐT, OTP, mật khẩu 2FA, thời gian và ghi chú tự cập nhật mỗi 5 giây.
- Cột Ghi chú hiển thị các mốc kết nối session, resolve chat, treo listener, đọc tin mới nhất và bảo trì.
- VPS chỉ đọc đúng một tin nhắn mới nhất; nếu tin đó quá 30 phút hoặc không có mã 5 số thì tiếp tục treo lắng nghe, không quét lùi các tin cũ hơn.
- Trang lay-otp/index.php?token=LINK_KEY vẫn được giữ làm luồng dự phòng.

5. Quyền tệp

PHP cần quyền đọc/ghi:
- lay-otp-data/config, data, logs, security, sessions
- data, codes, uploads, backup và kho-tdata khi các tính năng tương ứng được dùng

Gợi ý:
- thư mục riêng tư: 0750
- tệp dữ liệu/cấu hình/log: 0640
- lay-otp-data/config/master-key.json: 0600

Không dùng 0777 trừ khi kiểm tra tạm thời và phải đổi lại ngay.

6. Yêu cầu PHP

- PHP 7.4 trở lên
- extension JSON, OpenSSL và cURL
- cURL là bắt buộc để website gửi yêu cầu đến VPS
- HTTPS được khuyến nghị cho website, callback và API VPS

7. Kiểm tra sau triển khai

- Lưu thử cấu hình OTP trong admin/settings.php.
- Mở lại trang để xác nhận secret hiển thị trạng thái "đã cấu hình".
- Bật OTP cho một sản phẩm text và kiểm tra hai tệp JSON có quyền đọc/ghi.
- Mua thử sản phẩm, mở chi tiết đơn hàng và bấm "Lấy Mã".
- Kiểm tra callback cập nhật đúng một dòng code trong đúng đơn hàng.
- Kiểm tra URL /lay-otp-data/ trả về 403 hoặc 404, không lộ tệp JSON/khóa.

8. Cấu trúc mã và cập nhật phiên bản

- Toàn bộ thư viện PHP của lay-otp nằm trong public/includes/lay-otp/.
- Bên ngoài public chỉ còn JSON, log, session và file lock phục vụ runtime.
- includes/config.php là cấu hình riêng của máy chủ và không bị ghi đè khi update.
- includes/config-defaults.php luôn được cập nhật, tự bổ sung mọi hằng số mới cho config cũ.
- Bộ cập nhật tải và kiểm tra SHA-256, lint PHP khi hosting cho phép, tạo backup đầy đủ,
  chuẩn bị file tạm, bật bảo trì, thay file nguyên tử, chạy health check và tự rollback nếu lỗi.
- Backup cập nhật nằm tại backup/source-sync/. Không xóa trước khi đã kiểm tra website.
