mail-address-semantics/deploy/railiance/manifests.yaml
tegwick e517f2b81a Add railiance deploy manifests, mas.coulomb.social statute example, probe JSONL log + bind option
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 1370019@bnt-lap001
Assistant-Session: d462dd63-16de-4189-ae70-b9cd6566bf87
2026-10-11 20:22:37 +02:00

105 lines
3.1 KiB
YAML

# MAS live provider test (mail-address-semantics MAS-WP-0003).
# Founder go for A-D: 2026-10-08. Temporary: delete the namespace after the test.
# A namespace + MX pod B LoadBalancer :25 C statute-only ingress D no outbound mail
# IMAGE is replaced with the pushed digest at apply time.
apiVersion: v1
kind: Namespace
metadata:
name: mas
labels: {app.kubernetes.io/part-of: mail-address-semantics}
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata: {name: mas-evidence, namespace: mas}
spec:
accessModes: [ReadWriteOnce]
storageClassName: local-path
resources: {requests: {storage: 1Gi}}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mas-mx
namespace: mas
labels: {app.kubernetes.io/name: mas-mx}
spec:
replicas: 1
strategy: {type: Recreate}
selector: {matchLabels: {app.kubernetes.io/name: mas-mx}}
template:
metadata: {labels: {app.kubernetes.io/name: mas-mx}}
spec:
automountServiceAccountToken: false
containers:
- name: mx
image: IMAGE
args: [mx]
ports: [{name: smtp, containerPort: 25}]
volumeMounts: [{name: evidence, mountPath: /var/lib/mas}]
readinessProbe: {tcpSocket: {port: 25}, periodSeconds: 10}
resources:
requests: {cpu: 20m, memory: 64Mi}
limits: {memory: 256Mi}
volumes:
- name: evidence
persistentVolumeClaim: {claimName: mas-evidence}
---
apiVersion: v1
kind: Service
metadata: {name: mas-smtp, namespace: mas}
spec:
type: LoadBalancer
externalTrafficPolicy: Local # keep real client IPs in the Postfix log
selector: {app.kubernetes.io/name: mas-mx}
ports: [{name: smtp, port: 25, targetPort: 25, protocol: TCP}]
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mas-statute
namespace: mas
labels: {app.kubernetes.io/name: mas-statute}
spec:
replicas: 1
selector: {matchLabels: {app.kubernetes.io/name: mas-statute}}
template:
metadata: {labels: {app.kubernetes.io/name: mas-statute}}
spec:
automountServiceAccountToken: false
securityContext: {runAsNonRoot: true, runAsUser: 65534}
containers:
- name: statute
image: IMAGE
args: [statute]
ports: [{name: http, containerPort: 8080}]
readinessProbe: {httpGet: {path: /.well-known/mas, port: 8080}}
resources:
requests: {cpu: 5m, memory: 32Mi}
limits: {memory: 64Mi}
---
apiVersion: v1
kind: Service
metadata: {name: mas-statute, namespace: mas}
spec:
selector: {app.kubernetes.io/name: mas-statute}
ports: [{name: http, port: 80, targetPort: 8080}]
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: mas-statute
namespace: mas
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
ingressClassName: traefik
rules:
- host: mas.coulomb.social
http:
paths:
- path: /.well-known/mas
pathType: Exact
backend: {service: {name: mas-statute, port: {number: 80}}}
tls:
- hosts: [mas.coulomb.social]
secretName: mas-coulomb-social-tls