- Вопрос или проблема
- Ответ или решение
- Ошибка "Refused to execute script, strict MIME type checking is enabled" при использовании pgAdmin4 в Kubernetes
- 1. Понимание проблемы
- 2. Проверка конфигурации Kubernetes
- 3. Проверка ConfigMap
- 4. Проверка монтирования
- 5. Проверка доступа к контейнеру
- 6. Логи и отладка
- 7. Проблемы с сетью
- Заключение
Вопрос или проблема
Я пытаюсь запустить 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 для более глубокого анализа вашей конфигурации.