Nacos 2.2.3 生产级部署指南(单机 + MySQL + 鉴权)

一、部署背景

Nacos 作为主流的配置中心和服务注册中心,2.3.2 版本存在鉴权模块与 MySQL 兼容的致命 bug,因此生产环境优先选择 2.2.3 稳定版。本文实现 Nacos 2.2.3 单机部署,集成 MySQL 持久化存储,并开启鉴权(登录验证),满足生产环境安全与稳定性要求。

二、部署架构

  • 核心组件:Nacos 2.2.3 + MySQL 8.0.36
  • 部署模式:Docker Compose 单机部署
  • 核心特性:MySQL 数据持久化、鉴权登录、JVM 生产级调优、日志轮转、健康检查

三、前置准备

1. 环境要求

  • 服务器:Linux 系统(CentOS 7+/Ubuntu 20.04+)

  • 软件:Docker、Docker Compose

  • 网络:服务器开放 8848/9848/9849 端口(或仅对内网开放)

  • 存储

    四、部署步骤

    步骤 1:编写 Docker Compose 配置文件

    创建 docker-compose.yml,内容如下(生产级配置,含资源限制、健康检查):
    :MySQL 提前创建 nacos_config 数据库

XML 复制代码
version: "3.8"

# 第一步:定义两个网络(外部访问网 + 内部服务网)
networks:
  public-net:  # 外部访问网:只让webgateway加入,对外暴露
    driver: bridge
  internal-net:  # 内部服务网:所有服务内部通信,不对外暴露
    driver: bridge


services: #服务
  #######################################
  # Redis 服务(缓存/会话存储)
  #######################################
  redis:
    image: redis:6.2.0 
    container_name: redis6
    restart: always
    ports:
      - "6379:6379"
    volumes:
      - ./redis/redis.conf:/usr/local/etc/redis/redis.conf:ro
      - ./redis/data:/data:rw
      - ./redis/logs:/var/log/redis:rw
    environment:
      - TZ=Asia/Shanghai  # 设置时区
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]  # 加载自定义配置
    healthcheck:  # 健康检查
      test: ["CMD", "redis-cli", "ping"]
      interval: 5s
      timeout: 3s
      retries: 3
    networks:
      - internal-net

  #######################################
  # RabbitMQ 服务(消息队列)
  #######################################
  rabbitmq:
    # 原:rabbitmq:3.13-management
    image: rabbitmq:3.13-management
    container_name: rabbitmq
    restart: always
    hostname: rabbitmq
    environment:
      - RABBITMQ_DEFAULT_VHOST=my_vhost
      - RABBITMQ_DEFAULT_USER=admin
      - RABBITMQ_DEFAULT_PASS=admin
    volumes:
      - ./rabbitmq/data:/var/lib/rabbitmq:rw
      - ./rabbitmq/logs:/var/log/rabbitmq:rw
    ports:
      - "4369:4369"
      - "5672:5672"
      - "15672:15672"
      - "25672:25672"
    security_opt:
      - seccomp:unconfined  # 临时禁用 seccomp 限制(生产环境可细化配置文件)
    cap_add:
      - CAP_SYS_NICE  # 允许调整线程优先级
    networks:
      - internal-net
    healthcheck:
      test: ["CMD", "rabbitmq-diagnostics", "ping"]
      interval: 10s
      timeout: 5s
      retries: 3

  #######################################
  # MySQL 服务(关系型数据库)
  #######################################
  mysql:
    # 原:mysql:8.4.0
    image: mysql:8.4.0
    container_name: mysql840
    restart: always
    hostname: mysql
    environment:
      - MYSQL_ROOT_PASSWORD=shhy123
      - TZ=Asia/Shanghai
    volumes:
      - ./mysql/conf/my.cnf:/etc/my.cnf:ro
      - ./mysql/data:/var/lib/mysql:rw
      - ./mysql/logs:/var/log/mysql:rw
    command:
      #- --default-authentication-plugin=mysql_native_password
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_general_ci
      - --explicit_defaults_for_timestamp=true
      - --default-time-zone=+8:00
      - --lower_case_table_names=1
    ports:
      - "3307:3306"  # 【重要】原3307:3307已改3307:3306(容器内MySQL默认监听3306)
    security_opt:
      - seccomp:unconfined  # 临时禁用 seccomp 限制(生产环境可细化配置文件)
    cap_add:
      - CAP_SYS_NICE  # 允许调整线程优先级
    networks:
      - internal-net
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u$$MYSQL_ROOT_PASSWORD"]
      interval: 10s
      timeout: 5s
      retries: 3
      
  #######################################
  # Elasticsearch 服务(日志/数据检索)
  #######################################
  es:
    # 原:elasticsearch:8.17.2
    image: elasticsearch:8.17.2
    container_name: es
    restart: always
    hostname: es
    environment:
      - "ES_JAVA_OPTS=-Xms2048m -Xmx2048m"  # 【可选】内存不足可改1024m
      - "discovery.type=single-node"
      - "cluster.name=elasticsearch-spc"
      - "ELASTIC_PASSWORD=shhy123" 
      - "TAKE_FILE_OWNERSHIP=true"
      - TZ=Asia/Shanghai
    volumes:
      - ./es-kibana/es/master/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro
      - ./es-kibana/es/master/data:/usr/share/elasticsearch/data:rw
      - ./es-kibana/es/master/logs:/usr/share/elasticsearch/logs:rw
      - ./es-kibana/es/master/plugins:/usr/share/elasticsearch/plugins:rw
    ports:
      - "9200:9200"
      - "9300:9300"
    networks:
      - internal-net
    healthcheck:
      test: ["CMD", "curl", "-s", "-u", "elastic:$$ELASTIC_PASSWORD", "http://localhost:9200/_cluster/health"]
      interval: 15s
      timeout: 10s
      retries: 3

  #######################################
  # Kibana 服务(ES可视化界面)
  #######################################
  kibana:
    # 原:kibana:8.17.2
    image: kibana:8.17.2
    container_name: kibana
    restart: always
    hostname: kibana
    environment:
      - TZ=Asia/Shanghai
      - "elasticsearch.hosts=http://es:9200"
      - "elasticsearch.username=kibana_system"
      - "elasticsearch.password=shhy123"
      - "NODE_OPTIONS=--openssl-legacy-provider=false"  # 禁用旧版 OpenSSL 提供商
    volumes:
      - ./es-kibana/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml:ro
    ports:
      - "5601:5601"
    networks:
      - internal-net
    depends_on:
      - es
    healthcheck:
      test: ["CMD", "curl", "-s", "http://localhost:5601/api/status"]
      interval: 15s
      timeout: 10s
      retries: 3
      
  #######################################
  # MongoDB 服务(文档型数据库)
  #######################################
  mongodb:
    image: mongo:8.0.3  # 选择稳定版本(6.0/7.0均可,根据需求调整)
    container_name: mongodb
    restart: always  # 服务异常时自动重启
    hostname: mongodb
    environment:
      - TZ=Asia/Shanghai  # 时区与其他服务保持一致
      - MONGO_INITDB_ROOT_USERNAME=admin  # 初始化根用户名
      - MONGO_INITDB_ROOT_PASSWORD=shhy123  # 根用户密码(建议与其他服务密码策略一致)
    volumes:
      - ./mongodb/data:/data/db:rw  # 数据持久化目录(核心,避免容器删除后数据丢失)
      - ./mongodb/logs:/var/log/mongodb:rw  # 日志目录挂载
      # 可选:挂载自定义配置文件(如需修改MongoDB默认配置,如端口、权限等)
      # - ./mongodb/conf/mongod.conf:/etc/mongod.conf:ro
    ports:
      - "27017:27017"  # MongoDB默认端口(如需外部访问保留,仅内部访问可删除)
    security_opt:
      - seccomp:unconfined
      - apparmor:unconfined
    networks:
      - internal-net  # 加入内部服务网,与其他服务(如后端)通信
    healthcheck:  # 健康检查(验证数据库是否可用)
      test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')", "-u", "admin", "-p", "shhy123", "--authenticationDatabase", "admin"]
      interval: 10s  # 每10秒检查一次
      timeout: 5s    # 检查超时时间
      retries: 3     # 连续3次失败视为不健康

  #######################################
  # Nacos 服务(配置中心/注册中心)【生产版】
  #######################################
  nacos:
    image: nacos/nacos-server:v2.2.3        # 本地镜像,无需远程拉取
    container_name: nacos
    restart: always
    hostname: nacos
    privileged: true
    pull_policy: never                       # 禁用远程拉取,仅用本地镜像
    environment:
      - TZ=Asia/Shanghai
      # MySQL连接配置(仅基础连接,鉴权配置移到文件)
      - SPRING_DATASOURCE_PLATFORM=mysql
      - MYSQL_SERVICE_HOST=mysql
      - MYSQL_SERVICE_PORT=3306
      - MYSQL_SERVICE_USER=root
      - MYSQL_SERVICE_PASSWORD=shhy123
      - MYSQL_SERVICE_DB_NAME=nacos_config
      # Nacos基础配置
      - NACOS_SERVER_PORT=8848
      - PREFER_HOST_MODE=hostname
      - MODE=standalone                      # 单机模式(集群需另行配置)
      # JVM生产级调优
      - JVM_XMS=1024m
      - JVM_XMX=1024m
      - JVM_XMN=512m
      - JVM_MS=128m
      - JVM_MMS=320m
      # 日志配置
      - NACOS_LOG_BASE_DIR=/home/nacos/logs
      - NACOS_LOG_ROLLING_CONFIG=30
      - NACOS_LOG_MAX_FILE_SIZE=100MB
      - NACOS_WEB_CONTEXT=/nacos
      - NACOS_DEBUG_MODE=false
    volumes:
      # 核心!挂载自定义配置文件(鉴权配置在这里)
      - ./nacos/conf/application.properties:/home/nacos/conf/application.properties:ro
      # 其他持久化挂载
      - ./nacos/conf:/home/nacos/conf:rw
      - ./nacos/logs:/home/nacos/logs:rw
      - ./nacos/data:/home/nacos/data:rw
      - /etc/localtime:/etc/localtime:ro     # 同步宿主机时间
    ports:
      - "8848:8848"   # 主端口(配置中心/控制台)
      - "9848:9848"   # gRPC服务发现端口
      - "9849:9849"   # gRPC配置中心端口
    networks:
      internal-net:
    # 依赖MySQL健康后启动
    depends_on:
      mysql:
        condition: service_healthy
    # 生产级资源限制
    deploy:
      resources:
        limits:
          cpus: '1'
          memory: 2G
        reservations:
          cpus: '0.5'
          memory: 1G
    # 健康检查(及时发现服务异常)
    healthcheck:
      test: ["CMD", "curl", "-s", "-u", "nacos:nacos", "http://localhost:8848/nacos/v1/ns/instance?serviceName=nacos-prod-health"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s

步骤 2:编写 Nacos 核心配置文件(开启鉴权)

创建 ./nacos/conf/application.properties,内容如下(含完整鉴权配置):

XML 复制代码
# 基础单机配置
nacos.standalone=true
server.port=8848

# MySQL连接配置(和Compose一致)
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://mysql:3306/nacos_config?characterEncoding=utf8&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=shhy123

# ========== 核心:开启鉴权(适配Nacos 2.2.3,可直接登录) ==========
# 1. 启用鉴权(核心开关)
nacos.core.auth.enabled=true
# 2. 启用默认鉴权插件(2.2.3必需)
nacos.core.auth.plugin.enabled=true
# 3. 鉴权密钥(必须32位及以上,64位最佳)
nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789
# 4. 服务端身份标识(解决403/鉴权校验问题,必需)
nacos.core.auth.server.identity.key=custom-auth-key
nacos.core.auth.server.identity.value=custom-auth-value
# 5. 客户端身份标识(与服务端对应,可选但建议配置)
nacos.core.auth.identity.key=custom-auth-key
nacos.core.auth.identity.value=custom-auth-value
# 6. 关闭默认用户免密(生产必配,强制登录)
nacos.core.auth.enable.userAgentAuthWhite=false
# 7. 兜底:关闭空token访问(增强鉴权)
nacos.core.auth.plugin.nacos.token.empty.access=false

创建 ./nacos/conf/nacos-logback.xml,内容如下:

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!--
  ~ Copyright 1999-2018 Alibaba Group Holding Ltd.
  ~
  ~ Licensed under the Apache License, Version 2.0 (the "License");
  ~ you may not use this file except in compliance with the License.
  ~ You may obtain a copy of the License at
  ~
  ~      http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing, software
  ~ distributed under the License is distributed on an "AS IS" BASIS,
  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  ~ See the License for the specific language governing permissions and
  ~ limitations under the License.
  -->

<configuration scan="true" scanPeriod="10 seconds">

    <springProperty scope="context" name="logPath" source="nacos.logs.path" defaultValue="${nacos.home}/logs"/>
    <property name="LOG_HOME" value="${logPath}"/>

    <appender name="cmdb-main"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${nacos.home}/logs/cmdb-main.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${nacos.home}/logs/cmdb-main.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>2GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>7GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="naming-server"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/naming-server.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/naming-server.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>1GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>7GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="async-naming-server" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>1024</queueSize>
        <neverBlock>true</neverBlock>
        <appender-ref ref="naming-server"/>
    </appender>

    <appender name="naming-raft"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/naming-raft.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/naming-raft.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>1GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>3GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="async-naming-raft" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>1024</queueSize>
        <neverBlock>true</neverBlock>
        <appender-ref ref="naming-raft"/>
    </appender>


    <appender name="naming-distro"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/naming-distro.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/naming-distro.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>1GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>3GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="async-naming-distro" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>1024</queueSize>
        <neverBlock>true</neverBlock>
        <appender-ref ref="naming-distro"/>
    </appender>

    <appender name="naming-event"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/naming-event.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/naming-event.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>1GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>3GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="async-naming-event" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>1024</queueSize>
        <neverBlock>true</neverBlock>
        <appender-ref ref="naming-event"/>
    </appender>

    <appender name="naming-push"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/naming-push.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/naming-push.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>1GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>3GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <appender name="naming-rt"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/naming-rt.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/naming-rt.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>1GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>3GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%msg%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="naming-performance"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/naming-performance.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/naming-performance.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>1GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>3GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!--config module logback config-->
    <appender name="dumpFile"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/config-dump.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/config-dump.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>2GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>7GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <appender name="pullFile"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/config-pull.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/config-pull.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>20MB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>128MB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <appender name="fatalFile"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/config-fatal.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/config-fatal.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>20MB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>128MB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <appender name="memoryFile"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/config-memory.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/config-memory.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>20MB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>128MB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <appender name="pullCheckFile"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/config-pull-check.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/config-pull-check.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>1GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>3GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%msg%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="clientLog"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/config-client-request.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/config-client-request.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>2GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>7GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date|%msg%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="traceLog"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/config-trace.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/config-trace.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>2GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>7GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date|%msg%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="notifyLog"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/config-notify.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/config-notify.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>1GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>3GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="startLog"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/config-server.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/config-server.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>50MB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>512MB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="rootFile"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/nacos.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/nacos.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>50MB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>512MB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="nacos-address"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/nacos-address.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/nacos-address.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>2GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>7GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="istio-main"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/istio-main.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/istio-main.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>2GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>7GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="core-auth"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/core-auth.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/core-auth.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>2GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>7GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="protocol-raft"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/protocol-raft.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/protocol-raft.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>2GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>7GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="protocol-distro"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/protocol-distro.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/protocol-distro.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>2GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>7GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="nacos-cluster"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/nacos-cluster.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/nacos-cluster.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>2GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>7GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="alipay-jraft"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/alipay-jraft.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/alipay-jraft.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>2GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>7GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    
    
    <!--TPS control -->
    <appender name="tps-control"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/tps-control.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/tps-control.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>2GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>7GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    
    <appender name="tps-control-digest"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/tps-control-digest.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/tps-control-digest.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>2GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>7GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    
    <appender name="tps-control-detail"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/tps-control-detail.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/tps-control-detail.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>2GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>7GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    
    
    <appender name="remote"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/remote.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/remote.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>2GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>7GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    
    <appender name="remote-digest"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/remote-digest.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/remote-digest.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>2GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>7GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    
    <appender name="remote-push"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/remote-push.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/remote-push.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>2GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>7GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    
    
    <logger name="com.alibaba.nacos.address.main" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="nacos-address"/>
    </logger>

    <logger name="com.alibaba.nacos.cmdb.main" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="cmdb-main"/>
    </logger>
    
    <logger name="com.alibaba.nacos.core.remote" additivity="false">
        <level value="DEBUG"/>
        <appender-ref ref="remote"/>
    </logger>
    <logger name="com.alibaba.nacos.core.remote.push" additivity="false">
        <level value="DEBUG"/>
        <appender-ref ref="remote-push"/>
    </logger>
    
    <logger name="com.alibaba.nacos.core.remote.digest" additivity="false">
        <level value="DEBUG"/>
        <appender-ref ref="remote-digest"/>
    </logger>
    
    <!-- TPS Control-->
    <logger name="com.alibaba.nacos.core.remote.control.digest" additivity="false">
        <level value="DEBUG"/>
        <appender-ref ref="tps-control-digest"/>
    </logger>
    
    <logger name="com.alibaba.nacos.core.remote.control.detail" additivity="false">
        <level value="DEBUG"/>
        <appender-ref ref="tps-control-detail"/>
    </logger>
    
    <logger name="com.alibaba.nacos.core.remote.control" additivity="false">
        <level value="DEBUG"/>
        <appender-ref ref="tps-control"/>
    </logger>
    
    <logger name="com.alibaba.nacos.naming.main" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="async-naming-server"/>
    </logger>
    <logger name="com.alibaba.nacos.naming.raft" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="async-naming-raft"/>
    </logger>
    <logger name="com.alibaba.nacos.naming.distro" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="async-naming-distro"/>
    </logger>
    <logger name="com.alibaba.nacos.naming.event" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="async-naming-event"/>
    </logger>
    <logger name="com.alibaba.nacos.naming.push" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="naming-push"/>
    </logger>
    <logger name="com.alibaba.nacos.naming.rt" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="naming-rt"/>
    </logger>
    <logger name="com.alibaba.nacos.naming.performance" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="naming-performance"/>
    </logger>

    <logger name="com.alibaba.nacos.config.dumpLog" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="dumpFile"/>
    </logger>
    <logger name="com.alibaba.nacos.config.pullLog" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="pullFile"/>
    </logger>
    <logger name="com.alibaba.nacos.config.pullCheckLog" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="pullCheckFile"/>
    </logger>
    <logger name="com.alibaba.nacos.config.fatal" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="fatalFile"/>
    </logger>
    <logger name="com.alibaba.nacos.config.monitorLog" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="memoryFile"/>
    </logger>

    <logger name="com.alibaba.nacos.config.clientLog" additivity="false">
        <level value="info"/>
        <appender-ref ref="clientLog"/>
    </logger>

    <logger name="com.alibaba.nacos.config.notifyLog" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="notifyLog"/>
    </logger>

    <logger name="com.alibaba.nacos.config.traceLog" additivity="false">
        <level value="info"/>
        <appender-ref ref="traceLog"/>
    </logger>

    <logger name="com.alibaba.nacos.config.startLog" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="startLog"/>
    </logger>

    <logger name="com.alibaba.nacos.istio.main" additivity="false">
        <level value="DEBUG"/>
        <appender-ref ref="istio-main"/>
    </logger>

    <logger name="com.alibaba.nacos.core.auth" additivity="false">
        <level value="DEBUG"/>
        <appender-ref ref="core-auth"/>
    </logger>

    <logger name="com.alibaba.nacos.core.protocol.raft" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="protocol-raft"/>
    </logger>

    <logger name="com.alipay.sofa.jraft" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="alipay-jraft"/>
    </logger>

    <logger name="com.alibaba.nacos.core.protocol.distro" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="protocol-distro"/>
    </logger>

    <logger name="com.alibaba.nacos.core.cluster" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="nacos-cluster"/>
    </logger>

    <springProfile name="standalone">
        <logger name="org.springframework">
            <appender-ref ref="CONSOLE"/>
            <level value="INFO"/>
        </logger>

        <logger name="org.apache.catalina.startup.DigesterFactory">
            <appender-ref ref="CONSOLE"/>
            <level value="INFO"/>
        </logger>

        <logger name="org.apache.catalina.util.LifecycleBase">
            <appender-ref ref="CONSOLE"/>
            <level value="ERROR"/>
        </logger>

        <logger name="org.apache.coyote.http11.Http11NioProtocol">
            <appender-ref ref="CONSOLE"/>
            <level value="WARN"/>
        </logger>

        <logger name="org.apache.tomcat.util.net.NioSelectorPool">
            <appender-ref ref="CONSOLE"/>
            <level value="WARN"/>
        </logger>
    </springProfile>

    <logger name="com.alibaba.nacos.core.listener.StartingApplicationListener">
        <appender-ref ref="CONSOLE"/>
        <level value="INFO"/>
    </logger>

    <logger name="com.alibaba.nacos.common.notify.NotifyCenter">
        <appender-ref ref="CONSOLE"/>
        <level value="INFO"/>
    </logger>

    <logger name="com.alibaba.nacos.sys.file.WatchFileCenter">
        <appender-ref ref="CONSOLE"/>
        <level value="INFO"/>
    </logger>

    <logger name="com.alibaba.nacos.common.executor.ThreadPoolManager">
        <appender-ref ref="CONSOLE"/>
        <level value="INFO"/>
    </logger>

    <root>
        <level value="INFO"/>
        <appender-ref ref="rootFile"/>
    </root>
</configuration>

步骤 3:初始化 MySQL 鉴权表

创建 ./mysql/init/nacos-mysql.sql,写入以下 SQL(创建 Nacos 鉴权所需的用户 / 角色表):

sql 复制代码
/*
 * Copyright 1999-2018 Alibaba Group Holding Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info   */
/******************************************/
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL COMMENT 'content',
  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  `encrypted_data_key` text NOT NULL COMMENT '秘钥',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info_aggr   */
/******************************************/
CREATE TABLE `config_info_aggr` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  `datum_id` varchar(255) NOT NULL COMMENT 'datum_id',
  `content` longtext NOT NULL COMMENT '内容',
  `gmt_modified` datetime NOT NULL COMMENT '修改时间',
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段';


/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info_beta   */
/******************************************/
CREATE TABLE `config_info_beta` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  `content` longtext NOT NULL COMMENT 'content',
  `beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',
  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  `encrypted_data_key` text NOT NULL COMMENT '秘钥',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info_tag   */
/******************************************/
CREATE TABLE `config_info_tag` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
  `tag_id` varchar(128) NOT NULL COMMENT 'tag_id',
  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  `content` longtext NOT NULL COMMENT 'content',
  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_tags_relation   */
/******************************************/
CREATE TABLE `config_tags_relation` (
  `id` bigint(20) NOT NULL COMMENT 'id',
  `tag_name` varchar(128) NOT NULL COMMENT 'tag_name',
  `tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`nid`),
  UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),
  KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation';

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = group_capacity   */
/******************************************/
CREATE TABLE `group_capacity` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群',
  `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
  `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
  `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
  `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值',
  `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
  `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_group_id` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = his_config_info   */
/******************************************/
CREATE TABLE `his_config_info` (
  `id` bigint(20) unsigned NOT NULL,
  `nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `src_user` text,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  `encrypted_data_key` text NOT NULL COMMENT '秘钥',
  PRIMARY KEY (`nid`),
  KEY `idx_gmt_create` (`gmt_create`),
  KEY `idx_gmt_modified` (`gmt_modified`),
  KEY `idx_did` (`data_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造';


/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = tenant_capacity   */
/******************************************/
CREATE TABLE `tenant_capacity` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID',
  `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
  `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
  `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
  `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',
  `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
  `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表';


CREATE TABLE `tenant_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `kp` varchar(128) NOT NULL COMMENT 'kp',
  `tenant_id` varchar(128) default '' COMMENT 'tenant_id',
  `tenant_name` varchar(128) default '' COMMENT 'tenant_name',
  `tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc',
  `create_source` varchar(32) DEFAULT NULL COMMENT 'create_source',
  `gmt_create` bigint(20) NOT NULL COMMENT '创建时间',
  `gmt_modified` bigint(20) NOT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),
  KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';

CREATE TABLE `users` (
	`username` varchar(50) NOT NULL PRIMARY KEY,
	`password` varchar(500) NOT NULL,
	`enabled` boolean NOT NULL
);

CREATE TABLE `roles` (
	`username` varchar(50) NOT NULL,
	`role` varchar(50) NOT NULL,
	UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE
);

CREATE TABLE `permissions` (
    `role` varchar(50) NOT NULL,
    `resource` varchar(255) NOT NULL,
    `action` varchar(8) NOT NULL,
    UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
);

INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);

INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');

验证部署结果

1. 控制台访问

访问 http://服务器IP:8848/nacos,会出现 Nacos 登录页,输入默认账号:nacos,密码:nacos,可正常登录控制台。

2. 核心功能验证

  • 配置管理 :新增 / 修改 / 删除配置,数据会持久化到 MySQL 的 config_info 表;
  • 服务注册:通过 API/SDK 注册服务,可在「服务列表」查看,数据持久化到 MySQL;
  • 鉴权验证:退出登录后再次访问控制台,需重新输入账号密码(无免密访问);
  • 健康检查 :执行 docker-compose ps,Nacos/MySQL 状态均为 healthy
相关推荐
小陈工23 分钟前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
0xDevNull5 小时前
MySQL数据冷热分离详解
后端·mysql
科技小花5 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸5 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain5 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希5 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神6 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员6 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java6 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿6 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb