# Deploy en Homelab (Dell R815 / AMD Opteron) Este documento describe los fixes necesarios para deployar en el homelab, que tiene limitaciones de hardware específicas. ## Problemas resueltos ### 1. `next.config.ts` no soportado Next.js 14 no acepta configuración TypeScript. Usar `next.config.mjs` con JS puro: ```js /** @type {import('next').NextConfig} */ const nextConfig = { output: 'standalone', images: { remotePatterns: [ { protocol: 'https', hostname: 'flagcdn.com' }, ], }, } export default nextConfig ``` ### 2. `tsconfig.json` sin `target` Agregar `"target": "es2015"` en `compilerOptions` (necesario para iterar `Set`). ### 3. Clave duplicada en `teamMapping.ts` `'costa de marfil'` aparece dos veces (comillas simples y dobles). Dejar solo una. ### 4. `leaderboard/page.tsx` campos incorrectos - `entry.count` → `entry.predictions` - `entry.total` → `entry.totalPoints` ### 5. Migraciones Prisma crashean (sin AVX) El AMD Opteron no tiene instrucciones AVX. `npx prisma migrate deploy` termina con SIGILL. El `entrypoint.sh` saltea las migraciones. Si hay cambios de schema, aplicarlos manualmente: ```bash docker exec -it prode_mundial-db-1 psql -U prode -d prode_db ``` ### 6. Prisma no encuentra `libssl.so.1.1` (Alpine 3.23) Alpine 3.23 usa OpenSSL 3.x. El Dockerfile debe instalar `openssl` en las **3 etapas**: ```dockerfile FROM node:20-alpine AS deps RUN apk add --no-cache openssl ... FROM node:20-alpine AS builder RUN apk add --no-cache openssl ... FROM node:20-alpine AS runner RUN apk add --no-cache openssl ... ``` ### 7. Puerto 3000 ocupado En el homelab: 3000=Grafana, 3001=Uptime Kuma, 3002=Open WebUI. La app usa el **puerto 3003**. `docker-compose.yml`: ```yaml ports: - "3003:3000" ``` El Nginx Proxy Manager apunta a `172.17.0.1:3003` (bridge Docker → host). ### 8. Seed requiere `tsx` (no disponible en producción) Correr desde un container temporal con acceso a la red de compose: ```bash docker run --rm \ --network prode_mundial_default \ -v /home/proyecto/prode_mundial/app:/app \ -w /app \ -e DATABASE_URL="postgresql://prode:@prode_mundial-db-1:5432/prode_db" \ node:20-alpine \ sh -c "apk add --no-cache openssl && npx tsx prisma/seed.ts" ``` --- ## Proceso de deploy completo ```bash # 1. Clonar repo (Gitea corre en container, no en localhost:3000) cd /home/proyecto/prode_mundial git clone http://jpbeldomenico:@172.18.0.9:3000/jpbeldomenico/prode_mundial.git repo_tmp # 2. Aplicar fixes listados arriba sobre repo_tmp/app/ # 3. Borrar directorio anterior como root (node_modules tiene permisos de root) docker run --rm -v /home/proyecto/prode_mundial:/work alpine rm -rf /work/app # 4. Mover nuevo código cp -r repo_tmp/app /home/proyecto/prode_mundial/app rm -rf repo_tmp # 5. Rebuild cd /home/proyecto/prode_mundial docker compose down && docker compose up -d --build ``` ## Datos útiles - **Admin:** `admin@prode.com` / `admin2026` - **URL pública:** https://prode.beldo.duckdns.org - **Puerto host:** 3003 - **NPM proxy:** forward a `172.17.0.1:3003` - **IP container Gitea:** `172.18.0.9:3000`