Este conteúdo está disponível apenas em Espanhol.

Também está disponível em Português.

Ver tradução
Frontend

Next.js Firebase: Backend Escalable con TypeScript

El desarrollo web moderno con Next.js presenta desafíos complejos. Firebase se convierte en un aliado indispensable, ofreciendo un Backend-as-a-Service (BaaS) que simplifica la infraestructura. Este artículo es una guía completa para integrar Firebase de forma robusta con Next.js y TypeScript, cubriendo sus servicios clave, planes y las últimas innovaciones en IA.

Equipe Blueprintblog16 min
Next.js Firebase: Backend Escalable con TypeScript

En el desarrollo web moderno, especialmente con frameworks como Next.js, la línea entre frontend y backend es cada vez más difusa. El desarrollador necesita pensar en la interfaz de usuario, la lógica de negocio, la base de datos, la autenticación, la escalabilidad y la seguridad. Es un desafío enorme. A menudo, solo nos damos cuenta de la magnitud de este desafío cuando salimos de los tutoriales y comenzamos a construir una aplicación real.

Es exactamente en este punto donde Google Firebase se transforma de una herramienta interesante en un aliado indispensable. No es solo una base de datos; es una plataforma de Backend-as-a-Service (BaaS) diseñada para eliminar gran parte de la complejidad de la infraestructura, permitiéndote construir y lanzar proyectos en una fracción del tiempo.

Este artículo es una guía completa para desarrolladores de Next.js que desean entender e implementar Firebase de forma robusta, utilizando todo el poder de TypeScript.

¿Qué es Firebase y Por Qué Acelera Proyectos?

Piensa en Firebase como un "backend listo para usar". En lugar de construir, configurar y mantener servidores, bases de datos, sistemas de autenticación y almacenamiento de archivos tú mismo, Firebase ofrece todo esto como servicios listos, escalables y administrados por Google.

Los principales servicios que aceleran el desarrollo son:

Firestore: Una base de datos NoSQL, orientada a documentos, con capacidades de consulta en tiempo real. Las actualizaciones en la base de datos se propagan a los clientes conectados en milisegundos.

Firebase Authentication: Un servicio completo de autenticación que soporta login por email/contraseña, teléfono y proveedores OAuth (Google, Facebook, GitHub, etc.) con muy pocas líneas de código.

Cloud Storage for Firebase: Para almacenar y gestionar archivos generados por usuarios, como imágenes, videos y documentos, de forma simple y segura.

Firebase Hosting: Hosting de alto rendimiento para tus activos estáticos y aplicaciones web, con CDN global y SSL activados por defecto.

Cloud Functions for Firebase: Permite ejecutar código backend (serverless) en respuesta a eventos en el ecosistema Firebase (ej: un nuevo usuario registrándose, una subida de archivo) o a peticiones HTTP.

Firebase App Hosting (GA en 2025): La próxima generación de hosting serverless optimizado para aplicaciones Next.js y Angular con SSR (Server-Side Rendering). A diferencia del Hosting tradicional, App Hosting gestiona todo el ciclo: build, deploy, CDN y rendering del lado del servidor automáticamente desde tu repositorio GitHub.

Data Connect (GA en 2025): Un servicio backend-as-a-service alimentado por Cloud SQL PostgreSQL. Defines tu modelo de datos a través de un schema GraphQL, y Data Connect genera endpoints seguros y SDKs tipados automáticamente. Incluye soporte nativo para consultas relacionales, joins complejos e incluso búsqueda vectorial semántica.

Firebase Studio (Preview 2025): Un entorno de desarrollo agentic basado en la nube que te permite crear, prototipar y gestionar aplicaciones full-stack con asistencia de IA (Gemini). Puedes generar prototipos funcionales a partir de lenguaje natural o imágenes y publicar directamente en App Hosting.

Donde Firebase Brilla: Abstracciones que Liberan al Desarrollador

El verdadero poder de Firebase está en lo que evita que tengas que hacer. Abstrae capas enteras de complejidad:

1. La Abstracción de la Autenticación

Sin Firebase: Necesitarías crear tablas de usuarios, implementar hashing y salting de contraseñas, gestionar tokens de sesión (JWTs), construir flujos de "olvidé mi contraseña" e integrar manualmente cada proveedor OAuth. Es un trabajo enorme y un fallo de seguridad puede ser catastrófico.

Con Firebase: Usas createUserWithEmailAndPassword() o signInWithPopup(). Firebase gestiona toda la seguridad, tokens, sesiones y la complejidad detrás, entregándote un objeto de usuario listo.

2. La Abstracción de la Base de Datos Escalable en Tiempo Real

Sin Firebase: Necesitarías configurar un servidor de base de datos (PostgreSQL, MongoDB), gestionar conexiones, optimizar queries, crear una API REST o GraphQL para exponer los datos al frontend y, para tener tiempo real, implementar WebSockets. Escalar todo esto es un desafío por sí solo.

Con Firebase: Defines tu estructura de datos, defines reglas de seguridad y usas onSnapshot() para "escuchar" cambios en tiempo real. El SDK de Firebase se encarga de toda la comunicación, optimización y escalabilidad.

3. La Abstracción de la Infraestructura Serverless

Sin Firebase: Necesitas gestionar servidores, aplicar parches de seguridad, configurar load balancers y preocuparte por el dimensionamiento (scaling) de tu aplicación.

Con Firebase: Con Hosting, App Hosting y Cloud Functions, tu aplicación y tu backend corren en un entorno serverless. Nunca piensas en servidores. Si tu aplicación se vuelve viral, Google escala la infraestructura automáticamente para ti.

Planes de Firebase: Spark vs Blaze

Firebase ofrece dos planes principales:

Plan Spark (Gratuito)

El plan gratuito es increíblemente generoso y suficiente para la mayoría de proyectos en fase inicial:

Productos Totalmente Gratuitos (sin limitaciones más allá del uso justo):

  • Firebase Analytics (siempre gratuito, ilimitado)
  • Cloud Messaging (FCM) - notificaciones push ilimitadas
  • Remote Config
  • A/B Testing
  • Crashlytics
  • Performance Monitoring
  • In-App Messaging
  • Dynamic Links
  • App Distribution

Productos con Cuota Gratuita Diaria:

Firestore:

  • 50.000 lecturas/día (~1,5M/mes)
  • 20.000 escrituras/día (~600K/mes)
  • 20.000 eliminaciones/día (~600K/mes)
  • 1 GiB de almacenamiento total
  • 10 GiB de transferencia de red/mes

Authentication:

  • 50.000 MAUs (Monthly Active Users) para autenticación básica
  • 10.000 verificaciones/mes para Phone Authentication (SMS)
  • Autenticación social (Google, Facebook, GitHub, etc.) ilimitada

Cloud Storage:

  • 5 GB de almacenamiento
  • 1 GB/día de transferencia (descarga)
  • 20.000 operaciones get/día
  • 20.000 operaciones upload/día

Hosting:

  • 10 GB de almacenamiento
  • 360 MB/día de transferencia (~10 GB/mes)
  • Certificado SSL gratuito
  • CDN global incluida

Realtime Database:

  • 1 GB de almacenamiento
  • 10 GB/mes de transferencia
  • 100 conexiones simultáneas

Cloud Functions:

  • 125.000 invocaciones/mes
  • 40.000 GB-segundos de recursos computacionales
  • 40.000 CPU-segundos
  • 5 GB de tráfico saliente/mes

Limitaciones del Plan Spark:

  • Solo una database de Firestore por proyecto califica para la cuota gratuita
  • No se pueden usar Firebase Extensions (requiere Blaze)
  • No se puede usar App Hosting (requiere Blaze)
  • Sin acceso a productos pagos de Google Cloud (BigQuery, Pub/Sub, etc.)
  • Cloud Functions limitadas solo a triggers de Firebase

Plan Blaze (Pay-as-you-go)

El plan Blaze mantiene todas las cuotas gratuitas de Spark y añade:

Ventajas:

  • Facturación solo por uso por encima de las cuotas gratuitas
  • Acceso a Firebase Extensions
  • Acceso a App Hosting
  • Acceso completo a productos de Google Cloud
  • Cloud Functions pueden responder a eventos HTTP y otros triggers
  • Posibilidad de crear múltiples databases (solo la primera tiene cuota gratuita)
  • Créditos de $300 disponibles para nuevos usuarios elegibles

Costos Después de Cuota Gratuita (pueden variar por región):

  • Firestore: ~$0.06 por 100K lecturas, ~$0.18 por 100K escrituras
  • Cloud Storage: ~$0.026/GB de almacenamiento, ~$0.12/GB de transferencia
  • Authentication: Gratuito hasta 50K MAUs, luego $0.0055/MAU (Tier 1)
  • Cloud Functions: ~$0.40 por millón de invocaciones
  • Hosting: ~$0.15/GB después de cuota gratuita

Importante: Configura alertas de presupuesto en Google Cloud Console para evitar sorpresas. Firebase no bloquea automáticamente el uso al alcanzar límites - necesitas monitorear activamente.

Recursos Modernos de IA en Firebase

Genkit: Framework Open Source para IA

Genkit es un framework open source creado por Google para construir características de IA en aplicaciones. Soporta JavaScript/TypeScript, Python (Alpha) y Go (Beta).

Características Principales:

  • API unificada para múltiples proveedores de modelos (Gemini, OpenAI, Anthropic, Ollama)
  • Soporte nativo para RAG (Retrieval-Augmented Generation)
  • Developer UI local para pruebas y debugging
  • Integración directa con Cloud Functions vía trigger onCallGenkit
  • Streaming de respuestas para experiencias en tiempo real
  • Monitoreo integrado en Firebase Console

Ejemplo Básico con Genkit:

typescript
import { genkit } from 'genkit';
import { googleAI } from '@genkit-ai/googleai';

const ai = genkit({
  plugins: [googleAI()],
  model: 'gemini-1.5-flash',
});

const chatFlow = ai.defineFlow('chat', async (input: string) => {
  const response = await ai.generate({
    prompt: input,
    model: 'gemini-1.5-flash',
  });
  return response.text;
});

Vertex AI in Firebase

Permite integrar modelos Gemini e Imagen directamente en aplicaciones móviles y web:

  • Gemini API para generación de texto y chat
  • Imagen 3 para generación de imágenes a partir de texto
  • Live API para interacciones de voz en tiempo real
  • SDK simplificado y serverless
  • Sin necesidad de gestionar infraestructura

Gemini in Firebase

Asistente de IA integrado en Firebase Console que ayuda con:

  • Creación de schemas en Data Connect
  • Generación de queries y mutations GraphQL
  • Sugerencias de reglas de seguridad
  • Optimización de código

Costo: Gratuito para desarrolladores individuales. Usuarios de Google Workspace necesitan suscripción de Gemini Code Assist.

Firebase Extensions: Funcionalidad Lista en Minutos

Firebase Extensions son soluciones pre-empaquetadas que añaden funcionalidad compleja a tu aplicación sin necesidad de codificar desde cero.

Extensiones Populares:

  • Resize Images: Redimensiona imágenes automáticamente al subir
  • Translate Text: Traduce strings de Firestore a múltiples idiomas
  • Trigger Email: Envía emails automáticamente basado en eventos de Firestore
  • Stripe Payments: Integración completa con Stripe para pagos
  • Export to BigQuery: Exporta datos de Firestore a BigQuery automáticamente
  • Delete User Data: Elimina todos los datos del usuario al borrar cuenta
  • Chatbot with Gemini: Crea chatbots personalizables usando modelos Gemini
  • Algolia Search: Añade búsqueda full-text a tus datos de Firestore
  • Mailchimp Sync: Sincroniza usuarios con audiencias de Mailchimp

Importante: Extensions requieren el plan Blaze, pero solo pagas por los recursos que la extensión consume (ej: Cloud Functions invocadas).

Cómo Instalar:

text
firebase ext:install firebase/firestore-bigquery-export

O a través de Firebase Console en Extensions → Browse Extensions.

Configuración Robusta: Firebase con Next.js y TypeScript

Vamos a la guía práctica. La clave para una integración robusta con Next.js (App Router) es separar la inicialización de Firebase para el lado del cliente (Client Components) y para el lado del servidor (Server Components, Route Handlers).

1. Estructura del Proyecto

Crea una carpeta en la raíz de tu proyecto para organizar la configuración:

text
/
├── app/
├── lib/
│   └── firebase/
│       ├── admin.ts       // Configuración del Admin SDK (server-side)
│       └── client.ts      // Configuración del Client SDK (client-side)
└── ...

2. Variables de Entorno (.env.local)

Añade tus credenciales de Firebase al archivo .env.local. Las variables para el cliente deben comenzar con NEXT_PUBLIC_.

text
# Client-side Config (seguro para exponer en navegador)
NEXT_PUBLIC_FIREBASE_API_KEY="AIza..."
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN="tu-proyecto.firebaseapp.com"
NEXT_PUBLIC_FIREBASE_PROJECT_ID="tu-proyecto"
NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET="tu-proyecto.appspot.com"
NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID="..."
NEXT_PUBLIC_FIREBASE_APP_ID="1:..."

# Server-side Config (SECRETO - NUNCA exponer al cliente)
FIREBASE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n..."
FIREBASE_CLIENT_EMAIL="firebase-adminsdk-...@tu-proyecto.iam.gserviceaccount.com"

3. Configuración del Client SDK (lib/firebase/client.ts)

Este archivo inicializa Firebase para uso en Client Components.

typescript
import { initializeApp, getApps, getApp } from "firebase/app";
import { getAuth } from "firebase/auth";
import { getFirestore } from "firebase/firestore";
import { getStorage } from "firebase/storage";

const firebaseConfig = {
  apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY,
  authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN,
  projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID,
  storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET,
  messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID,
  appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID,
};

// Inicializa Firebase para el lado del cliente
// La verificación getApps().length previene la reinicialización en HMR (Hot Module Replacement)
const app = !getApps().length ? initializeApp(firebaseConfig) : getApp();

const auth = getAuth(app);
const db = getFirestore(app);
const storage = getStorage(app);

export { app, auth, db, storage };

4. Configuración del Admin SDK (lib/firebase/admin.ts)

Este archivo inicializa Firebase para uso seguro en el backend (Route Handlers, Server Components). Usa credenciales de administrador que nunca deben exponerse al cliente.

typescript
import admin from "firebase-admin";

// Decodifica la clave privada que está en una sola línea en .env
const privateKey = process.env.FIREBASE_PRIVATE_KEY?.replace(/\\n/g, '\n');

if (!admin.apps.length) {
  admin.initializeApp({
    credential: admin.credential.cert({
      projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID,
      clientEmail: process.env.FIREBASE_CLIENT_EMAIL,
      privateKey: privateKey,
    }),
  });
}

const adminAuth = admin.auth();
const adminDb = admin.firestore();

export { adminAuth, adminDb };

5. Patrón de Oro: Hook de Autenticación (Client-side)

Para gestionar el estado del usuario de forma reactiva y con tipado, crea un hook personalizado.

javascript
// hooks/useAuth.ts
'use client';

import { useState, useEffect } from 'react';
import { onAuthStateChanged, User } from 'firebase/auth';
import { auth } from '@/lib/firebase/client';

export function useAuth() {
  const [user, setUser] = useState<User | null>(null);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    const unsubscribe = onAuthStateChanged(auth, (user) => {
      setUser(user);
      setLoading(false);
    });

    // Limpia el listener cuando el componente se desmonta
    return () => unsubscribe();
  }, []);

  return { user, loading };
}

6. Uso en el Servidor (Ej: Route Handler)

Para operaciones que requieren privilegios de administrador (ej: crear un usuario personalizado, acceder a datos ignorando las reglas de seguridad), usa el Admin SDK en un Route Handler.

text
// app/api/promote-user/route.ts
import { NextResponse } from 'next/server';
import { adminAuth } from '@/lib/firebase/admin';

export async function POST(request: Request) {
  const { userId } = await request.json();

  if (!userId) {
    return NextResponse.json({ error: 'User ID is required' }, { status: 400 });
  }

  try {
    // Ejemplo: Añade un custom claim para transformar al usuario en 'admin'
    await adminAuth.setCustomUserClaims(userId, { admin: true });
    return NextResponse.json({ message: `User ${userId} has been promoted to admin.` });
  } catch (error) {
    return NextResponse.json({ error: 'Failed to promote user' }, { status: 500 });
  }
}

Integrando Data Connect con Next.js

¿Qué es Data Connect?

Data Connect es un servicio backend-as-a-service que combina el poder de una base de datos PostgreSQL gestionada (Cloud SQL) con la simplicidad de SDKs tipados generados automáticamente. A diferencia de Firestore (NoSQL), Data Connect es ideal cuando necesitas:

  • Relaciones complejas: Joins, foreign keys e integridad referencial
  • Queries SQL avanzadas: Agregaciones, subqueries y transacciones multi-paso
  • Tipado fuerte end-to-end: Desde la base de datos hasta el cliente, con TypeScript
  • GraphQL sin complejidad: Escribes el schema, Data Connect genera los resolvers

En lugar de escribir APIs manualmente, defines tu modelo de datos en GraphQL y Data Connect crea automáticamente endpoints seguros y SDKs tipados para React, Angular, Next.js y móvil (iOS/Android).

¿Cuándo usar Data Connect vs Firestore?

  • Usa Data Connect para: e-commerce, ERPs, sistemas con datos relacionales complejos
  • Usa Firestore para: chat en tiempo real, feeds sociales, datos jerárquicos y documentos

Data Connect es ideal para aplicaciones que necesitan una base de datos relacional con tipado fuerte:

text
// lib/firebase/dataconnect.ts
import { getDataConnect, connectDataConnectEmulator } from 'firebase/data-connect';
import { app } from './client';

const dataConnect = getDataConnect(app, {
  connector: 'your-connector',
  location: 'us-central1',
});

// Para desarrollo local
if (process.env.NODE_ENV === 'development') {
  connectDataConnectEmulator(dataConnect, 'localhost', 9399);
}

export { dataConnect };

Schema GraphQL Ejemplo:

text
type User @table {
  id: String! @col
  email: String! @col
  displayName: String @col
  posts: [Post] @relation
}

type Post @table {
  id: String! @col
  title: String! @col
  content: String! @col
  authorId: String! @col
  author: User @relation(fields: ["authorId"])
}

Data Connect genera automáticamente SDKs tipados para usar:

text
// Ejemplo generado automáticamente
import { createUser, listPosts } from '@/lib/dataconnect-sdk';

// Crear usuario
const result = await createUser({
  email: 'user@example.com',
  displayName: 'John Doe'
});

// Listar posts con autor
const posts = await listPosts();

Tópicos Avanzados para una Aplicación Profesional

Firebase Emulator Suite

Para desarrollar localmente, no uses tu proyecto de producción. El Emulator Suite simula los servicios de Firebase (Auth, Firestore, Functions, Data Connect) en tu máquina. Es más rápido, gratuito y evita el riesgo de contaminar tu base de datos de producción.

Instalación:

text
firebase init emulators
firebase emulators:start

Configuración en el código:

text
// lib/firebase/client.ts
import { connectAuthEmulator } from "firebase/auth";
import { connectFirestoreEmulator } from "firebase/firestore";

if (process.env.NODE_ENV === 'development') {
  connectAuthEmulator(auth, "http://localhost:9099");
  connectFirestoreEmulator(db, "localhost", 8080);
}

Seguridad con Firestore Rules

Este es el punto más crítico de una aplicación robusta. Las reglas de Firestore son tu backend de seguridad. Definen en el servidor quién puede leer, escribir, actualizar o eliminar cada documento. NO CONFÍES EN LA LÓGICA DEL CLIENTE PARA SEGURIDAD.

Un ejemplo simple y poderoso:

text
// firestore.rules
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    // Función auxiliar para verificar autenticación
    function isAuthenticated() {
      return request.auth != null;
    }
    
    // Función para verificar si es el dueño del documento
    function isOwner(userId) {
      return isAuthenticated() && request.auth.uid == userId;
    }
    
    // Permite que cualquier usuario autenticado lea la lista de posts
    match /posts/{postId} {
      allow read: if isAuthenticated();
      
      // Permite crear post si el userId es el usuario autenticado
      allow create: if isAuthenticated() 
                    && request.resource.data.userId == request.auth.uid;
      
      // Permite actualizar/eliminar solo si es el autor
      allow update, delete: if isOwner(resource.data.userId);
    }
    
    // Datos privados del usuario
    match /users/{userId} {
      // Usuario solo puede leer sus propios datos
      allow read: if isOwner(userId);
      
      // Usuario solo puede crear/actualizar sus propios datos
      allow create, update: if isOwner(userId);
      
      // Nunca permitir delete directo (usa Cloud Function)
      allow delete: if false;
    }
  }
}

Optimizaciones de Costos

1. Minimiza Lecturas de Firestore:

  • Usa caching del lado del cliente cuando sea posible
  • Evita queries con offset (cada documento saltado cuenta como lectura)
  • Usa cursors/paginación en lugar de cargar todo de una vez
  • Configura índices compuestos para queries complejas

2. Optimiza Cloud Storage:

  • Redimensiona imágenes antes de subirlas desde el cliente
  • Usa Firebase Extensions (Resize Images) para crear thumbnails automáticamente
  • Configura CORS adecuadamente
  • Usa cache headers para archivos estáticos

3. Monitoreo Activo:

  • Configura alertas de presupuesto en Google Cloud Console
  • Usa el Firebase Usage Dashboard diariamente durante desarrollo
  • Implementa rate limiting en Cloud Functions públicas
  • Usa Firebase App Check para prevenir abuso

Monitoreo y Observabilidad

Firebase Console Dashboard

Firebase Console proporciona dashboards dedicados para:

  • Usage & Billing: Monitoreo en tiempo real de uso y costos
  • Authentication: Métricas de sign-ins, proveedores más usados
  • Firestore: Lecturas, escrituras, storage usado
  • Performance Monitoring: Core Web Vitals, tiempos de respuesta
  • Crashlytics: Crashes en tiempo real con stack traces

Integración con Google Cloud

Para aplicaciones en producción, integra con:

  • Cloud Logging: Logs centralizados de todas las Cloud Functions
  • Cloud Trace: Distributed tracing para entender latencia
  • Cloud Monitoring: Alertas personalizadas y dashboards avanzados
  • Error Reporting: Agregación inteligente de errores

Conclusión

Integrar Firebase con Next.js no es solo una conveniencia; es un cambio de paradigma. Permite que equipos y desarrolladores individuales construyan aplicaciones full-stack complejas y escalables, enfocándose en la experiencia del usuario y la lógica de negocio, en lugar de perderse en la complejidad de la infraestructura.

El plan Spark ofrece una cuota gratuita extremadamente generosa - suficiente para validar ideas, crear MVPs e incluso soportar aplicaciones pequeñas en producción. Cuando necesites escalar, el plan Blaze ofrece precios competitivos con modelo pay-as-you-go.

Los nuevos servicios como App Hosting, Data Connect y Firebase Studio (2025) hacen que Firebase sea aún más poderoso, ofreciendo soluciones modernas para desarrolladores que trabajan con frameworks como Next.js y Angular. La integración nativa con IA a través de Genkit y Vertex AI in Firebase posiciona la plataforma a la vanguardia del desarrollo de aplicaciones inteligentes.

Al seguir una estructura organizada, separando las configuraciones de cliente y servidor, y tratando las reglas de seguridad como una prioridad, creas una base sólida y profesional. Firebase se encarga del trabajo pesado, para que puedas concentrarte en construir lo que realmente importa.


Fuentes

Este artículo fue complementado con información de las siguientes fuentes oficiales:

  1. Firebase Pricing - https://firebase.google.com/pricing
  2. Firebase at Google I/O 2025 - https://firebase.blog/posts/2025/05/whats-new-at-google-io
  3. Firebase Documentation - Pricing Plans - https://firebase.google.com/docs/projects/billing/firebase-pricing-plans

Tags do artigo

Artigos relacionados

Receba os ultimos artigos no seu email.

Follow Us: