pgAdmin4 в Kubernetes говорит: Отказано в выполнении скрипта, строгая проверка типа MIME включена?

Вопрос или проблема

Я пытаюсь запустить pgAdmin4 в Kubernetes, но всегда получаю ошибку “Отказано в выполнении скрипта, строгая проверка типа MIME включена?” и другие ошибки.

введите описание изображения здесь

Согласно проблеме с включенной строгой проверкой типа MIME с PGAdmin в шлюзе приложений Azure и https://github.com/pgadmin-org/pgadmin4/issues/7412 должна быть проблема с azure.

Kubernetes работает в AKS, так что я думаю, что это также моя проблема, потому что он работает локально без проблем.

Вот состояние kubernetes statefullset:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: pgadmin
  namespace: {{ NAMESPACE_NAME }}
spec:
  serviceName: pgadmin-service
  podManagementPolicy: Parallel
  replicas: 1
  updateStrategy:
    type: RollingUpdate
  selector:
    matchLabels:
      app: pgadmin
      role: database
  template:
    metadata:
      name: my-deployment
      labels:
        app: pgadmin
        role: database
    spec:
      terminationGracePeriodSeconds: 10
      initContainers:
        - name: create-readonly-user
          image: "{{ POSTGRES_IMAGE }}"
          imagePullPolicy: "Always"
          env:
            - name: CONNECTION_STRING
              value: "{{ CONNECTION_STRING}}"
            - name: POSTGRES_USER
              valueFrom:
                secretKeyRef:
                  name: pgadmin-secret
                  key: postgres-readonly-username
            - name: POSTGRES_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: pgadmin-secret
                  key: postgres-readonly-password
          command: [ "/bin/bash" ]
          args:
            - -c
            - >
              psql "${CONNECTION_STRING:?}" -c "CREATE ROLE ${POSTGRES_USER:?} WITH LOGIN PASSWORD '${POSTGRES_PASSWORD:?}'"
              psql "${CONNECTION_STRING:?}" -c "GRANT pg_read_all_data TO ${POSTGRES_USER:?}"
      containers:
        - name: pgadmin
          image: dpage/pgadmin4:8.13.0
          imagePullPolicy: Always
          securityContext:
            runAsUser: 0
            runAsGroup: 0
          env:
            - name: PGADMIN_DEFAULT_EMAIL
              valueFrom:
                secretKeyRef:
                  name: pgadmin-secret
                  key: pgadmin-default-email
            - name: PGADMIN_DEFAULT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: pgadmin-secret
                  key: pgadmin-default-password
            - name: POSTGRES_USER
              valueFrom:
                secretKeyRef:
                  name: pgadmin-secret
                  key: postgres-readonly-username
            # https://stackoverflow.com/questions/64394628/csrf-token-is-missing-error-in-docker-pgadmin
            - name: PGADMIN_CONFIG_WTF_CSRF_CHECK_DEFAULT
              value: "False"
            - name: PGADMIN_CONFIG_WTF_CSRF_ENABLED
              value: "False"
          ports:
            - name: http
              containerPort: {{ PGADMIN_CONTAINER_PORT }}
              protocol: TCP
          volumeMounts:
            - name: pgadmin-data
              mountPath: /var/lib/pgadmin
            - name: servers-file
              mountPath: /conf
            - name: cfg-file
              mountPath: /cfg
          lifecycle:
            postStart:
              exec:
                # sh: envsubst: command not found in container image
                command: ["/bin/sh", "-c", "sed \"s/<<<POSTGRES_USER>>>/${POSTGRES_USER}/g\" /conf/servers.json > /pgadmin4/servers.json && cp -v /cfg/config_local.py /pgadmin4/config_local.py && ls -lisah /pgadmin4 && cat /pgadmin4/config_local.py"]
      volumes:
        - name: servers-file
          configMap:
            name: pgadmin-configmap-servers-file
            items:
              - key: "servers.json"
                path: "servers.json"
        - name: cfg-file
          configMap:
            name: pgadmin-configmap-cfg-file
            items:
              - key: "config_local.py"
                path: "config_local.py"
  volumeClaimTemplates:
    - metadata:
        name: pgadmin-data
      spec:
        accessModes: [ "ReadWriteOnce" ]
        resources:
          requests:
            storage: 3Gi

А вот и configmap для конфигурационного файла:

apiVersion: v1
kind: ConfigMap
metadata:
  name: pgadmin-configmap-cfg-file
  namespace: {{ NAMESPACE_NAME }}
  labels:
    app: postgres
data:
  "config_local.py": |
    X_CONTENT_TYPE_OPTIONS = ""
    ENHANCED_COOKIE_PROTECTION = False
    X_XSS_PROTECTION = "0"

Инициализационный контейнер работает нормально. Он создает пользователя для pgAdmin. Также файл серверов, который используется, работает. Я копирую файл серверов в /pgadmin4/servers.json. Я также копирую config_local.py в эту директорию, потому что нашел config.py в этой директории. Документация на https://www.pgadmin.org/docs/pgadmin4/latest/config_py.html подразумевает, что этот файл следовало бы переместить в /etc/pgadmin/config_system.py, но, как я понимаю, это только для config_system.py, а не для config_local.py.

Согласно проблеме с включенной строгой проверкой типа MIME с PGAdmin в шлюзе приложений Azure и https://github.com/pgadmin-org/pgadmin4/issues/7412, я создал конфигурационный файл с содержимым, необходимым для исправления проблемы в Azure, но у меня все еще есть ошибка.

Я не уверен, работает ли конфигурационный файл, потому что у меня нет прав доступа к контейнеру kubernetes, чтобы проверить, существует ли файл и находится ли он в правильном месте, поэтому я добавил опцию CHECK_EMAIL_DELIVERABILITY = True, но загрузка контейнера pgAdmin все еще говорит:

│ конфигурация электронной почты pgadmin {'CHECK_EMAIL_DELIVERABILITY': False, 'ALLOW_SPECIAL_EMAIL_DOMAINS': []}                           │
│ pgadmin ПРИМЕЧАНИЕ: Настройка аутентификации для режима СЕРВЕРА.                                                                  │
│ pgadmin                                                                                                                    │
│ pgadmin pgAdmin 4 - Инициализация приложения                                                                             │
│ pgadmin ======================================                                                                             │
│ pgadmin                                                                                                                    │
│ pgadmin ----------                                                                                                         │
│ pgadmin Загрузка серверов с:   

Я делаю что-то неправильно? Я пытаюсь вывести содержимое файлов и директорий с помощью команды постстарта, но не вижу вывода. Есть ли советы или рекомендации по отладке?

Ответ или решение

Ошибка "Refused to execute script, strict MIME type checking is enabled" при использовании pgAdmin4 в Kubernetes

При работе с pgAdmin4 в Kubernetes, особенно в среде Azure Kubernetes Service (AKS), ошибка "Refused to execute script, strict MIME type checking is enabled" может возникать из-за нескольких причин. В этом руководстве мы рассмотрим основные шаги по диагностике и устранению данной проблемы.

1. Понимание проблемы

Ошибка связана с тем, что браузер отказывается загружать скрипт, потому что его MIME-тип не совпадает с ожидаемым. Это может произойти, если сервер не правильно настроен для обработки определенных типов статических ресурсов или если конфигурационные файлы содержат ошибки.

2. Проверка конфигурации Kubernetes

Сначала обратим внимание на предоставленный StatefulSet для pgAdmin4. Убедитесь, что следующие элементы корректно настроены:

  • Образы контейнеров: Убедитесь, что используемый образ dpage/pgadmin4:8.13.0 является последним и совместим с вашей конфигурацией.
  • Переменные окружения: Проверьте настройки переменных окружения для pgAdmin4, особенно PGADMIN_CONFIG_WTF_CSRF_CHECK_DEFAULT и PGADMIN_CONFIG_WTF_CSRF_ENABLED, которые вы установили в False. Это может помочь избежать проблем CSRF, но не влияет на MIME-тип.

3. Проверка ConfigMap

Ваш ConfigMap содержит config_local.py, который настраивает параметры приложения. Проверьте, что вы правильно указали параметры безопасности:

X_CONTENT_TYPE_OPTIONS = ""
ENHANCED_COOKIE_PROTECTION = False
X_XSS_PROTECTION = "0"

Возможно, добавить следующее значение в конфигурационный файл:

X_CONTENT_TYPE_OPTIONS = "nosniff"

Это может помочь избежать проблем со строгими требованиями к MIME-типа.

4. Проверка монтирования

Проверьте, корректно ли монтируется config_local.py и servers.json в контейнер pgAdmin4. Вы можете временно изменить команду postStart, чтобы вывести содержимое файлов сразу после их копирования:

command: ["/bin/sh", "-c", "cat /pgadmin4/servers.json && cat /pgadmin4/config_local.py"]

Так вы сможете увидеть, какие значения действительно находятся в этих файлах. Также убедитесь, что файлы доступны в ожидаемом формате, и их содержимое соответствует тому, что требуется pgAdmin4.

5. Проверка доступа к контейнеру

Если у вас нет прав доступа к контейнеру, можете использовать команду kubectl exec для входа в контейнер и просмотра файлов:

kubectl exec -it pgadmin-<pod-id> -- /bin/bash

Замените <pod-id> на уникальный идентификатор вашего пода pgAdmin. Внутри контейнера проверьте наличие файлов и их содержимое на соответствующих путях.

6. Логи и отладка

Обратите внимание на логи контейнера pgAdmin4. Запустите следующую команду:

kubectl logs pgadmin-<pod-id>

Это поможет выявить дополнительные проблемы или ошибки, которые могут быть связаны с работой pgAdmin4.

7. Проблемы с сетью

Если вы работаете через Ingress или какой-либо Celery service в Azure, необходимо убедиться, что заголовки устанавливаются корректно. Иногда прокси-сервер может изменить заголовки, что приведет к конфликтам MIME.

Если вы используете Azure Application Gateway, проверьте его правила и параметры настройки.

Заключение

Ошибки с MIME-типами в рамках pgAdmin4 в Kubernetes могут быть источником значительных трудностей, но их можно решить с помощью детального анализа конфигурации, проверки файлов и настройки окружения. Правильная настройка элементов Kubernetes, контроль доступа и мониторинг логов — ключ к успешному разрешению проблемы.

Если ни один из предложенных шагов не решает вашу проблему, рассмотрите возможность обращения к сообществу pgAdmin4 или к службе поддержки Azure для более глубокого анализа вашей конфигурации.

Оцените материал
Добавить комментарий

Капча загружается...