lomavuokraus/k8s/app.yaml
2025-12-10 14:04:39 +02:00

238 lines
5.5 KiB
YAML

apiVersion: v1
kind: ConfigMap
metadata:
name: lomavuokraus-web-config
namespace: ${K8S_NAMESPACE}
data:
NEXT_PUBLIC_SITE_URL: ${NEXT_PUBLIC_SITE_URL}
NEXT_PUBLIC_API_BASE: ${NEXT_PUBLIC_API_BASE}
APP_ENV: ${APP_ENV}
NEXT_PUBLIC_VERSION: ${APP_VERSION}
---
apiVersion: v1
kind: ConfigMap
metadata:
name: lomavuokraus-web-varnish
namespace: ${K8S_NAMESPACE}
data:
default.vcl: |
vcl 4.1;
backend app {
.host = "127.0.0.1";
.port = "3000";
}
sub vcl_recv {
if (req.method != "GET" && req.method != "HEAD") {
return (pass);
}
# Never cache health
if (req.url ~ "^/api/health") {
return (pass);
}
# Cache image API responses
if (req.url ~ "^/api/images/") {
return (hash);
}
# Cache static assets
if (req.url ~ "^/_next/static" ||
req.url ~ "^/favicon" ||
req.url ~ "^/robots.txt" ||
req.url ~ "^/sitemap") {
return (hash);
}
return (pass);
}
sub vcl_backend_response {
# Default TTL
set beresp.ttl = 1h;
if (bereq.url ~ "^/api/images/") {
set beresp.ttl = 24h;
set beresp.http.Cache-Control = "public, max-age=86400, immutable";
} else if (bereq.url ~ "^/_next/static") {
set beresp.ttl = 7d;
set beresp.http.Cache-Control = "public, max-age=604800, immutable";
}
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT";
} else {
set resp.http.X-Cache = "MISS";
}
}
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: lomavuokraus-monitor
namespace: ${K8S_NAMESPACE}
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: lomavuokraus-monitor
rules:
- apiGroups: [""]
resources: ["nodes", "pods", "pods/status"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: lomavuokraus-monitor-${K8S_NAMESPACE}
subjects:
- kind: ServiceAccount
name: lomavuokraus-monitor
namespace: ${K8S_NAMESPACE}
roleRef:
kind: ClusterRole
name: lomavuokraus-monitor
apiGroup: rbac.authorization.k8s.io
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: lomavuokraus-web
namespace: ${K8S_NAMESPACE}
labels:
app: lomavuokraus-web
spec:
replicas: ${APP_REPLICAS}
selector:
matchLabels:
app: lomavuokraus-web
template:
metadata:
labels:
app: lomavuokraus-web
spec:
serviceAccountName: lomavuokraus-monitor
imagePullSecrets:
- name: registry-halla
containers:
- name: varnish
image: varnish:7.5
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
name: http
args: ["-a", ":8080", "-f", "/etc/varnish/default.vcl", "-s", "malloc,256m"]
volumeMounts:
- name: varnish-vcl
mountPath: /etc/varnish/default.vcl
subPath: default.vcl
livenessProbe:
httpGet:
path: /api/health
port: http
initialDelaySeconds: 10
periodSeconds: 15
readinessProbe:
httpGet:
path: /api/health
port: http
initialDelaySeconds: 5
periodSeconds: 10
resources:
requests:
cpu: "50m"
memory: "128Mi"
limits:
cpu: "200m"
memory: "256Mi"
- name: lomavuokraus-web
image: ${K8S_IMAGE}
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3000
name: app
envFrom:
- configMapRef:
name: lomavuokraus-web-config
- secretRef:
name: lomavuokraus-web-secrets
resources:
requests:
cpu: "100m"
memory: "256Mi"
limits:
cpu: "500m"
memory: "512Mi"
volumes:
- name: varnish-vcl
configMap:
name: lomavuokraus-web-varnish
---
apiVersion: v1
kind: Service
metadata:
name: lomavuokraus-web
namespace: ${K8S_NAMESPACE}
labels:
app: lomavuokraus-web
spec:
selector:
app: lomavuokraus-web
ports:
- name: http
port: 80
targetPort: http
type: ClusterIP
---
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: https-redirect
namespace: ${K8S_NAMESPACE}
spec:
redirectScheme:
scheme: https
permanent: true
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: lomavuokraus-web
namespace: ${K8S_NAMESPACE}
annotations:
cert-manager.io/cluster-issuer: ${CLUSTER_ISSUER}
kubernetes.io/ingress.class: ${INGRESS_CLASS}
traefik.ingress.kubernetes.io/router.entrypoints: web,websecure
traefik.ingress.kubernetes.io/router.middlewares: ${K8S_NAMESPACE}-https-redirect@kubernetescrd
spec:
ingressClassName: ${INGRESS_CLASS}
tls:
- hosts:
- ${APP_HOST}
- ${API_HOST}
secretName: lomavuokraus-web-tls
rules:
- host: ${APP_HOST}
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: lomavuokraus-web
port:
number: 80
- host: ${API_HOST}
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: lomavuokraus-web
port:
number: 80