Как исправить ошибку "FATAL: роль 'root' не существует" при развертывании Conduktor Console с Docker Compose
Узнайте, как исправить ошибку FATAL: роль 'root' не существует при запуске Conduktor Console с Docker Compose. Пошаговое решение проблем подключения PostgreSQL.
Как исправить ошибку «FATAL: role ‘root’ does not exist» при развертывании Conduktor Console с Docker Compose
Я пытаюсь развернуть Conduktor Console для Apache Kafka с помощью Docker Compose, следуя официальным инструкциям из GitHub. После настройки конфигурации с PostgreSQL в качестве базы данных я сталкиваюсь с ошибкой «FATAL: role ‘root’ does not exist» в логах PostgreSQL, хотя в конфигурации указан другой пользователь.
Моя конфигурация Docker Compose
services:
postgresql:
image: postgres:14
hostname: postgresql
volumes:
- pg_data:/var/lib/postgresql/data
environment:
POSTGRES_DB: "conduktor-console"
POSTGRES_USER: "conduktor"
POSTGRES_PASSWORD: "change_me"
POSTGRES_HOST_AUTH_METHOD: "scram-sha-256"
healthcheck:
test: ["CMD-SHELL", "pg_isready"]
interval: 10s
timeout: 5s
retries: 5
conduktor-console:
image: conduktor/conduktor-console:1.40.0
ports:
- "8999:8999"
volumes:
- conduktor_data:/var/conduktor
environment:
CDK_ORGANIZATION_NAME: "getting-started"
CDK_DATABASE_URL: "postgresql://conduktor:change_me@postgresql:5432/conduktor-console"
CDK_MONITORING_CORTEX-URL: http://conduktor-monitoring:9009/
CDK_MONITORING_ALERT-MANAGER-URL: http://conduktor-monitoring:9010/
CDK_MONITORING_CALLBACK-URL: http://conduktor-platform:8999/monitoring/api/
CDK_MONITORING_NOTIFICATIONS-CALLBACK-URL: http://localhost:8999
depends_on:
postgresql:
condition: service_healthy
conduktor-monitoring:
image: conduktor/conduktor-console-cortex:1.40.0
environment:
CDK_CONSOLE-URL: "http://conduktor-console:8999"
volumes:
pg_data: {}
conduktor_data: {}
Проблема
- Я не могу подключиться к
localhost:8999и получаю ошибку «Connection reset». - В логах PostgreSQL появляется сообщение:
FATAL: role "root" does not exist. - Эта ошибка возникает, несмотря на то, что в конфигурации задан пользователь
POSTGRES_USER: "conduktor".
Что я уже пробовал
- Следовал официальным инструкциям из GitHub по развертыванию Conduktor Console.
- Изменил номер порта от значения по умолчанию.
- Проверил, что контейнер PostgreSQL запущен.
- Изучил логи, где видна ошибка с ролью «root».
Вопрос
Как можно устранить ошибку «FATAL: role ‘root’ does not exist» при развертывании Conduktor Console с Docker Compose, и почему она всё ещё появляется, хотя я указал другой пользователь PostgreSQL в конфигурации?
Ошибка «FATAL: role ‘root’ does not exist» при развертывании Conduktor Console с Docker Compose обычно возникает из‑за того, что приложение или его проверки работоспособности пытается подключиться к PostgreSQL, используя пользователя «root» по умолчанию, а не пользователь, который вы задали в конфигурации. Это происходит даже при корректной установке POSTGRES_USER: "conduktor", поскольку некоторые компоненты всё ещё ссылаются на учетные данные PostgreSQL по умолчанию.
Содержание
- Понимание причины
- Распространённые причины ошибки
- Пошаговые решения
- Профилактика и лучшие практики
- Продвинутый отладочный процесс
- Вывод
Понимание причины
Ошибка «FATAL: role ‘root’ does not exist» возникает, потому что PostgreSQL ищет роль с именем «root», которой нет в базе данных. Это происходит, несмотря на то, что вы задали POSTGRES_USER: "conduktor", поскольку в настройках Docker Compose некоторые компоненты всё ещё пытаются подключиться, используя «root».
Согласно документации Docker PostgreSQL, эта ошибка обычно проявляется, когда:
«password authentication failed for user ‘root’ … Role ‘root’ does not exist»
Причина в том, что при указании пользовательского POSTGRES_USER суперпользователь «postgres» может не создаваться, а приложения могут быть закодированы для подключения как «root» или другие пользователи по умолчанию.
Распространённые причины ошибки
1. Жёстко закодированные учетные данные в приложении
Некоторые приложения или их зависимости могут иметь жёстко закодированные строки подключения, которые ссылаются на «root» вместо использования переменных окружения, которые вы настроили. Это особенно распространено в старых приложениях или тех, которые имеют несколько способов подключения.
2. Проблемы с настройкой проверки работоспособности
Проверка работоспособности в вашем конфиге использует pg_isready без указания пользователя, что может привести к попытке подключения как «root» или «postgres»:
healthcheck:
test: ["CMD-SHELL", "pg_isready"]
3. Несоответствие переменных окружения
Может возникнуть несоответствие между переменными окружения PostgreSQL и строкой подключения, используемой Conduktor Console. Как отмечено в обсуждениях Stack Overflow, это часто случается, когда:
«I had a custom username set but when I called docker exec -it postgres psql -U <custom_username> I was getting the error: FATAL: database ‘<custom_username>’ does not exist»
4. Конфликты метода аутентификации
Настройка POSTGRES_HOST_AUTH_METHOD: "scram-sha-256" может вызывать проблемы с аутентификацией, особенно если приложение ожидает другой метод.
Пошаговые решения
Решение 1: Исправить учетные данные проверки работоспособности
Обновите проверку работоспособности PostgreSQL, явно указав правильные учетные данные:
healthcheck:
test: ["CMD-SHELL", "pg_isready -U conduktor -d conduktor-console"]
interval: 10s
timeout: 5s
retries: 5
Это гарантирует, что проверка использует того же пользователя и базу данных, которые вы настроили.
Решение 2: Проверить согласованность строки подключения
Проверьте переменную окружения CDK_DATABASE_URL в сервисе Conduktor Console. Убедитесь, что она точно соответствует вашей конфигурации PostgreSQL:
environment:
CDK_DATABASE_URL: "postgresql://conduktor:change_me@postgresql:5432/conduktor-console"
Решение 3: Удалить или изменить POSTGRES_HOST_AUTH_METHOD
Метод аутентификации scram-sha-256 может вызывать проблемы. Попробуйте удалить его или изменить на более совместимый метод:
environment:
POSTGRES_DB: "conduktor-console"
POSTGRES_USER: "conduktor"
POSTGRES_PASSWORD: "change_me"
# Удалите POSTGRES_HOST_AUTH_METHOD или установите "trust" для разработки
Решение 4: Явно создать пользователя по умолчанию
Если вам нужен пользователь «postgres» по какой‑то причине, вы можете явно его создать:
environment:
POSTGRES_DB: "conduktor-console"
POSTGRES_USER: "conduktor"
POSTGRES_PASSWORD: "change_me"
POSTGRES_INITDB_ARGS: "--auth-host=scram-sha-256"
Решение 5: Проверить конфликт портов
Как упомянуто в руководствах по устранению неполадок, проверьте, нет ли конфликтов портов:
sudo lsof -i :5432
Это покажет, использует ли другой процесс порт PostgreSQL.
Решение 6: Использовать корректные скрипты инициализации
Создайте пользовательский скрипт инициализации, чтобы гарантировать, что все необходимые пользователи и базы данных созданы правильно:
services:
postgresql:
image: postgres:14
volumes:
- pg_data:/var/lib/postgresql/data
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
environment:
POSTGRES_DB: "conduktor-console"
POSTGRES_USER: "conduktor"
POSTGRES_PASSWORD: "change_me"
Создайте файл init.sql со следующим содержимым:
CREATE USER conduktor WITH PASSWORD 'change_me';
CREATE DATABASE conduktor-console OWNER conduktor;
Профилактика и лучшие практики
1. Используйте согласованные имена
Сохраняйте одинаковые имена пользователя, базы данных и конфигурации приложения, чтобы избежать путаницы:
# Сервис PostgreSQL
POSTGRES_USER: "conduktor"
POSTGRES_DB: "conduktor-console"
# Сервис Conduktor Console
CDK_DATABASE_URL: "postgresql://conduktor:change_me@postgresql:5432/conduktor-console"
2. Реализуйте корректные проверки работоспособности
Используйте явные проверки работоспособности с правильными учетными данными:
healthcheck:
test: ["CMD-SHELL", "pg_isready -U conduktor -d conduktor-console"]
interval: 10s
timeout: 5s
retries: 5
start_period: 30s
3. Используйте файлы окружения
Для лучшей организации и избежания опечаток используйте файлы окружения:
# docker-compose.yml
services:
postgresql:
env_file:
- ./.env.postgres
# .env.postgres
POSTGRES_DB=conduktor-console
POSTGRES_USER=conduktor
POSTGRES_PASSWORD=change_me
4. Тестируйте соединения отдельно
Перед запуском Conduktor Console проверьте соединение с PostgreSQL:
docker exec -it <postgres-container-name> psql -U conduktor -d conduktor-console
5. Эффективно мониторьте логи
Настройте правильный логгинг, чтобы быстро обнаруживать проблемы с подключением:
services:
postgresql:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
Продвинутый отладочный процесс
Проверка зависимостей контейнеров
Ошибка может быть связана с зависимостями сервисов. Убедитесь, что конфигурация depends_on корректна:
depends_on:
postgresql:
condition: service_healthy
Проверка сетевой конфигурации
Убедитесь, что сервисы могут корректно общаться:
docker network ls
docker network inspect <network-name>
Отладка проблем с подключением
Проверьте соединение изнутри контейнера Conduktor Console:
docker exec -it <conduktor-container-name> telnet postgresql 5432
Проверка логов PostgreSQL
Изучите логи PostgreSQL для более подробной информации об ошибках:
docker logs <postgres-container-name>
Использование pgAdmin для проверки
Подключитесь к вашей базе PostgreSQL через pgAdmin, чтобы убедиться, что пользователь «conduktor» существует и имеет необходимые права.
Вывод
Ошибка «FATAL: role ‘root’ does not exist» при развертывании Conduktor Console с Docker Compose обычно вызвана несоответствием учетных данных между конфигурацией PostgreSQL и тем, как приложение пытается подключиться. Следуя ключевым шагам, вы сможете решить проблему:
- Использовать явные проверки работоспособности с правильными учетными данными PostgreSQL.
- Обеспечить согласованность между переменными окружения PostgreSQL и строками подключения.
- Удалить или изменить
POSTGRES_HOST_AUTH_METHOD, если он вызывает конфликты. - Тестировать соединения отдельно до запуска полной стека.
- Настроить надёжный мониторинг для раннего обнаружения проблем.
Наиболее распространённое решение — обновить проверку работоспособности, чтобы использовать правильные учетные данные, и убедиться, что строки подключения полностью совпадают с конфигурацией PostgreSQL. Если проблемы продолжаются, рассмотрите возможность использования скриптов инициализации для явного создания необходимых пользователей и баз данных.
Источники
- Stack Overflow - Postgres with docker compose gives FATAL: role “root” does not exist error
- Stack Overflow - Deploying Conduktor Console for Apache Kafka with Docker Compose FATAL: role “root” does not exist
- Docker Library PostgreSQL Issues - Role “root” does not exist when using docker-compose
- Medium - How to Fix the “Role ‘Postgres’ Does Not Exist” Error When Deploying PostgreSQL Docker Container
- Stack Overflow - Docker compose psql: error: FATAL: role “postgres” does not exist