apiVersion: v1 kind: PersistentVolumeClaim metadata: name: website-db namespace: website-production spec: accessModes: - ReadWriteOnce storageClassName: openebs-hostpath-retain resources: requests: storage: 1Gi --- apiVersion: apps/v1 kind: Deployment metadata: name: php-website-deployment namespace: website-production labels: app: php-website spec: replicas: 2 strategy: type: RollingUpdate rollingUpdate: maxSurge: 0 maxUnavailable: 1 selector: matchLabels: app: php-website template: metadata: labels: app: php-website spec: securityContext: runAsNonRoot: true runAsUser: 1000 runAsGroup: 1000 fsGroup: 1000 fsGroupChangePolicy: OnRootMismatch affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchExpressions: - key: app operator: In values: - php-website topologyKey: "kubernetes.io/hostname" containers: - name: php-app image: php-website:bootstrap imagePullPolicy: IfNotPresent securityContext: allowPrivilegeEscalation: false readOnlyRootFilesystem: true capabilities: drop: - ALL env: - name: WEBSITE_LANG_WRITE_DIR value: /var/www/localhost/htdocs/db/lang - name: WEBSITE_IDEAS_WRITE_DIR value: /var/www/localhost/htdocs/db/ideas - name: OLLAMA_HOST value: http://192.168.100.73:11434 - name: OLLAMA_MODEL value: website-translator - name: TRANSLATION_REDIS_HOST value: website-redis - name: TRANSLATION_REDIS_PORT value: "6379" - name: TRANSLATION_CACHE_PREFIX value: translation:v1 ports: - containerPort: 8080 name: http readinessProbe: httpGet: path: / port: http initialDelaySeconds: 5 periodSeconds: 10 livenessProbe: httpGet: path: / port: http initialDelaySeconds: 30 periodSeconds: 30 resources: requests: cpu: 100m memory: 128Mi limits: memory: 384Mi volumeMounts: - name: apache-run mountPath: /run/apache2 - name: apache-logs mountPath: /var/log/apache2 - name: website-db mountPath: /var/www/localhost/htdocs/db - name: tmp mountPath: /tmp volumes: - name: apache-run emptyDir: {} - name: apache-logs emptyDir: {} - name: website-db persistentVolumeClaim: claimName: website-db - name: tmp emptyDir: {} --- apiVersion: v1 kind: Service metadata: name: php-website-service namespace: website-production spec: ports: - port: 80 targetPort: http selector: app: php-website --- apiVersion: apps/v1 kind: Deployment metadata: name: website-redis namespace: website-production labels: app: website-redis spec: replicas: 1 selector: matchLabels: app: website-redis template: metadata: labels: app: website-redis spec: securityContext: runAsNonRoot: true runAsUser: 999 runAsGroup: 999 fsGroup: 999 fsGroupChangePolicy: OnRootMismatch containers: - name: redis image: redis:7.4-alpine imagePullPolicy: IfNotPresent args: - redis-server - --appendonly - "no" - --save - "" - --maxmemory - 128mb - --maxmemory-policy - allkeys-lru ports: - containerPort: 6379 name: redis readinessProbe: tcpSocket: port: redis initialDelaySeconds: 3 periodSeconds: 10 livenessProbe: tcpSocket: port: redis initialDelaySeconds: 15 periodSeconds: 30 resources: requests: cpu: 25m memory: 64Mi limits: memory: 160Mi securityContext: allowPrivilegeEscalation: false readOnlyRootFilesystem: true capabilities: drop: - ALL volumeMounts: - name: redis-data mountPath: /data - name: tmp mountPath: /tmp volumes: - name: redis-data emptyDir: {} - name: tmp emptyDir: {} --- apiVersion: v1 kind: Service metadata: name: website-redis namespace: website-production spec: ports: - port: 6379 targetPort: redis selector: app: website-redis --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: php-website namespace: website-production spec: ingressClassName: traefik rules: - host: lab2025.duckdns.org http: paths: - path: / pathType: Prefix backend: service: name: php-website-service port: number: 80