Introdução
📌 Contexto do Projeto: Laboratório IoT (Node-RED + MQTT + SQLite3 + Docker)
Aqui está um resumo compacto e estruturado da arquitetura e do script gerador (gen_portal.py), pronto para você copiar e colar como contexto inicial em um novo chat:
Objetivo Geral
O projeto é um gerador em Python (gen_portal.py) que cria automaticamente um ambiente Docker para aulas de IoT. Ele expõe contêineres Node-RED isolados por grupo/turma por trás de um portal Nginx (proxy reverso) e um broker MQTT Mosquitto central.
Arquitetura & Nomenclatura
- Roteamento & Nomes de Serviços:
-
Convenção de Nomes:
{turma}-{identificador}(ex.:n21-a,n21-b,n21-p,n21-n). -
Reservas de Letras Especiais:
-
p→ Professor (ex.:n21-p). -
n→ Painel de Notas / Avaliador (ex.:n21-n). -
Grupos de Alunos: Usam sequencialmente o restante do alfabeto (
a,b,c... pulandonep).
- Avaliador Distribuído (Container
{turma}-n):
- Possui o volume contendo todas as pastas dos alunos mapeado em modo leitura (
./data:/data_grupos:ro). - Vem pré-configurado com um fluxo Node-RED autogerado que executa análise estática nos arquivos
flows.jsondos alunos (checklist de nodes, tópicos, etc.) e imprime um relatório de correção/notas no Debug.
- Portal Nginx:
- Servido na porta
80. - Página Inicial (
index.html): Mantém visual dark/neon com grid e cards estilizados. Cards de alunos usam cor padrão, o Professor recebe destaque em dourado e o Avaliador de Notas em roxo. - Proxy Reverso: Redireciona a rota
/{servico}/(ex:/n21-a/) para a porta1880do respectivo container.
- Autenticação & Segurança:
- Node-RED: Cada container utiliza um
settings.jscustomizado com autenticação viaadminAuthcom hashesbcrypt(). - São gerados dois usuários por container:
{servico}(Admin) e{servico}-view(Apenas leitura). - As senhas geradas são exportadas para um arquivo
credenciais.txt.
Comandos Úteis de Operação
- Gerar infraestrutura (exemplo com 2 turmas e 10 grupos cada):
python3 gen_portal.py --turma n21 --grupos 10
- Subir o ambiente:
docker compose up -d --build
- Desabilitar/Habilitar um grupo pontualmente:
docker compose stop n21-a-nodered # Desabilita
docker compose start n21-a-nodered # Habilita
- Aplicar alterações com remoção de turmas/grupos antigos:
docker compose up -d --remove-orphans
Grok dump
Here’s a clean PlatformIO + Arduino + ESP32 starter structure you can use in your lab templates.
Recommended folder structure
labXX-template/
├── .github/
│ └── workflows/
│ └── grade.yml
├── include/
│ └── README
├── lib/
│ └── README
├── src/
│ └── main.cpp
├── test/
│ └── test_main.cpp
├── .gitignore
├── platformio.ini
└── README.md
File contents
platformio.ini
; PlatformIO Project Configuration File
; https://docs.platformio.org/page/projectconf.html
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
; Optional: common build flags
build_flags =
-DCORE_DEBUG_LEVEL=0
; Unit Testing
test_framework = unity
src/main.cpp
#include <Arduino.h>
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("LAB started - ESP32 + PlatformIO");
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
delay(500);
digitalWrite(LED_BUILTIN, LOW);
delay(500);
}
test/test_main.cpp (PlatformIO Unity test)
#include <unity.h>
#include <Arduino.h>
void setUp(void) {
// runs before each test
}
void tearDown(void) {
// runs after each test
}
void test_led_pin_mode() {
pinMode(LED_BUILTIN, OUTPUT);
TEST_ASSERT_EQUAL(OUTPUT, 1); // simple example
}
void setup() {
delay(2000); // wait for serial / board
UNITY_BEGIN();
RUN_TEST(test_led_pin_mode);
UNITY_END();
}
void loop() {
// empty
}
.gitignore
.pio
.vscode/.browse.c_cpp.db*
.vscode/c_cpp_properties.json
.vscode/launch.json
.vscode/ipch
*.pyc
__pycache__/
.DS_Store
README.md
# LABXX - ESP32 + PlatformIO
## Requirements
- [PlatformIO](https://platformio.org/) (VS Code extension or CLI)
- ESP32 board
## Build & Upload
```bash
pio run # compile
pio run -t upload # upload
pio device monitor # serial monitor
```
Run tests
pio test
Structure
src/→ main application codeinclude/→ header fileslib/→ private librariestest/→ unit tests (Unity)
**`.github/workflows/grade.yml`** (CI – compile only)
```yaml
name: Build & Test
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Cache PlatformIO
uses: actions/cache@v4
with:
path: |
~/.cache/pip
~/.platformio/.cache
key: ${{ runner.os }}-pio-${{ hashFiles('platformio.ini') }}
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install PlatformIO
run: pip install platformio
- name: Build project
run: pio run
# Uncomment if you want native/unit tests in CI
# - name: Run tests
# run: pio test -e native
include/README and lib/README (PlatformIO placeholders)
This directory is intended for project header files / private libraries.
Updated script snippet (replace the “Create starter folder structure” part)
# 3. Create PlatformIO starter structure
mkdir -p src include lib test .github/workflows
# platformio.ini
cat > platformio.ini << 'EOF'
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
test_framework = unity
EOF
# src/main.cpp
cat > src/main.cpp << EOF
#include <Arduino.h>
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("LAB$lab started - ESP32 + PlatformIO");
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
delay(500);
digitalWrite(LED_BUILTIN, LOW);
delay(500);
}
EOF
# test/test_main.cpp
cat > test/test_main.cpp << 'EOF'
#include <unity.h>
#include <Arduino.h>
void test_example() {
TEST_ASSERT_TRUE(true);
}
void setup() {
delay(2000);
UNITY_BEGIN();
RUN_TEST(test_example);
UNITY_END();
}
void loop() {}
EOF
# .gitignore
cat > .gitignore << 'EOF'
.pio
.vscode/.browse.c_cpp.db*
.vscode/c_cpp_properties.json
.vscode/launch.json
.vscode/ipch
.DS_Store
EOF
# README.md
cat > README.md << EOF
# LAB$lab - ESP32 + PlatformIO
## Commands
\`\`\`bash
pio run # build
pio run -t upload # upload
pio device monitor # serial
pio test # unit tests
\`\`\`
EOF
# GitHub Actions
cat > .github/workflows/grade.yml << 'EOF'
name: Build
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install PlatformIO
run: pip install platformio
- name: Build
run: pio run
EOF
# placeholders
echo "Project headers go here" > include/README
echo "Private libraries go here" > lib/README
Notes for ESP32 + PlatformIO
| Item | Recommendation |
|---|---|
| Board | esp32dev is the most common. Change to esp32-s3-devkitc-1, az-delivery-devkit-v4, etc. if needed |
| CI | Can only compile (no real hardware). Use pio run |
| Unit tests on device | pio test (requires connected board) |
| Native tests | Add a [env:native] environment if you want tests without hardware |
Would you like me to give you the full ready-to-run script already adapted for PlatformIO ESP32 (creating all lab00-template … lab10-template)?