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:
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