This setup gives you a secure flow:
- ESP32 -> Render backend -> Firestore (sensor writes)
- React frontend (authenticated user) -> Render backend -> Firestore (LED control)
- React frontend reads Firestore for live dashboard updates
- ESP32 reads LED state from Render backend
ESP32 --(device token)--> Render Backend --(Admin SDK)--> Firestore
Frontend --(Firebase Auth ID token)--> Render Backend --(Admin SDK)--> Firestore
Frontend <--(onSnapshot)-- Firestore
ESP32 <--(device token)-- Render Backend <-- Firestore
VITE_FIREBASE_API_KEY=YOUR_WEB_API_KEY
VITE_FIREBASE_AUTH_DOMAIN=YOUR_PROJECT.firebaseapp.com
VITE_FIREBASE_PROJECT_ID=YOUR_PROJECT_ID
VITE_BACKEND_BASE_URL=https://your-render-service.onrender.com- Firebase Console -> Project Settings -> General -> Your apps -> Web app.
- Copy
apiKey,authDomain,projectIdinto frontend.env. - Firebase Console -> Authentication -> Sign-in method -> enable Google.
- Add your GitHub Pages domain to authorized domains in Firebase Auth.
Use firestore.rules to block all direct client writes.
Apply rules:
- Firebase Console -> Firestore Database -> Rules
- paste rules from
firestore.rules - publish
sensorData/
latest
temperature: number
humidity: number
timestamp: number
source: "esp32"
sensorHistory/
slot_00 ... slot_24
temperature: number
humidity: number
timestamp: number
slot: number
source: "esp32"
deviceControl/
led
state: 0 | 1
updatedBy: string
A workflow already exists in .github/workflows/deploy-pages.yml.
- GitHub repo -> Settings -> Pages -> Source = GitHub Actions
- Add repository secrets:
VITE_FIREBASE_API_KEYVITE_FIREBASE_AUTH_DOMAINVITE_FIREBASE_PROJECT_ID
- Push to
main.
Backend code is generated at:
C:\PROJECTS\esp32-backend-render
Create new private repo and push backend:
cd C:\PROJECTS\esp32-backend-render
git init
git add .
git commit -m "Initial Render backend"
git branch -M main
git remote add origin https://github.com/<your-user>/<your-private-backend-repo>.git
git push -u origin mainDeploy on Render:
- Render -> New -> Web Service
- Connect private backend repo
- Build command:
npm ci - Start command:
npm start - Add env vars from backend
.env.example - Deploy and copy Render URL
Use ESP32.ino from this frontend repo root.
Set before upload:
WIFI_SSIDWIFI_PASSWORDBACKEND_BASE_URLDEVICE_TOKEN(must match backend env)
Upload, then monitor serial output at 115200.
- Do not put Firebase Admin SDK JSON in frontend or firmware.
- Keep backend repo private.
- Rotate any exposed keys/tokens.
- Firebase web
apiKeyis not a secret, but rules/auth still must be strict.