Saltar a contenido

Docker

Deployment del middleware usando Docker.

Dockerfile

FROM node:24-alpine AS builder
WORKDIR /app

RUN corepack enable && corepack prepare pnpm@latest --activate

COPY package.json pnpm-lock.yaml ./
RUN pnpm install --frozen-lockfile

COPY tsconfig.json ./
COPY src ./src
RUN pnpm run build

FROM node:24-alpine
WORKDIR /app

# Instalar tzdata y configurar zona horaria
RUN apk add --no-cache tzdata \
    && cp /usr/share/zoneinfo/America/Argentina/Buenos_Aires /etc/localtime \
    && echo "America/Argentina/Buenos_Aires" > /etc/timezone \
    && apk del tzdata

ENV TZ=America/Argentina/Buenos_Aires

RUN corepack enable && corepack prepare pnpm@latest --activate

COPY package.json pnpm-lock.yaml ./
RUN pnpm install --prod --frozen-lockfile && pnpm store prune

COPY --from=builder /app/dist ./dist

RUN addgroup -g 1001 -S nodejs && adduser -S nodejs -u 1001 -G nodejs
USER nodejs

EXPOSE 8080
CMD ["node", "dist/index.js"]

Arquitectura Multi-Stage

flowchart LR
    subgraph Stage1["Stage 1: Builder"]
        A[Node 24 Alpine] --> B[pnpm install]
        B --> C[Compilar TS]
        C --> D[dist/]
    end

    subgraph Stage2["Stage 2: Runtime"]
        E[Node 24 Alpine] --> F[pnpm install --prod]
        F --> G[Copiar dist/]
        G --> H[Usuario nodejs]
    end

    D --> G

Beneficios:

  • Imagen final más pequeña (sin devDependencies)
  • Sin código fuente TypeScript
  • Usuario no-root por seguridad

Docker Compose

version: '3.8'
services:
  sync:
    image: mundoit/erp-wms-sync:latest
    container_name: rodamar_sync
    env_file:
      - .env
    ports:
      - "127.0.0.1:8080:8080"
    networks:
      - rodamar_backend
    restart: always
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

networks:
  rodamar_backend:
    external: true

Comando Docker Run

Si no usás docker-compose (ej: Ubuntu 16 con docker-compose roto):

docker run -d \
  --name rodamar_sync \
  --network rodamar_backend \
  --restart always \
  --env-file .env \
  -p 127.0.0.1:8080:8080 \
  --log-driver json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  mundoit/erp-wms-sync:latest

Parámetros Importantes

Parámetro Valor Descripción
--name rodamar_sync Nombre del container
--network rodamar_backend Red Docker compartida
--restart always Reiniciar automáticamente
--env-file .env Variables de entorno
-p 127.0.0.1:8080:8080 Puerto solo local (SSH tunnel)
--log-opt max-size 10m Máximo 10MB por archivo
--log-opt max-file 3 Máximo 3 archivos (30MB total)

Script de Actualización

#!/bin/bash
# update-sync.sh

set -e

IMAGE="mundoit/erp-wms-sync:latest"
CONTAINER="rodamar_sync"
NETWORK="rodamar_backend"
ENV_FILE=".env"

echo "🔄 Pulling latest image..."
docker pull $IMAGE

echo "🛑 Stopping and removing old container..."
docker rm -f $CONTAINER 2>/dev/null || true

echo "🚀 Starting new container..."
docker run -d \
  --name $CONTAINER \
  --network $NETWORK \
  --restart always \
  --env-file $ENV_FILE \
  -p 127.0.0.1:8080:8080 \
  --log-driver json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  $IMAGE

echo "✅ Done! Checking status..."
docker ps | grep $CONTAINER

echo ""
echo "📋 Logs: docker logs -f $CONTAINER"

Uso:

chmod +x update-sync.sh
./update-sync.sh

Comandos Útiles

Gestión del Container

# Ver estado
docker ps | grep rodamar_sync

# Ver logs en tiempo real
docker logs -f rodamar_sync

# Ver logs con formato legible
docker logs rodamar_sync 2>&1 | npx pino-pretty

# Últimas 100 líneas
docker logs --tail 100 rodamar_sync

# Reiniciar
docker restart rodamar_sync

# Parar
docker stop rodamar_sync

# Iniciar
docker start rodamar_sync

# Eliminar
docker rm -f rodamar_sync

Debugging

# Entrar al container
docker exec -it rodamar_sync sh

# Ver uso de recursos
docker stats rodamar_sync

# Ver configuración completa
docker inspect rodamar_sync

# Ver variables de entorno
docker exec rodamar_sync env

# Ver network
docker network inspect rodamar_backend

Redis en Docker

Si Redis también está en Docker:

# Verificar Redis
docker ps | grep redis

# Actualizar Redis a versión 8
docker stop rodamar_redis_1
docker run -d \
  --name rodamar_redis_new \
  --network rodamar_backend \
  --network-alias redis \
  -v datos_redis:/data \
  --restart always \
  redis:8-alpine \
  redis-server --appendonly yes

# Verificar
docker exec rodamar_redis_new redis-cli PING

Migración de Redis

Al actualizar Redis, usar el mismo volumen de datos para mantener los hashes.

Network

El middleware debe estar en la misma red Docker que Redis y otros servicios:

# Ver redes disponibles
docker network ls

# Crear red si no existe
docker network create rodamar_backend

# Conectar container existente a red
docker network connect rodamar_backend rodamar_sync

Acceso Remoto

El puerto está bindeado a 127.0.0.1 (solo localhost). Para acceder remotamente:

# SSH tunnel desde tu máquina local
ssh -L 8080:127.0.0.1:8080 usuario@servidor

# Luego abrir en navegador local
open http://localhost:8080/admin

Rotación de Logs

Con max-size: 10m y max-file: 3:

rodamar_sync-json.log      (actual, hasta 10MB)
rodamar_sync-json.log.1    (rotado)
rodamar_sync-json.log.2    (más antiguo)

Total máximo: ~30MB de logs.

Monitoreo

Health Check

# Verificar que responde
curl http://localhost:8080/health

# Desde el servidor
docker exec rodamar_sync wget -qO- http://localhost:8080/health

Recursos

# Ver CPU y memoria
docker stats rodamar_sync --no-stream

# Output:
# CONTAINER     CPU %   MEM USAGE / LIMIT     MEM %
# rodamar_sync  0.50%   125.4MiB / 7.775GiB   1.58%

Troubleshooting

Container no inicia

# Ver logs de inicio
docker logs rodamar_sync

# Errores comunes:
# - Redis no accesible
# - Variables de entorno faltantes
# - Puerto ya en uso

No puede conectar a Redis

# Verificar que Redis está en la misma network
docker network inspect rodamar_backend | grep -A5 redis

# Verificar conectividad
docker exec rodamar_sync ping redis

No puede conectar a SQL Server

# Verificar que puede resolver el host
docker exec rodamar_sync nslookup 192.168.0.50

# Verificar puerto
docker exec rodamar_sync nc -zv 192.168.0.50 1433