【pg-ha-docker系列教程】04-新业务“nginx-proxy-manager”接入标准操作手册 (SOP)

【pg-ha-docker系列教程】04-新业务“nginx-proxy-manager”接入标准操作手册 (SOP)

太讲究了!你现在拥有了一个企业级的高可用数据库底座。对于这种级别的架构,“绝对不要让任何业务应用直接使用 postgres 超级管理员账号” 是运维界的第一铁律(所谓的“最小权限原则”)。

每个接入的新业务(比如 Gitea、Nextcloud、WordPress 或者你自己写的后端 API),都必须拥有一个独立且被彻底隔离的数据库和专属账号。

为你奉上这份标准的 《新业务接入标准操作手册 (SOP)》。不管以后你要部署什么应用,照着这套模版走,绝对安全且优雅!


🚀 业务接入标准操作手册 (SOP):开通专属数据库

💡 架构师温馨提示: > 得益于你搭建的底层流复制(Streaming Replication)高可用架构,你只需要在整个集群的任意一个写入口执行一次以下操作,新增的账号和数据库就会在毫秒级自动同步到另外两个节点!无需三台机器重复操作!

🛠️ 第一步:通过 HAProxy 连入主库

不管你现在 SSH 登录在 Node 1、Node 2 还是 Node 3 上,都可以直接利用本地的 patroni 容器内自带的 psql 客户端,通过本机 HAProxy 的 5000 端口(强制定向到主库) 连入系统。

在任意节点执行以下命令进入数据库命令行:

Bash

Bash
docker exec -it patroni psql -h 127.0.0.1 -p 5000 -U postgres

(按回车后,输入你在部署时生成的 postgres 超级管理员密码)

如果你看到类似 postgres=# 的提示符,说明你已经成功进入了当前最高权限的主库控制台!


🛠️ 第二步:执行标准的“开库三板斧”

假设你要接入的新应用叫做 nginx-proxy-manager,你想给它分配的用户名为 npm_user,密码为 npm@Secret2026,数据库名为 npm_db

请在 postgres=# 提示符下,依次敲入以下极其规范的 SQL 语句:

1. 创建专属用户(Role)并设置强密码:

SQL
CREATE USER npm_user WITH LOGIN PASSWORD 'npm@Secret2026';

2. 创建专属数据库,并直接将所有权(Owner)移交给该用户:

SQL
CREATE DATABASE npm_db OWNER npm_user;

3. ⚠️ 极其关键的一步(PostgreSQL 15+ 新规适配): 因为咱们的镜像用的是极新的 PostgreSQL 16,从 PG 15 开始,数据库彻底收回了普通用户在 public 默认模式(Schema)下的随意建表权限。所以你必须先切换到刚建好的新库,再显式地把 public 模式的权限赋予这个新用户

先切换到新数据库:

SQL
\c npm_db

(系统会提示:You are now connected to database “npm_db” as user “postgres”.)

然后赋予权限:

SQL
GRANT ALL ON SCHEMA public TO npm_user;

最后,优雅地退出数据库控制台:

SQL
\q

🔌 第三步:如何在新应用的配置文件里填写连接信息?

数据库建好了,接下来你在部署那个新应用(比如在它的 docker-compose.yml 或者配置向导里)填写数据库信息时,请直接照抄这套标准答案:

  • 数据库类型 (DB Type)PostgreSQL
  • 数据库地址 (Host):填写这三台机器中任意一台的 IP(推荐写应用所在宿主机的内网 IP,如果应用不跟数据库在一台机器上,填你 HAProxy 所在节点的任意 IP 均可)。
  • 数据库端口 (Port)
    • 5000 👉 这是唯一正确的选项!因为应用需要建表、写入数据,必须走 5000 端口直通当前的 Primary 主库。
  • 数据库名称 (DB Name)npm_db
  • 用户名 (User)npm_user
  • 密码 (Password)npm@Secret2026
YAML
# /opt/docker/npm/docker-compose.yml
version: '3.8'

services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    container_name: npm_app
    restart: unless-stopped
    ports:
      # 映射 HTTP 和 HTTPS 的标准端口
      - '80:80'
      - '443:443'
      # NPM 的后台管理 Web 界面端口
      - '81:81'
    environment:
      # 💡 强行注入 PostgreSQL 连接凭证,告诉 NPM 不要用自带的孱弱 SQLite
      # ⚠️ 架构师警告:绝不能写 127.0.0.1!请填入你宿主机的局域网 IP 
      # (比如 192.168.x.x,或者你之前的 2607:9d00:2000... 格式的 IP)
      DB_POSTGRES_HOST: '172.17.0.1' 
      DB_POSTGRES_PORT: '5000'          # 坚定地指向咱们的高可用写库网关
      DB_POSTGRES_USER: 'npm_user'      # 刚才建的专属账号
      DB_POSTGRES_PASSWORD: 'npm@Secret2026' # 刚才建的强密码
      DB_POSTGRES_NAME: 'npm_db'        # 专属数据库名
    volumes:
      # 持久化 NPM 的配置、证书等核心数据
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

🧠 高阶读写分离提示: 如果你未来部署的某些高级应用(比如 Nextcloud 或某些 Java Spring Boot 后端)支持配置**“只读从库 (Read Replica)”**,你可以把它的只读数据库连接端口配置为 5001!这样它的繁重查询(如报表导出)就会被 HAProxy 自动分摊给咱们的 Node 2 和 Node 3,彻底榨干三台机器的性能!


这套 SOP 极其精简且避开了所有版本权限暗坑,你可以把它直接作为你这套集群的官方运维文档存档。

Comments

No comments yet. Why don’t you start the discussion?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注