Skip to content

项目配置

基础配置

运行项目之前一定要先配置 数据库账户密码、`Redis` 端口号等

.env 基础配置

.env 里主要包含:项目名称、端口、全局请求前缀、多设备登录、OSS 配置、SMTP 配置,这类配置信息通常和项目运行环境无关。

bash
APP_NAME = NestAdmin # 项目名称
APP_PORT = 3000 # 项目端口

GLOBAL_PREFIX = '/' # 全局请求前缀

MULTI_DEVICE_LOGIN = true # 多设备登录

# OSS 配置
OSS_TYPE=local  #  local | qcloud | aliyun
OSS_SECRET_ID= # 腾讯云 是 secretId 阿里云是 AccessKey ID
OSS_SECRET_KEY= # secretKey
OSS_DOMAIN=
OSS_BUCKET= # bucket name
OSS_REGION= # ali oss-cn-beijing | qcloud  ap-chengdu

# SMTP 配置
SMTP_FROM=XXX的Nest后台 # 发件人名称
SMTP_HOST=smtp.qq.com # smtp服务器 smtp.qq.com
SMTP_PORT=465 # 端口 465
SMTP_USER= # 发件人 邮箱号码
SMTP_PASS= # 授权码

# pay 目前只有支付宝沙箱
PAY_APP_ID=
PAY_SIGN_TYPE=RSA2
PAY_GATEWAY=https://openapi-sandbox.dl.alipaydev.com/gateway.do

OSS 配置

local 就是本地上传 只需要配置 OSS_TYPE = local 即可 其他的配置项是使用 OSS 时才需要配置

OSS 配置最重要的是在对应的云服务网站在对象存储控制台配置好 bucketbucket 的权限,一般来说需要把权限改为私有写,公有读。配置好以后一定要把自己选择的存储桶(bucket)的地区配置到 OSS 配置项的 OSS_REGION,桶名称配置到 OSS_BUCKET。密钥的 OSS_SECRET_IDOSS_SECRET_KEY 在控制台的密钥管理中心创建后复制过来即可,切记不要弄混就行。一般来说 OSS_DOMAIN 不是必选,可以不填。

SMTP 配置

smtp 的难点就是需要去 QQ 邮箱> 账号与安全 里开启 POP3/IMAP/SMTP/Exchange/CardDAV 服务,并且生成授权码

PAY(支付宝沙箱) 配置

pay 的难点就是需要去阅读支付宝沙箱环境的配置文档,创建沙箱应用,获取到 APPID,再通过一系列操作生成支付宝的应用私钥和支付宝公钥,这里比较繁琐,配置里需要填写的就只有 PAY_APP_ID,也就是 对用沙箱应用的 APPID,支付宝应用私钥和支付宝公钥需要生成好复制到项目的src/modules/tools/pay/keys下面的 private-key.pempublic-key.pem 里,对应起来就好。如何生成应用私钥和支付宝公钥,看下面这篇文章即可 node.js 对接支付宝沙箱

支付宝开放平台地址

开发环境配置

.env.development 里主要包含:数据库配置信息、JWT 密钥/过期时间、redis 配置信息、日志配置,这类配置信息通常运行环境和生产环境差异较大,所以需要区分。

bash
# mysql
DB_TYPE = mysql # 数据库类型 默认 mysql
DB_HOST = 127.0.0.1 # 数据库地址
DB_PORT = 3306 # 数据库端口
DB_DATABASE = nest_admin # 数据库名称
DB_USERNAME = root # your db username
DB_PASSWORD = 12345678  # your db password
DB_SYNCHRONIZE = true # if true, will create table 是否在更新实体类时自动更新数据库
DB_LOGGING = true # if true, will log sql 日志

# jwt
JWT_SECRET = dev # jwt 密钥
JWT_EXPIRE = 86400 # jwt 过期时间
REFRESH_TOKEN_SECRET = dev # 刷新 token 密钥
REFRESH_TOKEN_EXPIRE = 604800 # 刷新 token的过期时间

# 本项目使用双token无感刷新,需要设置临时token(JWT_EXPIRE)的过期时间、刷新token(REFRESH_TOKEN_EXPIRE)的过期时间,单位是 s

# redis
REDIS_PORT = 6379 # redis 端口
REDIS_HOST = 127.0.0.1 # redis 地址
REDIS_PASSWORD =
REDIS_DB =

# log
LOG_ON = false # 是否开启日志
LOG_LEVEL = 'info' # 日志级别
LOG_MAX_FILES = 10 # 日志文件最多保存

# 三方登录 目前只有 github
GITHUB_CLIENT_ID =
GITHUB_CLIENT_SECRET =
GITHUB_CALLBACK_URL = http://localhost/login/github-login

三方登录配置(github)

1、创建 github Auth Appgithub 主页 -> 用户头像 -> settings -> develop settings -> OAuth Apps -> new OAuth App

2、记录好 Client IDClient Secret,并配置好 Callback URL,把这些信息复制到 .env.developmentGITHUB_CLIENT_IDGITHUB_CLIENT_SECRETGITHUB_CALLBACK_URL 里即可。

这里我的逻辑是用户发起三方登录时,我会去 nest-admin 的数据库查询当前 github 用户是否在 nest-adin 里注册过,注册过就可以直接登录,没有注册过就需要通过 github 返回的 code 信息拿到 token信息,再通过 token 信息获取到 github 的用户信息去 nest-admin 注册,用户只需要输入用户名和密码就可以注册了,注册后自动登录。(这里需要用户名是为了防止用户名重复,用户在发现重复后可以手动修正)

生产环境配置

如果在服务器上使用 `docker` 部署,则 `DB_HOST` 和 `REDIS_HOST` 必须配置为 `host.docker.internal`,否则会连不上 `Docker` 的网络,导致数据库和 Redis 无法连接。

如果使用 pm2 部署项目,则 DB_HOSTREDIS_HOST 配置为 127.0.0.1 即可。

bash
DB_TYPE = mysql
DB_HOST = host.docker.internal # 线上服务 如果使用docker部署则需要修改为host.docker.internal
DB_PORT = 3306
DB_DATABASE = nest_admin
DB_USERNAME = root
DB_PASSWORD = 12345678 # your db password
DB_SYNCHRONIZE = false
DB_LOGGING = false


# jwt
JWT_SECRET = prod # your jwt secret 上线记得改难一些
JWT_EXPIRE = 3600
REFRESH_TOKEN_SECRET = prod
REFRESH_TOKEN_EXPIRE = 604800

# redis
REDIS_PORT = 6379
REDIS_HOST = host.docker.internal
REDIS_PASSWORD =
REDIS_DB =

# log
LOG_ON = true
LOG_LEVEL = 'info'
LOG_MAX_FILES = 10

# 三方登录 目前只有 github
GITHUB_CLIENT_ID =
GITHUB_CLIENT_SECRET =
GITHUB_CALLBACK_URL = http://localhost/login/github-login

Docker 配置

Dockerfile

Dockerfile 属于是固定的配置,无需修改

dockerfile
# 使用官方的 Node.js 运行时镜像作为基础镜像
FROM node:22.3.0-alpine


# 设置工作目录
WORKDIR /usr/src/app

# 下面两步可要可不要,因为作者还没做好关于这方面的功能
# apk 更换为阿里云源
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
# 安装 MySQL 客户端 用于解决 nest-admin容器内不能使用 mysql 命令
RUN apk add --no-cache mysql-client

# 复制 package.json 和 package-lock.json
COPY package*.json ./

# 安装项目依赖
RUN npm install pnpm -g
RUN pnpm config set registry https://registry.npmmirror.com
RUN pnpm install

# 复制项目文件
COPY . .

# 构建项目
RUN pnpm run build

# 暴露应用的端口
EXPOSE 3000

# 启动应用
CMD ["pnpm", "run", "start:prod"]

docker-compose.yml

docker-compose.yml 文件,用于配置 Docker 容器,包括 nest-admin``、dbredis

yml
services:
  nest-admin:
    build: .
    ports:
      - "3000:3000" # 端口映射 左边是宿主机端口,右边是容器端口
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_healthy
    environment:
      - DB_HOST=db # 使用 db 即可
      - DB_PORT=3306
      - DB_USER=root
      - DB_PASSWORD=12345678
      - DB_DATABASE=nest_admin
      - REDIS_HOST=redis
      - REDIS_PORT=6379
      - TZ=Asia/Shanghai

  db:
    image: mysql:8 # 8 以上
    volumes:
      - db_data:/var/lib/mysql
      - ./sql:/docker-entrypoint-initdb.d # 初始化数据库 会自动去找 ./sql/init.sql 执行
    environment:
      - MYSQL_ROOT_PASSWORD=12345678
      - MYSQL_DATABASE=nest_admin # 这里的数据库就是 我们的表名称
      - TZ=Asia/Shanghai # 设置时区为亚洲/上海
    ports:
      - "3306:3306"
    healthcheck:
      test:
        [
          "CMD",
          "mysqladmin",
          "ping",
          "-h",
          "localhost",
          "-u",
          "root",
          "--password=12345678",
        ]
      interval: 10s
      retries: 5

  redis:
    image: redis:7.4.1
    ports:
      - "6379:6379"
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      retries: 5

volumes:
  db_data:

docker-compose.prod.yml

docker-compose.prod.yml 文件,用于配置 Docker 容器,包括 nest-admin``、dbredis

yml
# 这些配置,如数据库密码等 请根据实际情况修改
services:
  nest-admin:
    build: .
    extra_hosts:
      - "host.docker.internal:host-gateway" # 服务器上需使用 host.docker.internal
    ports:
      - "3000:3000" # 端口映射 左边是宿主机端口,右边是容器端口
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_healthy
    environment:
      - DB_HOST=db # docker 内部没有 ip
      - DB_PORT=3306
      - DB_USER=root
      - DB_PASSWORD=12345678
      - DB_DATABASE=nest_admin
      - REDIS_HOST=redis
      - REDIS_PORT=6379
      - TZ=Asia/Shanghai

  db:
    image: mysql:8
    volumes:
      - db_data:/var/lib/mysql
      - ./sql:/docker-entrypoint-initdb.d # 初始化数据库 会自动去找 ./sql/init.sql 执行
    environment:
      - MYSQL_ROOT_PASSWORD=12345678
      - MYSQL_DATABASE=nest_admin # 这里的数据库就是 我们的表名称
      - TZ=Asia/Shanghai # 设置时区为亚洲/上海
    ports:
      - "3306:3306"
    healthcheck:
      test:
        [
          "CMD",
          "mysqladmin",
          "ping",
          "-h",
          "localhost",
          "-u",
          "root",
          "--password=12345678",
        ]
      interval: 10s
      retries: 5

  redis:
    image: redis:7.4.1
    ports:
      - "6379:6379"
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      retries: 5

volumes:
  db_data:

Publish under the MIT license