Master Plan: สร้าง IoT Platform ครบวงจรใน 21 บท

Master Plan: สร้าง IoT Platform ครบวงจรใน 21 บท

Showkhun · Workshop ·

เคยมั้ยที่อยากสร้าง IoT system เองตั้งแต่ต้นจนจบ แต่ไม่รู้จะเริ่มจากตรงไหน? เรามาแก้ปัญหานั้นด้วยกันเลยดีกว่า workshop นี้เราจะสร้าง IoT Platform จริงๆ ครบทุก layer ตั้งแต่ sensor ส่งข้อมูลขึ้นมาถึง mobile app และ admin panel เลย (ใช่ ครบจริงๆ ไม่ใช่แค่ hello world นะ ^^)

Repo: github.com/kangana1024/iot-workshop


สิ่งที่น้องๆ จะได้จาก Workshop นี้

ก่อนจะลุยกัน ขอ spoil ก่อนว่าพอจบ workshop นี้น้องๆ จะทำอะไรได้บ้าง:

  • ออกแบบ IoT architecture ได้อย่างมั่นใจ รู้ว่า service ไหนคุยกับใคร ผ่านอะไร
  • เขียน Go + Fiber backend รับ sensor data ผ่าน REST และ MQTT
  • เก็บข้อมูล time-series ใน InfluxDB และ monitor ด้วย TICK Stack
  • สร้าง mobile app ด้วย LynxJS ดู real-time dashboard บนมือถือได้เลย
  • สร้าง admin panel ด้วย Vite + React + TypeScript จัดการ devices ทั้งหมด
  • Deploy ทุกอย่างด้วย Docker Compose คำสั่งเดียวขึ้นหมด

Tech Stack ที่เราจะใช้

ลองนึกภาพ IoT system เหมือน “ระบบไปรษณีย์อัจฉริยะ” นะ:

  • อุปกรณ์ IoT = คนส่งจดหมาย (sensor ส่งข้อมูล)
  • MQTT Broker = ที่ทำการไปรษณีย์ (รับและกระจายข้อความ)
  • Go + Fiber Backend = ผู้จัดการไปรษณีย์ (ประมวลผล, เก็บ, ส่งต่อ)
  • MongoDB + InfluxDB = คลังเก็บจดหมาย (ต่างประเภทเก็บต่างที่)
  • LynxJS Mobile = แอปติดตามพัสดุ (ดู status real-time)
  • Vite + React Admin = dashboard ของ supervisor (ควบคุมทั้งระบบ)
LayerTechnologyหน้าที่
Backend APIGo + FiberREST API, WebSocket, MQTT Handler
DatabaseMongoDBDevice registry, user data, configs
Time-SeriesInfluxDB (TICK Stack)Sensor data storage & analytics
MonitoringTelegraf + Kapacitor + ChronografData collection, alerting, visualization
Mobile AppLynxJSReal-time IoT dashboard & device control
Admin PanelVite + React + TypeScriptDevice management, user admin, monitoring
Message BrokerMQTT (Mosquitto)Device-to-cloud communication
ContainerDocker + Docker ComposeDevelopment & deployment

ภาพรวม Architecture ของทั้งระบบ

มาดูกันก่อนว่าข้อมูลจาก sensor มันเดินทางยังไง ตั้งแต่วัดอุณหภูมิจนถึงโชว์บนหน้าจอมือถือ:

Mermaid Diagram

ข้อมูลไหลแบบนี้แหละ - sensor ยิง MQTT ขึ้นมา แล้ว backend รับไปจัดการ เก็บ MongoDB สำหรับข้อมูล device และเก็บ InfluxDB สำหรับ time-series จากนั้น push ไป frontend แบบ real-time ผ่าน WebSocket เลย สวยงามมาก (งง) ฮ่าๆ แต่ไม่ต้องกังวล เราจะค่อยๆ build ทีละ layer กัน


โครงสร้าง Monorepo

iot-workshop/
├── backend/                    # Go + Fiber API Server
│   ├── cmd/
│   │   └── server/
│   │       └── main.go
│   ├── internal/
│   │   ├── config/             # App configuration
│   │   ├── handler/            # HTTP handlers
│   │   ├── middleware/         # Auth, CORS, logging
│   │   ├── model/              # Data models
│   │   ├── repository/         # Database layer
│   │   ├── service/            # Business logic
│   │   ├── mqtt/               # MQTT client & handlers
│   │   └── websocket/          # WebSocket hub
│   ├── pkg/
│   │   └── utils/              # Shared utilities
│   ├── go.mod
│   ├── go.sum
│   └── Dockerfile
├── frontend-mobile/            # LynxJS Mobile App
│   ├── src/
│   │   ├── screens/            # App screens
│   │   ├── components/         # Reusable components
│   │   ├── services/           # API & MQTT services
│   │   ├── stores/             # State management
│   │   └── utils/              # Helpers
│   ├── package.json
│   └── Dockerfile
├── frontend-admin/             # Vite + React Admin Panel
│   ├── src/
│   │   ├── pages/              # Admin pages
│   │   ├── components/         # UI components
│   │   ├── hooks/              # Custom hooks
│   │   ├── services/           # API services
│   │   ├── stores/             # Zustand stores
│   │   └── types/              # TypeScript types
│   ├── package.json
│   ├── vite.config.ts
│   └── Dockerfile
├── deployments/
│   ├── docker-compose.yml      # Full stack compose
│   ├── docker-compose.dev.yml  # Dev overrides
│   ├── mosquitto/
│   │   └── mosquitto.conf
│   ├── telegraf/
│   │   └── telegraf.conf
│   └── kapacitor/
│       └── kapacitor.conf
├── docs/                       # Workshop documentation
│   ├── architecture.md
│   ├── api-spec.md
│   └── setup-guide.md
├── scripts/
│   ├── setup.sh                # One-click dev setup
│   └── seed-data.sh            # Sample data seeder
├── .gitignore
├── README.md
└── Makefile

เรื่องโครงสร้าง เราเลือก Monorepo เพราะ workshop นี้ต้องการให้น้องๆ เห็นภาพรวมทั้งหมดในที่เดียว เปิด editor ครั้งเดียวเห็นทุก service เลย ง่ายกว่าต้อง clone หลาย repo แน่นอน


Roadmap 21 Content ใน 5 Phase

( •_•)
( •_•)>⌐■-■
(⌐■-■)  ← เตรียมตัวลุยกันได้เลย!

Phase 1: Planning (3 Content) - วางรากฐานให้แน่น

ก่อนจะเขียน code สักบรรทัด เราต้องออกแบบก่อน เหมือนสร้างบ้านต้องมีแปลนก่อนสร้าง ไม่งั้น สร้างไปก็รื้อทิ้งทีหลัง

#BranchContentDescription
1workshop/plan-01-architectureSystem Architectureออกแบบ architecture, data flow, component diagram
2workshop/plan-02-database-designDatabase & Data Modelออกแบบ MongoDB schema, InfluxDB measurements, data flow
3workshop/plan-03-project-setupProject Setup & DevOpsตั้งค่า monorepo, Docker Compose, CI/CD pipeline

Phase 2: Backend Development (6 Content) - หัวใจของทั้งระบบ

Backend ก็เหมือนครัวของร้านอาหาร ลูกค้า (frontend) ไม่เห็น แต่ถ้าครัวพัง ทุกอย่างพัง เราจะสร้างครัวที่แน่นมากๆ

#BranchContentDescription
4workshop/dev-01-fiber-bootstrapGo Fiber Bootstrapสร้าง project structure, config, middleware
5workshop/dev-02-mongodb-modelsMongoDB Models & Repositoryสร้าง models, repository pattern, connection
6workshop/dev-03-device-apiDevice Management APICRUD API สำหรับจัดการ devices
7workshop/dev-04-sensor-ingestionSensor Data Ingestionรับข้อมูล sensor ผ่าน REST & MQTT
8workshop/dev-05-mqtt-brokerMQTT Integrationเชื่อมต่อ Mosquitto, pub/sub patterns
9workshop/dev-06-websocketWebSocket Real-timePush real-time data ไปยัง frontend

Phase 3: TICK Stack & Monitoring (3 Content) - ตาที่มองเห็นทุกอย่าง

TICK Stack คือ “กล้องวงจรปิด” ของระบบเรา ดูได้ว่าข้อมูลไหลไปไหน มีปัญหาที่ไหน แจ้งเตือนได้ทันที

#BranchContentDescription
10workshop/dev-07-tick-setupTICK Stack Setupติดตั้งและ config Telegraf, InfluxDB, Chronograf, Kapacitor
11workshop/dev-08-telegraf-pipelineTelegraf Data PipelineMQTT consumer, data transformation, InfluxDB writer
12workshop/dev-09-alertingKapacitor Alertingสร้าง alert rules, threshold monitoring, notifications

Phase 4: Mobile Frontend - LynxJS (5 Content) - ของที่ผู้ใช้จะจับต้อง

นี่คือส่วนที่น้องๆ จะโชว์คนอื่นได้ “เฮ้ ดูนี่สิ app IoT ที่ฉันสร้างเอง!” บน mobile จริงๆ เลย

#BranchContentDescription
13workshop/dev-10-lynxjs-setupLynxJS App Setupสร้าง mobile app, navigation, base components
14workshop/dev-11-lynxjs-dashboardReal-time Dashboardแสดงข้อมูล sensor แบบ real-time ด้วย charts
15workshop/dev-12-lynxjs-controlDevice Control UIสร้าง UI สำหรับควบคุม devices
16workshop/dev-13-lynxjs-chartsData Visualizationกราฟ, charts, historical data view
17workshop/dev-14-lynxjs-alertsNotifications & AlertsPush notifications, alert history

Phase 5: Admin Panel - Vite+React (4 Content) - command center

Admin panel คือ “ห้องควบคุม” ที่ผู้ดูแลระบบใช้ manage ทุกอย่าง ตั้งแต่ device ยันสิทธิ์การเข้าถึง

#BranchContentDescription
18workshop/dev-15-vite-setupVite Admin Setupสร้าง admin panel ด้วย Vite + React + TypeScript
19workshop/dev-16-admin-crudAdmin CRUDจัดการ devices, users, configurations
20workshop/dev-17-admin-monitoringMonitoring DashboardAdmin monitoring ด้วย Chronograf integration
21workshop/dev-18-admin-authAuthentication & RBACJWT auth, role-based access control

Prompts สำหรับแต่ละ Content

ส่วนนี้คือ “สูตรอาหาร” ที่เราจะใช้สร้าง content แต่ละตอน เก็บไว้ reference ได้เลย

Phase 1: Planning Prompts

Prompt #1 - System Architecture:

สร้าง content สำหรับ IoT Workshop เกี่ยวกับ System Architecture Design
- ออกแบบ high-level architecture diagram (ASCII/Mermaid)
- อธิบาย data flow: Device -> MQTT -> Backend -> Database -> Frontend
- Component diagram แสดงความสัมพันธ์ของแต่ละ service
- อธิบาย communication patterns: REST, WebSocket, MQTT
- ระบุ ports และ protocols ที่ใช้
- Tech stack justification: ทำไมถึงเลือก Go+Fiber, MongoDB, TICK Stack, LynxJS, Vite
- Branch: workshop/plan-01-architecture

Prompt #2 - Database Design:

สร้าง content สำหรับ IoT Workshop เกี่ยวกับ Database & Data Model Design
- MongoDB Collections: devices, users, configs, device_groups, alert_rules
- Document schema design พร้อม field types และ indexes
- InfluxDB Measurements: sensor_data, device_status, system_metrics
- Tag keys, field keys, retention policies
- Data flow diagram: raw data -> processing -> storage -> query
- Migration strategy และ seed data plan
- Branch: workshop/plan-02-database-design

Prompt #3 - Project Setup:

สร้าง content สำหรับ IoT Workshop เกี่ยวกับ Project Setup & DevOps
- Monorepo structure สำหรับ backend + frontend-mobile + frontend-admin
- Docker Compose สำหรับ development environment
- Services: Go API, MongoDB, Mosquitto, InfluxDB, Telegraf, Chronograf, Kapacitor
- Makefile commands สำหรับ common tasks
- Environment variables และ configuration management
- Git branching strategy สำหรับ workshop
- Branch: workshop/plan-03-project-setup

Phase 2: Backend Prompts

Prompt #4 - Go Fiber Bootstrap:

สร้าง code สำหรับ Go Fiber API server bootstrap
- Project structure ตาม clean architecture
- Fiber app setup พร้อม middleware: CORS, Logger, Recover, RequestID
- Config management ด้วย Viper (ไฟล์ .env + environment variables)
- Health check endpoint
- Graceful shutdown
- Hot reload ด้วย Air
- Branch: workshop/dev-01-fiber-bootstrap

Prompt #5 - MongoDB Models:

สร้าง code สำหรับ MongoDB connection และ data models
- MongoDB connection ด้วย official Go driver
- Models: Device, User, DeviceGroup, AlertRule, Config
- Repository pattern implementation
- BSON tags และ validation
- Index creation
- Connection pooling configuration
- Branch: workshop/dev-02-mongodb-models

Prompt #6 - Device API:

สร้าง code สำหรับ Device Management REST API
- CRUD endpoints: POST/GET/PUT/DELETE /api/v1/devices
- List with pagination, filtering, sorting
- Device registration flow
- Device status tracking (online/offline/error)
- Bulk operations (register multiple devices)
- API documentation (Swagger/OpenAPI)
- Branch: workshop/dev-03-device-api

Prompt #7 - Sensor Ingestion:

สร้าง code สำหรับ Sensor Data Ingestion
- POST /api/v1/sensors/data - REST ingestion endpoint
- Batch ingestion support
- Data validation (temperature range, humidity range, etc.)
- Write to InfluxDB via InfluxDB Go client
- Data transformation pipeline
- Rate limiting per device
- Branch: workshop/dev-04-sensor-ingestion

Prompt #8 - MQTT Integration:

สร้าง code สำหรับ MQTT Broker Integration
- MQTT client setup ด้วย Eclipse Paho Go
- Topic structure: devices/{device_id}/telemetry, devices/{device_id}/command
- Subscribe to sensor data topics
- Publish commands to devices
- QoS levels configuration
- Auto-reconnection logic
- Message handler pipeline
- Branch: workshop/dev-05-mqtt-broker

Prompt #9 - WebSocket Real-time:

สร้าง code สำหรับ WebSocket real-time data streaming
- Fiber WebSocket upgrade handler
- Hub pattern: manage connections, rooms, broadcasts
- Room-based subscriptions (per device, per group)
- Fan-out sensor data to subscribed clients
- Connection lifecycle management
- Heartbeat/ping-pong
- Branch: workshop/dev-06-websocket

Phase 3: TICK Stack Prompts

Prompt #10 - TICK Stack Setup:

สร้าง content และ config สำหรับ TICK Stack Setup
- Docker Compose services สำหรับ InfluxDB, Telegraf, Chronograf, Kapacitor
- InfluxDB: database creation, retention policies, continuous queries
- Telegraf: basic configuration, input/output plugins
- Chronograf: dashboard setup, data explorer
- Kapacitor: connection to InfluxDB, basic configuration
- Network configuration ให้ทุก service คุยกันได้
- Branch: workshop/dev-07-tick-setup

Prompt #11 - Telegraf Pipeline:

สร้าง content และ config สำหรับ Telegraf Data Pipeline
- MQTT Consumer input plugin configuration
- Data format: JSON parsing จาก MQTT messages
- Processor plugins: rename, converter, regex
- InfluxDB output configuration
- Multiple measurement routing
- Performance tuning: buffer, batch, flush interval
- Branch: workshop/dev-08-telegraf-pipeline

Prompt #12 - Alerting:

สร้าง content และ config สำหรับ Kapacitor Alerting
- TICKscript สำหรับ threshold alerts
- Temperature > 40°C alert
- Device offline detection (no data for 5 minutes)
- Humidity anomaly detection
- Alert handlers: Webhook to Go API, Slack, Email
- Alert history storage
- Dead man's switch สำหรับ critical devices
- Branch: workshop/dev-09-alerting

Phase 4: Mobile Frontend Prompts

Prompt #13 - LynxJS Setup:

สร้าง code สำหรับ LynxJS Mobile App Setup
- LynxJS project initialization
- Navigation setup (tab-based: Dashboard, Devices, Alerts, Settings)
- Base components: Card, Button, Badge, Input
- Theme configuration (dark/light mode)
- API service layer (axios/fetch wrapper)
- Environment configuration
- Branch: workshop/dev-10-lynxjs-setup

Prompt #14 - Real-time Dashboard:

สร้าง code สำหรับ LynxJS Real-time Dashboard
- Dashboard screen layout
- Real-time sensor data cards (temperature, humidity, pressure)
- WebSocket connection manager
- Auto-reconnection logic
- Loading states และ error handling
- Pull-to-refresh
- Last updated timestamp
- Branch: workshop/dev-11-lynxjs-dashboard

Prompt #15 - Device Control:

สร้าง code สำหรับ LynxJS Device Control Interface
- Device list screen พร้อม search & filter
- Device detail screen
- Toggle controls (on/off switches, relays)
- Slider controls (brightness, speed)
- Command history
- Device status indicator (online/offline)
- Confirm dialog สำหรับ critical actions
- Branch: workshop/dev-12-lynxjs-control

Prompt #16 - Data Visualization:

สร้าง code สำหรับ LynxJS Data Visualization
- Line charts สำหรับ temperature/humidity over time
- Gauge charts สำหรับ current values
- Time range selector (1h, 6h, 24h, 7d, 30d)
- Multi-sensor overlay comparison
- Export data as CSV
- Chart animations
- Responsive chart sizing
- Branch: workshop/dev-13-lynxjs-charts

Prompt #17 - Notifications:

สร้าง code สำหรับ LynxJS Push Notifications & Alerts
- Push notification setup
- Alert list screen
- Alert detail with sensor context
- Mark as read/unread
- Alert severity badges (info, warning, critical)
- Notification preferences per device
- Sound/vibration settings
- Branch: workshop/dev-14-lynxjs-alerts

Phase 5: Admin Panel Prompts

Prompt #18 - Vite Admin Setup:

สร้าง code สำหรับ Vite + React Admin Panel
- Vite + React + TypeScript project setup
- Tailwind CSS configuration
- Layout: Sidebar navigation, Header, Main content
- Routing ด้วย React Router v6
- Zustand state management setup
- API service layer ด้วย Axios + interceptors
- Branch: workshop/dev-15-vite-setup

Prompt #19 - Admin CRUD:

สร้าง code สำหรับ Admin CRUD Operations
- Device Management page: list, create, edit, delete
- User Management page: list, create, edit, roles
- DataTable component พร้อม sorting, filtering, pagination
- Form validation ด้วย React Hook Form + Zod
- Toast notifications
- Confirmation dialogs
- Bulk actions (delete, export)
- Branch: workshop/dev-16-admin-crud

Prompt #20 - Admin Monitoring:

สร้าง code สำหรับ Admin Monitoring Dashboard
- System overview cards: total devices, active, alerts, data rate
- Chronograf iframe integration สำหรับ detailed graphs
- Real-time device status grid
- Alert management: acknowledge, resolve, escalate
- System health indicators
- Data export (CSV, JSON)
- Branch: workshop/dev-17-admin-monitoring

Prompt #21 - Authentication:

สร้าง code สำหรับ Authentication & RBAC
- JWT-based authentication (Go backend)
- Login/Register pages
- Protected routes ด้วย React Router
- Role-based access: admin, operator, viewer
- Token refresh mechanism
- Session management
- Audit log
- Branch: workshop/dev-18-admin-auth

Checklist ติดตามความคืบหน้า

Phase 1: Planning

  • Content #1: System Architecture Design
  • Content #2: Database & Data Model Design
  • Content #3: Project Setup & DevOps

Phase 2: Backend (Go + Fiber)

  • Content #4: Go Fiber Bootstrap
  • Content #5: MongoDB Models & Repository
  • Content #6: Device Management API
  • Content #7: Sensor Data Ingestion
  • Content #8: MQTT Broker Integration
  • Content #9: WebSocket Real-time

Phase 3: TICK Stack

  • Content #10: TICK Stack Setup
  • Content #11: Telegraf Data Pipeline
  • Content #12: Kapacitor Alerting

Phase 4: Mobile (LynxJS)

  • Content #13: LynxJS App Setup
  • Content #14: Real-time Dashboard
  • Content #15: Device Control UI
  • Content #16: Data Visualization
  • Content #17: Notifications & Alerts

Phase 5: Admin (Vite + React)

  • Content #18: Vite Admin Setup
  • Content #19: Admin CRUD Operations
  • Content #20: Monitoring Dashboard
  • Content #21: Authentication & RBAC

Repository Setup

  • Create GitHub repo: kangana1024/iot-workshop
  • Initialize monorepo structure
  • Setup Docker Compose
  • Create branch strategy
  • Setup CI/CD (GitHub Actions)
  • Write README.md

สรุปภาพรวม

Workshop นี้ครอบคลุม 21 content ใน 5 phase ใช้เวลาตามจริงน้องๆ จะมี IoT Platform ที่ทำงานได้จริง มี mobile app ดู sensor data real-time และมี admin panel จัดการทุกอย่างได้เต็มรูปแบบ

สิ่งสำคัญที่สุดที่เราอยากให้น้องๆ เข้าใจจาก workshop นี้ไม่ใช่แค่ code แต่คือ วิธีคิดการออกแบบระบบ ว่า service ต่างๆ ควรแบ่งหน้าที่ยังไง ข้อมูลควรไหลผ่านตรงไหน และเลือก technology ตามโจทย์ ไม่ใช่ตาม trend


Next: Content #1: System Architecture Design