0. 先决条件

名称 版本 链接
NodeJS >=10 https://nodejs.org
MySQL >=5.7.27 https://dev.mysql.com/downloads/mysql/
Redis 最新版 https://redis.io

如遇到问题,请参见常见问题-汇总贴

1. 安装Lerna

$ npm i -g lerna

2. 克隆Cabloy仓库

$ mkdir cabloy-lerna
$ cd cabloy-lerna
$ git clone https://github.com/zhennann/cabloy.git

3. 安装依赖

$ cd cabloy
$ lerna bootstrap

4. 拷贝前端Config

cp -r src/front/_config src/front/config

5. 拷贝后端Config

cp -r src/backend/_config src/backend/config

6. 配置Redis

集群现在已经成为CabloyJS的一等公民。也就是说,CabloyJS项目随时做好准备,以便部署到集群环境中

CabloyJS的集群特性是基于Redis设计的,因此,需要设置Redis的连接配置信息,这里以开发环境为例:

src/backend/config/config.local.js

  // redis
  const __redisConnectionDefault = {
    host: '127.0.0.1',
    port: 6379,
    password: '',
    db: 0,
  };
  const __redisConnectionDefaultCache = Object.assign({}, __redisConnectionDefault, {
    keyPrefix: `cache_${appInfo.name}:`,
  });
  const __redisConnectionDefaultIO = Object.assign({}, __redisConnectionDefault, {
    keyPrefix: `io_${appInfo.name}:`,
  });

  config.redisConnection = {
    default: __redisConnectionDefault,
    cache: __redisConnectionDefaultCache,
    io: __redisConnectionDefaultIO,
  };

  config.redis = {
    clients: {
      redlock: config.redisConnection.default,
      limiter: config.redisConnection.default,
      queue: config.redisConnection.default,
      broadcast: config.redisConnection.default,
      cache: config.redisConnection.cache,
      io: config.redisConnection.io,
    },
  };

CabloyJS基于Redis实现了多个特性:limiter, queue, broadcast, cache。这些特性默认都访问同一个Redis服务。当访问量上升后,可以考虑进行分离

7. 配置MySQL

EggJS提供了三个运行环境,CabloyJS针对每个运行环境实现了不同的数据库访问策略,具体请参见:Config

因此,需要单独设置三个运行环境的数据库连接配置信息

7.1 测试环境

src/backend/config/config.unittest.js

  // mysql
  config.mysql = {
    clients: {
      // donnot change the name
      __ebdb: {
        host: '127.0.0.1',
        port: '3306',
        user: 'root',
        password: '',
        database: 'mysql', // donnot change the name
        hook: {
          meta: {
            long_query_time: 200,
          },
        },
      },
    },
  };
名称 说明
__ebdb 这是系统内置的MySQL节点名,不允许变更
database 指定为mysql,在启动服务时,会自动删除旧的测试数据库,然后创建一个新的测试数据库
hook.meta.long_query_time 如果sql语句执行时间超过long_query_time(ms),就会打印到控制台

7.2 开发环境

src/backend/config/config.local.js

  // mysql
  config.mysql = {
    clients: {
      // donnot change the name
      __ebdb: {
        host: '127.0.0.1',
        port: '3306',
        user: 'root',
        password: '',
        database: 'mysql', // recommended
        hook: {
          meta: {
            long_query_time: 0,
          },
        },
      },
    },
  };
名称 说明
database 推荐指定为mysql,在启动服务时,查找可用的测试数据库,如果没有找到就创建一个新的测试数据库
如果指定为其他具体的数据库名,就不再查找可用的测试数据库,而是直接使用此设定的数据库
hook.meta.long_query_time 如果long_query_time0,则把所有sql语句打印到控制台

7.3 生产环境

src/backend/config/config.prod.js

  // mysql
  config.mysql = {
    clients: {
      // donnot change the name
      __ebdb: {
        host: '127.0.0.1',
        port: '3306',
        user: 'root',
        password: '',
        database: '{{name}}',
        hook: {
          meta: {
            long_query_time: 500,
          },
        },
      },
    },
  };
名称 说明
database 此数据库需要手工创建
hook.meta.long_query_time 如果sql语句执行时间超过long_query_time(ms),就会打印到控制台

8. 测试

$ npm run test:backend

CabloyJS推荐测试驱动的开发模式。通过测试驱动可以锁定开发的成果,当有代码变更时,可以尽早的发现问题,从而解决问题

此外,开发阶段会经常的变更数据库设计,这时,只需要运行一遍单元测试就可以生效了(自动删除旧的测试数据库,然后自动创建一个新的测试数据库)

9. 运行

启动后端服务

$ npm run dev:backend

启动前端服务

$ npm run dev:front

10. 进入系统

11. Docker Compose

在项目根目录有一个docker-compose.yml配置文件。如果您已经安装好了docker compose环境,那么可以一键启动CabloyJS所有的服务,包括Redis、MySQL、Nginx、以及CabloyJS后端服务

$ cp -r src/front/_config src/front/config
$ cp -r src/backend/_config src/backend/config
$ sudo docker-compose up

12. 升级源码

在升级源码之后,别忘了再次安装依赖

$ lerna bootstrap