项目配置
基础配置
运行项目之前一定要先配置 数据库账户密码、`Redis` 端口号等
.env 基础配置
.env
里主要包含:项目名称、端口、全局请求前缀、多设备登录、OSS
配置、SMTP
配置,这类配置信息通常和项目运行环境无关。
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
配置最重要的是在对应的云服务网站在对象存储控制台配置好 bucket
和 bucket
的权限,一般来说需要把权限改为私有写,公有读。配置好以后一定要把自己选择的存储桶(bucket
)的地区配置到 OSS
配置项的 OSS_REGION
,桶名称配置到 OSS_BUCKET
。密钥的 OSS_SECRET_ID
和 OSS_SECRET_KEY
在控制台的密钥管理中心创建后复制过来即可,切记不要弄混就行。一般来说 OSS_DOMAIN
不是必选,可以不填。
`OSS` 配置具体可参考以下文档
SMTP 配置
smtp
的难点就是需要去 QQ 邮箱> 账号与安全 里开启 POP3/IMAP/SMTP/Exchange/CardDAV
服务,并且生成授权码
PAY(支付宝沙箱) 配置
pay
的难点就是需要去阅读支付宝沙箱环境的配置文档,创建沙箱应用,获取到 APPID
,再通过一系列操作生成支付宝的应用私钥和支付宝公钥,这里比较繁琐,配置里需要填写的就只有 PAY_APP_ID
,也就是 对用沙箱应用的 APPID
,支付宝应用私钥和支付宝公钥需要生成好复制到项目的src/modules/tools/pay/keys
下面的 private-key.pem
和public-key.pem
里,对应起来就好。如何生成应用私钥和支付宝公钥,看下面这篇文章即可 node.js 对接支付宝沙箱。
开发环境配置
.env.development
里主要包含:数据库配置信息、JWT
密钥/过期时间、redis
配置信息、日志配置,这类配置信息通常运行环境和生产环境差异较大,所以需要区分。
# 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 App
github
主页 -> 用户头像 -> settings
-> develop settings
-> OAuth Apps
-> new OAuth App
2、记录好 Client ID
和 Client Secret
,并配置好 Callback URL
,把这些信息复制到 .env.development
的GITHUB_CLIENT_ID
、 GITHUB_CLIENT_SECRET
、 GITHUB_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_HOST
和 REDIS_HOST
配置为 127.0.0.1
即可。
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
属于是固定的配置,无需修改
# 使用官方的 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``、db
和 redis
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``、db
和 redis
# 这些配置,如数据库密码等 请根据实际情况修改
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: