#!/bin/bash # PostgreSQLセットアップスクリプト # このスクリプトは、データベースとユーザーを作成し、必要な権限を付与します # 再実行可能なスクリプトです - 既存のユーザーやデータベースは削除されます # エラーが発生した場合にスクリプトを停止 set -e # このスクリプト自身の絶対パスを取得 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # すべての変数を export 扱いに set -a # .env を読み込む . $SCRIPT_DIR/../.env # 通常モードに戻す set +a # 変数の定義 DB_NAME=$LOCAL_DB_NAME DB_USER=$LOCAL_DB_USER DB_PASSWORD=$LOCAL_DB_PASSWORD DB_SCHEMA="public" echo "PostgreSQLセットアップを開始します..." echo "データベース: $DB_NAME" echo "ユーザー: $DB_USER" echo "スキーマ: $DB_SCHEMA" # PostgreSQLのsuperuserとして実行する必要があります # 通常はpostgresユーザーを使用します # 既存の接続を切断 echo "既存の接続を切断します..." sudo -u postgres psql -c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '$DB_NAME';" || true # データベースの削除(存在する場合) echo "既存のデータベースを削除します(存在する場合)..." sudo -u postgres psql -c "DROP DATABASE IF EXISTS $DB_NAME;" # ユーザーの削除(存在する場合)と作成 echo "ユーザー '$DB_USER' を再作成します..." sudo -u postgres psql -c "DROP USER IF EXISTS $DB_USER;" sudo -u postgres psql -c "CREATE USER $DB_USER WITH PASSWORD '$DB_PASSWORD';" # データベースの作成 echo "データベース '$DB_NAME' を作成します..." sudo -u postgres psql -c "CREATE DATABASE $DB_NAME;" # データベースの所有者を設定 echo "データベース所有者を設定します..." sudo -u postgres psql -c "ALTER DATABASE $DB_NAME OWNER TO $DB_USER;" # 権限の付与 echo "データベース権限を付与します..." sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;" # データベースに接続してスキーマ権限を付与 echo "スキーマ権限を付与します..." sudo -u postgres psql -d $DB_NAME -c "GRANT ALL ON SCHEMA $DB_SCHEMA TO $DB_USER;" # 既存のオブジェクトに対する権限を付与 echo "既存のオブジェクトに対する権限を付与します..." sudo -u postgres psql -d $DB_NAME -c "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA $DB_SCHEMA TO $DB_USER;" || true sudo -u postgres psql -d $DB_NAME -c "GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA $DB_SCHEMA TO $DB_USER;" || true sudo -u postgres psql -d $DB_NAME -c "GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA $DB_SCHEMA TO $DB_USER;" || true # 今後作成されるオブジェクトに対する権限を設定(postgres ユーザーが作成する場合) echo "postgres ユーザーが今後作成するオブジェクトに対する権限を設定します..." sudo -u postgres psql -d $DB_NAME -c "ALTER DEFAULT PRIVILEGES FOR USER postgres IN SCHEMA $DB_SCHEMA GRANT ALL ON TABLES TO $DB_USER;" sudo -u postgres psql -d $DB_NAME -c "ALTER DEFAULT PRIVILEGES FOR USER postgres IN SCHEMA $DB_SCHEMA GRANT ALL ON SEQUENCES TO $DB_USER;" sudo -u postgres psql -d $DB_NAME -c "ALTER DEFAULT PRIVILEGES FOR USER postgres IN SCHEMA $DB_SCHEMA GRANT ALL ON FUNCTIONS TO $DB_USER;" sudo -u postgres psql -d $DB_NAME -c "ALTER DEFAULT PRIVILEGES FOR USER postgres IN SCHEMA $DB_SCHEMA GRANT ALL ON TYPES TO $DB_USER;" # ユーザー自身が作成するオブジェクトに対する権限を設定 echo "$DB_USER が今後作成するオブジェクトに対する権限を設定します..." sudo -u postgres psql -d $DB_NAME -c "ALTER DEFAULT PRIVILEGES FOR USER $DB_USER IN SCHEMA $DB_SCHEMA GRANT ALL ON TABLES TO $DB_USER;" sudo -u postgres psql -d $DB_NAME -c "ALTER DEFAULT PRIVILEGES FOR USER $DB_USER IN SCHEMA $DB_SCHEMA GRANT ALL ON SEQUENCES TO $DB_USER;" sudo -u postgres psql -d $DB_NAME -c "ALTER DEFAULT PRIVILEGES FOR USER $DB_USER IN SCHEMA $DB_SCHEMA GRANT ALL ON FUNCTIONS TO $DB_USER;" sudo -u postgres psql -d $DB_NAME -c "ALTER DEFAULT PRIVILEGES FOR USER $DB_USER IN SCHEMA $DB_SCHEMA GRANT ALL ON TYPES TO $DB_USER;" echo "PostgreSQLセットアップが完了しました" echo "データベース: $DB_NAME" echo "ユーザー: $DB_USER" echo "パスワード: $DB_PASSWORD" echo "" echo "このスクリプトは再実行可能です。再実行すると、既存のデータベースとユーザーは削除され、新しく作成されます。"