Skip to content

PostgreSQL 18 数据库配置

版本信息

  • 镜像: postgres:18.4-alpine
  • 驱动: postgres
  • 默认端口: 5432

环境变量配置(推荐)

从 v2.0 开始,后端支持通过环境变量配置数据库连接,无需 TOML 文件:

环境变量说明默认值
DB_DRIVER数据库驱动postgres
DB_HOST数据库主机
DB_PORT数据库端口5432
DB_USER用户名
DB_PASSWORD密码
DB_NAME数据库名
DB_SSLMODESSL 模式disable

完整服务(内置 PostgreSQL)

创建 docker-compose.yml

yaml
name: nnipms-postgres

services:
  db:
    image: postgres:18.4-alpine
    container_name: nnipms-postgres
    restart: unless-stopped
    environment:
      POSTGRES_PASSWORD: ${POSTGRES_ROOT_PASSWORD:-root123}
      POSTGRES_USER: ${POSTGRES_USER:-nnipms_user}
      POSTGRES_DB: ${POSTGRES_DATABASE:-nnipms_db}
      TZ: Asia/Shanghai
    ports:
      - "${POSTGRES_PORT:-5432}:5432"
    volumes:
      - ./data/postgres:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-nnipms_user} -d ${POSTGRES_DATABASE:-nnipms_db}"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 20s

  valkey:
    image: valkey/valkey:9-alpine
    container_name: nnipms-valkey
    restart: unless-stopped
    command:
      - valkey-server
      - --maxmemory ${VALKEY_MAX_MEMORY:-1024}mb
      - --maxmemory-policy ${VALKEY_MAX_MEMORY_POLICY:-allkeys-lru}
    ports:
      - "${VALKEY_PORT:-6379}:6379"
    volumes:
      - ./data/valkey:/data
    healthcheck:
      test: ["CMD", "valkey-cli", "ping"]
      interval: 10s
      timeout: 3s
      retries: 3

  backend:
    image: ccr.ccs.tencentyun.com/nnipms/backend:latest
    container_name: nnipms-backend
    restart: unless-stopped
    network_mode: host
    depends_on:
      db:
        condition: service_healthy
      valkey:
        condition: service_healthy
    environment:
      TZ: Asia/Shanghai
      CORS_ORIGINS: ${CORS_ORIGINS:-http://localhost:8848,http://127.0.0.1:8848}
      DB_DRIVER: ${DB_DRIVER:-postgres}
      DB_HOST: ${DB_HOST:-127.0.0.1}
      DB_PORT: "${DB_PORT:-5432}"
      DB_USER: ${POSTGRES_USER:-nnipms_user}
      DB_PASSWORD: ${POSTGRES_PASSWORD:-Hf#XE6h2f*#HrU}
      DB_NAME: ${POSTGRES_DATABASE:-nnipms_db}
      DB_SSLMODE: ${DB_SSLMODE:-disable}
      VALKEY_ADDRESS: ${VALKEY_ADDRESS:-127.0.0.1}
      VALKEY_PORT: "${VALKEY_PORT:-6379}"
    volumes:
      - ./config:/app/config
      - ./log:/app/log
    command:
      - -c
      - config/postgres.toml
      - -p
      - "${BACKEND_PORT:-12339}"
      - -a
      - "${BACKEND_ADDR:-0.0.0.0}"

  frontend:
    image: ccr.ccs.tencentyun.com/nnipms/dashboard:latest
    container_name: nnipms-frontend
    restart: unless-stopped
    network_mode: host
    depends_on:
      backend:
        condition: service_started
    environment:
      BACKEND_URL: http://127.0.0.1:${BACKEND_PORT:-12339}

创建 .env

bash
POSTGRES_PORT=5432
POSTGRES_USER=nnipms_user
POSTGRES_PASSWORD=Hf#XE6h2f*#HrU
POSTGRES_DATABASE=nnipms_db
POSTGRES_ROOT_PASSWORD=root123
VALKEY_PORT=6379
VALKEY_MAX_MEMORY=1024
BACKEND_PORT=12339
BACKEND_ADDR=0.0.0.0
CORS_ORIGINS=http://localhost:8848,http://127.0.0.1:8848

创建 config/postgres.toml

toml
[database]
driver = "postgres"
host = "127.0.0.1"
port = 5432
username = "nnipms_user"
password = "Hf#XE6h2f*#HrU"
database = "nnipms_db"
sslmode = "disable"

[postgres]
max_idle_conns = 10
max_open_conns = 100
conn_max_lifetime = 1

启动:

bash
docker compose up -d

外部 PostgreSQL

如果已有 PostgreSQL 实例,只需启动 Valkey、后端和前端。

创建 config/postgres.external.toml

toml
[database]
driver = "postgres"
host = "你的PG主机地址"
port = 5432
username = "nnipms_user"
password = "你的数据库密码"
database = "nnipms_db"
sslmode = "disable"

[postgres]
max_idle_conns = 10
max_open_conns = 100
conn_max_lifetime = 1

创建 docker-compose.yml(仅 Valkey + Backend + Frontend):

yaml
name: nnipms-postgres-external

services:
  valkey:
    image: valkey/valkey:9-alpine
    container_name: nnipms-valkey
    restart: unless-stopped
    ports:
      - "${VALKEY_PORT:-6379}:6379"
    healthcheck:
      test: ["CMD", "valkey-cli", "ping"]

  backend:
    image: ccr.ccs.tencentyun.com/nnipms/backend:latest
    container_name: nnipms-backend
    restart: unless-stopped
    network_mode: host
    depends_on:
      valkey:
        condition: service_healthy
    environment:
      CORS_ORIGINS: ${CORS_ORIGINS:-http://localhost:8848,http://127.0.0.1:8848}
      DB_DRIVER: ${DB_DRIVER:-postgres}
      DB_HOST: ${DB_HOST:-127.0.0.1}
      DB_PORT: ${DB_PORT:-5432}
      DB_USER: ${DB_USER:-nnipms_user}
      DB_PASSWORD: ${DB_PASSWORD:-Hf#XE6h2f*#HrU}
      DB_NAME: ${DB_NAME:-nnipms_db}
      DB_SSLMODE: ${DB_SSLMODE:-disable}
      VALKEY_ADDRESS: ${VALKEY_ADDRESS:-valkey}
      VALKEY_PORT: "${VALKEY_PORT:-6379}"
    volumes:
      - ./config:/app/config
    command:
      - -c
      - config/postgres.external.toml
      - -p
      - "${BACKEND_PORT:-12339}"
      - -a
      - "${BACKEND_ADDR:-0.0.0.0}"

  frontend:
    image: ccr.ccs.tencentyun.com/nnipms/dashboard:latest
    container_name: nnipms-frontend
    restart: unless-stopped
    network_mode: host
    depends_on:
      backend:
        condition: service_started
    environment:
      BACKEND_URL: http://127.0.0.1:${BACKEND_PORT:-12339}

启动:

bash
docker compose up -d

首次安装

PostgreSQL 首次启动时会自动创建用户和数据库,无需手动执行 SQL。

备份与恢复

bash
# 备份
docker exec -t nnipms-postgres pg_dump -U nnipms_user nnipms_db > backup_$(date +%Y%m%d).sql

# 恢复
cat backup.sql | docker exec -i nnipms-postgres psql -U nnipms_user nnipms_db