# Deployment — Attendance Server (Tailscale) Thư mục này tự đủ — KHÔNG cần cài Python trên máy chủ. Python embeddable ở `runtime/` đã có sẵn (~50MB). ## Yêu cầu máy chủ - Windows 10/11. - Tailscale đang chạy (IP `100.110.190.107`). - Truy cập LAN tới thiết bị Hikvision `192.168.1.15`. ## Cài đặt (1 lần) ### Bước 1 — Copy folder lên máy chủ Copy toàn bộ folder này (`deploy/`) qua SMB sang máy chủ. Ví dụ: ``` \\100.110.190.107\\Du_an_Cham_cong\ ``` Khuyến nghị copy ra **ổ cứng local của máy chủ** (vd `C:\Du_an_Cham_cong\`) thay vì giữ trên share — SQLite chạy chậm và rủi ro corrupt qua SMB. ### Bước 2 — Sửa `config.json` Mở `config.json`, đảm bảo IP/credentials đúng với thiết bị Hikvision: ```json { "device_ip": "192.168.1.15", "username": "admin", "password": "...", "timezone": "+08:00", "port": 80 } ``` ### Bước 3 — Cho phép port 5000 qua firewall Click chuột phải `INSTALL_FIREWALL_RULE.bat` → **Run as administrator**. Rule chỉ cho phép truy cập từ Tailscale CGNAT range `100.64.0.0/10` — không public ra LAN hay Internet. ### Bước 4 — Test kết nối Mở Command Prompt, chạy: ``` runtime\python.exe -c "from hikvision import HikvisionDevice; print(HikvisionDevice().test_connection())" ``` Phải in `(True, 'Connected OK!')`. ## Vận hành ### Chạy server Double-click `start_server.bat`. Cửa sổ Console giữ mở suốt thời gian chạy. ### Dừng server - Ctrl+C trong cửa sổ Console, hoặc - Double-click `STOP_SERVER.bat`. ### Sync dữ liệu thủ công Double-click `START_GUI.bat` → mở Flet GUI → tab Đồng bộ. ### Test truy cập từ máy client Mở browser ở máy client (đã có Tailscale): ``` http://100.110.190.107:5000/api/status ``` Phải trả JSON `{"server": "running", ...}`. ## Bảo mật (đã áp dụng) | Lớp | Cách bảo vệ | |---|---| | Network | Firewall rule chỉ allow 100.64.0.0/10 (Tailscale) | | Auth | Tailscale tự xác thực user/device | | Application | API chỉ GET cache local cho client; POST /api/sync có rate-limit | | Database | WAL mode + chỉ ghi từ process Python (R3.5) | ## Auto-start (CHƯA bật — chạy manual 1 tuần trước) Sau khi xác nhận server ổn định, có thể tạo Task Scheduler: ``` schtasks /create /tn "AttendanceAPI" /tr "C:\Du_an_Cham_cong\start_server.bat" ^ /sc onstart /ru "SYSTEM" /rl HIGHEST ``` Hoặc bằng GUI Task Scheduler. ## Backup tự động DB tự backup vào `data\backups\` mỗi lần sync (giữ 7 bản — R3.8). Cron thủ công nếu cần backup khoảng dài: ``` schtasks /create /tn "AttendanceBackup" /tr "robocopy C:\Du_an_Cham_cong\data D:\Backups\ChamCong attendance.db" /sc daily /st 23:00 ``` ## Sửa lỗi - **Server không lên**: xem `logs\app.log`. - **Client không kết nối**: ping `100.110.190.107` từ client — Tailscale OK? Telnet `100.110.190.107 5000` — firewall OK? - **DB lock**: chỉ 1 process được ghi cùng lúc. Tắt GUI nếu đang chạy server, và ngược lại. ## Cấu trúc thư mục ``` deploy/ ├── runtime/ ← Python 3.11 embeddable (KHÔNG xoá) ├── rules/ ├── skills/ ├── data/ │ ├── attendance.db ← DB chính │ ├── backups/ ← Auto backup │ └── export/ ← File xuất cho Power Query (kênh B) ├── logs/ ├── *.py ← Source code ├── start_server.bat ← Chạy server ├── STOP_SERVER.bat ← Tắt server ├── START_GUI.bat ← Mở Flet GUI ├── INSTALL_FIREWALL_RULE.bat ← Setup firewall (chạy 1 lần Admin) ├── config.json ← Cấu hình device └── README_DEPLOY.md ← File này ```