Add DEPLOY.md with homelab workarounds
This commit is contained in:
@@ -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:<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
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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`
|
||||||
Reference in New Issue
Block a user