搭建企业私有registry实践(二)

环境准备

cnpm 2.19.2
docker 1.13.0

一、build docker image 以及配置docker-compose

mkdir dockerCnpm
cd dockerCnpm
touch Dockerfile
touch docker-cnmpose.yml
1.Dockerfile的内容为

FROM node:6.9.4

# Working enviroment
ENV APPDIR /var/app/cnpmjs.org
ENV CNPMJS_ORG_VERSION 2.19.2

RUN \
  mkdir /var/app && \
  install -o www-data -d /var/app && \
  mkdir /var/www/ && mkdir  /var/www/.cnpmjs.org/ && chown www-data:www-data -R /var/www
  

USER www-data

RUN \
  wget -P /tmp https://github.com/cnpm/cnpmjs.org/archive/${CNPMJS_ORG_VERSION}.tar.gz && \
  tar xvzf /tmp/${CNPMJS_ORG_VERSION}.tar.gz -C /var/app && \
  mv /var/app/cnpmjs.org-${CNPMJS_ORG_VERSION} ${APPDIR}

WORKDIR ${APPDIR}

RUN npm install --build-from-source --registry=https://registry.npm.taobao.org --disturl=https://npm.taobao.org/mirrors/node


EXPOSE 7001 7002

# Entrypoint
CMD ["/usr/local/bin/node", "/var/app/cnpmjs.org/dispatch.js"]

npm install –build-from-source –registry=https://registry.npm.taobao.org –disturl=https://npm.taobao.org/mirrors/node
指定npm install的下载源 ,
如果你安装的模块依赖了 C++ 模块, 需要编译, 肯定会通过 node-gyp 来编译,
node-gyp 在第一次编译的时候, 需要依赖 node 源代码, 于是又会去 node dist 下载, 这里我们指向https://npm.taobao.org/mirrors/node。

2.docker-cnmpose.yml的内容

cnpm:
  image: 'images'
  ports:
     - "7001:7001"
     - "7002:7002"
  volumes:
     - ./config:/var/app/cnpmjs.org/config
     - ./.cnpmjs.org/:/var/www/.cnpmjs.org/

挂载config配置,以及数据包存储位置,sync数据包将存放在./.cnpmjs.org/里面。

二、配置config信息

在 dockerCnpm目录下创建 config文件夹 ,拷贝源码config 的 index.js文件到dockerCnpm/config/目录下。
在dockerCnpm/config/目录下创建自定义config.js。
接入企业私有的用户系统DefaultUserService
配置相关的数据库信息

  1. 具体config.js文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    function DefaultUserService() {
    }
    var proto = DefaultUserService.prototype;
    /**
    * Auth user with login name and password
    * @param {String} login login name
    * @param {String} password login password
    * @return {User}
    */
    proto.auth = function* (login, password) {

    };
    /**
    * Get user by login name
    * @param {String} login login name
    * @return {User}
    */
    proto.get = function* (login) {

    };

    /**
    * List users
    * @param {Array<String>} logins login names
    * @return {Array<User>}
    */
    proto.list = function* (logins) {};

    /**
    * Search users
    * @param {String} query query keyword
    * @param {Object} [options] optional query params
    * - {Number} limit match users count, default is `20`
    * @return {Array<User>}
    */
    proto.search = function* (query, options) {
    };

    module.exports = {
    debug: true,
    enableCluster: true, // enable cluster mode
    database: {
    db: 'cnpm_test',
    username: 'jance',
    password: '123',
    dialect: 'mysql',
    host: 'ip',
    port: 'port',
    pool: {
    maxConnections: 10,
    minConnections: 0,
    //maxIdleTime: 30000
    },
    logging: !!process.env.SQL_DEBUG,
    },
    enablePrivate: false,//允许普通用户上传包
    syncModel: 'exist', // 'none', 'all', 'exist',
    userService: new DefaultUserService(),
    customUserService: true,
    logoURL: '',//配置logo
    customReadmeFile:'../my.md',//配置首页文件显示
    customFooter: 'ciyy',//配置底部文案
    registryHost: 'ip:7001',// 修改registryHost,默认是r.cnpmjs.org,不设置的话,cnpm install 会到r.cnpmjs.org中install包
    "scopes": ["@org1", "@org2"]
    };

  2. 值得注意的是用户自定义内部登陆的DefaultUserService,必须包含auth,get,list,search不然会报错。
    registryHost也是个值得留意的配置:默认是r.cnpmjs.org,不设置的话,cnpm install 会到r.cnpmjs.org中install包

  3. 关于mysql 表的设置
    网上有两种方法一种是 cnpmjs.org/docs/db.sql 导入,一种是 node –harmony models/init_script.js。
    然后我发现第二种方法的表不最新的。所以用第一种方法导入就好.

  4. 关于多少磁盘够存储
    目前http://registry.npmjs.org/ 的disk_size:2533699713约等于2.36tb
    有关参考可以看cnpm issues 939

三、用户端配置

  1. 使用cnpm
1
2
$ npm install -g cnpm --registry=https://ip:7001 --registryweb=http://ip:7002

2.alias NPM

1
2
3
4
5
6
7
8
9
10
11
12
13
alias cnpm="npm --registry=https://ip:7001 \
--registryweb=http://ip:7002 \
--cache=$HOME/.npm/.cache/cnpm \
--disturl=https://npm.taobao.org/mirrors/node \
--userconfig=$HOME/.cnpmrc"

#Or alias it in .bashrc or .zshrc
$ echo '\n#alias for cnpm\nalias cnpm="npm --registry=https://ip:7001 \
--registryweb=http://ip:7002 \
--cache=$HOME/.npm/.cache/cnpm \
--disturl=https://npm.taobao.org/mirrors/node \
--userconfig=$HOME/.cnpmrc"' >> ~/.zshrc && source ~/.zshrc

四、总结

根基以上前两步简单的基础本地磁盘存储的私有registry已经搭建完成,
支持企业内部用户的登陆。