feat(ecommerce): ambiente de Staging (staging.cruzcloud.net)
Decisión del usuario 2026-09-14: dejar de validar cambios directo contra shop.cruzcloud.net (producción real). - workloads/ecommerce-staging/: overlay del frontend, mismo Dockerfile e imagen que Producción, backend compartido (Medusa/Postgres/ Meilisearch de "ecommerce" via FQDN cross-namespace medusa-svc.ecommerce.svc.cluster.local -- decisión del usuario, evita duplicar el consumo de la NAS con un backend propio para Staging). 1 réplica en vez de 2, resources mas chicos. - apps/ecommerce-staging-app.yaml + ecommerce-staging-governance-app.yaml: Applications de Argo CD para el workload y la governance (en platform-infra), mismo patrón que ecommerce-app/ecommerce-governance. - Ingress en staging.cruzcloud.net -- cubierto por el wildcard DNS *.cruzcloud.net que ya existe en Cloudflare, sin cambios de DNS. - .gitea/workflows/build.yaml: MANIFEST_FILE/KUSTOMIZE_DIR pasan a apuntar a Staging -- todo push a main promueve ahí automáticamente desde ahora. Promover a Producción (workloads/ecommerce, sin cambios en este commit) queda como acción manual aparte, ver scripts/promote-to-production.sh. Secrets commerce-storefront y gitea-registry-secret ya copiados a mano al namespace ecommerce-staging (no versionados, mismo criterio que el resto de los secrets reales del repo). Co-Authored-By: Claude Sonnet 5 <[email protected]> Claude-Session: https://claude.ai/code/session_012Y4df3Z7odr9Cg8F2nw6uV
This commit is contained in:
1 parent
5b8bac5ef1
commit
90176e36fc
8 files changed
+228
-2
No files matched your search
@@ -126,8 +126,13 @@ jobs:
|
||||
|
||||
env:
|
||||
APP_DIR: workloads/ecommerce
|
||||
MANIFEST_FILE: workloads/ecommerce/frontend/patches/deployment.yaml
|
||||
KUSTOMIZE_DIR: workloads/ecommerce/frontend
|
||||
# Cambio 2026-09-14: todo push a main promueve a STAGING
|
||||
# automaticamente (workloads/ecommerce-staging), no a Produccion
|
||||
# directo -- decision del usuario para dejar de probar cambios en
|
||||
# vivo contra Prod. Promover a Produccion (workloads/ecommerce) es
|
||||
# una accion manual aparte, ver scripts/promote-to-production.sh.
|
||||
MANIFEST_FILE: workloads/ecommerce-staging/frontend/patches/deployment.yaml
|
||||
KUSTOMIZE_DIR: workloads/ecommerce-staging/frontend
|
||||
IMAGE_NAME: gitea.cruzcloud.net/devops/ecommerce-frontend
|
||||
|
||||
steps:
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
apiVersion: argoproj.io/v1alpha1
|
||||
kind: Application
|
||||
|
||||
metadata:
|
||||
name: ecommerce-staging-app
|
||||
namespace: argocd
|
||||
|
||||
spec:
|
||||
project: default
|
||||
|
||||
source:
|
||||
repoURL: https://gitea.cruzcloud.net/devops/apps-registry.git
|
||||
targetRevision: main
|
||||
path: workloads/ecommerce-staging
|
||||
kustomize: {}
|
||||
|
||||
destination:
|
||||
server: https://kubernetes.default.svc
|
||||
namespace: ecommerce-staging
|
||||
|
||||
syncPolicy:
|
||||
automated:
|
||||
prune: true
|
||||
selfHeal: true
|
||||
syncOptions:
|
||||
- CreateNamespace=true
|
||||
@@ -0,0 +1,20 @@
|
||||
apiVersion: argoproj.io/v1alpha1
|
||||
kind: Application
|
||||
metadata:
|
||||
name: ecommerce-staging-governance
|
||||
namespace: argocd
|
||||
spec:
|
||||
project: default
|
||||
source:
|
||||
repoURL: https://gitea.cruzcloud.net/devops/platform-infra.git
|
||||
path: ecommerce-staging-governance
|
||||
targetRevision: main
|
||||
destination:
|
||||
server: https://kubernetes.default.svc
|
||||
namespace: ecommerce-staging
|
||||
syncPolicy:
|
||||
automated:
|
||||
prune: true
|
||||
selfHeal: true
|
||||
syncOptions:
|
||||
- CreateNamespace=true
|
||||
@@ -0,0 +1,51 @@
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
|
||||
namespace: ecommerce-staging
|
||||
|
||||
resources:
|
||||
- https://gitea.cruzcloud.net/devops/platform-templates.git//k8s-manifests/base?ref=main
|
||||
|
||||
patches:
|
||||
# Mismo criterio que workloads/ecommerce/frontend/kustomization.yaml:
|
||||
# sin anchors/aliases de YAML a propósito (el parser de Gitea Actions no
|
||||
# los resuelve en "on:", pero acá aplica igual por consistencia con el
|
||||
# resto del repo). Ingress propio via ingress-staging.yaml en vez del
|
||||
# generico de 1-backend del base.
|
||||
- target:
|
||||
kind: Ingress
|
||||
name: app-ingress
|
||||
patch: |-
|
||||
$patch: delete
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: app-ingress
|
||||
- target:
|
||||
kind: Deployment
|
||||
name: app-deployment
|
||||
path: patches/deployment.yaml
|
||||
- target:
|
||||
kind: Service
|
||||
name: app-svc
|
||||
path: patches/service.yaml
|
||||
|
||||
- target:
|
||||
kind: Deployment
|
||||
name: app-deployment
|
||||
patch: |-
|
||||
- op: replace
|
||||
path: /metadata/name
|
||||
value: frontend-deploy
|
||||
- op: replace
|
||||
path: /spec/template/spec/containers/0/ports
|
||||
value:
|
||||
- name: http
|
||||
containerPort: 80
|
||||
- target:
|
||||
kind: Service
|
||||
name: app-svc
|
||||
patch: |-
|
||||
- op: replace
|
||||
path: /metadata/name
|
||||
value: frontend-svc
|
||||
@@ -0,0 +1,86 @@
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: app-deployment
|
||||
labels:
|
||||
app: frontend
|
||||
spec:
|
||||
# 1 réplica (no 2 como Producción): Staging es para verificar cambios
|
||||
# antes de promover, no para servir tráfico real -- alcanza, y deja más
|
||||
# margen de recursos en la NAS para el resto del cluster.
|
||||
replicas: 1
|
||||
strategy:
|
||||
type: RollingUpdate
|
||||
rollingUpdate:
|
||||
maxUnavailable: 0
|
||||
maxSurge: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: frontend
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: frontend
|
||||
spec:
|
||||
securityContext:
|
||||
runAsUser: 1001
|
||||
containers:
|
||||
- name: app
|
||||
image: gitea.cruzcloud.net/devops/ecommerce-frontend:v1.0.260
|
||||
env:
|
||||
- name: HEADLESS_PROVIDER
|
||||
value: medusa
|
||||
# Backend COMPARTIDO con Producción a propósito (decisión del
|
||||
# usuario 2026-09-14: armar un backend propio para Staging
|
||||
# -Postgres/Medusa/Meilisearch- duplicaría el consumo de la
|
||||
# NAS sin necesidad todavía). FQDN cross-namespace: "ecommerce"
|
||||
# es el namespace real de medusa-svc -- el nombre corto
|
||||
# "medusa-svc" solo resuelve dentro del mismo namespace.
|
||||
- name: MEDUSA_BACKEND_URL
|
||||
value: http://medusa-svc.ecommerce.svc.cluster.local:9000
|
||||
- name: MEDUSA_REGION_ID
|
||||
value: reg_01KZT86WPAH7A7ZZRDSX3350V2
|
||||
envFrom:
|
||||
- secretRef:
|
||||
name: commerce-storefront
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: /api/health
|
||||
port: http
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: /api/health
|
||||
port: http
|
||||
# Mismo securityContext que Producción -- ver comentario largo en
|
||||
# workloads/ecommerce/frontend/patches/deployment.yaml (misma
|
||||
# imagen, mismos motivos: runAsUser numérico por el Dockerfile
|
||||
# usando "nextjs" por nombre, NET_BIND_SERVICE por el puerto 80,
|
||||
# volumenes por el cache de Next.js con root filesystem de solo
|
||||
# lectura).
|
||||
securityContext:
|
||||
allowPrivilegeEscalation: false
|
||||
readOnlyRootFilesystem: true
|
||||
capabilities:
|
||||
drop:
|
||||
- ALL
|
||||
add:
|
||||
- NET_BIND_SERVICE
|
||||
# Requests/limits mas chicos que Produccion -- una sola replica
|
||||
# de verificacion, no trafico real.
|
||||
resources:
|
||||
requests:
|
||||
cpu: 50m
|
||||
memory: 128Mi
|
||||
limits:
|
||||
cpu: 500m
|
||||
memory: 512Mi
|
||||
volumeMounts:
|
||||
- name: next-cache
|
||||
mountPath: /app/.next/cache
|
||||
- name: tmp
|
||||
mountPath: /tmp
|
||||
volumes:
|
||||
- name: next-cache
|
||||
emptyDir: {}
|
||||
- name: tmp
|
||||
emptyDir: {}
|
||||
@@ -0,0 +1,11 @@
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: app-svc
|
||||
spec:
|
||||
selector:
|
||||
app: frontend
|
||||
ports:
|
||||
- name: http
|
||||
port: 80
|
||||
targetPort: 80
|
||||
@@ -0,0 +1,19 @@
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: ecommerce-staging-ingress
|
||||
annotations:
|
||||
traefik.ingress.kubernetes.io/router.entrypoints: web
|
||||
spec:
|
||||
ingressClassName: traefik
|
||||
rules:
|
||||
- host: staging.cruzcloud.net
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: frontend-svc
|
||||
port:
|
||||
number: 80
|
||||
@@ -0,0 +1,8 @@
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
|
||||
namespace: ecommerce-staging
|
||||
|
||||
resources:
|
||||
- frontend/
|
||||
- ingress-staging.yaml
|
||||
Reference in new issue
Block a user