Files

3.1 KiB

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:

/** @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:

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:

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:

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:

docker run --rm \
  --network prode_mundial_default \
  -v /home/proyecto/prode_mundial/app:/app \
  -w /app \
  -e DATABASE_URL="postgresql://prode:<password>@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

# 1. Clonar repo (Gitea corre en container, no en localhost:3000)
cd /home/proyecto/prode_mundial
git clone http://jpbeldomenico:<token>@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