Другое

Как исправить ошибку "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

yaml
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: {}

Проблема

  1. Я не могу подключиться к localhost:8999 и получаю ошибку «Connection reset».
  2. В логах PostgreSQL появляется сообщение: FATAL: role "root" does not exist.
  3. Эта ошибка возникает, несмотря на то, что в конфигурации задан пользователь 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»:

yaml
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, явно указав правильные учетные данные:

yaml
healthcheck:
  test: ["CMD-SHELL", "pg_isready -U conduktor -d conduktor-console"]
  interval: 10s
  timeout: 5s
  retries: 5

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

Решение 2: Проверить согласованность строки подключения

Проверьте переменную окружения CDK_DATABASE_URL в сервисе Conduktor Console. Убедитесь, что она точно соответствует вашей конфигурации PostgreSQL:

yaml
environment:
  CDK_DATABASE_URL: "postgresql://conduktor:change_me@postgresql:5432/conduktor-console"

Решение 3: Удалить или изменить POSTGRES_HOST_AUTH_METHOD

Метод аутентификации scram-sha-256 может вызывать проблемы. Попробуйте удалить его или изменить на более совместимый метод:

yaml
environment:
  POSTGRES_DB: "conduktor-console"
  POSTGRES_USER: "conduktor"
  POSTGRES_PASSWORD: "change_me"
  # Удалите POSTGRES_HOST_AUTH_METHOD или установите "trust" для разработки

Решение 4: Явно создать пользователя по умолчанию

Если вам нужен пользователь «postgres» по какой‑то причине, вы можете явно его создать:

yaml
environment:
  POSTGRES_DB: "conduktor-console"
  POSTGRES_USER: "conduktor"
  POSTGRES_PASSWORD: "change_me"
  POSTGRES_INITDB_ARGS: "--auth-host=scram-sha-256"

Решение 5: Проверить конфликт портов

Как упомянуто в руководствах по устранению неполадок, проверьте, нет ли конфликтов портов:

bash
sudo lsof -i :5432

Это покажет, использует ли другой процесс порт PostgreSQL.

Решение 6: Использовать корректные скрипты инициализации

Создайте пользовательский скрипт инициализации, чтобы гарантировать, что все необходимые пользователи и базы данных созданы правильно:

yaml
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 со следующим содержимым:

sql
CREATE USER conduktor WITH PASSWORD 'change_me';
CREATE DATABASE conduktor-console OWNER conduktor;

Профилактика и лучшие практики

1. Используйте согласованные имена

Сохраняйте одинаковые имена пользователя, базы данных и конфигурации приложения, чтобы избежать путаницы:

yaml
# Сервис PostgreSQL
POSTGRES_USER: "conduktor"
POSTGRES_DB: "conduktor-console"

# Сервис Conduktor Console
CDK_DATABASE_URL: "postgresql://conduktor:change_me@postgresql:5432/conduktor-console"

2. Реализуйте корректные проверки работоспособности

Используйте явные проверки работоспособности с правильными учетными данными:

yaml
healthcheck:
  test: ["CMD-SHELL", "pg_isready -U conduktor -d conduktor-console"]
  interval: 10s
  timeout: 5s
  retries: 5
  start_period: 30s

3. Используйте файлы окружения

Для лучшей организации и избежания опечаток используйте файлы окружения:

yaml
# docker-compose.yml
services:
  postgresql:
    env_file:
      - ./.env.postgres
bash
# .env.postgres
POSTGRES_DB=conduktor-console
POSTGRES_USER=conduktor
POSTGRES_PASSWORD=change_me

4. Тестируйте соединения отдельно

Перед запуском Conduktor Console проверьте соединение с PostgreSQL:

bash
docker exec -it <postgres-container-name> psql -U conduktor -d conduktor-console

5. Эффективно мониторьте логи

Настройте правильный логгинг, чтобы быстро обнаруживать проблемы с подключением:

yaml
services:
  postgresql:
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

Продвинутый отладочный процесс

Проверка зависимостей контейнеров

Ошибка может быть связана с зависимостями сервисов. Убедитесь, что конфигурация depends_on корректна:

yaml
depends_on:
  postgresql:
    condition: service_healthy

Проверка сетевой конфигурации

Убедитесь, что сервисы могут корректно общаться:

bash
docker network ls
docker network inspect <network-name>

Отладка проблем с подключением

Проверьте соединение изнутри контейнера Conduktor Console:

bash
docker exec -it <conduktor-container-name> telnet postgresql 5432

Проверка логов PostgreSQL

Изучите логи PostgreSQL для более подробной информации об ошибках:

bash
docker logs <postgres-container-name>

Использование pgAdmin для проверки

Подключитесь к вашей базе PostgreSQL через pgAdmin, чтобы убедиться, что пользователь «conduktor» существует и имеет необходимые права.


Вывод

Ошибка «FATAL: role ‘root’ does not exist» при развертывании Conduktor Console с Docker Compose обычно вызвана несоответствием учетных данных между конфигурацией PostgreSQL и тем, как приложение пытается подключиться. Следуя ключевым шагам, вы сможете решить проблему:

  1. Использовать явные проверки работоспособности с правильными учетными данными PostgreSQL.
  2. Обеспечить согласованность между переменными окружения PostgreSQL и строками подключения.
  3. Удалить или изменить POSTGRES_HOST_AUTH_METHOD, если он вызывает конфликты.
  4. Тестировать соединения отдельно до запуска полной стека.
  5. Настроить надёжный мониторинг для раннего обнаружения проблем.

Наиболее распространённое решение — обновить проверку работоспособности, чтобы использовать правильные учетные данные, и убедиться, что строки подключения полностью совпадают с конфигурацией PostgreSQL. Если проблемы продолжаются, рассмотрите возможность использования скриптов инициализации для явного создания необходимых пользователей и баз данных.

Источники

  1. Stack Overflow - Postgres with docker compose gives FATAL: role “root” does not exist error
  2. Stack Overflow - Deploying Conduktor Console for Apache Kafka with Docker Compose FATAL: role “root” does not exist
  3. Docker Library PostgreSQL Issues - Role “root” does not exist when using docker-compose
  4. Medium - How to Fix the “Role ‘Postgres’ Does Not Exist” Error When Deploying PostgreSQL Docker Container
  5. Stack Overflow - Docker compose psql: error: FATAL: role “postgres” does not exist
Авторы
Проверено модерацией
Модерация