MacでredashをDokcerで構築しようとしたら sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) FATAL: password authentication failed for user “postgres”

Dockerを使ってredash環境を用意しようとしたところ、以下のエラーが出て難儀しました。

sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) FATAL:  password authentication failed for user "postgres"

整理も兼ねて一から構築手順を書いていきます。

※ dockerはインストール済前提で話します。

スポンサードサーチ

Git操作

リポジトリはこちらになります。
https://github.com/getredash/redash

$ git clone https://github.com/getredash/redash.git

タグが管理されていますので、v8.0.0 にチェックアウトします。

$ cd redash
$ git checkout refs/tags/v8.0.0

v9.0.0-betaからsetupディレクトリの中身が getredash/setup に移行しているので少し面倒なためです。
https://github.com/getredash/redash/tree/v9.0.0-beta/setup

v8.0.0のsetupディレクトリなら必要なファイルが揃っています。

pwgenのインストール

setup.shを実行するためpwgenをインストールします

$ brew install pwgen

ディレクトリの用意

setup/docker-compose.yml を確認するとvolumesで/opt/redash/postgres-data を指定しているので

postgres:
  image: postgres:9.5-alpine
  env_file: /opt/redash/env
  volumes:
    - /opt/redash/postgres-data:/var/lib/postgresql/data
  restart: always

ディレクトリを作成していきます。

$ sudo mkdir /opt/redash
$ sudo chown {ユーザー名}:staff /opt/redash
$ sudo mkdir /opt/redash/postgres-data

ユーザー名は以下のコマンドで確認してみてください

$ whoami

DockerのFILE SHARINGに追加

dockerのアイコンからPreferences を開き

Resources > FILE SHARING にて /opt/redash/postgres-data を追加します。

docker-compose.ymlをコピー

/opt/redashsetup/docker-compose.yml を設置します。

$ cd setup
$ cp docker-compose.yml /opt/redash

setup.shの編集

setup/setup.shを編集します。
編集した内容がこちら。

#!/usr/bin/env bash
# This script setups dockerized Redash on Ubuntu 18.04.
set -eu

REDASH_BASE_PATH=/opt/redash

create_directories() {
    if [[ ! -e $REDASH_BASE_PATH ]]; then
        sudo mkdir -p $REDASH_BASE_PATH
        sudo chown $USER:$USER $REDASH_BASE_PATH
    fi

    if [[ ! -e $REDASH_BASE_PATH/postgres-data ]]; then
        mkdir $REDASH_BASE_PATH/postgres-data
    fi
}

create_config() {
    if [[ -e $REDASH_BASE_PATH/env ]]; then
        rm $REDASH_BASE_PATH/env
        touch $REDASH_BASE_PATH/env
    fi

    COOKIE_SECRET=$(pwgen -1s 32)
    SECRET_KEY=$(pwgen -1s 32)
    POSTGRES_PASSWORD=$(pwgen -1s 32)
    REDASH_DATABASE_URL="postgresql://postgres:${POSTGRES_PASSWORD}@postgres/postgres"

    echo "PYTHONUNBUFFERED=0" >> $REDASH_BASE_PATH/env
    echo "REDASH_LOG_LEVEL=INFO" >> $REDASH_BASE_PATH/env
    echo "REDASH_REDIS_URL=redis://redis:6379/0" >> $REDASH_BASE_PATH/env
    echo "POSTGRES_PASSWORD=$POSTGRES_PASSWORD" >> $REDASH_BASE_PATH/env
    echo "REDASH_COOKIE_SECRET=$COOKIE_SECRET" >> $REDASH_BASE_PATH/env
    echo "REDASH_SECRET_KEY=$SECRET_KEY" >> $REDASH_BASE_PATH/env
    echo "REDASH_DATABASE_URL=$REDASH_DATABASE_URL" >> $REDASH_BASE_PATH/env
}

setup_compose() {
    cd $REDASH_BASE_PATH
    echo "export COMPOSE_PROJECT_NAME=redash" >> ~/.profile
    echo "export COMPOSE_FILE=$REDASH_BASE_PATH/docker-compose.yml" >> ~/.profile
    export COMPOSE_PROJECT_NAME=redash
    export COMPOSE_FILE=$REDASH_BASE_PATH/docker-compose.yml
    sudo docker-compose run --rm server create_db
    sudo docker-compose up -d
}

create_directories
create_config
setup_compose

差分は以下。
install_docker : dockerはインストール済前提のため不要
setup_compose : 実行時の最新版を取得してこようとしてるので不要

 REDASH_BASE_PATH=/opt/redash

-install_docker(){
-    # Install Docker
-    sudo apt-get update
-    sudo apt-get -yy install apt-transport-https ca-certificates curl software-properties-common wget pwgen
-    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
-    sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
-    sudo apt-get update && sudo apt-get -y install docker-ce
-
-    # Install Docker Compose
-    sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
-    sudo chmod +x /usr/local/bin/docker-compose
-
-    # Allow current user to run Docker commands
-    sudo usermod -aG docker $USER
-}
-
 create_directories() {
     if [[ ! -e $REDASH_BASE_PATH ]]; then
         sudo mkdir -p $REDASH_BASE_PATH
@@ -52,13 +36,7 @@ create_config() {
 }

 setup_compose() {
-    REQUESTED_CHANNEL=stable
-    LATEST_VERSION=`curl -s "https://version.redash.io/api/releases?channel=$REQUESTED_CHANNEL"  | json_pp  | grep "docker_image" | head -n 1 | awk 'BEGIN{FS=":"}{print $3}' | awk 'BEGIN{FS="\""}{print $1}'`
-
     cd $REDASH_BASE_PATH
-    REDASH_BRANCH="${REDASH_BRANCH:-master}" # Default branch/version to master if not specified in REDASH_BRANCH env var
-    wget https://raw.githubusercontent.com/getredash/redash/${REDASH_BRANCH}/setup/docker-compose.yml
-    sed -ri "s/image: redash\/redash:([A-Za-z0-9.-]*)/image: redash\/redash:$LATEST_VERSION/" docker-compose.yml
     echo "export COMPOSE_PROJECT_NAME=redash" >> ~/.profile
     echo "export COMPOSE_FILE=$REDASH_BASE_PATH/docker-compose.yml" >> ~/.profile
     export COMPOSE_PROJECT_NAME=redash
@@ -67,7 +45,7 @@ setup_compose() {
     sudo docker-compose up -d
 }

-install_docker
 create_directories
 create_config
 setup_compose

setup.shの実行

$ cd setup
$ chmod +x setup.sh
$ ./setup.sh

っとすると、冒頭のエラーが出ると。。。

sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) FATAL:  password authentication failed for user "postgres"

無視してdockerを起動して

$ docker-compose up -d

http://localhost:5000/ にアクセスしてもInternal Server Error が出るのでダメと。。。

解決方法

きちんと理解できていませんが、パスワードの認証がおかしいと。。。
これはsetup.shの POSTGRES_PASSWORDpostgres に変更し、setup.shを実行しなおせば通りました。

-    POSTGRES_PASSWORD=$(pwgen -1s 32)
+    POSTGRES_PASSWORD=postgres

postgresユーザーのパスワードのデフォルトが postgres だったりするのかな?
そうだったとしても、これで通るのがよくわかってない。。。
詳しい人教えて〜〜

とりあえず、これで http://localhost:5000/ にアクセスしたら無事redashが表示されました。

蛇足

この解決方法、検索してもなかなか見つけられず。。。
(ググり力と知識がなさすぎた orz)

手探りしている間、試したことを記載。
※ 以下では解決しなかったという話です。

バージョン変更作戦

v8.0.0にチェックアウトしたもののv8.0.0のsetup/docker-compose.yml のredashのimageを確認すると redash/redash:7.0.0.b18042 じゃないか!

x-redash-service: &redash-service
  image: redash/redash:7.0.0.b18042
  depends_on:
    - postgres
    - redis
  env_file: /opt/redash/env
  restart: always

バージョンの問題ではなかろうかと思い docker-compose.yml にてimageをredash/redash:8.0.0.b32245 に変更し

-  image: redash/redash:7.0.0.b18042
+  image: redash/redash:8.0.0.b32245

setup.shを実行しても結果は一緒だった orz

sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) FATAL:  password authentication failed for user "postgres"

データベースURL変更作戦

ここ でも同じエラーで困っている人たちがいたので確認していたのだが、
その中のこの投稿 を参考に

If this is local and just for testing, you can remove POSTGRES_PASSWORD and change REDASH_DATABASE_URL to be postgresql://postgres@postgres/postgres.

/opt/redash/env を変更し、

PYTHONUNBUFFERED=0
REDASH_LOG_LEVEL=INFO
REDASH_REDIS_URL=redis://redis:6379/0
- POSTGRES_PASSWORD=qVs6v0dyQxa5j9HSC9Ol6FFlMWXxiwAa
REDASH_COOKIE_SECRET=dukw2St1Uen1TZLv9qyX08AHCKf4nTQi
REDASH_SECRET_KEY=lZKufrINhCejnbbVnr0BPg81FNQi4WZy
- REDASH_DATABASE_URL=postgresql://postgres:qVs6v0dyQxa5j9HSC9Ol6FFlMWXxiwAa@postgres/postgres
+ REDASH_DATABASE_URL=postgresql://postgres@postgres/postgres

以下を実行

$ docker-compose run --rm server create_db

しかし、以下のエラーが。。。
POSTGRES_PASSWORD は必要っと。。。

sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) fe_sendauth: no password supplied

それなら、REDASH_DATABASE_URL だけ修正ならどうだ?

PYTHONUNBUFFERED=0
REDASH_LOG_LEVEL=INFO
REDASH_REDIS_URL=redis://redis:6379/0
POSTGRES_PASSWORD=qVs6v0dyQxa5j9HSC9Ol6FFlMWXxiwAa
REDASH_COOKIE_SECRET=dukw2St1Uen1TZLv9qyX08AHCKf4nTQi
REDASH_SECRET_KEY=lZKufrINhCejnbbVnr0BPg81FNQi4WZy
- REDASH_DATABASE_URL=postgresql://postgres:qVs6v0dyQxa5j9HSC9Ol6FFlMWXxiwAa@postgres/postgres
+ REDASH_DATABASE_URL=postgresql://postgres@postgres/postgres

この場合は以下のエラーが。。。
REDASH_DATABASE_URL にパスワードはないとダメか。。。

sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) fe_sendauth: no password supplied

POSTGRES_PASSWORD=your password ならどうだ。
(postgres ではない適当なパスワードの設定)

PYTHONUNBUFFERED=0
REDASH_LOG_LEVEL=INFO
REDASH_REDIS_URL=redis://redis:6379/0
- POSTGRES_PASSWORD=qVs6v0dyQxa5j9HSC9Ol6FFlMWXxiwAa
+ POSTGRES_PASSWORD=hogehoge
REDASH_COOKIE_SECRET=dukw2St1Uen1TZLv9qyX08AHCKf4nTQi
REDASH_SECRET_KEY=lZKufrINhCejnbbVnr0BPg81FNQi4WZy
- REDASH_DATABASE_URL=postgresql://postgres:qVs6v0dyQxa5j9HSC9Ol6FFlMWXxiwAa@postgres/postgres
+ REDASH_DATABASE_URL=postgresql://postgres:hogehoge@postgres/postgres

結局このエラー。。。

sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) FATAL:  password authentication failed for user "postgres"

参考

コメントを残す

メールアドレスが公開されることはありません。