apiVersion: apps/v1 kind: Deployment metadata: name: ushahidi-api namespace: ushahidi spec: replicas: 1 strategy: type: Recreate selector: matchLabels: component: api template: metadata: labels: component: api spec: securityContext: runAsUser: 0 runAsNonRoot: false seccompProfile: type: RuntimeDefault initContainers: - name: wait-for-db image: mysql:9.1.0 securityContext: allowPrivilegeEscalation: false capabilities: drop: - ALL readOnlyRootFilesystem: false env: - name: DB_HOSTNAME value: {{ .db.host }} - name: DB_PORT value: "{{ .db.port }}" - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: ushahidi-secrets key: mysql.rootPassword command: - /bin/bash - -c - | until mysql -h ${DB_HOSTNAME} -P ${DB_PORT} -u root -p${MYSQL_ROOT_PASSWORD} -e "SELECT 1" 2>/dev/null; do echo "Waiting for MySQL..." sleep 2 done echo "MySQL is ready" containers: - name: ushahidi-api image: ghcr.io/ushahidi/platform:v2025.04.1 ports: - name: http containerPort: 8080 protocol: TCP env: - name: APP_ENV value: production - name: APP_DEBUG value: "false" - name: APP_KEY valueFrom: secretKeyRef: name: ushahidi-secrets key: appKey - name: ENABLE_NGINX value: "true" - name: ENABLE_PHPFPM value: "true" - name: ENABLE_PLATFORM_TASKS value: "false" - name: RUN_PLATFORM_MIGRATIONS value: "true" - name: DB_MIGRATIONS_HANDLED value: "true" - name: DB_CONNECTION value: mysql - name: DB_HOST value: {{ .db.host }} - name: DB_PORT value: "{{ .db.port }}" - name: DB_DATABASE value: {{ .db.name }} - name: DB_USERNAME value: {{ .db.user }} - name: DB_PASSWORD valueFrom: secretKeyRef: name: ushahidi-secrets key: dbPassword - name: REDIS_HOST value: {{ .redis.host }} - name: REDIS_PORT value: "{{ .redis.port }}" - name: CACHE_DRIVER value: redis - name: QUEUE_DRIVER value: redis - name: CLIENT_URL value: https://{{ .domain }} - name: HTTP_PORT value: "8080" resources: limits: cpu: "1" ephemeral-storage: 1Gi memory: 512Mi requests: cpu: 50m ephemeral-storage: 100Mi memory: 256Mi volumeMounts: - name: ushahidi-storage mountPath: /var/www/storage/app/public livenessProbe: tcpSocket: port: 8080 initialDelaySeconds: 120 timeoutSeconds: 10 periodSeconds: 30 failureThreshold: 6 readinessProbe: tcpSocket: port: 8080 initialDelaySeconds: 60 timeoutSeconds: 5 periodSeconds: 15 failureThreshold: 3 securityContext: allowPrivilegeEscalation: true readOnlyRootFilesystem: false volumes: - name: ushahidi-storage persistentVolumeClaim: claimName: ushahidi-storage restartPolicy: Always