TỔNG QUAN
Trong những năm gần đây, sự phát triển của Internet of Things (IoT) đã và đang mở ra nhiều cơ hội lớn cho các lĩnh vực như sản xuất, nông nghiệp, y tế, giao thông và đời sống hàng ngày. Tuy nhiên, đi kèm với sự mở rộng nhanh chóng của các hệ thống IoT là hàng loạt thách thức trong công tác quản lý, vận hành và đảm bảo an toàn cho thiết bị. Đặc biệt, việc cập nhật phần mềm, tái cấu hình và bảo trì các thiết bị phân tán thường gặp nhiều khó khăn do hạn chế về tài nguyên phần cứng, tính đa dạng của hệ sinh thái thiết bị, cũng như yêu cầu khắt khe về bảo mật và độ tin cậy.[1]
Từ thực tế học tập và tìm hiểu các dự án thực tiễn, em nhận thấy rằng phần lớn các hệ thống IoT hiện nay vẫn chủ yếu vận hành theo mô hình thủ công hoặc bán tự động, khiến cho mỗi lần cần cập nhật, bảo dưỡng hay tái cấu hình đều mất nhiều thời gian và công sức, thậm chí tiềm ẩn rủi ro cao về lỗi hệ thống hoặc bị tấn công mạng. Trong khi đó, các phương pháp hiện đại như DevOps đã chứng minh hiệu quả vượt trội trong việc tự động hóa quy trình phát triển, kiểm thử và triển khai phần mềm ở lĩnh vực công nghệ thông tin truyền thống. Việc áp dụng DevOps vào IoT, theo em đánh giá, không những giúp rút ngắn thời gian cập nhật phần mềm mà còn tăng cường kiểm soát, đảm bảo đồng bộ cấu hình, nâng cao khả năng giám sát, phát hiện và xử lý sự cố kịp thời.[1]
Bên cạnh đó, các giải pháp DevOps cho IoT trên thế giới tuy đã xuất hiện nhưng đa số vẫn còn hạn chế về khả năng tùy biến, chưa thực sự phù hợp với điều kiện và nhu cầu thực tế tại Việt Nam, đặc biệt là đối với các hệ thống quy mô vừa và nhỏ hoặc nguồn lực còn hạn chế. Xuất phát từ mong muốn góp phần giải quyết những vướng mắc này, nhóm quyết định lựa chọn đề tài “DevOps cho tái cấu hình thiết bị IoT” với hy vọng nghiên cứu, xây dựng và thử nghiệm một mô hình DevOps phù hợp, có tính thực tiễn cao, dễ áp dụng rộng rãi, góp phần nâng cao hiệu quả, tính linh hoạt và bảo mật cho các hệ thống IoT tại Việt Nam.
Mục tiêu nghiên cứu
Trong khuôn khổ nghiên cứu này, nhóm tập trung hướng đến các mục tiêu sau:
- Thiết kế và xây dựng kiến trúc hệ thống DevOps tối ưu dành cho IoT, đảm bảo khả năng tự động hóa, linh hoạt và dễ mở rộng.
- Xây dựng quy trình CI/CD phù hợp với đặc thù thiết bị IoT nhằm tự động hóa việc triển khai và cập nhật phần mềm.
- Thử nghiệm triển khai hệ thống trên các thiết bị thực tế hoặc các nền tảng mô phỏng như Raspberry Pi (RasPi), ESP32; đồng thời đánh giá hiệu quả dựa trên các tiêu chí như thời gian cập nhật, mức tiêu thụ tài nguyên và độ ổn định của hệ thống.
- Đề xuất và tích hợp các giải pháp bảo mật trong quá trình cập nhật phần mềm trên thiết bị IoT, hạn chế rủi ro về an ninh và đảm bảo tính toàn vẹn hệ thống.
- So sánh, phân tích ưu điểm của phương pháp DevOps so với các cách tiếp cận truyền thống, từ đó khẳng định tính hiệu quả và thực tiễn của giải pháp.
Đối tượng nghiên cứu
1.Tầng thiết bị (Device Layer)
- ESP32 WROOM-32: Thiết bị thật, thu thập dữ liệu, nhận cập nhật firmware qua OTA (HTTP) và giao tiếp qua MQTT.[3]
- Raspberry Pi Device (mô phỏng): Được giả lập bằng Docker container, đóng vai trò thiết bị IoT cần cập nhật hệ điều hành hoặc ứng dụng (dạng Docker image).
2. Tầng biên (Edge Layer) - Hạ tầng triển khai: 3 máy ảo Ubuntu 22.04 trên nền tảng OpenStack (Hybrid Cloud của trường).
- K3s Cluster: Gồm 1 master node và 2 worker nodes được cài đặt tự động bằng Ansible. [4]
- Các dịch vụ triển khai:
⋄ MQTT Broker: EMQX (Edge ↔ Device giao tiếp).
⋄ Prometheus + Grafana: Thu thập và hiển thị metrics hạ tầng hệ thống.
⋄ Loki Stack (Loki + Promtail): Thu thập log từ hạ tầng hệ thống.
⋄ OTA Web Server ESP32 (Node.js): Cung cấp file ‘.bin‘ và API quản lý log/update/status cho ESP32.
⋄ Web Server RasPi (FastAPI + React): Giao diện người dùng để theo dõi trạng thái RasPi device, logs, và trigger cập nhật app/OS.
3. Tầng Cloud/CI/CD - GitHub Actions:
⋄ Tự động build firmware cho ESP32 và upload lên OTA server ở Edge.
⋄ Tự động build Docker image cho Raspberry Pi app, sau đó push lên Docker Hub. - Docker Hub: Registry lưu trữ các image được build từ GitHub Actions.
4. Các công nghệ sử dụng - Kubernetes (K3s): Triển khai ứng dụng dạng container tại Edge.
- Ansible: Tự động hóa quá trình cài đặt và cấu hình hạ tầng Edge.
- MQTT, HTTP REST: Giao thức trao đổi dữ liệu giữa Device và Edge.
- GitHub Actions: Hệ thống CI/CD chuyên dùng cho cả firmware và Docker image.
Phạm vi nghiên cứu
- Xây dựng kiến trúc hệ thống IoT theo mô hình phân tầng Device – Edge – Cloud, trong đó tầng Edge hoạt động như một điểm trung gian thông minh.
- Triển khai hạ tầng K3s cluster tại tầng Edge, tích hợp các dịch vụ giám sát, cập nhật firmware và ứng dụng.
- Phát triển hai Web Server:
⋄ Node.js OTA Web Server: phục vụ ESP32 cập nhật firmware và gửi thông tin log.
⋄ FastAPI + React Web Server: phục vụ RasPi device mô phỏng cập nhật Docker image và hiển thị trạng thái thiết bị. - Tích hợp GitHub Actions cho quá trình CI/CD:
⋄ Tự động build firmware ESP32 và push tới Edge.
⋄ Build, publish Docker image RasPi lên Docker Hub, để Edge có thể pull. - Triển khai hệ thống giám sát và logging tại Edge [5]:
⋄ Prometheus, Grafana: Giám sát hiệu năng hệ thống.
⋄ Lokistack: Thu thập log từ hệ thống. - Kiểm thử thực tế với thiết bị ESP32 thật và RasPi giả lập bằng container.
- Tích hợp gửi thông báo về quá trình hoạt động cũng như trạng thái update của thiết bị khi có firmware mới hoặc image mới về Slack.
PHƯƠNG PHÁP THỰC HIỆN
Tổng quan quy trình thực hiện
Đồ án được triển khai dựa trên mô hình kiến trúc ba tầng gồm: Thiết bị (Device) – Biên (Edge) – Đám mây (Cloud). Em đã tiến hành thực hiện theo một quy trình tuần tự, có kiểm soát, kết hợp giữa các công cụ tự động hóa và giám sát nhằm đảm bảo khả năng triển khai, kiểm thử và đánh giá một cách khoa học và hiệu quả.
Quy trình thực hiện được thiết kế theo hướng tiếp cận từ hạ tầng đến ứng dụng, trong đó mỗi tầng có vai trò cụ thể và gắn liền với các giai đoạn trong quá trình triển khai. Cụ thể, em bắt đầu từ việc thiết lập hạ tầng ở tầng biên bằng cách triển khai cụm K3s trên ba máy ảo sử dụng nền tảng OpenStack.Việc thiết lập hệ thống được thực hiện hoàn toàn tự động hóa thông qua công cụ Ansible, bao gồm cả cài đặt cụm K3s, cấu hình mạng và triển khai các dịch vụ cần thiết (Prometheus, Grafana, LokiStack, EMQX). Tiếp theo là xây dựng hệ thống backend phục vụ cập nhật OTA cho thiết bị ESP32 và RasPi mô phỏng, đồng thời tích hợp các thành phần mạng như ingress controller và tên miền nội bộ để đảm bảo thiết bị ở ngoài có thể truy cập được dịch vụ nội bộ.[2] [6]
Sau khi hoàn tất hạ tầng, nhóm tiến hành xây dựng hệ thống backend OTA phục vụ cho ESP32 và container RasPi mô phỏng. Đồng thời, một workflow CI/CD sử dụng GitHub Actions cũng được thiết kế để tự động build firmware ESP32 (.bin), kiểm thử, quét bảo mật (Trivy), upload firmware lên OTA server và build/push Docker image lên Docker Hub cho RasPi.
Khi hạ tầng backend và pipeline CI/CD đã sẵn sàng, nhóm tiến hành kết nối các thiết bị đầu cuối, bao gồm một thiết bị ESP32 thực tế và nhiều container Docker mô phỏng Raspberry Pi. Các thiết bị này được lập trình để định kỳ gửi dữ liệu, heartbeat và tự động kiểm tra cập nhật.
Hệ thống giám sát được thiết kế bao gồm:
- Prometheus: thu thập metrics từ các node và pod trong cụm K3s.
- Loki + Promtail: thu thập logs từ container.
- Grafana: hiển thị dashboard thống kê, logs, cảnh báo realtime.
Tổng thể quy trình được chia thành các bước chính sau: - Thiết lập hạ tầng cụm K3s bằng Ansible trên 3 VM tầng biên (OpenStack).
- Triển khai các dịch vụ Prometheus, Grafana, LokiStack, EMQX bằng Ansible.
- Cấu hình NetworkPolicy kiểm soát truy cập giữa các pod.
- Xây dựng hệ thống backend OTA và Web UI phục vụ ESP32 và RasPi.
- Thiết kế CI/CD pipeline trên GitHub Actions cho build, test, deploy firmware và Docker image.
- Kết nối thiết bị đầu cuối và cấu hình tự động cập nhật.
- Thiết lập hệ thống giám sát và thực hiện các bài thực nghiệm.
Các mục tiếp theo sẽ đi sâu vào từng bước triển khai cụ thể với mô tả chi tiết kiến trúc, luồng dữ liệu và các công cụ được sử dụng.
Thiết lập hạ tầng K3s bằng Ansible

Tổng quan kiến trúc hệ thống



THỰC NGHIỆM VÀ ĐÁNH GIÁ
Thực nghiệm và đánh giá hệ thống Agent-RasPi
Mục tiêu của kịch bản demo là đánh giá khả năng hoạt động thực tế của hệ thống IoT Device Management thông qua các kịch bản mô phỏng được triển khai bởi file demo_script được viết bằng python. Demo nhằm kiểm chứng các khía cạnh sau:
- Độ chính xác và đầy đủ của các chức năng chính (device management, log, deployment. . . ).
- Khả năng xử lý lỗi và tự phục hồi.
- Hiệu suất và độ trễ hệ thống.
- Trải nghiệm người dùng (qua dashboard và Slack).

Kịch bản 1: Hoạt động IoT cơ bản
Các bước thực hiện:
- Tạo 5 thiết bị giả lập Raspberry Pi, gửi yêu cầu POST /api/device đến backend.
- Mỗi thiết bị gửi heartbeat 10 giây/lần đến /api/device/heartbeat.
- Thiết bị gửi log hệ thống bao gồm: CPU, RAM, Disk, Network.
Kết quả đạt được:
- Tất cả 5 thiết bị được backend ghi nhận.
- Heartbeat gửi thành công liên tục trong 5 phút.
- Các log hệ thống hiển thị đầy đủ trên dashboard.
Đánh giá: Hoạt động ổn định, latency API < 150ms, dữ liệu log đồng bộ tốt, giao diện trực quan.
Kịch bản 2: Triển khai và Rollback Firmware
Các bước thực hiện:
- Triển khai phiên bản firmware 2.1.0 lên 3 thiết bị đầu tiên.
- Thiết bị thứ 4 cố tình lỗi triển khai (disk full).
- Hệ thống tự động rollback thiết bị thứ 4 về phiên bản cũ (2.0.5).
Kết quả đạt được:
- 3 thiết bị cập nhật thành công.
- 1 lỗi được phát hiện đúng, log lỗi được ghi lại.
- Rollback thực hiện tự động trong vòng 20 giây.
Đánh giá: Hệ thống xử lý deployment logic tốt, phản ứng nhanh với lỗi và rollback hiệu quả. Slack nhận được thông báo chi tiết.
Kịch bản 3: Cập nhật hàng loạt thiết bị (Bulk Update)
Các bước thực hiện:
- Kích hoạt API POST /api/demo/bulk-update.
- Tất cả 5 thiết bị nhận lệnh cập nhật lên phiên bản 2.2.0.
- Hệ thống ghi log từng thiết bị cập nhật thành công.
Kết quả đạt được:
- 100% thiết bị cập nhật thành công sau 35 giây.
- Quá trình thực thi song song, không bị gián đoạn.
- Slack nhận thông báo tổng hợp.
Đánh giá: Khả năng xử lý đồng thời tốt, phù hợp mở rộng trên quy mô lớn hơn. Tốc độ và độ tin cậy cao.
Kịch bản 4: Mô phỏng sự cố và phục hồi hệ thống
Các bước thực hiện:
- Kích hoạt sự cố qua API POST /api/demo/system-failure.
- Một thiết bị được mô phỏng mất kết nối mạng.
- Sau đó thiết bị được khôi phục và gửi log trở lại.
Kết quả đạt được:
- Hệ thống ghi nhận thiết bị offline đúng thời điểm.
- Recovery hoạt động đúng sau 15 giây.
- Không mất dữ liệu, log được đồng bộ đầy đủ sau khi trở lại.
Đánh giá: Cơ chế khôi phục tự động hoạt động tốt, log lỗi rõ ràng, cảnh báo được gửi tới Slack đúng lúc.
Kịch bản 5: Giám sát thời gian thực
Các bước thực hiện:
- Trong vòng 10 giây, chọn ngẫu nhiên thiết bị và gửi log CPU, RAM mỗi 2 giây.
- Dữ liệu hiển thị real-time trên dashboard frontend.
Kết quả đạt được:
- 5 log metrics được ghi nhận trong vòng 10 giây.
- Latency hiển thị real-time < 500ms.
- Dashboard phản hồi mượt, không cần reload.
Đánh giá: Hệ thống hiển thị real-time tốt, phù hợp giám sát tại hiện trường. Latency thấp, độ tin cậy cao.
Tổng kết: Tất cả các kịch bản được thực thi thành công. Hệ thống thể hiện được tính ổn định, khả năng mở rộng và độ tin cậy cao trong mọi tình huống, từ vận hành bình thường đến sự cố bất ngờ. Các tính năng chính như rollback, bulk update, real-time dashboard và log đồng bộ đều đạt yêu cầu.
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN
Kết luận
Đồ án này được xây dựng với mục tiêu triển khai một hệ thống quản lý thiết bị IoT hoàn chỉnh, bao gồm hai loại thiết bị chính: Raspberry Pi và ESP32. Mỗi thiết bị đều có vai trò riêng biệt nhưng cùng phối hợp trong một hệ thống tổng thể nhằm hỗ trợ cập nhật firmware từ xa, giám sát thiết bị theo thời gian thực, và đảm bảo tính bảo mật, ổn định trong quá trình vận hành.
Ở thời điểm hiện tại, hệ thống đã đạt được mức độ hoàn thiện khoảng 70% so với các tiêu chí ban đầu đặt ra. Cụ thể, các chức năng lõi như:
- Kết nối và giao tiếp của thiết bị ESP32 với backend qua HTTP và MQTT.
- Gửi dữ liệu cảm biến, heartbeat theo định kỳ.
- Giao diện Web UI hiển thị realtime trạng thái thiết bị, dữ liệu sensor và log OTA.
- Hệ thống backend quản lý firmware, xác thực API, phân quyền token.
- Tích hợp pipeline CI/CD tự động build và deploy firmware ESP32 qua GitHub Actions
Tuy nhiên, trong quá trình thực hiện, em gặp phải một số hạn chế kỹ thuật cũng như trở ngại về thời gian nghiên cứu. Một trong những vấn đề lớn là việc tích hợp HTTPS cho ESP32 thông qua Cloudflare. Do Cloudflare sử dụng chứng chỉ SSL với thuật toán ECDSA, vốn không được hỗ trợ tốt bởi ESP32 sử dụng thư viện WiFiClientSecure mặc định, nên việc kết nối bảo mật gặp nhiều lỗi khó xử lý. Điều này khiến phần giao tiếp HTTPS chưa được hoàn thiện hoàn toàn như mong muốn.
Thêm vào đó, do em chỉ mới tiếp cận các công cụ DevOps như K3s, Ansible, PM2, MQTT broker (EMQX), nên giai đoạn đầu thực hiện đồ án mất khá nhiều thời gian để đọc tài liệu, cài đặt, khắc phục lỗi và điều chỉnh hệ thống cho phù hợp. Có những lúc gặp lỗi không rõ nguyên nhân, em đã phải kiểm tra log từng dòng, thử nghiệm và sửa lỗi nhiều lần.
Mặc dù mất thời gian nhưng quá trình này giúp em tích lũy được rất nhiều kinh nghiệm thực tế và cải thiện kỹ năng xử lý sự cố .
Hạn chế chính của đồ án
- Giao tiếp HTTPS giữa ESP32 và backend chưa hoàn thiện: Do hạn chế từ phía phần cứng và thư viện của ESP32.
- Thiếu cơ chế rollback khi cập nhật firmware thất bại: Firmware ESP32 hiện chưa hỗ trợ phục hồi bản cũ nếu bản mới lỗi.
- Các log giám sát hệ thống còn đơn giản: Chưa có phân loại rõ ràng hoặc hiển thị theo mức độ severity.
- Thiếu kiểm thử tự động cho backend và frontend: Mới chỉ thực hiện CI/CD cho phần firmware ESP32.
- Chưa triển khai mô hình dự đoán lỗi thiết bị: Ý tưởng đã hình thành nhưng chưa đủ thời gian để triển khai.
Hướng phát triển
Mặc dù đồ án hiện tại mới chỉ hoàn thiện các chức năng cơ bản, nhưng nó đã đặt nền tảng vững chắc để mở rộng và tích hợp nhiều tính năng nâng cao trong tương lai. Một số định hướng phát triển tiếp theo bao gồm:
- Tích hợp giao tiếp HTTPS đầy đủ cho ESP32: Khắc phục hạn chế liên quan đến chứng chỉ SSL ECDSA bằng cách triển khai proxy trung gian dùng Let’s Encrypt với thuật toán RSA, hoặc tự tạo CA để phù hợp với ESP32. Điều này đảm bảo toàn bộ giao tiếp với server được mã hóa và xác thực.[1]
- Xây dựng cơ chế rollback OTA tự động: Khi cập nhật firmware không thành công, thiết bị sẽ tự động quay về phiên bản trước thông qua việc lưu trữ bản firmware ổn định ở phân vùng khác và thiết kế cơ chế kiểm tra hash trong quá trình boot.[2] [6]
- Áp dụng mô hình dự đoán lỗi bằng học máy: Thu thập log hệ thống và dữ liệu cảm biến để huấn luyện mô hình machine learning giúp dự đoán lỗi phần cứng hoặc phần mềm của thiết bị từ sớm (predictive maintenance).
- Mở rộng CI/CD cho Backend và Dashboard: Thiết lập thêm các pipeline tự động build, test, deploy cho backend (FastAPI) và frontend (React) để nâng cao độ tin cậy và chuẩn hóa quy trình phát triển phần mềm toàn hệ thống.
- Tăng cường khả năng bảo mật hệ thống: Bao gồm xác thực JWT nâng cao, phân quyền theo vai trò (RBAC), kiểm tra bảo mật định kỳ (SAST/DAST) và giám sát an ninh thời gian thực qua các công cụ như Wazuh, Falco.
- Nâng cấp kiến trúc hệ thống: Chuyển backend lên nền tảng Kubernetes hoặc K3s để hỗ trợ autoscaling, high availability và triển khai phân tán trên nhiều vùng mạng, hướng đến hệ thống production thật sự.
- Thêm khả năng quản lý đa thiết bị: Bổ sung các chức năng như phân nhóm thiết bị, lọc theo loại cảm biến, kiểm soát cập nhật firmware theo đợt (staged rollout), cảnh báo theo từng cụm thiết bị.
- Tối ưu hóa giao diện người dùng: Cải tiến Web UI để hỗ trợ biểu đồ thời gian thực, dashboard có thể tùy chỉnh, hỗ trợ mobile/tablet, thêm chức năng tìm kiếm nâng cao và phân quyền truy cập từng phần


