Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/danitocsc/transporte-unrc-web-public/llms.txt

Use this file to discover all available pages before exploring further.

Además del despliegue en Vercel, Transporte Tijuana puede ejecutarse en cualquier servidor o máquina local mediante Docker Compose. La imagen se construye con un Dockerfile multi-stage que aprovecha la opción output: "standalone" de Next.js para producir un contenedor mínimo y autosuficiente, sin dependencias externas.

Requisitos previos

  • Docker Engine 24+ y Docker Compose v2
  • El repositorio clonado localmente

Arquitectura del servicio

El archivo docker-compose.yml define un único servicio llamado web conectado a una red interna dedicada:
services:
  web:
    build:
      context: ./web
    container_name: transporte-web
    restart: unless-stopped
    environment:
      NODE_ENV: production
      PORT: 3000
      HOSTNAME: 0.0.0.0
    networks:
      - transporte-net
    healthcheck:
      test: ["CMD", "node", "-e", "require('http').get('http://localhost:3000/api/health', (r) => r.statusCode === 200 ? process.exit(0) : process.exit(1))"]
      interval: 30s
      timeout: 10s
      retries: 3

networks:
  transporte-net:
    name: transporte-net

Propiedades del servicio web

PropiedadValorDescripción
container_nametransporte-webNombre fijo del contenedor
restartunless-stoppedSe reinicia automáticamente salvo que se detenga de forma explícita
NODE_ENVproductionActiva las optimizaciones de producción de Node.js y Next.js
PORT3000Puerto en el que el servidor Node.js escucha dentro del contenedor
HOSTNAME0.0.0.0El servidor acepta conexiones en todas las interfaces de red del contenedor
Redtransporte-netRed bridge interna aislada del resto del host

Healthcheck

Docker comprueba la salud del contenedor llamando al endpoint /api/health cada 30 segundos. Si el servidor responde con HTTP 200, el contenedor se marca como healthy; de lo contrario, Docker reintenta hasta 3 veces (timeout de 10 s por intento) antes de marcarlo como unhealthy.
interval: 30s  →  se verifica cada 30 segundos
timeout:  10s  →  la comprobación se cancela si tarda más de 10 s
retries:   3   →  3 fallos consecutivos marcan el contenedor como unhealthy

Dockerfile multi-stage

El Dockerfile ubicado en web/ usa tres stages para minimizar el tamaño final de la imagen:
FROM node:20-alpine AS deps
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci

FROM node:20-alpine AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN npm run build

FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
ENV PORT=3000
ENV HOSTNAME=0.0.0.0

COPY --from=builder /app/public ./public
COPY --from=builder /app/.next/standalone ./
COPY --from=builder /app/.next/static ./.next/static

EXPOSE 3000

CMD ["node", "server.js"]
StageBaseResponsabilidad
depsnode:20-alpineInstala dependencias de producción con npm ci
buildernode:20-alpineEjecuta next build y genera .next/standalone
runnernode:20-alpineImagen final mínima: solo los artefactos necesarios para ejecutar el servidor
La clave del stage runner es la opción output: "standalone" de next.config.ts. Next.js genera un directorio .next/standalone con el servidor Node.js (server.js) y todas las dependencias copiadas de node_modules, de modo que el contenedor final no necesita instalar paquetes en tiempo de ejecución. Los archivos estáticos se copian por separado desde .next/static.

Comandos de operación

# Construye la imagen y levanta el contenedor en background
docker compose up --build -d

Acceso desde el host

Por defecto, el docker-compose.yml no expone el puerto 3000 al host — el servicio solo es accesible dentro de la red transporte-net. Esto es intencionado para entornos donde un proxy inverso (por ejemplo, Nginx o Traefik) se conecta a la misma red Docker y termina las conexiones externas.
Si necesitas acceder directamente al contenedor desde el navegador de tu máquina (por ejemplo, para pruebas locales), agrega una sección ports al servicio web en tu docker-compose.yml:
services:
  web:
    # ...
    ports:
      - "3000:3000"
Con esto, http://localhost:3000 apuntará al servidor Next.js dentro del contenedor.
No expongas el puerto 3000 directamente a Internet en un entorno de producción. Utiliza un proxy inverso que gestione TLS y los encabezados de seguridad adecuados.

Build docs developers (and LLMs) love