apiVersion: apps/v1 kind: Deployment metadata: name: searxng namespace: ai spec: replicas: 1 selector: matchLabels: app: searxng template: metadata: labels: app: searxng annotations: # Redéploie le pod quand settings.yml change (le hash bouge → nouveau rollout). checksum/config: "searxng-settings-v1" spec: # Conformité PodSecurity "restricted" (namespace ai). L'image tourne en uid 977 (searxng). # fsGroup 977 → l'emptyDir /etc/searxng est accessible en écriture par l'init + le main. securityContext: runAsNonRoot: true runAsUser: 977 runAsGroup: 977 fsGroup: 977 seccompProfile: type: RuntimeDefault # Copie settings.yml (ConfigMap RO) dans un emptyDir inscriptible → évite les soucis # de mount RO de l'entrypoint searxng (chown/sed éventuels sur le fichier de conf). initContainers: - name: copy-config image: docker.io/searxng/searxng:2026.6.22-952896d29 command: ["sh", "-c", "cp /config-src/settings.yml /etc/searxng/settings.yml"] securityContext: allowPrivilegeEscalation: false capabilities: drop: ["ALL"] volumeMounts: - name: config-src mountPath: /config-src readOnly: true - name: config mountPath: /etc/searxng containers: - name: searxng image: docker.io/searxng/searxng:2026.6.22-952896d29 securityContext: allowPrivilegeEscalation: false capabilities: drop: ["ALL"] ports: - containerPort: 8080 env: # Base URL interne (pas d'exposition WAN). Requis par SearXNG pour générer ses liens. - name: SEARXNG_BASE_URL value: "http://searxng.lab.local/" volumeMounts: - name: config mountPath: /etc/searxng readinessProbe: tcpSocket: port: 8080 initialDelaySeconds: 5 periodSeconds: 10 livenessProbe: tcpSocket: port: 8080 initialDelaySeconds: 15 periodSeconds: 20 resources: requests: cpu: 100m memory: 192Mi limits: cpu: "1" memory: 512Mi volumes: - name: config-src configMap: name: searxng-settings - name: config emptyDir: {}