Help us shape the future of Go! Take the 2026 Go Developer Survey

postgres

package
v0.0.0-...-7c54862 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 14, 2026 License: Apache-2.0 Imports: 13 Imported by: 0

README

数据库连接配置

go-scalebox 系列项目的统一数据库连接管理,支持密码和证书两种认证方式。

认证模式

模式 场景 客户端凭证 pg_hba.conf
密码 开发/测试 PGPASS 环境变量 scram-sha-256
证书 生产环境 client.crt + client.key cert(CN 匹配用户名)

模式由客户端自动检测:$SCALEBOX_CERTS_DIR/client.crt 存在则走证书,否则走密码。

客户端环境变量

连接目标
环境变量 默认值 说明
DATABASE_URL — 完整连接串,最高优先级
PGURL — 同上,存量兼容
PGHOST fallback 链¹ 主机地址
PGPORT 5432 端口
PGUSER scalebox 用户名
PGDB scalebox 数据库名
认证
环境变量 默认值 说明
PGPASS — 密码(密码模式)
SCALEBOX_CERTS_DIR ./secrets/shared 证书目录(证书模式)
连接池
环境变量 默认值 说明
PG_MAX_CONNS 20 pgxpool 最大连接(GetPgxPool)
PG_MIN_CONNS 5 pgxpool 最小连接(GetPgxPool)
PG_MAX_IDLE_CONNS 1 sql.DB 最大空闲连接(GetDB)
PG_MAX_OPEN_CONNS 4 sql.DB 最大打开连接(GetDB)
PG_MAX_CONN_LIFETIME_MIN 30 pgxpool 连接最大存活(分钟)
PG_MAX_CONN_IDLE_TIME_MIN 5 pgxpool 连接最大空闲(分钟)

¹ PGHOST fallback:PGHOST → GRPC_SERVER 的 IP → LOCAL_ADDR → 本机 IP

连接串构建优先级

1. DATABASE_URL          完整控制权,有值直接返回
2. PGURL                 存量兼容
3. 证书文件存在           检测 $SCALEBOX_CERTS_DIR/client.crt + client.key
   └─ sslmode=verify-full(CA 存在)/ require(CA 不存在)
4. PGPASS                密码认证

证书体系

同一 CA 签发所有证书 + JWT 密钥对,由 gen-secrets.sh 一次性生成:

./secrets/
├── ca.key              CA 私钥(仅签发,部署前移走保管)
├── private.pem         JWT 签发私钥
│
├── db/                 PostgreSQL SSL(database 容器)
│   ├── server.crt        CN=scalebox-db
│   └── server.key
│
├── controld/           gRPC TLS(controld 容器)
│   ├── server.crt        CN=controld
│   └── server.key
│
└── shared/             所有客户端共用(SCALEBOX_CERTS_DIR 指向此目录)
    ├── ca.crt            验证服务端
    ├── client.crt        CN=scalebox
    ├── client.key
    └── public.pem        JWT 验签公钥
cd build
bash gen-secrets.sh            # 生成所有密钥到 ./secrets/
make copy-secrets              # 拷贝 shared/ 到 agent 镜像 rootfs
make agent                     # 构建 agent 镜像
各容器挂载
容器 挂载 用途
database ./secrets/shared/ca.crt + ./secrets/db/ PostgreSQL SSL
controld ./secrets/controld/ + ./secrets/shared/ gRPC TLS + DB 客户端 + JWT
actuator ./secrets/shared/ DB 客户端
agent 镜像内置 shared/(make copy-secrets) DB 客户端 + JWT
CLI export SCALEBOX_CERTS_DIR=./secrets/shared DB 客户端

连接变化检测

GetDB() 和 GetPgxPool() 每次调用时比较当前连接串与上次是否一致。任何环境变量变化(DATABASE_URL、PGHOST、PGPASS、SCALEBOX_CERTS_DIR 等)都会触发旧连接关闭、新连接重建。

数据库服务端

环境变量
环境变量 默认值 说明
AUTH_MODE password password 或 cert
POSTGRES_PASSWORD —(password 模式必填) 数据库密码
PASSWORD_FALLBACK_CIDR — cert 模式下允许密码降级的 IP 范围

部署

go-scalebox 的 build/ 目录提供分层 compose 文件,各层独立开关,按需组合:

文件 功能
compose.yaml 基础服务(controld、actuator、database、redis)
compose.tls.yaml gRPC 传输加密(controld↔agent↔CLI)
compose.db-cert.yaml 数据库证书认证
compose.security.yaml JWT 安全认证(Token Service)
compose.security-local-key.yaml JWT 安全认证(本地私钥,无需 Token Service)
用法
cd build

# 首次部署前生成证书
bash gen-certs.sh

# 开发环境:仅密码模式
docker compose -f compose.yaml up -d

# gRPC TLS
docker compose -f compose.yaml -f compose.tls.yaml up -d

# gRPC TLS + 数据库证书
docker compose -f compose.yaml -f compose.tls.yaml -f compose.db-cert.yaml up -d

# gRPC TLS + 数据库证书 + JWT 认证
docker compose -f compose.yaml -f compose.tls.yaml -f compose.db-cert.yaml -f compose.security.yaml up -d

### 本地开发(直连数据库)

```bash
# 证书模式(需先运行 gen-certs.sh)
export PGHOST=localhost
export SCALEBOX_CERTS_DIR=./build/secrets/shared

# 密码模式
export PGHOST=localhost
export PGPASS=dev123

项目覆盖

项目 获取连接方式 改动
go-scalebox postgres.GetDB() / postgres.GetPgxPool() 自动受益
workspace/scalebox pkg/postgres(源头) 修改
exastore DATABASE_URL → pgxpool.NewWithConfig() 部署时 DATABASE_URL 加证书参数
scalebox-security DATABASE_URL → pgxpool.New() 同上
gopkg 接收外部 *pgxpool.Pool(DI) 无需改动

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func GetDB

func GetDB() *sql.DB

GetDB 返回 *sql.DB。 当连接参数变化(DATABASE_URL/PGURL/PGHOST/PGPASS/SCALEBOX_CERTS_DIR 等)时自动重建连接。

func GetPgxPool

func GetPgxPool() *pgxpool.Pool

GetPgxPool 返回 *pgxpool.Pool。 当连接参数变化时自动重建连接池。

func NewSQLNullString

func NewSQLNullString(s string) sql.NullString

NewSQLNullString ...

Types

This section is empty.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL