Skip to content

项目介绍

环境要求

node v16.14.2+
yarn 1.22.17+
mysql 5.7+  (数据字段需要支持json类型;数据库、表、字段 字符集最好都设置为:utf8mb4 和 utf8mb4_bin)
redis 5.0+
ffmpeg 6.1+  (用于获取音视频文件元数据)
elasticsearch 7.10 【可选】(必须是这个版本,高于8.* 语法不兼容)

技术栈

1、开发语言:nodejs v16.14.2+

2、开发框架:Eggjs (https://eggjs.org)

3、依赖服务:
    基础:
        mysql 5.7+
        redis 5.0+
    业务依赖【可选】:
        邮件服务(发送邮件)
        阿里云SMS (发短信)
        阿里云OSS (文件云存储)
        阿里云TTS (文字转语音)
        微信公众号 (扫码登录、网页授权)
        微信支付
        支付宝支付
        Elasticsearch(全文搜索)
        Nacos (配置中心、注册中心)
4、部署:
    支持单机部署
    支持集群部署
    支持docker容器部署

5、项目集成
    支持通过sass方式,将工具集成到现有业务系统中去,方便、快速、对现有系统几乎无入侵。

项目结构

server
    |- app              项目源码目录,参考eggjs官网文档
        |- common       项目公共代码模块(常量定义、第三方lib、Helper帮助类、validate等)
        |- controller   controller
            |- admin    后台管理相关接口
            |- api      用户侧业务相关
            |- open     无需登录相关接口
            |- third    saas接入相关
            |- web      模板controller
            - base.js   基础controller
        |- extend       egg应用扩展能力
        |- middleware   接口中间件相关
        |- model        数据表模型
        |- public       对外资源文件目录
        |- queue        队列文件
        |- router       接口路由配置文件
        |- service      service
        |- view         模板视图
        - router.js     路由配置
    |- config           项目配置文件目录,区分环境  
        - config.default.js     项目默认基础配置文件
        - config.local.js       开发环境(yarn dev 启动)使用的配置文件  
        - config.prod.js        正式环境(yarn start 启动)使用的配置文件   
        - config.nacos.js       nacos作为配置管理时,使用该配置  
    |- database         项目数据库项目文件目录
        |- migrations   migrate数据迁移文件目录
        |- seeders      初始化数据目录
        |- sqls         sql数据文件目录
    |- logs             项目运行日志输入目录 
    -.env.example       项目配置文件样板,正式部署时,复制并重名为.env  
    -.gitlab-ci.yml     基于gitlab的cicd配置文件  
    -.gitignore         git忽略提交配置文件  
    -agent.js           agent文件,参考eggjs官网文档
    -app.js             项目入口文件,参考eggjs官网文档  
    -Dockerfile         项目容器化配置文件  
    -init_lock          项目是否执行初始化锁定文件,没有该文件时,系统启动时会自动执行相关初始化,初始化完成后会自动生成该文件,该文件路径可在.env中指定  
    -nacos.js           项目使用nacos管理配置信息时有效,将在启动时通过该配置加载nacos中的配置到系统env环境变量中  
    -packages.json      node 包配置文件  
    -yarn.lock          包锁定文件
    -README.md          项目开发使用说明文档

QuickStart(项目基于Eggjs框架)

本项目基于开源Eggjs框架开发,关于框架的结构、使用方法、设计模式等下面不再介绍,更多框架信息请参考 Eggjs (https://eggjs.org).

初始安装

bash
# 拉取代码
$ git clone https://项目地址/server.git

$ cd server

# 配置config,目前本项目支持 本地.env 和 远程nacos 两种配置模式,用户根据自身选择,下方以本地.env模式为例
# 复制.env.example 为 .env ,并配置值
$ cp .env.example .env    

# 默认监听8882端口,可以修改.env指定监听端口号
cluster.listen.port=8882

# 安装依赖,如果没有 yarn 则先安装 $ npm install -g yarn
$ yarn

# 【慎用】会先清空admin/role/role_admin三张表,再插入数据,为防止重复初始化会在根目录生成一个init_lock文件,如果已经初始化过,则不会再次执行初始化
#  数据初始化( 初始化表结构 + 初始化数据(初始化角色、超级管理员))
$ yarn migrate
$ yarn artisan -- init

# 初始化后将自动创建如下账户:
前台:
  初始用户:super_user@qq.com/@p123456
管理端后台:
  超级管理员:super_admin/@p123456

开发环境 Development

推荐使用vscode作为开发工具

bash
# 安装依赖(建议使用yarn)
$ yarn

# 1、【推荐】调试模式(vscode下),可对程序做断点跟踪调试
# 按F5 或者运行下面命令
$ yarn debug


# 2、启动服务,热更新
# 此时系统默认使用的config/config.local.js的配置内容(如需指定使用指定配置文件请参考官方文档说明设置环境参数)
# 系统将监听到http://localhost:{port}/,此时可以浏览器或者postman访问测试
$ yarn dev

# 3、prod模式,不会热更新,使用config/config.prod.js配置文件,模拟线上部署的启动方式,会启动多个进程
#启动服务
$ yarn start
#停止服务
$ yarn stop
#重启服务
$ yarn restart


# 注意:
开发模式和prod模式最终应用到的配置信息还是来源于.env
当只有一个.env配置时,应用的配置信息是一致的
当然也可以准备(.env.local .env.prod)两个文件来区分不同模式下加载的配置信息

测试接口

项目启动后,默认监听8882端口,端口可在.env中修改

访问 http://localhost:8882/api/test 

当有 “h5ds server” 内容输出表示启动成功!

接口文档

项目目前使用apipost工具做为接口管理工具。

在线接口文档 https://console-docs.apipost.cn/preview/9ed37ed6e7524e4d/6b0d17929e8f5612

数据库设计

项目采用squelize作为数据库ORM框架,并使用migrate进行数据库迁移管理,具体数据表设计和字段说明请参考:

迁移文件目录server/database/migrations
模型文件目录server/app/model 

线上环境 Deploy

【推荐】双端口模式,单机热部署

bash
//确保.env中配置两个端口
cluster.listen.port=8882,8881
//系统将监听到http://0.0.0.0:{port}/,此时可以对外以http://服务器ip:{port} 提供服务

//拉取最新代码
$ git pull --all

//更新依赖
$ yarn

//启动服务(会依次重启每个端口的服务)
$ yarn deploy

//停止指定端口的服务
$ yarn stop --title=multimedia_8901

单端口模式

bash
//启动服务
//此时系统默认使用的config/config.local.js的配置内容(如需指定使用指定配置文件请参考官方文档说明设置环境参数)
//系统将监听到http://0.0.0.0:{port}/,此时可以对外以http://服务器ip:{port} 提供服务
$ yarn start
//停止服务
$ yarn stop
//重启服务
$ yarn restart

服务器nginx配置

【热部署模式】(推荐),支持单机不掉线更新,如果需要 前端页面直接nginx静态代理 且 需要支持https的,建议如下配置:

【注意】:nginx引入的mime.types文件中一定要包含wasm类型

```
application/wasm                                 wasm;
```
# 用于实现单机热部署
upstream us-fvideo {
    server localhost:8882;
    server localhost:8881;
}
server {
    listen 443;
    server_name video.h5ds.com;
    ssl on;
    ssl_certificate /opt/app/letsencrypt/h5ds.com/fullchain.pem;
    ssl_certificate_key /opt/app/letsencrypt/h5ds.com/privkey.pem;
    ssl_session_timeout 5m;
    client_max_body_size 1000M;

    #代理微信相关(跨域地址)
    location ~ ^/cgi-bin {
        proxy_pass https://mp.weixin.qq.com;
    }

    #代理(跨域地址)
    location ~ ^/(video/|static/|uploads/) {
        proxy_pass https://cdn.h5ds.com;
    }

    #前端打包好的页面及资源目录
    root "/www/video/web";

    #前端-官网页面
    location / {
        index index.html;
        try_files $uri $uri/ /index.html;
        if ($request_filename ~* .*\.html$) {
           add_header Cache-Control "no-cache, no-store";
        }
    }
    #H5编辑器资源目录
    location ~ ^/(editor$|editor/) {
        add_header Cross-Origin-Embedder-Policy "require-corp" always;
        add_header Cross-Origin-Opener-Policy "same-origin" always;
        try_files /editor.html =404;
    }
    #前端-管理后台
    location ~ ^/(admin$|admin/) {
        try_files /admin.html =404;
    }

    #资源路径设置跨域头(否则编辑器里面会报跨域错)
    location ~ ^/assets/ {
        add_header Cross-Origin-Embedder-Policy "require-corp" always;
        add_header Cross-Origin-Opener-Policy "same-origin" always;
        index index.html;
        try_files $uri $uri/ /index.html;
    }

    #server Api接口服务
    location ~ ^/(api$|api/|video/) {
        #大文件上传限制
        client_max_body_size 1000M;
        # define buffers, necessary for proper communication to prevent 502s
        proxy_buffer_size 128k;
        proxy_buffers 4 256k;
        proxy_busy_buffers_size 256k;
        proxy_connect_timeout 1200;
        proxy_read_timeout 1200;
        proxy_send_timeout 1200;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        #下方代理到server启动时监听的ip和端口号上,注意proxy_pass的值最后一定不能要/
	    #proxy_pass http://172.31.195.253:8882;
        proxy_pass http://us-video;
    }

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
        expires 30d;
    }
    location ~ .*\.(js|css)?$ {
        expires 12h;
    }

    # 定义错误页面码,如果出现相应的错误页面码,转发到那里。
    error_page 404  /404.html;
}
server {
    listen 80;
    server_name video.h5ds.com localhost;
    #生成Let's Encrypt 证书时验证使用
    
    location / {
        #把http的域名请求转成https
        return 301 https://$host$request_uri;
    }
}

docker构建与使用

容器中包含了:前端代码 + server服务 + nginx服务

构建测试

1、把build好的前端代码,放到项目的app/public/web 目录下

2、修改nginx配置文件:build/nginx/conf.d/video.conf

3、修改server配置文件: .env文件

4、构建&测试镜像:

# 删除旧容器
$ docker stop video
$ docker rm video

# 构建镜像
$ docker build -t video .

# 测试镜像
$ docker run -it --name video -v $PWD/.env:/www/server/.env -v $PWD/app:/www/server/app -p 80:80 -p:443:443 -p 8882:8882 video

#说明
    -v $PWD/.env:/www/server/.env  配置文件
    -v $PWD/app:/www/server/app    业务代码
    -p 80:80   映射80端口
    -p 443:443 映射443端口

# 推送到远端镜像仓库
$ docker tag render registry.cn-hangzhou.aliyuncs.com/h5ds/video:latest
$ docker push registry.cn-hangzhou.aliyuncs.com/h5ds/video:latest

# 清理TAG<none>镜像
$ docker image prune -f

容器正式部署

与concat服务集成,需要保证server/app/public/video目录(资源上传、生成、访问目录)在server和concat服务中一致且能共同访问。

假设整体目录为:

server/
      .env    # server服务配置
concat/
      .env    # concat服务配置
video/        # 资源上传、生成、访问目录,分别挂载到server和concat容器中的相同位置

运行容器

# 运行server容器
$ docker run -it --name video -v $PWD/server/.env:/www/server/.env -v $PWD/video:/www/server/app/public/video/ -p 80:80 -p:443:443 video

# 运行concat容器
$ docker run -it --name concat -v $PWD/concat/.env:/www/concat/.env -v -v $PWD/video:/www/server/app/public/video/ concat

# 注意:concat的.env文件中

#说明
    -v $PWD/*/.env:/www/*/.env                     配置文件
    -v $PWD/video:/www/server/app/public/video/    业务代码
    -p 80:80   映射80端口
    -p 443:443 映射443端口

项目配置说明

1、【.env】本地配置文件模式

该模式下,有两种配置方式(注意:以下两种方式有且仅保留一种方式的配置文件,否则可能出现配置不生效的情况)

方式一:不区分运行环境
    只copy出一个 .env 配置文件,此时 yarn debug 或 yarn dev 或 yarn start 启动项目时,都将应用.env的配置

$ cp .env.example .env

方式二:要区分运行环境(目前系统支持 local 和 prod 两种运行环境)
    copy出两个配置文件 .env.local 和 .env.prod,修改其中的配置值。
    a、用户通过 yarn debug 或 yarn dev 启动项目时,将应用.env.locl的配置
    b、用户通过 yarn start 启动项目时,将应用.env.prod的配置

$ cp .env.example .env.local
$ cp .env.example .env.prod

注意:目前项目不提供test环境的配置模式,用户可以根据项目情况,参考目前的环境配置,自行拓展更多的环境配置。

配置文件内容样例,参考.env.example文件

2、【Nacos】远程配置中心模式 (配置中心&服务注册&服务发现调用)

配置中心,支持通过username+password方式获取配置数据

1、删除当前目录下的.env文件

2、修改config/config.nacos.js配置文件,设置配置中心连接信息

3、local模式启动
$ yarn nacos-dev

4、prod模式启动
$ yarn nacos-start
实现原理说明:

1、修改config/config.nacos.js配置文件,设置配置中心连接信息

2、通过调用 node nacos.js 将配置中心内容写入到本地.env配置文件中

3、通过在config.default.js/config.local.js/config.prod.js 文件中调用如下语句,将本地缓存文件中的配置,写入到环境变量process.env中
//加载.env配置到 process.env 环境变量中
require("dotenv").config({ path: ".env" });

4、调整项目package.json文件中scripts启动脚本
node nacos.js && ~~~

5、修改配置文件,从环境变量中取值,比如:
host: process.env["sequelize.host"] || "",
port: process.env["sequelize.port"] || ""

服务注册

1、修改config/plugin.js,启用插件

    exports.nacos = {
    enable: true,
    package: "eggjs-nacos"
    };

2、修改env配置文件中关于nacos部分的配置

    #nacos服务注册与发现配置
    nacos.serverList=nacos.h5ds.com
    nacos.client.namespace=dev
    nacos.client.serviceName=h5ds-v7
    nacos.client.groupName=DEFAULT_GROUP
    nacos.client.username=
    nacos.client.password=

服务调用

参考代码
async serviceInvoke() {
    const result = await this.ctx.nacos.h5ds.request("/api/v1/test"); // 默认 GET 请求
    if (result.status !== 200) throw Error("Error ...");
    this.ctx.body = result.data;
    return;
}

常用脚本

  • Use F5 or yarn debug 【推荐】启动开发环境并开启断点调试模式.
  • Use yarn dev 开发环境启动脚本.
  • Use yarn start 正式环境启动脚本.
  • Use yarn init-server 初始化数据库结构和数据(仅需开始时执行一次)
  • Use npx sequelize migration:generate --name=init-users 创建数据迁移文件
  • Use yarn migrate:create --name=init-users 创建数据迁移文件
  • Use yarn migrate 执行数据迁移,使用config/config.local.js配置文件
  • Use yarn migrate-prod 执行数据迁移,使用config/config.prod.js配置文件
  • Use npx sequelize db:migrate:undo 撤销最近的数据迁移

命令行工具artisan

使用方式:

# 查看所有命令
$ yarn artisan

# 查看具体命令(init)使用帮助
$ yarn artisan -- init -h

# 查看具体命令(material)使用帮助
$ yarn artisan -- material -h

# 测试命令
$ yarn artisan -- test -x=1 --type=2 a b

启用nacos后的常用命令

  • Use F5 or yarn nacos-debug 【推荐】启动开发环境并开启断点调试模式.
  • Use yarn nacos-dev 本地开发模式启动脚本.
  • Use yarn nacos-start 正式环境启动脚本.
  • Use yarn nacos-migrate 执行数据迁移,使用config/config.local.js配置文件
  • Use yarn nacos-migrate-prod 执行数据迁移,使用nacos的prod命名空间数据,且使用config/config.prod.js配置文件

QA

1、mac/linux下执行 yarn artisan 报错 env: node\r: No such file or directory

原因:
    因为egg-artisan 包使用的行尾序列是CRLF(windows默认),此序列方式在mac/linux中会把\r、\t等字符识别为字符串导致找不到文件错误

处理:
    应该将node_modules/egg-artisan/*.js都改为LF序列方式

Powered by 四川爱趣五科技有限公司.蜀ICP备18034069号.