From a774c218efd5c39745501b0d25d4061e22913ac6 Mon Sep 17 00:00:00 2001 From: dmolinari Date: Wed, 29 Oct 2025 14:33:40 -0300 Subject: [PATCH] Feat Docker Files --- backend/Dockerfile | 26 ++++++++++++ backend/src/Titulares.Api/appsettings.json | 2 +- docker-compose.yml | 48 ++++++++++++++++++++++ frontend/Dockerfile | 25 +++++++++++ frontend/proxy/nginx.conf | 40 ++++++++++++++++++ 5 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 backend/Dockerfile create mode 100644 docker-compose.yml create mode 100644 frontend/Dockerfile create mode 100644 frontend/proxy/nginx.conf diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000..70393d6 --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,26 @@ +# --- Etapa 1: Compilación (Build) --- +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build +WORKDIR /app + +# Copiar archivos de proyecto y restaurar dependencias primero para aprovechar el caché de Docker +COPY backend/src/Titulares.Api/Titulares.Api.csproj backend/src/Titulares.Api/ +RUN dotnet restore backend/src/Titulares.Api/Titulares.Api.csproj + +# Copiar el resto del código fuente del backend +COPY backend/src/ ./backend/src/ + +# Publicar la aplicación en modo Release +RUN dotnet publish backend/src/Titulares.Api/Titulares.Api.csproj -c Release -o /app/publish + +# --- Etapa 2: Imagen Final (Final) --- +FROM mcr.microsoft.com/dotnet/aspnet:9.0 +WORKDIR /app + +# Copiar solo los artefactos compilados desde la etapa de build +COPY --from=build /app/publish . + +# Exponer el puerto interno que ASP.NET Core usará por defecto en Docker +EXPOSE 8080 + +# Comando para iniciar la aplicación +ENTRYPOINT ["dotnet", "Titulares.Api.dll"] \ No newline at end of file diff --git a/backend/src/Titulares.Api/appsettings.json b/backend/src/Titulares.Api/appsettings.json index 6de4d08..39ce038 100644 --- a/backend/src/Titulares.Api/appsettings.json +++ b/backend/src/Titulares.Api/appsettings.json @@ -7,6 +7,6 @@ }, "AllowedHosts": "*", "ConnectionStrings": { - "DefaultConnection": "Server=TECNICA3;Database=TitularesDB;User Id=titularesApi;Password=PTP847Titulares;Trusted_Connection=True;TrustServerCertificate=True;" + "DefaultConnection": "Server=db-sqlserver;Database=TitularesDB;User Id=titularesApi;Password=PTP847Titulares;Trusted_Connection=True;TrustServerCertificate=True;" } } \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..d6dec4c --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,48 @@ +services: + # Servicio del Backend + titulares-api: + build: + context: . + dockerfile: backend/Dockerfile + container_name: titulares-api + restart: unless-stopped + expose: + - "8080" + networks: + - titulares-net + - shared-net # Se conecta a la red compartida para acceder a la DB + + # Servicio del Frontend + titulares-frontend: + build: + context: ./frontend + dockerfile: Dockerfile + container_name: titulares-frontend + restart: unless-stopped + expose: + - "80" + networks: + - titulares-net + + # Proxy Inverso + titulares-proxy: + image: nginx:1.25-alpine + container_name: titulares-proxy + restart: unless-stopped + volumes: + - ./frontend/proxy/nginx.conf:/etc/nginx/conf.d/default.conf + ports: + - "8905:80" # Usamos el puerto 8905 para no colisionar con otros + networks: + - titulares-net + depends_on: + - titulares-api + - titulares-frontend + +networks: + # Red interna para la comunicación entre los servicios de esta aplicación + titulares-net: + driver: bridge + # Red externa preexistente para la base de datos + shared-net: + external: true \ No newline at end of file diff --git a/frontend/Dockerfile b/frontend/Dockerfile new file mode 100644 index 0000000..56061fa --- /dev/null +++ b/frontend/Dockerfile @@ -0,0 +1,25 @@ +# --- Etapa 1: Compilación (Build) --- +FROM node:20-alpine AS build +WORKDIR /app + +# Copiar package.json y package-lock.json para instalar dependencias +COPY package*.json ./ +RUN npm install + +# Copiar el resto del código fuente del frontend +COPY . . + +# Construir la aplicación de producción +RUN npm run build + +# --- Etapa 2: Servidor de Producción (Final) --- +FROM nginx:1.25-alpine + +# Copiar los archivos estáticos construidos en la etapa anterior al directorio web de Nginx +COPY --from=build /app/dist /usr/share/nginx/html + +# Exponer el puerto 80, que es el puerto por defecto de Nginx +EXPOSE 80 + +# El comando por defecto de la imagen de Nginx se encargará de iniciar el servidor +CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file diff --git a/frontend/proxy/nginx.conf b/frontend/proxy/nginx.conf new file mode 100644 index 0000000..6b309cf --- /dev/null +++ b/frontend/proxy/nginx.conf @@ -0,0 +1,40 @@ +# Define el servidor upstream para la API, usando el nombre del servicio de Docker Compose +upstream api_server { + server titulares-api:8080; +} + +server { + listen 80; + + # Redirigir todas las peticiones que comiencen con /api/ al servicio del backend + location /api/ { + proxy_pass http://api_server; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # Cabeceras importantes para SignalR (WebSockets) + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + } + + # Redirigir todas las peticiones que comiencen con /titularesHub (para SignalR) + location /titularesHub { + proxy_pass http://api_server; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + proxy_set_header Host $host; + proxy_cache_bypass $http_upgrade; + } + + # Servir los archivos del frontend para todas las demás peticiones + location / { + root /usr/share/nginx/html; + index index.html; + # Esta línea es crucial para que el enrutamiento de React funcione correctamente (Single Page Application) + try_files $uri $uri/ /index.html; + } +} \ No newline at end of file