add blog
Build Hugo / build (push) Successful in 16s
Build Hugo / deploy (push) Failing after 6s

This commit is contained in:
ahmza committed 2026-10-31 20:42:16 +00:00
1 parent 08ced83f47
commit ea19586b04
7 files changed
+409

No files matched your search

+26
View File
@@ -0,0 +1,26 @@
# CI publishes the static site image; this Application makes Git, rather than
# a runner's kubeconfig, the source of truth for which image Kubernetes runs.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: blog-ahmza-com
namespace: argocd
# No cascading-deletion finalizer during initial migration: removing this
# Application must not unexpectedly delete the public site's resources.
spec:
project: default
source:
repoURL: https://tea.ahmza.com/ahmza.com/k8s-starter-pack.git
targetRevision: main
path: apps/blog-ahmza-com
destination:
server: https://kubernetes.default.svc
namespace: blog-ahmza-com
syncPolicy:
automated:
# Review the initial sync before allowing Git deletions to remove live
# resources. Enabling prune later is separate from cascading app deletion.
prune: false
selfHeal: true
syncOptions:
- CreateNamespace=true
+78
View File
@@ -0,0 +1,78 @@
# Hugo generates the complete site at image-build time. SWS serves only those
# immutable files, with no writable content volume or Kubernetes API access.
apiVersion: apps/v1
kind: Deployment
metadata:
name: blog
namespace: blog-ahmza-com
spec:
replicas: 2
strategy:
type: RollingUpdate
rollingUpdate:
# Keep the existing site available while replacement Pods become ready.
maxUnavailable: 0
maxSurge: 1
selector:
matchLabels:
app: blog
template:
metadata:
labels:
app: blog
spec:
automountServiceAccountToken: false
topologySpreadConstraints:
- maxSkew: 1
topologyKey: kubernetes.io/hostname
# Ignore tainted control-plane nodes when balancing the two workers;
# otherwise a surge Pod could be blocked by an unusable third node.
nodeTaintsPolicy: Honor
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: blog
securityContext:
seccompProfile:
type: RuntimeDefault
containers:
- name: blog
# Bootstrap with the verified published amd64/arm64 index. CI updates
# this line to each build's digest, never a mutable latest tag.
# yamllint disable-line rule:line-length
image: tea.ahmza.com/ahmza/blog-ahmza-com@sha256:25dce7a45c8869879bbb6f056b3e4d18971c7da542255867ad83f1db26ffefc3
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
protocol: TCP
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
runAsNonRoot: true
# SWS does not declare USER in the image. An explicit unprivileged
# identity lets Kubernetes enforce runAsNonRoot safely.
runAsUser: 10001
runAsGroup: 10001
capabilities:
drop:
- ALL
readinessProbe:
httpGet:
path: /health
port: http
initialDelaySeconds: 2
periodSeconds: 10
livenessProbe:
httpGet:
path: /health
port: http
initialDelaySeconds: 5
periodSeconds: 30
resources:
requests:
cpu: 10m
memory: 16Mi
limits:
cpu: 250m
memory: 128Mi
+27
View File
@@ -0,0 +1,27 @@
# Share ingress-nginx at 10.10.60.12. DNS and any external Caddy/NetBird
# hostname routing must also be pointed at this ingress before public cutover.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: blog
namespace: blog-ahmza-com
annotations:
# Reuse the production DNS-01 issuer already used by the cluster's sites.
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
ingressClassName: nginx
tls:
- hosts:
- blog.ahmza.com
secretName: blog-tls
rules:
- host: blog.ahmza.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: blog
port:
name: http
+5
View File
@@ -0,0 +1,5 @@
# Isolate the blog's lifecycle and access controls from unrelated applications.
apiVersion: v1
kind: Namespace
metadata:
name: blog-ahmza-com
+15
View File
@@ -0,0 +1,15 @@
# A stable in-cluster address for ingress-nginx; no extra MetalLB IP is needed.
apiVersion: v1
kind: Service
metadata:
name: blog
namespace: blog-ahmza-com
spec:
type: ClusterIP
selector:
app: blog
ports:
- name: http
port: 80
targetPort: http
protocol: TCP