Obtención de claves de API
Instrucciones paso a paso para obtener credenciales reales de cada proveedor externo con el que se integra Closegram. Consulta Configuración del entorno para saber en qué variable de .env va cada valor.
Los proveedores están ordenados aproximadamente según la probabilidad de que los necesites para el desarrollo local.
Base de datos y Redis
No se necesita cuenta — consulta Infraestructura local mediante Docker. Configura un proveedor administrado de Postgres/Redis (por ejemplo, Railway, RDS, ElastiCache) solo al desplegar.
LiveKit
Desarrollo local: no se necesita cuenta — el stack de Docker Compose ejecuta un servidor LiveKit real con una clave de desarrollo fija (devkey / dev1234567890abcdef1234567890abcdef). Apunta LIVEKIT_URL a ws://localhost:7880 y usa esas credenciales.
Producción: puedes autoalojarlo (despliega la misma imagen livekit/livekit-server en algún lugar accesible y genera tu propio par de claves con livekit-server generate-keys) o usar LiveKit Cloud:
- Regístrate en cloud.livekit.io y crea un proyecto.
- Ve a Settings → Keys y crea un nuevo par de API key/secret.
- Copia la WebSocket URL, la API Key y el API Secret en
LIVEKIT_URL/LIVEKIT_API_KEY/LIVEKIT_API_SECRET.
Firebase
Se usa para: verificación de tokens de Google Sign-In (backend), notificaciones push (backend + iOS + web) y Firebase Auth en los clientes frontend/iOS.
- Ve a la consola de Firebase y crea un proyecto (o usa uno existente).
- Cuenta de servicio del backend (completa las variables
FIREBASE_*del backend): Project settings (icono de engranaje) → Service accounts → Generate new private key. Esto descarga un archivo JSON — mapea sus campos directamente aFIREBASE_PROJECT_ID,FIREBASE_PRIVATE_KEY_ID,FIREBASE_PRIVATE_KEY,FIREBASE_CLIENT_EMAIL,FIREBASE_CLIENT_ID,FIREBASE_AUTH_URI,FIREBASE_TOKEN_URI,FIREBASE_AUTH_PROVIDER_CERT_URL,FIREBASE_CLIENT_CERT_URL. Al pegarFIREBASE_PRIVATE_KEYen un archivo.env, mantenlo en una sola línea con secuencias literales\n(siguiendo el formato que ya existe en.env.example). - Configuración de la app web (completa las variables
NEXT_PUBLIC_FIREBASE_*del frontend): Project settings → General → desplázate hasta Your apps → agrega una app Web (icono</>) si no existe → copiaapiKey,authDomain,projectId,storageBucket,messagingSenderId,appIddel objetofirebaseConfig. - Configuración de la app iOS (completa
GoogleService-Info.plist): Project settings → General → Your apps → agrega una app iOS con el bundle ID deapp.xcodeproj→ descargaGoogleService-Info.plisty reemplazaapps/ios/app/app/GoogleService-Info.plist. - Habilita los métodos de inicio de sesión que necesites en Authentication → Sign-in method (Google, y Phone si quieres autenticación telefónica basada en Firebase además de la vía Twilio/SMS).
- Si usas notificaciones push, habilita también Cloud Messaging en Project settings — no se necesita ninguna clave adicional más allá de la cuenta de servicio anterior.
Google Sign-In (cliente OAuth)
Independiente del proyecto de Firebase anterior — este es un cliente OAuth de Google Cloud puro, usado por dos rutas de código distintas en el backend (GOOGLE_CLIENT_ID/GOOGLE_CLIENT_SECRET para una estrategia, CLIENT_ID/CLIENT_ID_SECRET/REDIRECT_URIs para otra).
- Ve a Google Cloud Console → selecciona el mismo proyecto que tu proyecto de Firebase (los proyectos de Firebase son proyectos de GCP por debajo) o crea uno nuevo.
- APIs & Services → OAuth consent screen — configúrala (External, agrega el nombre de tu app/correo de soporte) si aún no está hecho.
- APIs & Services → Credentials → Create Credentials → OAuth client ID.
- Tipo de aplicación Web application. Agrega tu(s) URI(s) de redirección (por ejemplo,
http://localhost:8000/auth/google/callbackpara desarrollo local) — este valor también va enREDIRECT_URIs. - Copia el Client ID y el Client Secret generados — usa el mismo par tanto para
GOOGLE_CLIENT_ID/GOOGLE_CLIENT_SECRETcomo paraCLIENT_ID/CLIENT_ID_SECRET, a menos que quieras que sean apps distintas específicamente.
Apple Sign-In
Requiere una cuenta de Apple Developer paga ($99/año).
- Apple Developer → Certificates, Identifiers & Profiles → Identifiers → tu App ID (o crea uno) → habilita la capacidad Sign In with Apple.
- Identifiers → + → Services IDs → crea uno (por ejemplo,
com.yourapp.signin) → habilita Sign In with Apple → configúralo con tu dominio y URL de redirección. Este valor de Services ID es tuAPPLE_CLIENT_ID. - Keys → + → marca Sign In with Apple, configúralo contra tu App ID → Continue → Register → Download. La descarga es un archivo
.p8que solo se puede obtener una vez — su contenido va enAPPLE_PRIVATE_KEY(conserva el envoltorio-----BEGIN PRIVATE KEY-----/-----END PRIVATE KEY-----, con\nescapado como las demás claves multilínea). El Key ID mostrado en esa página esAPPLE_KEY_ID. - Tu Team ID se muestra en la esquina superior derecha de la página de la cuenta de Apple Developer (o en Membership) — eso es
APPLE_TEAM_ID. APPLE_REDIRECT_URIes la URL de callback que configuraste en el Services ID en el paso 2 (solo se usa para el flujo OAuth web/backend — el Sign in with Apple nativo en iOS no lo necesita).
La propia app de iOS necesita la capacidad Sign In with Apple agregada en Xcode (Signing & Capabilities) — ya presente en apps/ios/app/app/app.entitlements.
Apple Push Notifications (APNs)
Clave separada de Sign in with Apple — se usa para push de VoIP (alertas de llamadas entrantes) y push estándar de iOS.
- Apple Developer → Keys → + → marca Apple Push Notifications service (APNs) → Continue → Register → Download. De nuevo, este
.p8solo se puede descargar una vez. - El contenido de la clave va en
APNS_PRIVATE_KEY; el Key ID mostrado en la página esAPNS_KEY_ID. APNS_TEAM_IDes el mismo Team ID mencionado antes.APNS_BUNDLE_IDes el identificador de bundle de tu app iOS (deapp.xcodeproj).- Deja
APNS_PRODUCTION=falsepara un build Debug/TestFlight que use el entorno sandbox de APNs; ponlo entruepara builds de App Store.
Stripe
- Regístrate en dashboard.stripe.com.
- Developers → API keys — copia la Secret key (
sk_test_...en modo de prueba) enSTRIPE_API_KEY_PROD_SECRET, y la Publishable key (pk_test_...) enNEXT_PUBLIC_STRIPE_PUBLISHABLE_KEYdel frontend ySTRIPE_PUBLISHABLE_KEYde iOS. - Developers → Webhooks → Add endpoint — apúntalo a
<API_URL>/webhooks/stripe(o dondequiera que el backend lo exponga), selecciona los eventos que la app necesita (payment intents, eventos de suscripción), luego copia el Signing secret enSTRIPE_WEBHOOK_SECRET. Para pruebas locales, el Stripe CLI (stripe listen --forward-to localhost:8000/webhooks/stripe) imprime un webhook secret que puedes usar en su lugar. - Cambia a claves live (
sk_live_.../pk_live_...) solo en producción, después de completar la activación de cuenta de Stripe.
AWS (S3, SES, SNS)
- Crea una cuenta de AWS si no tienes una, e inicia sesión en la consola de IAM.
- Crea un usuario de IAM (o rol) con acceso programático. Adjunta políticas acotadas a lo que necesites:
AmazonS3FullAccess(o una política personalizada acotada a un bucket),AmazonSESFullAccess,AmazonSNSFullAccess— redúcelas para producción. - IAM → Users → tu usuario → Security credentials → Create access key — copia el Access key ID y el Secret access key en
AWS_ACCESS_KEY/AWS_ACCESS_KEY_IDyAWS_SECRET_KEY/AWS_SECRET_ACCESS_KEY(ambas variantes de nombre son leídas por distintas partes del código — usa los mismos valores para ambas). - Bucket de S3: consola de S3 → Create bucket, dale un nombre y anota la región. Completa
AWS_BUCKET_NAMEyAWS_REGION;AWS_S3_URLeshttps://<bucket>.s3.amazonaws.com. - SES (correo): consola de SES → Verified identities → Create identity — verifica un dominio o una dirección de remitente individual. Mientras estés en el sandbox de SES solo puedes enviar a direcciones verificadas; solicita acceso de producción para enviar a cualquier dirección. Configura
AWS_EMAILcon tu remitente verificado. - SNS (SMS, solo si usas
SMS_PROVIDER=aws-sns): no requiere un registro aparte — las mismas credenciales de IAM funcionan; SNS se cobra por uso, por SMS. - Para desarrollo local sin nada de esto, configura
DISABLE_S3=trueyDISABLE_EMAIL=true.
Twilio (SMS / OTP telefónico)
SMS_PROVIDER por defecto.
- Regístrate en twilio.com.
- El panel de la consola muestra directamente tu Account SID y Auth Token →
TWILIO_ACCOUNT_SID/TWILIO_AUTH_TOKEN. - Phone Numbers → Buy a number (las cuentas de prueba obtienen uno gratis) → cópialo en
TWILIO_PHONE_NUMBER. - Verify → Services → Create new Service — esto habilita específicamente los códigos OTP. Copia el Service SID en
TWILIO_VERIFY_SERVICE_SID. - Para desarrollo local sin SMS, configura
DISABLE_SMS=true.
MessageBird (proveedor de SMS alternativo)
Solo se necesita si configuras SMS_PROVIDER=messagebird.
- Regístrate en messagebird.com.
- Developers → API access → copia tu Live API key (o Test key para el sandbox) en
MESSAGEBIRD_API_KEY. MESSAGEBIRD_ORIGINATORes el nombre/número de remitente que se muestra a los destinatarios.
PayPal
- Regístrate para una cuenta de PayPal Developer.
- Apps & Credentials → Create App (en Sandbox para pruebas, Live para producción).
- Copia el Client ID y el Secret en
PAYPAL_CLIENT_ID/PAYPAL_CLIENT_SECRET. PAYPAL_API_BASEpor defecto es la URL de sandbox (https://api-m.sandbox.paypal.com) — cambia ahttps://api-m.paypal.compara producción.
Compras dentro de la app (Apple & Google IAP)
Para vender monedas dentro de las apps nativas. Ver Monedas → Compras dentro de la app para cómo funciona, y las variables de entorno.
Apple (App Store Server API)
- Primero crea los productos: App Store Connect → tu app → Monetization → In-App Purchases → Create un Consumable por cada paquete de monedas. Configura ahí sus tiers de precio localizados (Apple localiza automáticamente) y copia cada Product ID al paquete correspondiente en la pantalla admin
/coins(appleProductId). - Crea una API key: App Store Connect → Users and Access → Integrations (Keys) → App Store Connect API → genera una key con el rol In-App Purchase (o Admin). Descarga el
.p8(solo una vez). - Mapea al env: la página muestra el Issuer ID →
APPLE_IAP_ISSUER_ID; el Key ID de la key →APPLE_IAP_KEY_ID; el contenido del.p8→APPLE_IAP_PRIVATE_KEY; tu bundle id →APPLE_IAP_BUNDLE_ID. - Notificaciones (reembolsos): App Store Connect → tu app → General → App Store Server Notifications → Version 2, pon la URL de Producción/Sandbox a
https://<tu-api>/api/webhooks/apple/iap. Para fijar la firma, descarga Apple Root CA — G3 de Apple PKI y pon su PEM enAPPLE_IAP_ROOT_CERT(requerido — el webhook de reembolso de Apple falla en cerrado y rechaza notificaciones sin un root anclado).
Google (Play Developer API + RTDN)
- Primero crea los productos: Play Console → tu app → Monetize → Products → In-app products → Create un producto gestionado por paquete de monedas. Copia cada Product ID al paquete en admin (
googleProductId).GOOGLE_IAP_PACKAGE_NAMEes elapplicationIdde tu app. - Service account: en Google Cloud Console crea una service account + JSON key; luego en Play Console → Users and permissions → invita esa service account y otórgale View financial data / Manage orders and subscriptions. Pon el JSON (como string) en
GOOGLE_IAP_SERVICE_ACCOUNT_KEY. - Reembolsos (Voided Purchases + RTDN): habilita Play Console → Monetization setup → Real-time developer notifications, apunta el topic a un topic de Google Cloud Pub/Sub, y agrega una push subscription a ese topic que entregue a
https://<tu-api>/api/webhooks/google/rtdn. Para verificar el push, configuraGOOGLE_RTDN_AUDIENCE(la URL de tu webhook) yGOOGLE_RTDN_SA_EMAIL(la service account del push) — opcional pero recomendado.
Google Cloud Vision (moderación de imágenes)
Se usa para la detección de contenido NSFW/etiquetas de contenido (IMAGE_ANALYSIS_PROVIDER=google-vision). Usa el mismo tipo de credenciales de cuenta de servicio que BigQuery más abajo — puedes reutilizar una misma cuenta de servicio para ambas si tiene ambas APIs habilitadas.
- En Google Cloud Console, habilita la Cloud Vision API para tu proyecto (APIs & Services → Library → Cloud Vision API → Enable).
- IAM & Admin → Service Accounts → Create Service Account, otórgale un rol como Cloud Vision AI Service Agent (o uno más amplio si la reutilizas para BigQuery).
- Keys → Add key → Create new key → JSON — descárgala. El servicio de análisis de imágenes del backend obtiene las credenciales de la forma estándar de Google Cloud; revisa
services/image-analysis/image-analysis.service.jspara saber exactamente en qué variable(s) de entorno espera la ruta/JSON de credenciales antes de conectar esto, ya que no es una de las variables nombradas explícitamente en.env.example.
BigQuery (analítica, opcional)
Solo se necesita si configuras ANALYTICS_DB_TYPE=bigquery — el valor por defecto (postgres) no requiere ninguna cuenta externa.
- En Google Cloud Console, habilita la BigQuery API.
- IAM & Admin → Service Accounts → Create Service Account, otórgale BigQuery Data Editor y BigQuery Job User.
- Keys → Add key → Create new key → JSON — mapea los campos del archivo descargado a
BIGQUERY_PRIVATE_KEY_ID,BIGQUERY_PRIVATE_KEY,BIGQUERY_CLIENT_EMAIL,BIGQUERY_CLIENT_ID. - Consola de BigQuery → Create dataset — anota el ID del dataset y la ubicación para
BIGQUERY_DATASET_ID/BIGQUERY_LOCATION. GOOGLE_CLOUD_PROJECT_ID/GCP_PROJECT_IDes el ID de tu proyecto de GCP, visible en el panel de Cloud Console.
Giphy (selector de GIF de iOS)
- Regístrate en developers.giphy.com.
- Create an App → elige el tipo de clave API (no SDK).
- Copia la clave en
GIPHY_API_KEYde iOS (variable de entorno del scheme de Xcode — consulta Configuración del entorno).
Observabilidad (todo opcional)
Esto solo importa cuando te preocupas por el monitoreo en producción — puedes omitirlo por completo para el desarrollo local.
- Sentry — crea un proyecto, copia el DSN de Project Settings → Client Keys en
SENTRY_DSN. - Datadog — Organization Settings → API Keys → crea/copia uno en
DATADOG_API_KEY. - New Relic — Account settings → API keys → copia una clave Ingest - License en
NEW_RELIC_LICENSE_KEY. - LogRocket — Project Settings → copia el App ID (formato
org/project) enLOGROCKET_APP_ID. - Logger personalizado (
CUSTOM_LOGGER_URL/CUSTOM_LOGGER_API_KEY) — solo es relevante si apuntas los logs a tu propio endpoint de ingesta; no está ligado a ningún producto de terceros en particular.