Đây là một dự án được sử dụng cho mục đích nghiên cứu iot sử dụng tunel của ngork
Bộ cấu hình Docker để chạy Blynk Server cùng với API endpoint và ngrok, cho phép ESP8266 kết nối đến Blynk Server thông qua TCP tunnel.
Repository: https://github.com/tinboy16/blynk-ngrok
1. Kiến trúc
Hệ thống gồm các thành phần:
- Blynk Server: chạy trong Docker.
- API: Node.js, cung cấp endpoint
/api/để trả về địa chỉ TCP ngrok hiện tại cho ESP8266. - Nginx: gateway cho web và API.
- ngrok-web: public web/API thông qua HTTPS.
- ngrok-app: tunnel TCP cho cổng web/app của Blynk.
- ngrok-esp: tunnel TCP cho ESP8266.
Luồng kết nối chính:
ESP8266
|
| HTTPS GET
v
ngrok-web
|
v
Nginx
|
v
API
|
| trả về host + port
v
ESP8266
|
| TCP Blynk
v
ngrok-esp
|
v
Blynk Server
2. Yêu cầu
Cần cài:
- Docker
- Docker Compose
- Git
Kiểm tra:
docker --version
docker compose version
git --version
3. Clone repository
git clone https://github.com/tinboy16/blynk-ngrok.git
cd blynk-ngrok
4. Tạo file .env
Không commit file .env lên GitHub.
Tạo file:
.env
Nội dung:
NGROK_AUTHTOKEN=YOUR_NGROK_AUTHTOKEN
Thay YOUR_NGROK_AUTHTOKEN bằng Auth Token của tài khoản ngrok.
5. Khởi động hệ thống
Chạy:
docker compose up -d
Kiểm tra:
docker compose ps
Các container chính:
blynk
blynk-endpoint-api
blynk-gateway
blynk-web-ngrok
blynk-ngrok-app
blynk-ngrok-esp
Xem log:
docker compose logs -f
Hoặc xem riêng:
docker logs blynk
docker logs blynk-endpoint-api
docker logs blynk-gateway
docker logs blynk-web-ngrok
docker logs blynk-ngrok-app
docker logs blynk-ngrok-esp
6. Kiểm tra API
API public có dạng:
https://YOUR_NGROK_DOMAIN/api/
Ví dụ:
https://exciting-painfully-kiwi.ngrok-free.app/api/
API trả về JSON tương tự:
{
"ok": true,
"app": {
"host": "0.tcp.ap.ngrok.io",
"port": 13268,
"public_url": "tcp://0.tcp.ap.ngrok.io:13268"
},
"esp": {
"host": "0.tcp.ap.ngrok.io",
"port": 25984,
"public_url": "tcp://0.tcp.ap.ngrok.io:25984"
}
}
ESP8266 sử dụng thông tin trong trường esp để kết nối Blynk.
7. Cấu hình ESP8266
Trong code ESP8266 cần cấu hình WiFi, Blynk Auth và domain API:
const char* WIFI_SSID = "YOUR_WIFI_SSID";
const char* WIFI_PASS = "YOUR_WIFI_PASSWORD";
char BLYNK_AUTH[] = "YOUR_BLYNK_AUTH";
const char* API_HOST =
"YOUR_NGROK_DOMAIN";
const char* API_PATH =
"/api/";
const uint16_t API_PORT = 443;
8. Cách ESP8266 hoạt động
ESP8266 thực hiện các bước:
- Kết nối WiFi.
- Resolve DNS của API domain.
- Kết nối HTTPS đến API.
- Gửi
GET /api/. - Đọc HTTP response.
- Xử lý response dạng
chunked. - Parse JSON bằng ArduinoJson.
- Lấy
esp.hostvàesp.port. - Dùng host và port nhận được để cấu hình Blynk.
- Kết nối đến Blynk Server.
- Nếu kết nối mất, ESP8266 lấy endpoint mới và kết nối lại.
Việc lấy endpoint động rất hữu ích khi TCP port của ngrok thay đổi.
9. API sử dụng HTTP Chunked
API có thể trả response với:
Transfer-Encoding: chunked
ESP8266 cần đọc từng chunk trước khi parse JSON.
Không nên chỉ sử dụng:
client.readString();
để giả định toàn bộ response luôn có sẵn trong một lần đọc.
Code ESP8266 của dự án có phần xử lý:
HTTP status
HTTP headers
Transfer-Encoding: chunked
Content-Length
Connection: close
JSON parsing
10. Các cổng sử dụng
Theo cấu hình Docker Compose:
| Thành phần | Port |
|---|---|
| Blynk HTTP | 8080 |
| Blynk HTTPS | 9443 |
| API | 3000 nội bộ |
| Nginx | 80 nội bộ |
| ngrok web | HTTPS public |
| ngrok app | TCP public |
| ngrok ESP | TCP public |
Trong hệ thống hiện tại, ESP8266 sử dụng TCP tunnel trỏ vào Blynk Server port 8080.
Cấu hình ngrok tương ứng:
ngrok-esp:
image: ngrok/ngrok:latest
container_name: blynk-ngrok-esp
restart: unless-stopped
environment:
NGROK_AUTHTOKEN: "${NGROK_AUTHTOKEN}"
command:
- tcp
- blynk:8080
- --log=stdout
depends_on:
- blynk
Nếu thay đổi port Blynk, cần thay đổi cả server.properties, Docker Compose và endpoint mà ESP8266 sử dụng.
11. Kiểm tra tunnel ngrok
Xem log:
docker logs blynk-ngrok-esp --tail 100
Khi tunnel hoạt động sẽ có dòng tương tự:
started tunnel
url=tcp://0.tcp.ap.ngrok.io:XXXXX
Port XXXXX có thể thay đổi khi tunnel được tạo lại.
Do đó ESP8266 không nên hard-code TCP port ngrok.
Thay vào đó, ESP8266 lấy endpoint từ:
/api/
12. Kiểm tra kết nối ESP8266
Serial Monitor:
[WiFi] CONNECTED
[API] GET NGROK ENDPOINT
[HTTPS] TLS CONNECTED!
[JSON] PARSE SUCCESS
[JSON] ok = true
NEW BLYNK ENDPOINT
[Blynk] CONNECTING
[Blynk] CONNECTED!
Nếu API hoạt động nhưng Blynk không kết nối được, kiểm tra:
docker logs blynk-ngrok-esp --tail 100
Đặc biệt chú ý:
failed to open private leg
connection refused
Nếu xuất hiện lỗi này, ngrok đang chạy nhưng container Blynk không lắng nghe ở port mà ngrok đang trỏ tới.
13. Kiểm tra Blynk Server
Kiểm tra container:
docker ps
Kiểm tra process:
docker exec blynk ps aux
Kiểm tra cấu hình:
docker exec blynk cat /data/config/server.properties
Ví dụ:
hardware.mqtt.port=8440
http.port=8080
https.port=9443
Lưu ý: hardware.mqtt.port, http.port và https.port là các cổng khác nhau. Không nên nhầm port MQTT với port HTTP/HTTPS.
14. Dữ liệu và backup
data/
backup/
File cấu hình bí mật:
.env
Ví dụ:
.env
data/
backup/
15. Cấu trúc project
Cấu trúc cơ bản:
blynk-ngrok/
├── api/
│ └── server.js
├── nginx/
│ └── default.conf
├── docker-compose.yaml
├── .env
├── .gitignore
├── data/
└── backup/
16. Dừng hệ thống
docker compose down
Dừng và xóa container nhưng giữ dữ liệu trong volume bind mount:
docker compose down
Khởi động lại:
docker compose up -d
17. Cập nhật project
Sau khi pull code mới:
git pull
docker compose up -d --build
Nếu image không cần build lại:
docker compose pull
docker compose up -d
18. Xem trạng thái
docker compose ps
Xem toàn bộ log:
docker compose logs --tail 100
Theo dõi log realtime:
docker compose logs -f
19. Lưu ý bảo mật
Không commit các thông tin sau:
.env
WiFi password
Blynk Auth Token
NGROK_AUTHTOKEN
private keys
database credentials
backup/
data/
Nếu đã lỡ commit token hoặc mật khẩu lên GitHub, cần thay token/mật khẩu đó ngay cả khi đã xóa file khỏi commit mới nhất.
20. Giấy phép
Project này được cung cấp để phục vụ mục đích nghiên cứu, thử nghiệm và triển khai hệ thống Blynk Server cá nhân.
Kiểm tra giấy phép của các thành phần bên thứ ba trước khi sử dụng trong môi trường thương mại.
English
Blynk Ngrok Gateway
Docker setup for running a Blynk Server with an API endpoint, Nginx gateway and ngrok TCP/HTTP tunnels.
Main components
- Blynk Server
- Node.js API
- Nginx gateway
- ngrok web tunnel
- ngrok app TCP tunnel
- ngrok ESP8266 TCP tunnel
Quick start
Clone the repository:
git clone https://github.com/tinboy16/blynk-ngrok.git
cd blynk-ngrok
Create .env:
NGROK_AUTHTOKEN=YOUR_NGROK_AUTHTOKEN
Start the services:
docker compose up -d
Check:
docker compose ps
View logs:
docker compose logs -f
API
The API endpoint is:
https://YOUR_NGROK_DOMAIN/api/
It returns the current public Blynk TCP endpoint for the ESP8266.
Example:
{
"ok": true,
"esp": {
"host": "0.tcp.ap.ngrok.io",
"port": 25984,
"public_url": "tcp://0.tcp.ap.ngrok.io:25984"
}
}
The ESP8266 reads this endpoint instead of hard-coding the ngrok TCP port.
ESP8266
The ESP8266:
- Connects to WiFi.
- Requests
/api/. - Reads the HTTP response.
- Supports chunked transfer encoding.
- Parses the JSON response.
- Gets the current Blynk host and port.
- Connects to Blynk.
- Refreshes the endpoint when the connection is lost.
Security
Do not commit:
.env
data/
backup/
WiFi passwords
Blynk authentication tokens
ngrok authentication tokens
private keys
database credentials
