#!/usr/bin/env bash # ============================================================================= # FranklinWH Toolbox - pgAdmin4(Web)部署脚本 # ============================================================================= # 作用: # 1. 给现有 PostgreSQL 超级用户 postgres 设置登录密码(供 pgAdmin 连接用) # 2. 以 Docker Compose 部署 Web 版 pgAdmin4(dpage/pgadmin4) # 3. 检测 pg_hba.conf / listen_addresses,打印让容器经 TCP 连本机 PG 所需的配置 # (本脚本【不】自动修改系统配置文件,仅给出提示,改动交由你确认执行) # # 前置条件: # - Docker + docker compose 插件已安装(可用 install_deps.sh docker) # - PostgreSQL 已安装并运行(本机 :5432),且当前用户可 sudo -u postgres psql # # 用法: # POSTGRES_PASSWORD='强密码' PGADMIN_PASSWORD='强密码' ./install_pgadmin.sh # # 可用环境变量(均有默认值): # POSTGRES_PASSWORD PostgreSQL 超级用户 postgres 的新密码 (默认 change_me_strong) # PGADMIN_EMAIL pgAdmin4 Web 登录邮箱 (默认 liang_jlyx@163.com) # PGADMIN_PASSWORD pgAdmin4 Web 登录密码 (默认 change_me_strong) # PGADMIN_PORT pgAdmin4 对外端口 (默认 5480) # PGADMIN_BIND 端口绑定地址(默认仅本机,防公网暴露) (默认 127.0.0.1) # PGADMIN_DIR pgAdmin 部署目录 (默认 /home/$USER/docker/pgadmin) # PG_HOST 容器视角的 PG 主机 (默认 host.docker.internal) # PG_PORT PG 端口 (默认 5432) # ============================================================================= set -euo pipefail # TODO: [必填] postgres 超级用户新密码——请通过环境变量传入强口令,勿用默认 POSTGRES_PASSWORD="${POSTGRES_PASSWORD:-change_me_strong}" PGADMIN_EMAIL="${PGADMIN_EMAIL:-liang_jlyx@163.com}" # TODO: [必填] pgAdmin4 Web 登录密码——请通过环境变量传入强口令,勿用默认 PGADMIN_PASSWORD="${PGADMIN_PASSWORD:-change_me_strong}" PGADMIN_PORT="${PGADMIN_PORT:-5480}" PGADMIN_BIND="${PGADMIN_BIND:-127.0.0.1}" PGADMIN_DIR="${PGADMIN_DIR:-$HOME/docker/pgadmin}" PG_HOST="${PG_HOST:-host.docker.internal}" PG_PORT="${PG_PORT:-5432}" c_reset='\033[0m'; c_blue='\033[1;34m'; c_green='\033[1;32m'; c_yellow='\033[1;33m'; c_red='\033[1;31m' info() { echo -e "${c_blue}[INFO]${c_reset} $*"; } ok() { echo -e "${c_green}[ OK ]${c_reset} $*"; } warn() { echo -e "${c_yellow}[WARN]${c_reset} $*"; } err() { echo -e "${c_red}[FAIL]${c_reset} $*" >&2; } # docker compose 命令探测(插件 or 独立二进制) compose() { if docker compose version >/dev/null 2>&1; then docker compose "$@" elif command -v docker-compose >/dev/null 2>&1; then docker-compose "$@" else err "未找到 docker compose,请先安装(install_deps.sh docker)"; return 1 fi } # --------------------------------------------------------------------------- # 1. 给 postgres 超级用户设置密码 # 使用 psql 变量 + %L 转义,安全支持含特殊字符的密码。 # --------------------------------------------------------------------------- set_postgres_password() { info "为 PostgreSQL 超级用户 postgres 设置密码 ..." command -v psql >/dev/null 2>&1 || { err "未找到 psql,请先安装 PostgreSQL"; return 1; } if [[ "${POSTGRES_PASSWORD}" == "change_me_strong" ]]; then warn "当前使用默认占位密码 change_me_strong,请务必改用强口令后重跑:" warn " POSTGRES_PASSWORD='你的强口令' ./install_pgadmin.sh" fi sudo -u postgres psql -v ON_ERROR_STOP=1 -v pwd="${POSTGRES_PASSWORD}" <<'SQL' SELECT format('ALTER ROLE postgres WITH PASSWORD %L', :'pwd') \gexec SQL ok "postgres 密码已设置" } # --------------------------------------------------------------------------- # 2. 检测 pg_hba.conf / listen_addresses(只提示,不自动改) # --------------------------------------------------------------------------- check_pg_network() { info "检查 PostgreSQL 是否允许容器经 TCP 连接(密码认证)..." local hba conf listen hba="$(sudo -u postgres psql -tAc 'SHOW hba_file;' 2>/dev/null || true)" conf="$(sudo -u postgres psql -tAc 'SHOW config_file;' 2>/dev/null || true)" listen="$(sudo -u postgres psql -tAc 'SHOW listen_addresses;' 2>/dev/null || true)" info " hba_file : ${hba:-未知}" info " config_file : ${conf:-未知}" info " listen_addresses: ${listen:-未知}" if [[ "${listen}" != "*" && "${listen}" != *"0.0.0.0"* ]]; then warn "listen_addresses 当前为 '${listen}',容器可能无法经 host-gateway 连入。" warn "如需允许,请在 ${conf:-postgresql.conf} 设置: listen_addresses = '*'" fi cat < "${PGADMIN_DIR}/docker-compose.yml" </dev/null 2>&1 || { err "未找到 docker,请先安装(install_deps.sh docker)"; exit 1; } set_postgres_password check_pg_network deploy_pgadmin cat <