Monorepo do Meu Desafio, uma plataforma para criar desafios esportivos, registrar atividades, acompanhar progresso e integrar dados de corrida e pedalada.
O projeto usa Bun workspaces para organizar a API e o aplicativo mobile em um unico repositorio.
- Runtime e workspace: Bun
- API: Elysia, Better Auth, Prisma, PostgreSQL, Redis
- Mobile: Expo, React Native, Expo Router, React Query, Zustand
- Observabilidade: Prometheus e Grafana
.
|-- apps
| |-- api Backend Elysia/Bun
| `-- mobile Aplicativo Expo/React Native
`-- package.json Scripts do monorepo e workspaces- Bun
1.3.14ou superior compativel - Podman ou Docker com suporte a Compose
- Node.js instalado para ferramentas do ecossistema Expo
- Android Studio, Xcode ou um dispositivo fisico para rodar o app mobile
Instale as dependencias na raiz do monorepo:
bun installCrie os arquivos .env conforme necessario em cada app. Nao versione segredos reais.
Arquivo esperado: apps/api/.env
Variaveis usadas pela API:
PORT=3000
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/meu_desafio?schema=public
REDIS_URL=redis://localhost:6379
BETTER_AUTH_SECRET=altere-este-segredo
BETTER_AUTH_URL=http://localhost:3000
FRONTEND_URL=http://localhost:8081
EXPO_SCHEME=meudesafio2
GOOGLE_CLIENT_ID=seu-client-id
GOOGLE_CLIENT_SECRET=seu-client-secret
RESEND_API_KEY=sua-chave-resend
EMAIL_HOST=smtp.exemplo.com
EMAIL_PORT=587
EMAIL_USER=usuario
EMAIL_PASS=senha
EMAIL_FROM="Meu Desafio <noreply@exemplo.com>"
R2_ACCOUNT_ID=account-id
R2_ACCESS_KEY_ID=access-key
R2_SECRET_ACCESS_KEY=secret-key
R2_PUBLIC_URL_AVATARS=https://exemplo.com/avatars
R2_PUBLIC_URL_DESAFIOS=https://exemplo.com/desafios
STRAVA_CLIENT_ID=12345
STRAVA_CLIENT_SECRET=seu-client-secretArquivo esperado: apps/mobile/.env
Variaveis usadas pelo app Expo:
APP_ENV=development
API_URL_DEVELOPMENT=http://localhost:3000
API_URL_PRODUCTION=https://api.exemplo.com
GOOGLE_MAPS_API_KEY=sua-chave-google-mapsPara testar em um celular fisico, use em API_URL_DEVELOPMENT um host acessivel pelo dispositivo, como o IP da maquina na rede local ou um tunel HTTPS.
Suba PostgreSQL, Redis, Prometheus e Grafana:
bun run db:upAplique as migrations e gere o client Prisma:
bun run prisma:generate
bun run prisma:migratePara parar os servicos:
bun run db:downInicie a API:
bun run dev:apiInicie o app mobile:
bun run dev:mobileTambem e possivel executar comandos diretamente nos workspaces:
bun run --cwd apps/api dev
bun run --cwd apps/mobile start- API local:
http://localhost:3000 - Documentacao OpenAPI/Scalar:
http://localhost:3000/openapi - Metricas Prometheus da API:
http://localhost:3000/metrics - Prometheus:
http://localhost:9090 - Grafana:
http://localhost:3001
Credenciais locais padrao do Grafana, conforme apps/api/compose.yaml:
usuario: admin
senha: adminExecute a partir da raiz do monorepo:
bun run dev:api # inicia a API em modo watch
bun run dev:mobile # inicia o Expo com dev client
bun run start:api # inicia a API sem watch
bun run lint:api # roda ESLint na API
bun run lint:mobile # roda ESLint no mobile
bun run prisma:generate # gera o client Prisma
bun run prisma:migrate # executa migrations em desenvolvimento
bun run db:up # sobe servicos locais
bun run db:down # derruba servicos locaisA API fica em apps/api e expoe modulos para:
- Autenticacao com Better Auth, e-mail/senha, OTP e Google OAuth
- Usuarios, perfil, avatar e ranking
- Desafios e inscricoes
- Tarefas/atividades dos desafios
- Integracao com Strava
- Metricas em
/metrics
A documentacao interativa fica disponivel em /openapi quando a API esta rodando.
O app fica em apps/mobile e usa Expo Router. Ele consome a API do workspace @meu-desafio/api e utiliza recursos nativos como mapas, localizacao, imagens e armazenamento seguro.
Comandos uteis do mobile:
bun run --cwd apps/mobile android
bun run --cwd apps/mobile ios
bun run --cwd apps/mobile web