Compare commits

..
Author SHA1 Message Date
devops 5c47a39579 fix(docs-portal): remediar CVE CRITICAL en libssl3/libcrypto3 (Alpine)
Build and Push Docs Portal / Escaneo de Secretos (Gitleaks) (push) Successful in 21s
Build and Push Docs Portal / Construir y publicar Docs Portal (push) In progress
Run 144 de deploy-docs.yaml encontro un CVE CRITICAL real
(CVE-2026-31789, heap buffer overflow en OpenSSL) en libssl3/libcrypto3
de la base nginx:1.27-alpine, con fix ya publicado por Alpine
(3.3.3-r0 -> 3.3.7-r0). Se agrega apk upgrade puntual de esos dos
paquetes en el Dockerfile. Verificado localmente: docker build OK +
Trivy real en exit 0 (0 vulnerabilidades).
2026-08-15 14:43:52 -05:00
devops 3ee7171178 Merge: incorporar promocion GitOps automatica de Medusa v1.0.108
Build and Push Docs Portal / Escaneo de Secretos (Gitleaks) (push) Successful in 1m27s
Build and Push Docs Portal / Construir y publicar Docs Portal (push) Failing after 4m56s
2026-08-15 14:30:52 -05:00
devops 81c0f99e00 Merge fix/devsecops-docs-portal: pipeline de seguridad para docs-portal 2026-08-15 14:30:37 -05:00
gitea-actions 38722b97a8 chore(gitops): deploy Medusa v1.0.108 [skip ci] 2026-08-15 19:28:44 +00:00
devops 5fc86e6ef4 chore: reintentar pipeline de commerce-backend (run 107 murio por reinicio de Gitea, no por el pipeline)
Build and Push Medusa / Escaneo de Secretos (Gitleaks) (push) Successful in 20s
Build and Push Medusa / Construir y publicar Medusa (push) Successful in 10m59s
2026-08-15 14:17:18 -05:00
devops 93f071c175 Merge fix/devsecops-medusa-cve-remediation: remediacion CVE + excepcion documentada
Build and Push Medusa / Escaneo de Secretos (Gitleaks) (push) Successful in 21s
Build and Push Medusa / Construir y publicar Medusa (push) Failing after 22m14s
2026-08-15 13:50:09 -05:00
devops 0c1076eda0 fix(commerce-backend): remediar 3/5 CVE CRITICAL, documentar excepcion para 2
Run 138 de build-medusa.yaml encontro 5 CVE CRITICAL reales (no falsos
positivos) al escanear la imagen con Trivy:

Remediados en el Dockerfile (verificado localmente con Trivy real,
exit 0):
- CVE-2026-33845 / CVE-2026-42010 (libgnutls30, base Debian): apt
  upgrade puntual del paquete.
- CVE-2026-59873 (tar vendorizado dentro del npm CLI global de la
  imagen base node:*-slim): se elimina /usr/local/lib/node_modules/npm
  completo -- no es una dependencia real del proyecto (el CMD nunca
  invoca npm en runtime), asi que no hay nada que "actualizar".

Documentados como excepcion en workloads/commerce-backend/.trivyignore
(con --ignorefile solo en este workflow, no afecta a build.yaml ni
deploy-docs.yaml):
- CVE-2024-24790 / CVE-2025-68121 (Go stdlib embebido en el binario de
  esbuild que trae [email protected], dependencia interna de
  @medusajs/admin-sdk). Se probo el fix real (override de esbuild a
  una version mas nueva) y rompio el build del admin panel --
  [email protected] fija "esbuild: ^0.21.3" como dependencia directa, y
  esbuild >=0.24 cambio el manejo de targets de transpilacion que vite
  5 espera. No existe un patch dentro de la serie 0.21.x con un Go
  toolchain mas nuevo. Requiere subir @medusajs/admin-sdk/vite en un
  cambio aparte, fuera de alcance de este pipeline de seguridad.
2026-08-15 13:49:51 -05:00
devops 80d99f9f3f Merge fix/devsecops-trivy-timeout: fix real tras primer intento fallido (run 136)
Build and Push Medusa / Escaneo de Secretos (Gitleaks) (push) Successful in 20s
Build and Push Medusa / Construir y publicar Medusa (push) Failing after 15m1s
2026-08-15 13:10:55 -05:00
devops 81f01c7ade fix(devsecops): timeout de 15m en Trivy imagen para commerce-backend
El run 136 (primer intento de este pipeline, recien mergeado a main)
fallo en el paso "Escanear imagen (Trivy) - CRITICAL bloquea" con
"context deadline exceeded" a los 4m52s -- no una CVE, un timeout de
herramienta. Causa: el default de Trivy (5m) no alcanza para escanear
(vuln + secret scan de la imagen completa) el node_modules de Medusa
v2, mas pesado que el del frontend. Se agrega --timeout 15m0s a ambos
escaneos de imagen (CRITICAL y HIGH).
2026-08-15 13:09:47 -05:00
devops 27a1e75a4c fix(devsecops): timeout de 15m en Trivy imagen para docs-portal
Preventivo: mismo comando que en commerce-backend, donde se vio en
vivo que el timeout default de Trivy (5m) no alcanza en este host bajo
carga ("context deadline exceeded" a los 4m52s, run 136). Ver
fix/devsecops-trivy-timeout para el fix real en commerce-backend.
2026-08-15 13:08:24 -05:00
devops 45312fc189 Merge fix/devsecops-commerce-backend: pipeline de seguridad para commerce-backend
Build and Push Medusa / Escaneo de Secretos (Gitleaks) (push) Successful in 42s
Build and Push Medusa / Construir y publicar Medusa (push) Failing after 9m31s
2026-08-15 12:51:41 -05:00
devops 1bcae76102 feat(devsecops): replicar pipeline de seguridad a docs-portal
Agrega a deploy-docs.yaml las mismas 6 etapas ya validadas en
build.yaml (run 134, frontend): Gitleaks, Trivy IaC, Semgrep (SAST),
Trivy imagen, Syft (SBOM) y Cosign (firma + verificación).

Adaptaciones de stack:
- Trivy IaC escanea todo workloads/docs-portal/ (varios manifiestos
  K8s separados: deployment/service/ingress), no un MANIFEST_FILE
  único como el frontend.
- Semgrep usa p/python + p/security-audit (no hay TypeScript/React
  acá) -- docs-portal no tiene código de aplicación propio hoy (solo
  Markdown + config de MkDocs), así que 0 hallazgos es el resultado
  esperado; el stage queda listo para el día que se agregue un
  hook/plugin en Python.

Mismos umbrales que el resto: Trivy bloquea en CRITICAL, Semgrep en
modo auditoría. Reutiliza el mismo par de llaves Cosign (secrets ya
existentes a nivel de repo); se agrega workloads/docs-portal/cosign.pub.
2026-08-15 12:47:43 -05:00
7 changed files with 356 additions and 8 deletions
+22
View File
@@ -1,5 +1,11 @@
name: Build and Push Medusa name: Build and Push Medusa
# Retrigger: el run 107 (con la remediacion de CVEs ya mergeada) fue
# cancelado a mitad de camino porque el stack de Gitea (gitea +
# gitea-runner) se reinicio solo durante el build -- no por el
# contenido del pipeline. Ver hallazgo de contencion de recursos en
# docs/playbooks.
# Sin anchors/aliases de YAML (&x / *x) a propósito -- el parser de # Sin anchors/aliases de YAML (&x / *x) a propósito -- el parser de
# workflows de Gitea Actions no los resuelve en el bloque "on:" y # workflows de Gitea Actions no los resuelve en el bloque "on:" y
# descarta el archivo completo con "unknown on type". Las dos listas de # descarta el archivo completo con "unknown on type". Las dos listas de
@@ -211,6 +217,19 @@ jobs:
# CRITICAL bloquea el pipeline: no se sube una imagen con una CVE # CRITICAL bloquea el pipeline: no se sube una imagen con una CVE
# crítica conocida y con fix disponible. # crítica conocida y con fix disponible.
# --timeout 15m0s: el default de Trivy (5m) no alcanza para esta
# imagen -- a diferencia del frontend, commerce-backend arrastra
# el node_modules completo de Medusa v2 (framework + admin-sdk +
# cli), muchos más archivos que escanear tanto para vulnerabilidades
# como para el escaneo de secretos que Trivy corre por default
# dentro de la imagen. Visto en vivo: "context deadline exceeded"
# a los 4m52s con el timeout default, en un run donde el host
# venía de terminar el docker build (ver hallazgo de rendimiento
# de Gitea/runner en docs/playbooks).
# --ignorefile: excepciones puntuales y documentadas (ver
# workloads/commerce-backend/.trivyignore) para CVEs sin fix de
# bajo riesgo disponible hoy. No debilita el gate en general --
# cualquier otra CRITICAL sigue bloqueando igual.
- name: Escanear imagen (Trivy) — CRITICAL bloquea - name: Escanear imagen (Trivy) — CRITICAL bloquea
shell: bash shell: bash
run: | run: |
@@ -219,6 +238,8 @@ jobs:
--severity CRITICAL \ --severity CRITICAL \
--exit-code 1 \ --exit-code 1 \
--ignore-unfixed \ --ignore-unfixed \
--timeout 15m0s \
--ignorefile "${APP_DIR}/.trivyignore" \
"${IMAGE_NAME}:${{ steps.vars.outputs.VERSION }}" "${IMAGE_NAME}:${{ steps.vars.outputs.VERSION }}"
# HIGH solo informa por ahora — mismo criterio que el frontend. # HIGH solo informa por ahora — mismo criterio que el frontend.
@@ -230,6 +251,7 @@ jobs:
--severity HIGH \ --severity HIGH \
--exit-code 0 \ --exit-code 0 \
--ignore-unfixed \ --ignore-unfixed \
--timeout 15m0s \
"${IMAGE_NAME}:${{ steps.vars.outputs.VERSION }}" "${IMAGE_NAME}:${{ steps.vars.outputs.VERSION }}"
- name: Instalar Syft - name: Instalar Syft
+266 -6
View File
@@ -1,5 +1,9 @@
name: Build and Push Docs Portal name: Build and Push Docs Portal
# Sin anchors/aliases de YAML (&x / *x) a propósito -- el parser de
# workflows de Gitea Actions no los resuelve en el bloque "on:" y
# descarta el archivo completo con "unknown on type". Las dos listas de
# paths quedan duplicadas literalmente (mismo criterio que build.yaml).
on: on:
push: push:
branches: branches:
@@ -10,14 +14,71 @@ on:
- 'workloads/docs-portal/requirements.txt' - 'workloads/docs-portal/requirements.txt'
- 'workloads/docs-portal/Dockerfile' - 'workloads/docs-portal/Dockerfile'
- '.gitea/workflows/deploy-docs.yaml' - '.gitea/workflows/deploy-docs.yaml'
pull_request:
branches:
- main
paths:
- 'workloads/docs-portal/docs/**'
- 'workloads/docs-portal/mkdocs.yml'
- 'workloads/docs-portal/requirements.txt'
- 'workloads/docs-portal/Dockerfile'
- '.gitea/workflows/deploy-docs.yaml'
permissions: permissions:
contents: write contents: write
packages: write packages: write
jobs: jobs:
# Corre en push y en pull_request, siempre antes que build. Mismo
# criterio que el frontend: si hay un secreto commiteado, el job build
# nunca arranca (needs: gitleaks).
gitleaks:
name: Escaneo de Secretos (Gitleaks)
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Checkout del código
uses: actions/checkout@v3
with:
fetch-depth: 1
- name: Instalar Gitleaks
shell: bash
run: |
set -euo pipefail
GITLEAKS_VERSION="8.21.2"
curl -sSfL \
"https://github.com/gitleaks/gitleaks/releases/download/v${GITLEAKS_VERSION}/gitleaks_${GITLEAKS_VERSION}_linux_x64.tar.gz" \
-o /tmp/gitleaks.tar.gz
tar -xzf /tmp/gitleaks.tar.gz -C /tmp gitleaks
chmod +x /tmp/gitleaks
/tmp/gitleaks version
- name: Escanear secretos en el árbol de archivos
shell: bash
run: |
set -euo pipefail
/tmp/gitleaks detect \
--source=workloads/docs-portal \
--no-git \
--redact \
--report-format=json \
--report-path=gitleaks-report.json \
--exit-code=1
- name: Publicar reporte de Gitleaks
if: always()
uses: actions/upload-artifact@v3
with:
name: gitleaks-report
path: gitleaks-report.json
if-no-files-found: ignore
build: build:
name: Construir y publicar Docs Portal name: Construir y publicar Docs Portal
needs: gitleaks
if: github.event_name == 'push'
runs-on: ubuntu-latest runs-on: ubuntu-latest
timeout-minutes: 20 timeout-minutes: 20
@@ -56,6 +117,83 @@ jobs:
exit 1 exit 1
} }
- name: Instalar Trivy
shell: bash
run: |
set -euo pipefail
TRIVY_VERSION="0.74.0"
curl -sSfL \
"https://github.com/aquasecurity/trivy/releases/download/v${TRIVY_VERSION}/trivy_${TRIVY_VERSION}_Linux-64bit.tar.gz" \
-o /tmp/trivy.tar.gz
tar -xzf /tmp/trivy.tar.gz -C /tmp trivy
chmod +x /tmp/trivy
/tmp/trivy version
# Escanea todo el directorio de la app (Deployment, Service,
# Ingress y Dockerfile), no un único MANIFEST_FILE como el
# frontend -- docs-portal tiene varios manifiestos K8s separados
# (deployment.yaml, service.yaml, ingress.yaml) en vez de uno
# solo, así que un único archivo dejaría fuera la mayoría del
# directorio. Informativo por ahora, mismo criterio que el resto.
- name: Escanear manifiestos Kubernetes (Trivy IaC)
shell: bash
run: |
set -euo pipefail
/tmp/trivy config \
--severity CRITICAL,HIGH,MEDIUM \
--exit-code 0 \
"${APP_DIR}"
# Mismo motivo que en build.yaml: sibling containers, no
# Docker-in-Docker -- Semgrep corre nativo en un venv.
- name: Instalar Semgrep
shell: bash
run: |
set -euo pipefail
python3 -m venv /tmp/semgrep-venv
/tmp/semgrep-venv/bin/pip install --quiet "semgrep==1.173.0"
/tmp/semgrep-venv/bin/semgrep --version
# Ruleset adaptado: docs-portal no tiene código de aplicación
# propio (es contenido Markdown + configuración de MkDocs), así
# que ni p/typescript ni p/react/p/nextjs del frontend aplican
# acá. Se usa p/python -- el único código ejecutable real en este
# directorio sería un hook/plugin de Python de MkDocs, si algún
# día se agrega uno. Hoy no hay ningún archivo .py en
# workloads/docs-portal, así que 0 hallazgos es el resultado
# esperado, no un falso negativo -- se deja el stage para que
# detecte código nuevo el día que se agregue, sin tener que
# recordar volver a tocar el pipeline. Modo auditoría, igual que
# el resto: no bloquea.
- name: Escaneo SAST (Semgrep) — modo auditoría, no bloquea
shell: bash
run: |
set -euo pipefail
/tmp/semgrep-venv/bin/semgrep scan \
--config=p/python \
--config=p/security-audit \
--json \
--output=semgrep-report.json \
"${APP_DIR}"
echo "=== Resumen Semgrep ==="
/tmp/semgrep-venv/bin/python -c "
import json
data = json.load(open('semgrep-report.json'))
results = data.get('results', [])
print(f'Hallazgos: {len(results)}')
for r in results:
print(f\" [{r['extra']['severity']}] {r['check_id']} - {r['path']}:{r['start']['line']}\")
"
- name: Publicar reporte de Semgrep
if: always()
uses: actions/upload-artifact@v3
with:
name: semgrep-report
path: semgrep-report.json
if-no-files-found: ignore
- name: Login en Gitea Registry - name: Login en Gitea Registry
uses: docker/login-action@v2 uses: docker/login-action@v2
with: with:
@@ -64,18 +202,129 @@ jobs:
password: ${{ secrets.REGISTRY_PASSWORD }} password: ${{ secrets.REGISTRY_PASSWORD }}
logout: true logout: true
# mkdocs build --strict corre dentro del propio Dockerfile (stage de # mkdocs build --strict corre dentro del propio Dockerfile (stage
# build), así que un nav/link roto rompe este paso antes de publicar. # de build), así que un nav/link roto rompe este paso antes de
- name: Construir y subir imagen # publicar. push: false / load: true -- igual que el frontend, la
# imagen queda cargada localmente para escanearla con Trivy antes
# de subirla.
- name: Construir Imagen
uses: docker/build-push-action@v4 uses: docker/build-push-action@v4
with: with:
context: workloads/docs-portal/ context: ${{ env.APP_DIR }}/
file: workloads/docs-portal/Dockerfile file: ${{ env.APP_DIR }}/Dockerfile
push: true push: false
load: true
tags: | tags: |
${{ env.IMAGE_NAME }}:${{ steps.vars.outputs.VERSION }} ${{ env.IMAGE_NAME }}:${{ steps.vars.outputs.VERSION }}
${{ env.IMAGE_NAME }}:latest ${{ env.IMAGE_NAME }}:latest
# CRITICAL bloquea el pipeline: no se sube una imagen con una CVE
# crítica conocida y con fix disponible.
# --timeout 15m0s: agregado preventivamente. Se vio en vivo, al
# correr este mismo comando sin el flag en commerce-backend, que
# el default de Trivy (5m) no alcanza en este host bajo carga
# ("context deadline exceeded" a los 4m52s) -- la imagen de
# docs-portal es chica, pero no cuesta nada blindar el mismo
# comando en los tres pipelines.
- name: Escanear imagen (Trivy) — CRITICAL bloquea
shell: bash
run: |
set -euo pipefail
/tmp/trivy image \
--severity CRITICAL \
--exit-code 1 \
--ignore-unfixed \
--timeout 15m0s \
"${IMAGE_NAME}:${{ steps.vars.outputs.VERSION }}"
# HIGH solo informa por ahora — mismo criterio que el resto.
- name: Escanear imagen (Trivy) — HIGH informativo
shell: bash
run: |
set -euo pipefail
/tmp/trivy image \
--severity HIGH \
--exit-code 0 \
--ignore-unfixed \
--timeout 15m0s \
"${IMAGE_NAME}:${{ steps.vars.outputs.VERSION }}"
- name: Instalar Syft
shell: bash
run: |
set -euo pipefail
SYFT_VERSION="1.51.0"
curl -sSfL \
"https://github.com/anchore/syft/releases/download/v${SYFT_VERSION}/syft_${SYFT_VERSION}_linux_amd64.tar.gz" \
-o /tmp/syft.tar.gz
tar -xzf /tmp/syft.tar.gz -C /tmp syft
chmod +x /tmp/syft
/tmp/syft version
- name: Generar SBOM (Syft)
shell: bash
run: |
set -euo pipefail
/tmp/syft "${IMAGE_NAME}:${{ steps.vars.outputs.VERSION }}" \
-o cyclonedx-json=sbom.cdx.json \
-o spdx-json=sbom.spdx.json
- name: Publicar SBOM
if: always()
uses: actions/upload-artifact@v3
with:
name: sbom-${{ steps.vars.outputs.VERSION }}
path: |
sbom.cdx.json
sbom.spdx.json
if-no-files-found: ignore
# Login ya se hizo arriba; recién acá se sube, después de que la
# imagen pasó el gate de CRITICAL.
- name: Subir Imagen al Registry
shell: bash
run: |
set -euo pipefail
docker push "${IMAGE_NAME}:${{ steps.vars.outputs.VERSION }}"
docker push "${IMAGE_NAME}:latest"
- name: Instalar Cosign
shell: bash
run: |
set -euo pipefail
COSIGN_VERSION="3.1.3"
curl -sSfL \
"https://github.com/sigstore/cosign/releases/download/v${COSIGN_VERSION}/cosign-linux-amd64" \
-o /tmp/cosign
chmod +x /tmp/cosign
/tmp/cosign version
# Mismo par de llaves que el frontend y commerce-backend (secrets
# ya existentes a nivel de repo). Llave pública commiteada en
# workloads/docs-portal/cosign.pub.
- name: Firmar Imagen (Cosign)
shell: bash
env:
COSIGN_PRIVATE_KEY: ${{ secrets.COSIGN_PRIVATE_KEY }}
COSIGN_PASSWORD: ${{ secrets.COSIGN_PASSWORD }}
run: |
set -euo pipefail
/tmp/cosign sign \
--key env://COSIGN_PRIVATE_KEY \
--use-signing-config=false \
--tlog-upload=false \
--yes \
"${IMAGE_NAME}:${{ steps.vars.outputs.VERSION }}"
- name: Verificar Firma (smoke test)
shell: bash
run: |
set -euo pipefail
/tmp/cosign verify \
--key "${APP_DIR}/cosign.pub" \
--insecure-ignore-tlog=true \
"${IMAGE_NAME}:${{ steps.vars.outputs.VERSION }}"
- name: Verificar promoción segura - name: Verificar promoción segura
id: promotion id: promotion
shell: bash shell: bash
@@ -123,3 +372,14 @@ jobs:
-m "chore(gitops): deploy Docs Portal ${VERSION} [skip ci]" -m "chore(gitops): deploy Docs Portal ${VERSION} [skip ci]"
git push origin HEAD:main git push origin HEAD:main
- name: Resumen del pipeline
if: always()
shell: bash
run: |
echo "========================================"
echo "CruzCloud Lab Docs Portal"
echo "Versión: ${{ steps.vars.outputs.VERSION }}"
echo "Commit: ${{ github.sha }}"
echo "Promoción GitOps: ${{ steps.promotion.outputs.promote }}"
echo "========================================"
+34
View File
@@ -0,0 +1,34 @@
# Excepciones documentadas al gate CRITICAL de Trivy (imagen) para
# commerce-backend. Cada entrada requiere justificación y fecha -- no
# es un mecanismo para silenciar hallazgos sin revisar.
#
# CVE-2024-24790 / CVE-2025-68121 (golang stdlib, gobinary):
# Van embebidas en el binario precompilado de esbuild
# (app/node_modules/@esbuild/linux-x64/bin/esbuild), traído
# transitivamente por [email protected], que a su vez lo trae
# @medusajs/admin-sdk para bundlear el panel de admin en build time.
# No es un binario que se ejecute en runtime del contenedor (el CMD
# corre "node .../medusa/cli start", nunca esbuild).
#
# Se intentó el fix real (bump de esbuild a una versión compilada con
# un Go toolchain más nuevo, override en package.json) y rompió el
# build del admin: [email protected] declara "esbuild: ^0.21.3" como
# dependencia directa (no rango amplio), y esbuild >=0.24 cambió el
# manejo de la lista de "target" de transpilación que vite 5 pasa
# internamente -- build.yaml falló con
# "Transforming destructuring... not supported yet" /
# PLUGIN_ERROR en vite:esbuild-transpile. No existe un patch dentro
# de la propia serie 0.21.x (0.21.5 ya es la última) que incluya un
# Go toolchain con estas CVEs corregidas.
#
# Domesticar esto de verdad requiere subir @medusajs/admin-sdk (y por
# lo tanto vite) a una versión que dependa de un esbuild más nuevo --
# fuera de alcance de este pipeline de seguridad, queda como TODO de
# dependencias en un cambio aparte, no bloqueado por CI mientras
# tanto.
#
# Documentado: 2026-08-15. Revisar en cada bump de @medusajs/* por si
# ya arrastra una versión de vite/esbuild más nueva y esta excepción
# deja de ser necesaria.
CVE-2024-24790
CVE-2025-68121
+20
View File
@@ -59,6 +59,26 @@ ENV NODE_ENV=production \
PORT=9000 \ PORT=9000 \
NPM_CONFIG_UPDATE_NOTIFIER=false NPM_CONFIG_UPDATE_NOTIFIER=false
#
# libgnutls30 en la base node:22.18.0-bookworm-slim trae dos CVE
# CRITICAL con fix ya publicado por Debian (CVE-2026-33845,
# CVE-2026-42010) -- detectado por el gate de Trivy imagen del
# pipeline (run 138). Solo se actualiza este paquete puntual, no toda
# la imagen, para minimizar el diff de superficie de la base.
RUN apt-get update \
&& apt-get upgrade -y libgnutls30 \
&& rm -rf /var/lib/apt/lists/*
#
# El CLI global de npm que trae la imagen base node:*-slim no se usa en
# runtime (el CMD invoca a Medusa directo con `node`, nunca `npm`) y
# arrastra su propia copia vendorizada de `tar` con un CVE CRITICAL
# (CVE-2026-59873, detectado por Trivy en
# usr/local/lib/node_modules/npm/node_modules/tar). Se elimina en vez
# de forzar una versión: no es una dependencia real de este proyecto,
# así que no hay nada que "actualizar" -- solo superficie sin uso.
RUN rm -rf /usr/local/lib/node_modules/npm
# #
# Solo lo necesario para ejecutar Medusa # Solo lo necesario para ejecutar Medusa
# #
+8
View File
@@ -16,6 +16,14 @@ RUN mkdocs build --strict
# --- Stage 2: sirve el sitio estático generado con nginx --- # --- Stage 2: sirve el sitio estático generado con nginx ---
FROM nginx:1.27-alpine FROM nginx:1.27-alpine
# libssl3/libcrypto3 de la base nginx:1.27-alpine traen un CVE CRITICAL
# con fix ya publicado por Alpine (CVE-2026-31789, heap buffer overflow
# en OpenSSL) -- detectado por el gate de Trivy imagen del pipeline
# (run 144). Solo se actualizan estos dos paquetes puntuales.
RUN apk update \
&& apk upgrade --no-cache libssl3 libcrypto3 \
&& rm -rf /var/cache/apk/*
COPY --from=build /site/site /usr/share/nginx/html COPY --from=build /site/site /usr/share/nginx/html
EXPOSE 80 EXPOSE 80
+4
View File
@@ -0,0 +1,4 @@
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEhjg9/nC0u+iEANiHkVJY8iN+LZo+
VFMF7XG/oC64W3/SfwrPgt+ZIqF6t+ceyrNuEgugajvUdpigz1PHEqQKLw==
-----END PUBLIC KEY-----
+2 -2
View File
@@ -52,7 +52,7 @@ spec:
memory: 64Mi memory: 64Mi
- name: migrations - name: migrations
image: gitea.cruzcloud.net/devops/ecommerce-medusa:v1.0.92 image: gitea.cruzcloud.net/devops/ecommerce-medusa:v1.0.108
imagePullPolicy: IfNotPresent imagePullPolicy: IfNotPresent
command: command:
- npx - npx
@@ -73,7 +73,7 @@ spec:
containers: containers:
- name: medusa - name: medusa
image: gitea.cruzcloud.net/devops/ecommerce-medusa:v1.0.92 image: gitea.cruzcloud.net/devops/ecommerce-medusa:v1.0.108
imagePullPolicy: IfNotPresent imagePullPolicy: IfNotPresent
envFrom: envFrom:
- configMapRef: - configMapRef: