Skip to content

安装部署

系统要求

最低配置

  • 操作系统: Linux (推荐 Ubuntu 20.04+ / Debian 11+ / CentOS 8+)
  • CPU: 2 核
  • 内存: 4 GB
  • 磁盘: 20 GB 可用空间
  • Docker Engine: 24.0+
  • Docker Compose: 2.20+

推荐配置

  • CPU: 4 核及以上
  • 内存: 8 GB 及以上
  • 磁盘: SSD 100 GB 及以上

环境准备

1. 安装 Docker Engine

bash
# Ubuntu/Debian
curl -fsSL https://get.docker.com | bash
sudo systemctl start docker
sudo systemctl enable docker

# 验证安装
docker --version
docker compose version

2. 创建部署目录

bash
mkdir nnipms && cd nnipms
mkdir -p config data data/postgres data/valkey log

Docker Compose 部署

按场景分为完整服务使用外部数据库两大类。

环境变量配置(推荐)

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

环境变量说明默认值
DB_DRIVER数据库驱动类型:mysqlpostgrespostgres
DB_HOST数据库主机地址
DB_PORT数据库端口5432
DB_USER数据库用户名
DB_PASSWORD数据库密码
DB_NAME数据库名称
DB_SSLMODESSL 模式(PostgreSQL 专用)

设置环境变量后,可省略 -c 参数和 config/ 目录挂载。配置优先级:环境变量 > TOML 配置文件

方案一:完整服务(内置数据库)

适用于首次部署或没有现有数据库的场景,一键启动数据库 + 缓存 + 后端 + 前端全部服务。

PostgreSQL 方案

创建 docker-compose.yml

yaml
# ==============================================================================
# NNIPMS - 前后端分离部署(PostgreSQL + Valkey)
# ==============================================================================
# 使用方式:
#   cd docker-compose
#   cp ../.env.example .env
#   docker compose -f docker-compose.postgres.yml up -d
# ==============================================================================

services:
  # ---- PostgreSQL 数据库(默认访问端口: 5432)----
  db:
    image: postgres:18.4-alpine
    container_name: nnipms-seperate-postgres
    restart: unless-stopped
    environment:
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-Hf#XE6h2f*#HrU}
      POSTGRES_USER: ${POSTGRES_USER:-nnipms_user}
      POSTGRES_DB: ${POSTGRES_DATABASE:-nnipms_db}
      TZ: Asia/Shanghai
    ports:
      - "${POSTGRES_PORT:-5432}:${POSTGRES_INTERNAL_PORT:-5432}"
    volumes:
      - ./data/postgres:/var/lib/postgresql
    networks:
      nnipms-db-net:
        ipv4_address: ${DB_FIXED_IP:-172.20.0.10}
    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 缓存(默认访问端口: 6379)----
  valkey:
    image: valkey/valkey:9-alpine
    container_name: nnipms-seperate-valkey
    restart: unless-stopped
    command:
      - valkey-server
      - --maxmemory ${VALKEY_MAX_MEMORY:-1024}mb
      - --maxmemory-policy ${VALKEY_MAX_MEMORY_POLICY:-allkeys-lru}
      - --save ""
    ports:
      - "${VALKEY_PORT:-6379}:${VALKEY_INTERNAL_PORT:-6379}"
    volumes:
      - ./data/valkey:/data
    healthcheck:
      test: ["CMD", "valkey-cli", "ping"]
      interval: 10s
      timeout: 3s
      retries: 3

  # ---- Go 后端服务(默认访问端口: 12339)----
  backend:
    image: ${BACKEND_IMAGE:-ccr.ccs.tencentyun.com/nnipms/backend:latest}
    container_name: nnipms-seperate-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:12338,http://127.0.0.1:12338}
      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}"
      LOG_LEVEL: ${LOG_LEVEL:-warn}
      LOG_FILE_LEVEL: ${LOG_FILE_LEVEL:-debug}
    volumes:
      - ${CONFIG_DIR:-./config}:/app/config
      - ${LOG_DIR:-./log}:/app/log
    command:
      - -c
      - config/postgres.toml
      - -p
      - "${BACKEND_PORT:-12339}"
      - -a
      - "${BACKEND_ADDR:-0.0.0.0}"
      - -log
      - "${LOG_LEVEL:-warn}"
      - --log-file
      - "${LOG_FILE_LEVEL:-debug}"

  # ---- 前端静态服务(默认访问端口: 12338)----
  frontend:
    image: ${FRONTEND_IMAGE:-ccr.ccs.tencentyun.com/nnipms/dashboard:latest}
    container_name: nnipms-seperate-frontend
    restart: unless-stopped
    network_mode: host
    depends_on:
      backend:
        condition: service_started
    environment:
      BACKEND_URL: http://127.0.0.1:${BACKEND_PORT:-12339}

networks:
  nnipms-db-net:
    driver: bridge
    ipam:
      config:
        - subnet: ${DB_NET_SUBNET:-172.20.0.0/16}

创建 .env

bash
# =============================================================================
# NNIPMS Docker Compose 环境变量配置模板
# 拷贝此文件为 .env 并根据需要修改:
#   cp .env.example .env
# =============================================================================

# ---- 数据库配置 ----
# 驱动类型: mysql | postgres
DB_DRIVER=postgres
# 外部数据库配置文件路径(external 模式)
EXTERNAL_CONFIG=./config/postgres.external.toml
# MySQL 配置
MYSQL_HOST=db
MYSQL_PORT=3306
MYSQL_INTERNAL_PORT=3306
MYSQL_USER=nnipms_user
MYSQL_PASSWORD=M8k#xR2p$9Lq@7ZnW
MYSQL_DATABASE=nnipms_db
MYSQL_CHARSET=utf8mb4
MYSQL_PARSE_TIME=true
MYSQL_LOC=Local
# PostgreSQL 配置
POSTGRES_HOST=db
POSTGRES_PORT=5432
POSTGRES_INTERNAL_PORT=5432
POSTGRES_USER=nnipms_user
POSTGRES_PASSWORD=M8k#xR2p$9Lq@7ZnW
POSTGRES_DATABASE=nnipms_db
POSTGRES_SSLMODE=disable

# ---- Valkey 缓存配置 ----
VALKEY_ADDRESS=valkey:6379
VALKEY_PORT=6379
VALKEY_INTERNAL_PORT=6379
VALKEY_PASSWORD=
VALKEY_DB=0
VALKEY_MAX_MEMORY=1024
VALKEY_MAX_MEMORY_POLICY=allkeys-lru

# ---- 后端服务配置 ----
BACKEND_PORT=12339
BACKEND_ADDR=0.0.0.0
LOG_LEVEL=warn                # 终端输出级别(告警及以上)
LOG_FILE_LEVEL=debug           # 日志文件级别(调试及以上)
BACKEND_IMAGE=ccr.ccs.tencentyun.com/nnipms/backend:latest

# ---- CORS 跨域配置 ----
# 允许的跨域来源,多个用逗号分隔
CORS_ORIGINS=http://localhost:12338,http://127.0.0.1:12338

# ---- 前端配置 ----
FRONTEND_PORT=12338
FRONTEND_IMAGE=ccr.ccs.tencentyun.com/nnipms/dashboard:latest
VITE_API_BASE_URL=http://localhost:12339

# ---- 数据持久化路径 ----
DATA_DIR=./data
CONFIG_DIR=./config
LOG_DIR=./log

# ---- License Server 配置 ----
LICENSE_SERVER_PORT=8080
LICENSE_SERVER_INTERNAL_PORT=8080
LICENSE_LOG_LEVEL=warn                # License Server 终端级别
LICENSE_LOG_FILE_LEVEL=debug           # License Server 文件级别
LICENSE_SERVER_IMAGE=ccr.ccs.tencentyun.com/nnipms/license:latest

# ---- 探针客户端配置 ----
PROBE_IMAGE=ccr.ccs.tencentyun.com/nnipms/probe:latest
PROBE_CONFIG=./probe-config.toml
PROBE_LOG_LEVEL=warn               # 探针终端级别
PROBE_LOG_FILE_LEVEL=debug          # 探针文件级别

# ---- 数据库容器网络(内部数据库场景) ----
DB_NET_SUBNET=172.20.0.0/16
DB_FIXED_IP=172.20.0.10

# ---- MySQL/PostgreSQL 容器 root 密码(内部数据库场景) ----
# 生产环境请务必修改为强密码!
MYSQL_ROOT_PASSWORD=R00t#9kP$mN2@vL8
POSTGRES_ROOT_PASSWORD=R00t#9kP$mN2@vL8

创建 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

MySQL 方案

创建 docker-compose.yml

yaml
# ==============================================================================
# NNIPMS - 前后端分离部署(MySQL + Valkey)
# ==============================================================================
# 使用方式:
#   cd docker-compose
#   cp ../.env.example .env
#   docker compose -f docker-compose.mysql.yml up -d
# ==============================================================================

services:
  # ---- MySQL 数据库(默认访问端口: 3306)----
  db:
    image: mysql:9.7.0
    container_name: nnipms-seperate-mysql
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123}
      MYSQL_DATABASE: ${MYSQL_DATABASE:-nnipms_db}
      MYSQL_USER: ${MYSQL_USER:-nnipms_user}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD:-Hf#XE6h2f*#HrU}
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
      - --max_connections=200
    ports:
      - "${MYSQL_PORT:-3306}:${MYSQL_INTERNAL_PORT:-3306}"
    volumes:
      - ./data/mysql:/var/lib/mysql
    networks:
      nnipms-db-net:
        ipv4_address: ${DB_FIXED_IP:-172.20.0.10}
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD:-root123}"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s

  # ---- Valkey 缓存(默认访问端口: 6379)----
  valkey:
    image: valkey/valkey:9-alpine
    container_name: nnipms-seperate-valkey
    restart: unless-stopped
    command:
      - valkey-server
      - --maxmemory ${VALKEY_MAX_MEMORY:-1024}mb
      - --maxmemory-policy ${VALKEY_MAX_MEMORY_POLICY:-allkeys-lru}
      - --save ""
    ports:
      - "${VALKEY_PORT:-6379}:${VALKEY_INTERNAL_PORT:-6379}"
    volumes:
      - ./data/valkey:/data
    healthcheck:
      test: ["CMD", "valkey-cli", "ping"]
      interval: 10s
      timeout: 3s
      retries: 3

  # ---- Go 后端服务(默认访问端口: 12339)----
  backend:
    image: ${BACKEND_IMAGE:-ccr.ccs.tencentyun.com/nnipms/backend:latest}
    container_name: nnipms-seperate-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:12338,http://127.0.0.1:12338}
      DB_DRIVER: ${DB_DRIVER:-mysql}
      DB_HOST: ${DB_HOST:-127.0.0.1}
      DB_PORT: "${DB_PORT:-3306}"
      DB_USER: ${MYSQL_USER:-nnipms_user}
      DB_PASSWORD: ${MYSQL_PASSWORD:-Hf#XE6h2f*#HrU}
      DB_NAME: ${MYSQL_DATABASE:-nnipms_db}
      DB_SSLMODE: ${DB_SSLMODE:-disable}
      VALKEY_ADDRESS: ${VALKEY_ADDRESS:-127.0.0.1}
      VALKEY_PORT: "${VALKEY_PORT:-6379}"
      LOG_LEVEL: ${LOG_LEVEL:-warn}
      LOG_FILE_LEVEL: ${LOG_FILE_LEVEL:-debug}
    volumes:
      - ${CONFIG_DIR:-./config}:/app/config
      - ${LOG_DIR:-./log}:/app/log
    command:
      - -c
      - config/mysql.toml
      - -p
      - "${BACKEND_PORT:-12339}"
      - -a
      - "${BACKEND_ADDR:-0.0.0.0}"
      - -log
      - "${LOG_LEVEL:-warn}"
      - --log-file
      - "${LOG_FILE_LEVEL:-debug}"

  # ---- 前端静态服务(默认访问端口: 12338)----
  frontend:
    image: ${FRONTEND_IMAGE:-ccr.ccs.tencentyun.com/nnipms/dashboard:latest}
    container_name: nnipms-seperate-frontend
    restart: unless-stopped
    network_mode: host
    depends_on:
      backend:
        condition: service_started
    environment:
      BACKEND_URL: http://127.0.0.1:${BACKEND_PORT:-12339}

networks:
  nnipms-db-net:
    driver: bridge
    ipam:
      config:
        - subnet: ${DB_NET_SUBNET:-172.20.0.0/16}

创建 .env

bash
# =============================================================================
# NNIPMS Docker Compose 环境变量配置模板
# 拷贝此文件为 .env 并根据需要修改:
#   cp .env.example .env
# =============================================================================

# ---- 数据库配置 ----
# 驱动类型: mysql | postgres
DB_DRIVER=mysql
# 外部数据库配置文件路径(external 模式)
EXTERNAL_CONFIG=./config/mysql.external.toml
# MySQL 配置
MYSQL_HOST=db
MYSQL_PORT=3306
MYSQL_INTERNAL_PORT=3306
MYSQL_USER=nnipms_user
MYSQL_PASSWORD=M8k#xR2p$9Lq@7ZnW
MYSQL_DATABASE=nnipms_db
MYSQL_CHARSET=utf8mb4
MYSQL_PARSE_TIME=true
MYSQL_LOC=Local
# PostgreSQL 配置
POSTGRES_HOST=db
POSTGRES_PORT=5432
POSTGRES_INTERNAL_PORT=5432
POSTGRES_USER=nnipms_user
POSTGRES_PASSWORD=M8k#xR2p$9Lq@7ZnW
POSTGRES_DATABASE=nnipms_db
POSTGRES_SSLMODE=disable

# ---- Valkey 缓存配置 ----
VALKEY_ADDRESS=valkey:6379
VALKEY_PORT=6379
VALKEY_INTERNAL_PORT=6379
VALKEY_PASSWORD=
VALKEY_DB=0
VALKEY_MAX_MEMORY=1024
VALKEY_MAX_MEMORY_POLICY=allkeys-lru

# ---- 后端服务配置 ----
BACKEND_PORT=12339
BACKEND_ADDR=0.0.0.0
LOG_LEVEL=warn                # 终端输出级别(告警及以上)
LOG_FILE_LEVEL=debug           # 日志文件级别(调试及以上)
BACKEND_IMAGE=ccr.ccs.tencentyun.com/nnipms/backend:latest

# ---- CORS 跨域配置 ----
# 允许的跨域来源,多个用逗号分隔
CORS_ORIGINS=http://localhost:12338,http://127.0.0.1:12338

# ---- 前端配置 ----
FRONTEND_PORT=12338
FRONTEND_IMAGE=ccr.ccs.tencentyun.com/nnipms/dashboard:latest
VITE_API_BASE_URL=http://localhost:12339

# ---- 数据持久化路径 ----
DATA_DIR=./data
CONFIG_DIR=./config
LOG_DIR=./log

# ---- License Server 配置 ----
LICENSE_SERVER_PORT=8080
LICENSE_SERVER_INTERNAL_PORT=8080
LICENSE_LOG_LEVEL=warn                # License Server 终端级别
LICENSE_LOG_FILE_LEVEL=debug           # License Server 文件级别
LICENSE_SERVER_IMAGE=ccr.ccs.tencentyun.com/nnipms/license:latest

# ---- 探针客户端配置 ----
PROBE_IMAGE=ccr.ccs.tencentyun.com/nnipms/probe:latest
PROBE_CONFIG=./probe-config.toml
PROBE_LOG_LEVEL=warn               # 探针终端级别
PROBE_LOG_FILE_LEVEL=debug          # 探针文件级别

# ---- 数据库容器网络(内部数据库场景) ----
DB_NET_SUBNET=172.20.0.0/16
DB_FIXED_IP=172.20.0.10

# ---- MySQL/PostgreSQL 容器 root 密码(内部数据库场景) ----
# 生产环境请务必修改为强密码!
MYSQL_ROOT_PASSWORD=R00t#9kP$mN2@vL8
POSTGRES_ROOT_PASSWORD=R00t#9kP$mN2@vL8

创建 config/mysql.toml

toml
[database]
driver = "mysql"
host = "127.0.0.1"
port = 3306
username = "nnipms_user"
password = "Hf#XE6h2f*#HrU"
database = "nnipms_db"

[mysql]
charset = "utf8mb4"
parse_time = true
loc = "Local"

启动:

bash
docker compose up -d

已知问题

MySQL 9.x 对 TEXT/BLOB 类型的索引键有前缀长度要求,部分表的 uniqueIndex 字段可能在表初始化时报错 BLOB/TEXT column used in key specification without a key length。如遇此问题,建议换用 MariaDB 12(完全兼容 MySQL 协议,使用 driver = "mysql" 连接),详见 MariaDB 部署文档

MariaDB 方案

创建 docker-compose.yml

yaml
# ==============================================================================
# NNIPMS - 前后端分离部署(MariaDB + Valkey)
# ==============================================================================
# 使用方式:
#   cd docker-compose
#   cp ../.env.example .env
#   docker compose -f docker-compose.mariadb.yml up -d
# ==============================================================================

services:
  # ---- MariaDB 数据库(默认访问端口: 3306)----
  db:
    image: mariadb:11.7
    container_name: nnipms-seperate-mariadb
    restart: unless-stopped
    environment:
      MARIADB_ROOT_PASSWORD: ${MARIADB_ROOT_PASSWORD:-root123}
      MARIADB_DATABASE: ${MARIADB_DATABASE:-nnipms_db}
      MARIADB_USER: ${MARIADB_USER:-nnipms_user}
      MARIADB_PASSWORD: ${MARIADB_PASSWORD:-Hf#XE6h2f*#HrU}
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
      - --max_connections=200
    ports:
      - "${MARIADB_PORT:-3306}:${MARIADB_INTERNAL_PORT:-3306}"
    volumes:
      - ./data/mariadb:/var/lib/mysql
    networks:
      nnipms-db-net:
        ipv4_address: ${DB_FIXED_IP:-172.20.0.10}
    healthcheck:
      test: ["CMD", "mariadb-admin", "ping", "-h", "localhost", "-u", "root", "-p${MARIADB_ROOT_PASSWORD:-root123}"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s

  # ---- Valkey 缓存(默认访问端口: 6379)----
  valkey:
    image: valkey/valkey:9-alpine
    container_name: nnipms-seperate-valkey
    restart: unless-stopped
    command:
      - valkey-server
      - --maxmemory ${VALKEY_MAX_MEMORY:-1024}mb
      - --maxmemory-policy ${VALKEY_MAX_MEMORY_POLICY:-allkeys-lru}
      - --save ""
    ports:
      - "${VALKEY_PORT:-6379}:${VALKEY_INTERNAL_PORT:-6379}"
    volumes:
      - ./data/valkey:/data
    healthcheck:
      test: ["CMD", "valkey-cli", "ping"]
      interval: 10s
      timeout: 3s
      retries: 3

  # ---- Go 后端服务(默认访问端口: 12339)----
  backend:
    image: ${BACKEND_IMAGE:-ccr.ccs.tencentyun.com/nnipms/backend:latest}
    container_name: nnipms-seperate-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:12338,http://127.0.0.1:12338}
      DB_DRIVER: ${DB_DRIVER:-mysql}
      DB_HOST: ${DB_HOST:-127.0.0.1}
      DB_PORT: "${DB_PORT:-3306}"
      DB_USER: ${MARIADB_USER:-nnipms_user}
      DB_PASSWORD: ${MARIADB_PASSWORD:-Hf#XE6h2f*#HrU}
      DB_NAME: ${MARIADB_DATABASE:-nnipms_db}
      DB_SSLMODE: ${DB_SSLMODE:-disable}
      VALKEY_ADDRESS: ${VALKEY_ADDRESS:-127.0.0.1}
      VALKEY_PORT: "${VALKEY_PORT:-6379}"
      LOG_LEVEL: ${LOG_LEVEL:-warn}
      LOG_FILE_LEVEL: ${LOG_FILE_LEVEL:-debug}
    volumes:
      - ${CONFIG_DIR:-./config}:/app/config
      - ${LOG_DIR:-./log}:/app/log
    command:
      - -c
      - config/mysql.toml
      - -p
      - "${BACKEND_PORT:-12339}"
      - -a
      - "${BACKEND_ADDR:-0.0.0.0}"
      - -log
      - "${LOG_LEVEL:-warn}"
      - --log-file
      - "${LOG_FILE_LEVEL:-debug}"

  # ---- 前端静态服务(默认访问端口: 12338)----
  frontend:
    image: ${FRONTEND_IMAGE:-ccr.ccs.tencentyun.com/nnipms/dashboard:latest}
    container_name: nnipms-seperate-frontend
    restart: unless-stopped
    network_mode: host
    depends_on:
      backend:
        condition: service_started
    environment:
      BACKEND_URL: http://127.0.0.1:${BACKEND_PORT:-12339}

networks:
  nnipms-db-net:
    driver: bridge
    ipam:
      config:
        - subnet: ${DB_NET_SUBNET:-172.20.0.0/16}

创建 .env

bash
# =============================================================================
# NNIPMS Docker Compose 环境变量配置模板
# 拷贝此文件为 .env 并根据需要修改:
#   cp .env.example .env
# =============================================================================

# ---- 数据库配置 ----
# 驱动类型: mysql | postgres
DB_DRIVER=mysql
# 外部数据库配置文件路径(external 模式)
EXTERNAL_CONFIG=./config/mysql.external.toml
# MySQL 配置
MYSQL_HOST=db
MYSQL_PORT=3306
MYSQL_INTERNAL_PORT=3306
MYSQL_USER=nnipms_user
MYSQL_PASSWORD=M8k#xR2p$9Lq@7ZnW
MYSQL_DATABASE=nnipms_db
MYSQL_CHARSET=utf8mb4
MYSQL_PARSE_TIME=true
MYSQL_LOC=Local
# MariaDB 配置(与 MySQL 兼容,使用 mysql 驱动)
MARIADB_HOST=db
MARIADB_PORT=3306
MARIADB_INTERNAL_PORT=3306
MARIADB_USER=nnipms_user
MARIADB_PASSWORD=M8k#xR2p$9Lq@7ZnW
MARIADB_DATABASE=nnipms_db
MARIADB_CHARSET=utf8mb4
# PostgreSQL 配置
POSTGRES_HOST=db
POSTGRES_PORT=5432
POSTGRES_INTERNAL_PORT=5432
POSTGRES_USER=nnipms_user
POSTGRES_PASSWORD=M8k#xR2p$9Lq@7ZnW
POSTGRES_DATABASE=nnipms_db
POSTGRES_SSLMODE=disable

# ---- Valkey 缓存配置 ----
VALKEY_ADDRESS=valkey:6379
VALKEY_PORT=6379
VALKEY_INTERNAL_PORT=6379
VALKEY_PASSWORD=
VALKEY_DB=0
VALKEY_MAX_MEMORY=1024
VALKEY_MAX_MEMORY_POLICY=allkeys-lru

# ---- 后端服务配置 ----
BACKEND_PORT=12339
BACKEND_ADDR=0.0.0.0
LOG_LEVEL=warn                # 终端输出级别(告警及以上)
LOG_FILE_LEVEL=debug           # 日志文件级别(调试及以上)
BACKEND_IMAGE=ccr.ccs.tencentyun.com/nnipms/backend:latest

# ---- CORS 跨域配置 ----
# 允许的跨域来源,多个用逗号分隔
CORS_ORIGINS=http://localhost:12338,http://127.0.0.1:12338

# ---- 前端配置 ----
FRONTEND_PORT=12338
FRONTEND_IMAGE=ccr.ccs.tencentyun.com/nnipms/dashboard:latest
VITE_API_BASE_URL=http://localhost:12339

# ---- 数据持久化路径 ----
DATA_DIR=./data
CONFIG_DIR=./config
LOG_DIR=./log

# ---- License Server 配置 ----
LICENSE_SERVER_PORT=8080
LICENSE_SERVER_INTERNAL_PORT=8080
LICENSE_LOG_LEVEL=warn                # License Server 终端级别
LICENSE_LOG_FILE_LEVEL=debug           # License Server 文件级别
LICENSE_SERVER_IMAGE=ccr.ccs.tencentyun.com/nnipms/license:latest

# ---- 探针客户端配置 ----
PROBE_IMAGE=ccr.ccs.tencentyun.com/nnipms/probe:latest
PROBE_CONFIG=./probe-config.toml
PROBE_LOG_LEVEL=warn               # 探针终端级别
PROBE_LOG_FILE_LEVEL=debug          # 探针文件级别

# ---- 数据库容器网络(内部数据库场景) ----
DB_NET_SUBNET=172.20.0.0/16
DB_FIXED_IP=172.20.0.10

# ---- MySQL/PostgreSQL/MariaDB 容器 root 密码(内部数据库场景) ----
# 生产环境请务必修改为强密码!
MYSQL_ROOT_PASSWORD=R00t#9kP$mN2@vL8
POSTGRES_ROOT_PASSWORD=R00t#9kP$mN2@vL8
MARIADB_ROOT_PASSWORD=R00t#9kP$mN2@vL8

创建 config/mysql.toml(MariaDB 使用 MySQL 驱动):

toml
[database]
driver = "mysql"
host = "127.0.0.1"
port = 3306
username = "nnipms_user"
password = "Hf#XE6h2f*#HrU"
database = "nnipms_db"

[mysql]
charset = "utf8mb4"
parse_time = true
loc = "Local"

启动:

bash
docker compose up -d

访问系统

启动完成后,打开浏览器访问:http://localhost:12338

默认管理员账号:

  • 用户名: admin
  • 密码: admin123456

安全提示

首次登录后请立即修改默认密码!

方案二:使用外部数据库

适用于已有 PostgreSQL/MySQL 实例的场景,Docker Compose 仅管理缓存、后端和前端服务。

创建 config/postgres.external.toml(PostgreSQL):

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

创建 config/mysql.external.toml(MySQL):

toml
[database]
driver = "mysql"
host = "你的MySQL主机"
port = 3306
username = "nnipms_user"
password = "你的密码"
database = "nnipms_db"

[mysql]
charset = "utf8mb4"
parse_time = true
loc = "Local"

创建 docker-compose.yml

yaml
name: nnipms-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:12338,http://127.0.0.1:12338}
      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

使用 Nginx 反向代理(可选)

nginx
server {
    listen 80;
    server_name nnipms.yourdomain.com;

    location / {
        proxy_pass http://127.0.0.1:12338;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

数据备份

数据库备份

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

# MySQL 备份
docker exec -t nnipms-mysql mysqldump -u nnipms_user -p nnipms_db > nnipms_backup_$(date +%Y%m%d).sql

配置文件备份

bash
tar -czf nnipms_config_backup_$(date +%Y%m%d).tar.gz .env config/

常见问题

无法连接数据库

  1. 检查数据库容器是否正常运行:docker ps
  2. 查看容器日志:docker logs nnipms-postgres
  3. 检查 .env 中的连接信息
  4. 检查防火墙设置

端口被占用

bash
# 查看端口占用
sudo lsof -i :12339

# 修改 .env 中的端口变量后重新创建容器:
docker compose down && docker compose up -d

容器无法启动

bash
# 查看容器日志
docker compose logs

# 检查数据目录权限
ls -la data/

# 重建容器
docker compose down -v && docker compose up -d

获取帮助

  • 技术支持: support@nnipms.liumou.site