diff --git a/DEPLOY.md b/DEPLOY.md new file mode 100644 index 0000000..058f0eb --- /dev/null +++ b/DEPLOY.md @@ -0,0 +1,121 @@ +# 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`