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: # CRITIQUE : le Service s'appelle « searxng » → sans ça, k8s injecte la variable # SEARXNG_PORT=tcp://:8080 (env « service link » façon Docker), que l'entrypoint # SearXNG lit comme PORT de bind → granian crash (« 'tcp://…:8080' is not a valid integer »). # On coupe l'injection des service-links (inutiles ici) ; on fixe aussi le port en dur ci-dessous. enableServiceLinks: false # 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: # Port/bind explicites (défense en profondeur vs l'env service-link, déjà coupé # par enableServiceLinks:false) — l'entrypoint SearXNG lit ces variables. - name: SEARXNG_PORT value: "8080" - name: SEARXNG_BIND_ADDRESS value: "0.0.0.0" # 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: {}