DEV Community

Bendev Junior
Bendev Junior

Posted on

Como construí meu próprio sistema OTA (Over-the-Air Updates) para o Nutrilow com ExpressJS e Expo

Entenda a arquitetura técnica e as decisões por trás da criação de um sistema customizado de over-the-air updates, substituindo o Expo Updates oficial no Nutrilow.

Contexto

Em um artigo anterior, compartilhei por que escolhi Expo + React Native + ExpressJS como base para o Nutrilow:
➡️ Por que adotei Expo, React Native e ExpressJS para a escalabilidade do Nutrilow

No momento, o foco era escalabilidade e autonomia técnica. Essa mentalidade continuou evoluindo — e o próximo passo natural foi assumir o controle sobre o sistema de OTA Updates.

O problema com o Expo Updates

O Expo oferece um excelente sistema de OTA, mas ele:

  • Depende da infraestrutura da Expo;
  • Não permite forçar reenvio de updates com o mesmo runtimeVersion;
  • Não oferece logs detalhados de distribuição;

Esses pontos podia se tornar gargalos no processo de entrega contínua do Nutrilow.

A solução: Send OTA self-hosted

Decidi criar um serviço ExpressJS que atua como repositório e distribuidor de builds OTA.

Arquitetura simplificada

+--------------------------------------+
|   expo export --public-url=...       |
+----------------------+---------------+
                       |
                       v
+--------------------------------------+
| Express Server (OTA API)             |
| - Recebe bundle e metadata           |
| - Valida upload key                  |
| - Armazena e versiona build          |
| - Retorna manifest para o app        |
+--------------------------------------+
                       |
                       v
+--------------------------------------+
| Nutrilow App (Expo Updates client)   |
| - Faz check automático de versão     |
| - Faz download e aplica OTA          |
+--------------------------------------+

Enter fullscreen mode Exit fullscreen mode

Script de automação

Criei um script simples em Bash para publicar OTA updates com contexto do commit:

#!/bin/bash
commitHash=$(git rev-parse HEAD)
commitMessage=$(git log -1 --pretty=%B)

expo export --output ./dist
curl -F "bundle=@./dist/bundle.zip" \
     -F "commit=$commitHash" \
     -F "message=$commitMessage" \
     -F "uploadKey=$UPLOAD_KEY" \
     $OTA_SERVER_URL

Enter fullscreen mode Exit fullscreen mode

Isso permite rodar ./deploy-ota.sh e publicar um update versionado automaticamente.

Resultados

✅ Deploys OTA automáticos e auditáveis
✅ Logs centralizados por commit
✅ Controle completo do ciclo de atualização
✅ Sem dependência da infraestrutura Expo

Próximos passos e referência cruzada

Essa implementação é detalhada de forma mais filosófica e experimental no post do Lab.BendevOficial, que inspirou este artigo:
👉 Leia: Por que criei meu próprio sistema de Send OTA Updates para o Nutrilow

Top comments (0)