Files

1 line
38 KiB
JSON

{"repo": "andresperez0401/hypetechub", "files": {"README.md": {"b1404901bec2439bbdb083c94dc2031e5ba136c0": {"t": 1785747229.678741, "n": 8119, "h": "7e02e8e1f97bd814", "c": "# Despliegue\n\nComo parte de mejorar la experiencia de uso de la app, se desplegó con una url publica para que se pueda acceder a probarla:\n\nhttps://www.hypetechub.online/\n\napi: https://api.hypetechub.online/api\n\n\n# Hype Tech Hub\n\nPlataforma integral construida diseñada para rankear, explorar y chatear con IA sobre un catálogo de contenido y tutoriales calificando el nivel de HYPE. También se puede iniciar sesión con Google para guardar videos en favoritos.\n\n> Este proyecto fue desarrollado basándose en requerimientos técnicos orientados a medir el \"Hype\" (engagement en proporción a las vistas) integrando IA y un stack full modern tech en TypeScript.\n\n## Requisitos previos\n- **Node.js** v20+\n- **NPM** v10+\n\n## 🚀 Cómo ejecutar el proyecto localmente\n\n1. **Instalar dependencias globales del monorepo:**\n ```bash\n npm install\n ```\n\n2. **Configurar Variables de Entorno:**\n Debes establecer los archivos `.env` respectivos para Web y API basándote en los templates existentes o usando las claves entregadas.\n\n **En `apps/api/.env`:**\n ```env\n # Entorno y Puerto\n NODE_ENV=development\n PORT=3001\n \n # Base de Datos (Prisma)\n DATABASE_URL=\"file:./dev.db\" # O postgresql://usuario:password@localhost:5432/db_name si usas PostgreSQL\n \n # Autenticación y Seguridad (JWT)\n JWT_SECRET=super_secret_jwt_key # Cambiar por una cadena segura\n \n # Autenticación con Google Cloud (OAuth)\n GOOGLE_CLIENT_ID=tu_google_client_id_aqui\n GOOGLE_CLIENT_SECRET=tu_google_client_secret_aqui\n GOOGLE_CALLBACK_URL=http://localhost:3001/api/auth/google/callback\n FRONTEND_URL=http://localhost:3000\n \n # Inteligencia Artificial (DeepSeek)\n DEEPSEEK_API_KEY=tu-clave-deepseek-aqui\n \n # Catálogo de Imágenes (Pexels)\n PEXELS_API_KEY=tu-clave-pexels-aqui\n DEFAULT_VIDEO_PLACEHOLDER_URL=https://placehold.co/600x400?text=Hype+Tech+Hub\n ```\n\n **Importante**\n - La clave de Pexels se obtiene entrando a su página web y solicitando la api key. Se utilizó esta herramienta ya que las url de la fuente de datos no estaban cargando adecuadamente.\n\n - La clave de Deepseek Api key, importante teneral para que pueda funcionar el Hype AI. Un agente de IA que permite generar respuestas basadas en el contexto de los videos.\n\n - Database URL, de igual forma colocarlo ya sea una bd local o remota para poder ejecutar las migraciones con Prisma. En este caso se utilizó Neon, como bd para el proyecto.\n\n **En `apps/web/.env.local`:**\n ```env\n # Conexión al Backend\n NEXT_PUBLIC_API_URL=http://localhost:3001/api\n \n\n3. **Generar Cliente, Ejecutar Migraciones y Cargar Videos (Base de Datos):**\n Antes de correr la aplicación, levanta el esquema y carga el catálogo inicial de videos en la base de datos:\n ```bash\n cd apps/api\n npx prisma generate\n npx prisma migrate dev --name init\n npm run prisma:seed\n cd ../..\n ```\n El seed es **idempotente**: si ya existen los videos en la BD, los omite sin duplicar. Puedes correrlo cuantas veces quieras sin riesgo.\n\n4. **Ejecutar el proyecto completo (Front y Back simultáneamente):**\n ```bash\n npm run dev\n ```\n * Turborepo levantará:\n * Frontend (Next.js) en: [http://localhost:3000](http://localhost:3000)\n * Backend (NestJS) en: [http://localhost:3001/api](http://localhost:3001/api)\n * Swagger UI de Backend: [http://localhost:3001/api/docs](http://localhost:3001/api/docs)\n\n## 🐳 Ejecución con Docker (Producción Completa)\n\nEl proyecto está completamente **dockerizado**. Puedes levantar toda la orquestación (Frontend + Backend) utilizando los `Dockerfiles.\n\nPara levantarlo, solo debes tener encendido tu motor y ejecutar:\n\n```bash\ndocker-compose up --build -d\n```\nDocker leerá silenciosamente `apps/api/.env` para levantar el backend e inyectará los atributos a `apps/web/.env.local` configurándolo para Vercel standalone output routing.\n\n---\n\n## 🚂 Deploy en Railway\n\n### Arquitectura de despliegue\nEste monorepo es de tipo **shared** (node_modules y `packages/` compartidos). Railway debe usar la **raíz del repo** como source para ambos servicios, y se le indica el Dockerfile de cada servicio mediante la variable `RAILWAY_DOCKERFILE_PATH`.\n\n```\nRailway Project\n├── Service: api → raíz repo + RAILWAY_DOCKERFILE_PATH=apps/api/Dockerfile\n└── Service: web → raíz repo + RAILWAY_DOCKERFILE_PATH=apps/web/Dockerfile\n```\n\n---\n\n### Prerrequisitos\n- Base de datos PostgreSQL ya desplegada (Neon, Railway DB, etc.)\n- URL de la DB disponible (`DATABASE_URL`)\n- Google OAuth app configurada\n- Cloudflare Turnstile configurado\n\n---\n\n### 1. Crear servicio `api` en Railway\n\n1. En Railway → New Project → Deploy from GitHub Repo → selecciona este repositorio\n2. Railway crea un servicio por defecto. Renómbralo `api`\n3. En **Settings → Build**:\n - **Root Directory**: dejar en blanco (usa la raíz del repo)\n - **Builder**: Dockerfile\n - **Dockerfile Path**: `apps/api/Dockerfile`\n > Alternativa: en **Variables** del servicio añadir `RAILWAY_DOCKERFILE_PATH=apps/api/Dockerfile`\n4. En **Variables** del servicio `api`, añadir:\n\n```env\nNODE_ENV=production\nPORT=3001\nDATABASE_URL=postgresql://...\nFRONTEND_URL=https://<web-service>.up.railway.app\nJWT_SECRET=<string-aleatoria-larga>\nJWT_REFRESH_SECRET=<string-aleatoria-diferente>\nJWT_ACCESS_TTL=15m\nJWT_REFRESH_TTL=7d\nGOOGLE_CLIENT_ID=<tu-client-id>\nGOOGLE_CLIENT_SECRET=<tu-client-secret>\nGOOGLE_CALLBACK_URL=https://<api-service>.up.railway.app/api/auth/google/callback\nTURNSTILE_SECRET_KEY=<tu-secret-key>\nDEEPSEEK_API_KEY=<tu-api-key>\nPEXELS_API_KEY=<tu-api-key>\nDEFAULT_VIDEO_PLACEHOLDER_URL=https://placehold.co/600x400?text=Hype+Tech+Hub\n```\n\n5. Deploy. El contenedor ejecuta `prisma migrate deploy` automáticamente antes de iniciar.\n6. Railway asigna una URL pública. Cópiala — la necesitas para el servicio `web`.\n\n---\n\n### 2. Crear servicio `web` en Railway\n\n1. En el mismo proyecto → New Service → GitHub Repo (mismo repo)\n2. Renómbralo `web`\n3. En **Settings → Build**:\n - **Root Directory**: dejar en blanco\n - **Builder**: Dockerfile\n - **Dockerfile Path**: `apps/web/Dockerfile`\n > Alternativa: `RAILWAY_DOCKERFILE_PATH=apps/web/Dockerfile` en Variables\n4. En **Variables** del servicio `web`:\n\n```env\nNODE_ENV=production\nPORT=3000\nNEXT_PUBLIC_API_URL=https://<api-service>.up.railway.app/api\nNEXT_PUBLIC_TURNSTILE_SITE_KEY=<tu-site-key>\nNEXT_PUBLIC_APP_NAME=Hype Tech Hub\n```\n\n > Las variables `NEXT_PUBLIC_*` deben estar presentes **en tiempo de build** (Docker ARGs).\n > Para esto, en Railway Build Variables (no solo Runtime Variables) añade también:\n > `NEXT_PUBLIC_API_URL` y `NEXT_PUBLIC_TURNSTILE_SITE_KEY`\n\n5. Deploy.\n\n---\n\n### 3. Conectar frontend con backend\n\nEl frontend conecta al backend via `NEXT_PUBLIC_API_URL`. Esta variable se inyecta en build time como Docker ARG. Railway la pasa automáticamente si está definida como Build Variable.\n\nSi cambias la URL del API service después del deploy:\n1. Actualizar `NEXT_PUBLIC_API_URL` en las Build Variables del servicio `web`\n2. Re-deploy el servicio `web` (re-build completo, no restart)\n\n---\n\n### 4. Actualizar Google OAuth tras el deploy\n\nEn Google Console → OAuth → Authorized redirect URIs, añadir:\n```\nhttps://<api-service>.up.railway.app/api/auth/google/callback\n```\n\nY en Authorized JavaScript Origins:\n```\nhttps://<web-service>.up.railway.app\n```\n\n---\n\n### 5. Validar el deploy\n\n```bash\n# API health check\ncurl https://<api-service>.up.railway.app/api/health\n# Esperado: { \"status\": \"ok\", \"timestamp\": \"...\" }\n\n# Swagger\n# https://<api-service>.up.railway.app/api/docs\n\n# Videos endpoint\ncurl https://<api-service>.up.railway.app/api/videos\n\n# Frontend\n# https://<web-service>.up.railway.app\n```\n\n---\n\n### Variables template rápido\n\n**Servicio `api`** → ver `apps/api/.env.example`\n**Servicio `web`** → ver `apps/web/.env.example`\n\n---\n\n## 🏢 Estructura de Proyecto (Monorepo)\n* `apps/web`: Frontend Next.js / Tailwind CSS / React. Consume la API. \n* `apps/api`: Backend NestJS Hexagonal en TypeScript estricto. (Rutas `/api/*`)\n* `packages/*`: (Opcional) Configuraciones compartidas como TypeScript rules, ESLint, UI library interna, etc.\n"}, "9e74a3e3e85fa2638c967172b91dfa5153eb9e7a": {"t": 1785771519.4138806, "n": 8119, "h": "7e02e8e1f97bd814", "c": "# Despliegue\n\nComo parte de mejorar la experiencia de uso de la app, se desplegó con una url publica para que se pueda acceder a probarla:\n\nhttps://www.hypetechub.online/\n\napi: https://api.hypetechub.online/api\n\n\n# Hype Tech Hub\n\nPlataforma integral construida diseñada para rankear, explorar y chatear con IA sobre un catálogo de contenido y tutoriales calificando el nivel de HYPE. También se puede iniciar sesión con Google para guardar videos en favoritos.\n\n> Este proyecto fue desarrollado basándose en requerimientos técnicos orientados a medir el \"Hype\" (engagement en proporción a las vistas) integrando IA y un stack full modern tech en TypeScript.\n\n## Requisitos previos\n- **Node.js** v20+\n- **NPM** v10+\n\n## 🚀 Cómo ejecutar el proyecto localmente\n\n1. **Instalar dependencias globales del monorepo:**\n ```bash\n npm install\n ```\n\n2. **Configurar Variables de Entorno:**\n Debes establecer los archivos `.env` respectivos para Web y API basándote en los templates existentes o usando las claves entregadas.\n\n **En `apps/api/.env`:**\n ```env\n # Entorno y Puerto\n NODE_ENV=development\n PORT=3001\n \n # Base de Datos (Prisma)\n DATABASE_URL=\"file:./dev.db\" # O postgresql://usuario:password@localhost:5432/db_name si usas PostgreSQL\n \n # Autenticación y Seguridad (JWT)\n JWT_SECRET=super_secret_jwt_key # Cambiar por una cadena segura\n \n # Autenticación con Google Cloud (OAuth)\n GOOGLE_CLIENT_ID=tu_google_client_id_aqui\n GOOGLE_CLIENT_SECRET=tu_google_client_secret_aqui\n GOOGLE_CALLBACK_URL=http://localhost:3001/api/auth/google/callback\n FRONTEND_URL=http://localhost:3000\n \n # Inteligencia Artificial (DeepSeek)\n DEEPSEEK_API_KEY=tu-clave-deepseek-aqui\n \n # Catálogo de Imágenes (Pexels)\n PEXELS_API_KEY=tu-clave-pexels-aqui\n DEFAULT_VIDEO_PLACEHOLDER_URL=https://placehold.co/600x400?text=Hype+Tech+Hub\n ```\n\n **Importante**\n - La clave de Pexels se obtiene entrando a su página web y solicitando la api key. Se utilizó esta herramienta ya que las url de la fuente de datos no estaban cargando adecuadamente.\n\n - La clave de Deepseek Api key, importante teneral para que pueda funcionar el Hype AI. Un agente de IA que permite generar respuestas basadas en el contexto de los videos.\n\n - Database URL, de igual forma colocarlo ya sea una bd local o remota para poder ejecutar las migraciones con Prisma. En este caso se utilizó Neon, como bd para el proyecto.\n\n **En `apps/web/.env.local`:**\n ```env\n # Conexión al Backend\n NEXT_PUBLIC_API_URL=http://localhost:3001/api\n \n\n3. **Generar Cliente, Ejecutar Migraciones y Cargar Videos (Base de Datos):**\n Antes de correr la aplicación, levanta el esquema y carga el catálogo inicial de videos en la base de datos:\n ```bash\n cd apps/api\n npx prisma generate\n npx prisma migrate dev --name init\n npm run prisma:seed\n cd ../..\n ```\n El seed es **idempotente**: si ya existen los videos en la BD, los omite sin duplicar. Puedes correrlo cuantas veces quieras sin riesgo.\n\n4. **Ejecutar el proyecto completo (Front y Back simultáneamente):**\n ```bash\n npm run dev\n ```\n * Turborepo levantará:\n * Frontend (Next.js) en: [http://localhost:3000](http://localhost:3000)\n * Backend (NestJS) en: [http://localhost:3001/api](http://localhost:3001/api)\n * Swagger UI de Backend: [http://localhost:3001/api/docs](http://localhost:3001/api/docs)\n\n## 🐳 Ejecución con Docker (Producción Completa)\n\nEl proyecto está completamente **dockerizado**. Puedes levantar toda la orquestación (Frontend + Backend) utilizando los `Dockerfiles.\n\nPara levantarlo, solo debes tener encendido tu motor y ejecutar:\n\n```bash\ndocker-compose up --build -d\n```\nDocker leerá silenciosamente `apps/api/.env` para levantar el backend e inyectará los atributos a `apps/web/.env.local` configurándolo para Vercel standalone output routing.\n\n---\n\n## 🚂 Deploy en Railway\n\n### Arquitectura de despliegue\nEste monorepo es de tipo **shared** (node_modules y `packages/` compartidos). Railway debe usar la **raíz del repo** como source para ambos servicios, y se le indica el Dockerfile de cada servicio mediante la variable `RAILWAY_DOCKERFILE_PATH`.\n\n```\nRailway Project\n├── Service: api → raíz repo + RAILWAY_DOCKERFILE_PATH=apps/api/Dockerfile\n└── Service: web → raíz repo + RAILWAY_DOCKERFILE_PATH=apps/web/Dockerfile\n```\n\n---\n\n### Prerrequisitos\n- Base de datos PostgreSQL ya desplegada (Neon, Railway DB, etc.)\n- URL de la DB disponible (`DATABASE_URL`)\n- Google OAuth app configurada\n- Cloudflare Turnstile configurado\n\n---\n\n### 1. Crear servicio `api` en Railway\n\n1. En Railway → New Project → Deploy from GitHub Repo → selecciona este repositorio\n2. Railway crea un servicio por defecto. Renómbralo `api`\n3. En **Settings → Build**:\n - **Root Directory**: dejar en blanco (usa la raíz del repo)\n - **Builder**: Dockerfile\n - **Dockerfile Path**: `apps/api/Dockerfile`\n > Alternativa: en **Variables** del servicio añadir `RAILWAY_DOCKERFILE_PATH=apps/api/Dockerfile`\n4. En **Variables** del servicio `api`, añadir:\n\n```env\nNODE_ENV=production\nPORT=3001\nDATABASE_URL=postgresql://...\nFRONTEND_URL=https://<web-service>.up.railway.app\nJWT_SECRET=<string-aleatoria-larga>\nJWT_REFRESH_SECRET=<string-aleatoria-diferente>\nJWT_ACCESS_TTL=15m\nJWT_REFRESH_TTL=7d\nGOOGLE_CLIENT_ID=<tu-client-id>\nGOOGLE_CLIENT_SECRET=<tu-client-secret>\nGOOGLE_CALLBACK_URL=https://<api-service>.up.railway.app/api/auth/google/callback\nTURNSTILE_SECRET_KEY=<tu-secret-key>\nDEEPSEEK_API_KEY=<tu-api-key>\nPEXELS_API_KEY=<tu-api-key>\nDEFAULT_VIDEO_PLACEHOLDER_URL=https://placehold.co/600x400?text=Hype+Tech+Hub\n```\n\n5. Deploy. El contenedor ejecuta `prisma migrate deploy` automáticamente antes de iniciar.\n6. Railway asigna una URL pública. Cópiala — la necesitas para el servicio `web`.\n\n---\n\n### 2. Crear servicio `web` en Railway\n\n1. En el mismo proyecto → New Service → GitHub Repo (mismo repo)\n2. Renómbralo `web`\n3. En **Settings → Build**:\n - **Root Directory**: dejar en blanco\n - **Builder**: Dockerfile\n - **Dockerfile Path**: `apps/web/Dockerfile`\n > Alternativa: `RAILWAY_DOCKERFILE_PATH=apps/web/Dockerfile` en Variables\n4. En **Variables** del servicio `web`:\n\n```env\nNODE_ENV=production\nPORT=3000\nNEXT_PUBLIC_API_URL=https://<api-service>.up.railway.app/api\nNEXT_PUBLIC_TURNSTILE_SITE_KEY=<tu-site-key>\nNEXT_PUBLIC_APP_NAME=Hype Tech Hub\n```\n\n > Las variables `NEXT_PUBLIC_*` deben estar presentes **en tiempo de build** (Docker ARGs).\n > Para esto, en Railway Build Variables (no solo Runtime Variables) añade también:\n > `NEXT_PUBLIC_API_URL` y `NEXT_PUBLIC_TURNSTILE_SITE_KEY`\n\n5. Deploy.\n\n---\n\n### 3. Conectar frontend con backend\n\nEl frontend conecta al backend via `NEXT_PUBLIC_API_URL`. Esta variable se inyecta en build time como Docker ARG. Railway la pasa automáticamente si está definida como Build Variable.\n\nSi cambias la URL del API service después del deploy:\n1. Actualizar `NEXT_PUBLIC_API_URL` en las Build Variables del servicio `web`\n2. Re-deploy el servicio `web` (re-build completo, no restart)\n\n---\n\n### 4. Actualizar Google OAuth tras el deploy\n\nEn Google Console → OAuth → Authorized redirect URIs, añadir:\n```\nhttps://<api-service>.up.railway.app/api/auth/google/callback\n```\n\nY en Authorized JavaScript Origins:\n```\nhttps://<web-service>.up.railway.app\n```\n\n---\n\n### 5. Validar el deploy\n\n```bash\n# API health check\ncurl https://<api-service>.up.railway.app/api/health\n# Esperado: { \"status\": \"ok\", \"timestamp\": \"...\" }\n\n# Swagger\n# https://<api-service>.up.railway.app/api/docs\n\n# Videos endpoint\ncurl https://<api-service>.up.railway.app/api/videos\n\n# Frontend\n# https://<web-service>.up.railway.app\n```\n\n---\n\n### Variables template rápido\n\n**Servicio `api`** → ver `apps/api/.env.example`\n**Servicio `web`** → ver `apps/web/.env.example`\n\n---\n\n## 🏢 Estructura de Proyecto (Monorepo)\n* `apps/web`: Frontend Next.js / Tailwind CSS / React. Consume la API. \n* `apps/api`: Backend NestJS Hexagonal en TypeScript estricto. (Rutas `/api/*`)\n* `packages/*`: (Opcional) Configuraciones compartidas como TypeScript rules, ESLint, UI library interna, etc.\n"}, "0fb70a706ea76e72395c15c3c5ec3e5e68bc6760": {"t": 1785771520.757133, "n": 7387, "h": "82ae687be12a9f46", "c": "# Despliegue\n\nComo parte de mejorar la experiencia de uso de la app, se desplegó con una url publica para que se pueda acceder a probarla:\n\nhttps://www.hypetechub.online/\n\napi: https://api.hypetechub.online/api\n\n\n# Hype Tech Hub\n\nPlataforma integral construida diseñada para rankear, explorar y chatear con IA sobre un catálogo de contenido y tutoriales calificando el nivel de HYPE. También se puede iniciar sesión con Google para guardar videos en favoritos.\n\n> Este proyecto fue desarrollado basándose en requerimientos técnicos orientados a medir el \"Hype\" (engagement en proporción a las vistas) integrando IA y un stack full modern tech en TypeScript.\n\n## Requisitos previos\n- **Node.js** v20+\n- **NPM** v10+\n\n## 🚀 Cómo ejecutar el proyecto localmente\n\n1. **Instalar dependencias globales del monorepo:**\n ```bash\n npm install\n ```\n\n2. **Configurar Variables de Entorno:**\n Debes establecer los archivos `.env` respectivos para Web y API basándote en los templates existentes o usando las claves entregadas.\n\n **En `apps/api/.env`:**\n ```env\n # Entorno y Puerto\n NODE_ENV=development\n PORT=3001\n \n # Base de Datos (Prisma)\n DATABASE_URL=\"file:./dev.db\" # O postgresql://usuario:password@localhost:5432/db_name si usas PostgreSQL\n \n # Autenticación y Seguridad (JWT)\n JWT_SECRET=super_secret_jwt_key # Cambiar por una cadena segura\n \n # Autenticación con Google Cloud (OAuth)\n GOOGLE_CLIENT_ID=tu_google_client_id_aqui\n GOOGLE_CLIENT_SECRET=tu_google_client_secret_aqui\n GOOGLE_CALLBACK_URL=http://localhost:3001/api/auth/google/callback\n FRONTEND_URL=http://localhost:3000\n \n # Inteligencia Artificial (DeepSeek)\n DEEPSEEK_API_KEY=tu-clave-deepseek-aqui\n \n # Catálogo de Imágenes (Pexels)\n PEXELS_API_KEY=tu-clave-pexels-aqui\n DEFAULT_VIDEO_PLACEHOLDER_URL=https://placehold.co/600x400?text=Hype+Tech+Hub\n ```\n\n **En `apps/web/.env.local`:**\n ```env\n # Conexión al Backend\n NEXT_PUBLIC_API_URL=http://localhost:3001/api\n \n\n3. **Generar Cliente y Ejecutar Migraciones (Base de Datos):**\n Antes de correr la aplicación, asegúrate de levantar tu esquema en Prisma. Navega al contexto de la API y ejecuta:\n ```bash\n cd apps/api\n npx prisma generate\n npx prisma migrate dev --name init\n cd ../..\n ```\n\n4. **Ejecutar el proyecto completo (Front y Back simultáneamente):**\n ```bash\n npm run dev\n ```\n * Turborepo levantará:\n * Frontend (Next.js) en: [http://localhost:3000](http://localhost:3000)\n * Backend (NestJS) en: [http://localhost:3001/api](http://localhost:3001/api)\n * Swagger UI de Backend: [http://localhost:3001/api/docs](http://localhost:3001/api/docs)\n\n## 🐳 Ejecución con Docker (Producción Completa)\n\nEl proyecto está completamente **dockerizado**. Puedes levantar toda la orquestación (Frontend + Backend) utilizando los `Dockerfiles.\n\nPara levantarlo, solo debes tener encendido tu motor y ejecutar:\n\n```bash\ndocker-compose up --build -d\n```\nDocker leerá silenciosamente `apps/api/.env` para levantar el backend e inyectará los atributos a `apps/web/.env.local` configurándolo para Vercel standalone output routing.\n\n---\n\n## 🚂 Deploy en Railway\n\n### Arquitectura de despliegue\nEste monorepo es de tipo **shared** (node_modules y `packages/` compartidos). Railway debe usar la **raíz del repo** como source para ambos servicios, y se le indica el Dockerfile de cada servicio mediante la variable `RAILWAY_DOCKERFILE_PATH`.\n\n```\nRailway Project\n├── Service: api → raíz repo + RAILWAY_DOCKERFILE_PATH=apps/api/Dockerfile\n└── Service: web → raíz repo + RAILWAY_DOCKERFILE_PATH=apps/web/Dockerfile\n```\n\n---\n\n### Prerrequisitos\n- Base de datos PostgreSQL ya desplegada (Neon, Railway DB, etc.)\n- URL de la DB disponible (`DATABASE_URL`)\n- Google OAuth app configurada\n- Cloudflare Turnstile configurado\n\n---\n\n### 1. Crear servicio `api` en Railway\n\n1. En Railway → New Project → Deploy from GitHub Repo → selecciona este repositorio\n2. Railway crea un servicio por defecto. Renómbralo `api`\n3. En **Settings → Build**:\n - **Root Directory**: dejar en blanco (usa la raíz del repo)\n - **Builder**: Dockerfile\n - **Dockerfile Path**: `apps/api/Dockerfile`\n > Alternativa: en **Variables** del servicio añadir `RAILWAY_DOCKERFILE_PATH=apps/api/Dockerfile`\n4. En **Variables** del servicio `api`, añadir:\n\n```env\nNODE_ENV=production\nPORT=3001\nDATABASE_URL=postgresql://...\nFRONTEND_URL=https://<web-service>.up.railway.app\nJWT_SECRET=<string-aleatoria-larga>\nJWT_REFRESH_SECRET=<string-aleatoria-diferente>\nJWT_ACCESS_TTL=15m\nJWT_REFRESH_TTL=7d\nGOOGLE_CLIENT_ID=<tu-client-id>\nGOOGLE_CLIENT_SECRET=<tu-client-secret>\nGOOGLE_CALLBACK_URL=https://<api-service>.up.railway.app/api/auth/google/callback\nTURNSTILE_SECRET_KEY=<tu-secret-key>\nDEEPSEEK_API_KEY=<tu-api-key>\nPEXELS_API_KEY=<tu-api-key>\nDEFAULT_VIDEO_PLACEHOLDER_URL=https://placehold.co/600x400?text=Hype+Tech+Hub\n```\n\n5. Deploy. El contenedor ejecuta `prisma migrate deploy` automáticamente antes de iniciar.\n6. Railway asigna una URL pública. Cópiala — la necesitas para el servicio `web`.\n\n---\n\n### 2. Crear servicio `web` en Railway\n\n1. En el mismo proyecto → New Service → GitHub Repo (mismo repo)\n2. Renómbralo `web`\n3. En **Settings → Build**:\n - **Root Directory**: dejar en blanco\n - **Builder**: Dockerfile\n - **Dockerfile Path**: `apps/web/Dockerfile`\n > Alternativa: `RAILWAY_DOCKERFILE_PATH=apps/web/Dockerfile` en Variables\n4. En **Variables** del servicio `web`:\n\n```env\nNODE_ENV=production\nPORT=3000\nNEXT_PUBLIC_API_URL=https://<api-service>.up.railway.app/api\nNEXT_PUBLIC_TURNSTILE_SITE_KEY=<tu-site-key>\nNEXT_PUBLIC_APP_NAME=Hype Tech Hub\n```\n\n > Las variables `NEXT_PUBLIC_*` deben estar presentes **en tiempo de build** (Docker ARGs).\n > Para esto, en Railway Build Variables (no solo Runtime Variables) añade también:\n > `NEXT_PUBLIC_API_URL` y `NEXT_PUBLIC_TURNSTILE_SITE_KEY`\n\n5. Deploy.\n\n---\n\n### 3. Conectar frontend con backend\n\nEl frontend conecta al backend via `NEXT_PUBLIC_API_URL`. Esta variable se inyecta en build time como Docker ARG. Railway la pasa automáticamente si está definida como Build Variable.\n\nSi cambias la URL del API service después del deploy:\n1. Actualizar `NEXT_PUBLIC_API_URL` en las Build Variables del servicio `web`\n2. Re-deploy el servicio `web` (re-build completo, no restart)\n\n---\n\n### 4. Actualizar Google OAuth tras el deploy\n\nEn Google Console → OAuth → Authorized redirect URIs, añadir:\n```\nhttps://<api-service>.up.railway.app/api/auth/google/callback\n```\n\nY en Authorized JavaScript Origins:\n```\nhttps://<web-service>.up.railway.app\n```\n\n---\n\n### 5. Validar el deploy\n\n```bash\n# API health check\ncurl https://<api-service>.up.railway.app/api/health\n# Esperado: { \"status\": \"ok\", \"timestamp\": \"...\" }\n\n# Swagger\n# https://<api-service>.up.railway.app/api/docs\n\n# Videos endpoint\ncurl https://<api-service>.up.railway.app/api/videos\n\n# Frontend\n# https://<web-service>.up.railway.app\n```\n\n---\n\n### Variables template rápido\n\n**Servicio `api`** → ver `apps/api/.env.example`\n**Servicio `web`** → ver `apps/web/.env.example`\n\n---\n\n## 🏢 Estructura de Proyecto (Monorepo)\n* `apps/web`: Frontend Next.js / Tailwind CSS / React. Consume la API. \n* `apps/api`: Backend NestJS Hexagonal en TypeScript estricto. (Rutas `/api/*`)\n* `packages/*`: (Opcional) Configuraciones compartidas como TypeScript rules, ESLint, UI library interna, etc.\n"}, "62629254ca81c303189c0554f7326f34016e807f": {"t": 1785771526.4702203, "n": 7196, "h": "001f6cd4ee9faf9e", "c": "# Hype Tech Hub\n\nPlataforma integral construida diseñada para rankear, explorar y chatear con IA sobre un catálogo de contenido y tutoriales de desarrollo de software. Este repositorio contiene el Frontend y Backend productizado como un Monorepo manejado por Turborepo.\n\n> Este proyecto fue desarrollado basándose en requerimientos técnicos orientados a medir el \"Hype\" (engagement en proporción a las vistas) integrando IA y un stack full modern tech en TypeScript.\n\n## Requisitos previos\n- **Node.js** v20+\n- **NPM** v10+\n\n## 🚀 Cómo ejecutar el proyecto localmente\n\n1. **Instalar dependencias globales del monorepo:**\n ```bash\n npm install\n ```\n\n2. **Configurar Variables de Entorno:**\n Debes establecer los archivos `.env` respectivos para Web y API basándote en los templates existentes o usando las claves entregadas.\n\n **En `apps/api/.env`:**\n ```env\n # Entorno y Puerto\n NODE_ENV=development\n PORT=3001\n \n # Base de Datos (Prisma)\n DATABASE_URL=\"file:./dev.db\" # O postgresql://usuario:password@localhost:5432/db_name si usas PostgreSQL\n \n # Autenticación y Seguridad (JWT)\n JWT_SECRET=super_secret_jwt_key # Cambiar por una cadena segura\n \n # Autenticación con Google Cloud (OAuth)\n GOOGLE_CLIENT_ID=tu_google_client_id_aqui\n GOOGLE_CLIENT_SECRET=tu_google_client_secret_aqui\n GOOGLE_CALLBACK_URL=http://localhost:3001/api/auth/google/callback\n FRONTEND_URL=http://localhost:3000\n \n # Inteligencia Artificial (DeepSeek)\n DEEPSEEK_API_KEY=tu-clave-deepseek-aqui\n \n # Catálogo de Imágenes (Pexels)\n PEXELS_API_KEY=tu-clave-pexels-aqui\n DEFAULT_VIDEO_PLACEHOLDER_URL=https://placehold.co/600x400?text=Hype+Tech+Hub\n ```\n\n **En `apps/web/.env.local`:**\n ```env\n # Conexión al Backend\n NEXT_PUBLIC_API_URL=http://localhost:3001/api\n \n\n3. **Generar Cliente y Ejecutar Migraciones (Base de Datos):**\n Antes de correr la aplicación, asegúrate de levantar tu esquema en Prisma. Navega al contexto de la API y ejecuta:\n ```bash\n cd apps/api\n npx prisma generate\n npx prisma migrate dev --name init\n cd ../..\n ```\n\n4. **Ejecutar el proyecto completo (Front y Back simultáneamente):**\n ```bash\n npm run dev\n ```\n * Turborepo levantará:\n * Frontend (Next.js) en: [http://localhost:3000](http://localhost:3000)\n * Backend (NestJS) en: [http://localhost:3001/api](http://localhost:3001/api)\n * Swagger UI de Backend: [http://localhost:3001/api/docs](http://localhost:3001/api/docs)\n\n## 🐳 Ejecución con Docker (Producción Completa)\n\nEl proyecto está completamente **dockerizado**. Puedes levantar toda la orquestación (Frontend + Backend) utilizando los `Dockerfiles.\n\nPara levantarlo, solo debes tener encendido tu motor y ejecutar:\n\n```bash\ndocker-compose up --build -d\n```\nDocker leerá silenciosamente `apps/api/.env` para levantar el backend e inyectará los atributos a `apps/web/.env.local` configurándolo para Vercel standalone output routing.\n\n---\n\n## 🚂 Deploy en Railway\n\n### Arquitectura de despliegue\nEste monorepo es de tipo **shared** (node_modules y `packages/` compartidos). Railway debe usar la **raíz del repo** como source para ambos servicios, y se le indica el Dockerfile de cada servicio mediante la variable `RAILWAY_DOCKERFILE_PATH`.\n\n```\nRailway Project\n├── Service: api → raíz repo + RAILWAY_DOCKERFILE_PATH=apps/api/Dockerfile\n└── Service: web → raíz repo + RAILWAY_DOCKERFILE_PATH=apps/web/Dockerfile\n```\n\n---\n\n### Prerrequisitos\n- Base de datos PostgreSQL ya desplegada (Neon, Railway DB, etc.)\n- URL de la DB disponible (`DATABASE_URL`)\n- Google OAuth app configurada\n- Cloudflare Turnstile configurado\n\n---\n\n### 1. Crear servicio `api` en Railway\n\n1. En Railway → New Project → Deploy from GitHub Repo → selecciona este repositorio\n2. Railway crea un servicio por defecto. Renómbralo `api`\n3. En **Settings → Build**:\n - **Root Directory**: dejar en blanco (usa la raíz del repo)\n - **Builder**: Dockerfile\n - **Dockerfile Path**: `apps/api/Dockerfile`\n > Alternativa: en **Variables** del servicio añadir `RAILWAY_DOCKERFILE_PATH=apps/api/Dockerfile`\n4. En **Variables** del servicio `api`, añadir:\n\n```env\nNODE_ENV=production\nPORT=3001\nDATABASE_URL=postgresql://...\nFRONTEND_URL=https://<web-service>.up.railway.app\nJWT_SECRET=<string-aleatoria-larga>\nJWT_REFRESH_SECRET=<string-aleatoria-diferente>\nJWT_ACCESS_TTL=15m\nJWT_REFRESH_TTL=7d\nGOOGLE_CLIENT_ID=<tu-client-id>\nGOOGLE_CLIENT_SECRET=<tu-client-secret>\nGOOGLE_CALLBACK_URL=https://<api-service>.up.railway.app/api/auth/google/callback\nTURNSTILE_SECRET_KEY=<tu-secret-key>\nDEEPSEEK_API_KEY=<tu-api-key>\nPEXELS_API_KEY=<tu-api-key>\nDEFAULT_VIDEO_PLACEHOLDER_URL=https://placehold.co/600x400?text=Hype+Tech+Hub\n```\n\n5. Deploy. El contenedor ejecuta `prisma migrate deploy` automáticamente antes de iniciar.\n6. Railway asigna una URL pública. Cópiala — la necesitas para el servicio `web`.\n\n---\n\n### 2. Crear servicio `web` en Railway\n\n1. En el mismo proyecto → New Service → GitHub Repo (mismo repo)\n2. Renómbralo `web`\n3. En **Settings → Build**:\n - **Root Directory**: dejar en blanco\n - **Builder**: Dockerfile\n - **Dockerfile Path**: `apps/web/Dockerfile`\n > Alternativa: `RAILWAY_DOCKERFILE_PATH=apps/web/Dockerfile` en Variables\n4. En **Variables** del servicio `web`:\n\n```env\nNODE_ENV=production\nPORT=3000\nNEXT_PUBLIC_API_URL=https://<api-service>.up.railway.app/api\nNEXT_PUBLIC_TURNSTILE_SITE_KEY=<tu-site-key>\nNEXT_PUBLIC_APP_NAME=Hype Tech Hub\n```\n\n > Las variables `NEXT_PUBLIC_*` deben estar presentes **en tiempo de build** (Docker ARGs).\n > Para esto, en Railway Build Variables (no solo Runtime Variables) añade también:\n > `NEXT_PUBLIC_API_URL` y `NEXT_PUBLIC_TURNSTILE_SITE_KEY`\n\n5. Deploy.\n\n---\n\n### 3. Conectar frontend con backend\n\nEl frontend conecta al backend via `NEXT_PUBLIC_API_URL`. Esta variable se inyecta en build time como Docker ARG. Railway la pasa automáticamente si está definida como Build Variable.\n\nSi cambias la URL del API service después del deploy:\n1. Actualizar `NEXT_PUBLIC_API_URL` en las Build Variables del servicio `web`\n2. Re-deploy el servicio `web` (re-build completo, no restart)\n\n---\n\n### 4. Actualizar Google OAuth tras el deploy\n\nEn Google Console → OAuth → Authorized redirect URIs, añadir:\n```\nhttps://<api-service>.up.railway.app/api/auth/google/callback\n```\n\nY en Authorized JavaScript Origins:\n```\nhttps://<web-service>.up.railway.app\n```\n\n---\n\n### 5. Validar el deploy\n\n```bash\n# API health check\ncurl https://<api-service>.up.railway.app/api/health\n# Esperado: { \"status\": \"ok\", \"timestamp\": \"...\" }\n\n# Swagger\n# https://<api-service>.up.railway.app/api/docs\n\n# Videos endpoint\ncurl https://<api-service>.up.railway.app/api/videos\n\n# Frontend\n# https://<web-service>.up.railway.app\n```\n\n---\n\n### Variables template rápido\n\n**Servicio `api`** → ver `apps/api/.env.example`\n**Servicio `web`** → ver `apps/web/.env.example`\n\n---\n\n## 🏢 Estructura de Proyecto (Monorepo)\n* `apps/web`: Frontend Next.js / Tailwind CSS / React. Consume la API. \n* `apps/api`: Backend NestJS Hexagonal en TypeScript estricto. (Rutas `/api/*`)\n* `packages/*`: (Opcional) Configuraciones compartidas como TypeScript rules, ESLint, UI library interna, etc.\n"}, "b27596066c0002d4e72283a537de48e7c35b79fd": {"t": 1785771527.993126, "n": 3247, "h": "bf0dbfe640d7202e", "c": "# Hype Tech Hub\n\nPlataforma integral construida diseñada para rankear, explorar y chatear con IA sobre un catálogo de contenido y tutoriales de desarrollo de software. Este repositorio contiene el Frontend y Backend productizado como un Monorepo manejado por Turborepo.\n\n> Este proyecto fue desarrollado basándose en requerimientos técnicos orientados a medir el \"Hype\" (engagement en proporción a las vistas) integrando IA y un stack full modern tech en TypeScript.\n\n## Requisitos previos\n- **Node.js** v20+\n- **NPM** v10+\n\n## 🚀 Cómo ejecutar el proyecto localmente\n\n1. **Instalar dependencias globales del monorepo:**\n ```bash\n npm install\n ```\n\n2. **Configurar Variables de Entorno:**\n Debes establecer los archivos `.env` respectivos para Web y API basándote en los templates existentes o usando las claves entregadas.\n\n **En `apps/api/.env`:**\n ```env\n # Entorno y Puerto\n NODE_ENV=development\n PORT=3001\n \n # Base de Datos (Prisma)\n DATABASE_URL=\"file:./dev.db\" # O postgresql://usuario:password@localhost:5432/db_name si usas PostgreSQL\n \n # Autenticación y Seguridad (JWT)\n JWT_SECRET=super_secret_jwt_key # Cambiar por una cadena segura\n \n # Autenticación con Google Cloud (OAuth)\n GOOGLE_CLIENT_ID=tu_google_client_id_aqui\n GOOGLE_CLIENT_SECRET=tu_google_client_secret_aqui\n GOOGLE_CALLBACK_URL=http://localhost:3001/api/auth/google/callback\n FRONTEND_URL=http://localhost:3000\n \n # Inteligencia Artificial (DeepSeek)\n DEEPSEEK_API_KEY=tu-clave-deepseek-aqui\n \n # Catálogo de Imágenes (Pexels)\n PEXELS_API_KEY=tu-clave-pexels-aqui\n DEFAULT_VIDEO_PLACEHOLDER_URL=https://placehold.co/600x400?text=Hype+Tech+Hub\n ```\n\n **En `apps/web/.env.local`:**\n ```env\n # Conexión al Backend\n NEXT_PUBLIC_API_URL=http://localhost:3001/api\n \n\n3. **Generar Cliente y Ejecutar Migraciones (Base de Datos):**\n Antes de correr la aplicación, asegúrate de levantar tu esquema en Prisma. Navega al contexto de la API y ejecuta:\n ```bash\n cd apps/api\n npx prisma generate\n npx prisma migrate dev --name init\n cd ../..\n ```\n\n4. **Ejecutar el proyecto completo (Front y Back simultáneamente):**\n ```bash\n npm run dev\n ```\n * Turborepo levantará:\n * Frontend (Next.js) en: [http://localhost:3000](http://localhost:3000)\n * Backend (NestJS) en: [http://localhost:3001/api](http://localhost:3001/api)\n * Swagger UI de Backend: [http://localhost:3001/api/docs](http://localhost:3001/api/docs)\n\n## 🐳 Ejecución con Docker (Producción Completa)\n\nEl proyecto está completamente **dockerizado**. Puedes levantar toda la orquestación (Frontend + Backend) utilizando los `Dockerfiles.\n\nPara levantarlo, solo debes tener encendido tu motor y ejecutar:\n\n```bash\ndocker-compose up --build -d\n```\nDocker leerá silenciosamente `apps/api/.env` para levantar el backend e inyectará los atributos a `apps/web/.env.local` configurándolo para Vercel standalone output routing.\n\n## 🏢 Estructura de Proyecto (Monorepo)\n* `apps/web`: Frontend Next.js / Tailwind CSS / React. Consume la API. \n* `apps/api`: Backend NestJS Hexagonal en TypeScript estricto. (Rutas `/api/*`)\n* `packages/*`: (Opcional) Configuraciones compartidas como TypeScript rules, ESLint, UI library interna, etc.\n"}, "5093c8cc802cb3b537ac65cc8abbcd5ba25c4ff0": {"t": 1785771529.28607, "n": 2780, "h": "4194ad4bdde8748a", "c": "# Hype Tech Hub\n\nPlataforma integral construida diseñada para rankear, explorar y chatear con IA sobre un catálogo de contenido y tutoriales de desarrollo de software. Este repositorio contiene el Frontend y Backend productizado como un Monorepo manejado por Turborepo.\n\n> Este proyecto fue desarrollado basándose en requerimientos técnicos orientados a medir el \"Hype\" (engagement en proporción a las vistas) integrando IA y un stack full modern tech en TypeScript.\n\n## Requisitos previos\n- **Node.js** v20+\n- **NPM** v10+\n\n## 🚀 Cómo ejecutar el proyecto localmente\n\n1. **Instalar dependencias globales del monorepo:**\n ```bash\n npm install\n ```\n\n2. **Configurar Variables de Entorno:**\n Debes establecer los archivos `.env` respectivos para Web y API basándote en los templates existentes o usando las claves entregadas.\n\n **En `apps/api/.env`:**\n ```env\n # Entorno y Puerto\n NODE_ENV=development\n PORT=3001\n \n # Base de Datos (Prisma)\n DATABASE_URL=\"file:./dev.db\" # O postgresql://usuario:password@localhost:5432/db_name si usas PostgreSQL\n \n # Autenticación y Seguridad (JWT)\n JWT_SECRET=super_secret_jwt_key # Cambiar por una cadena segura\n \n # Autenticación con Google Cloud (OAuth)\n GOOGLE_CLIENT_ID=tu_google_client_id_aqui\n GOOGLE_CLIENT_SECRET=tu_google_client_secret_aqui\n GOOGLE_CALLBACK_URL=http://localhost:3001/api/auth/google/callback\n FRONTEND_URL=http://localhost:3000\n \n # Inteligencia Artificial (DeepSeek)\n DEEPSEEK_API_KEY=tu-clave-deepseek-aqui\n \n # Catálogo de Imágenes (Pexels)\n PEXELS_API_KEY=tu-clave-pexels-aqui\n DEFAULT_VIDEO_PLACEHOLDER_URL=https://placehold.co/600x400?text=Hype+Tech+Hub\n ```\n\n **En `apps/web/.env.local`:**\n ```env\n # Conexión al Backend\n NEXT_PUBLIC_API_URL=http://localhost:3001/api\n \n\n3. **Generar Cliente y Ejecutar Migraciones (Base de Datos):**\n Antes de correr la aplicación, asegúrate de levantar tu esquema en Prisma. Navega al contexto de la API y ejecuta:\n ```bash\n cd apps/api\n npx prisma generate\n npx prisma migrate dev --name init\n cd ../..\n ```\n\n4. **Ejecutar el proyecto completo (Front y Back simultáneamente):**\n ```bash\n npm run dev\n ```\n * Turborepo levantará:\n * Frontend (Next.js) en: [http://localhost:3000](http://localhost:3000)\n * Backend (NestJS) en: [http://localhost:3001/api](http://localhost:3001/api)\n * Swagger UI de Backend: [http://localhost:3001/api/docs](http://localhost:3001/api/docs)\n\n## 🏢 Estructura de Proyecto (Monorepo)\n* `apps/web`: Frontend Next.js / Tailwind CSS / React. Consume la API. \n* `apps/api`: Backend NestJS Hexagonal en TypeScript estricto. (Rutas `/api/*`)\n* `packages/*`: (Opcional) Configuraciones compartidas como TypeScript rules, ESLint, UI library interna, etc.\n"}}}}