dead-horse @ github
2B码农死小马 @ weibo
不四 @ Alibaba - EDP | Focus on Web and Node.js

270,000 $ ? WTF !

npm 要如何优化?

  1. Always be in multi-master
  2. Decouple www.npmjs.org and registry.npmjs.org
  3. Always have a spare replica
  4. Move attachments out of CouchDB
  1. 不熟悉 CouchDB
  2. 新的 npm 架构还没完全想好
  3. 模块的 tgz 包需要单独存储
  4. 我们没有 270,000 $

有没有更容易的方法来做这件事情?

保持 npm 的所有接口

MySQL + CDN

可扩展

高速、稳定的全量 NPM 镜像

NPM

CNPM

同步方式

  • 每30分钟自动增量同步
  • cnpm sync 主动同步
  • cnpm install 安装不存在的模块或版本,自动同步
  • 通过 cnpm 网站主动同步

cnpm 现状

  • total packages
  • total package versions
  • downloads in this week
  • downloads in this month
  • Last sync time:
  • packages sync successed last time

如何使用


# install cnpm
$ npm install -g cnpm
# or alias npm
$ alias cnpm="npm --registry=http://registry.cnpmjs.org \
--cache=${HOME}/.npm/.cache/cnpm \
--userconfig=${HOME}/.cnpmrc"

$ cnpm install connect

# sync by cnpm
$ cnpm sync connect

# can not publish to cnpm
$ npm publish name
$ cnpm sync name
          

请勿


          # edit ~/.npmrc, add
          registry = http://registry.cnpmjs.org
          # use npm config
          $ npm config set registry http://registry.cnpmjs.org
          

回馈社区


            $ npm adduser
            $ npm publish
          

不只是一个 npm 的镜像

更是一个企业级npm解决方案

为什么需要私有 NPM

  • 需要快速、稳定的 npm 服务
  • 发布私有模块
  • 控制私有 npm 内模块质量与安全

CNPM

CNPM with Admin

CNPM with Admin

同步方式

  • 每30分钟自动更新库中模块版本
  • cnpm sync 主动同步
  • cnpm install 安装不存在的模块或版本,自动同步
  • 通过 cnpm 网站主动同步

5分钟完成部署

### Dependencies * Node * Mysql * Redis * qiniu CDN (or other CDN)

Goodbye, CouchDB !

获取代码


# clone from github
$ git clone git://github.com/fengmk2/cnpmjs.org.git $HOME/cnpmjs.org
$ cd $HOME/cnpmjs.org

# create mysql tables
$ mysql -u yourname -p
mysql> use cnpmjs;
mysql> source docs/db.sql

# create your own config file
$ vim config/config.js
          

Config File


  module.exports = {
    debug: false,
    enableCluster: true, // enable cluster mode
    mysqlServers: [
      {
        host: 'localhost',
        port: 3306,
        user: 'cnpmjs',
        password: 'cnpmjs123',
      }
    ],
    mysqlDatabase: 'cnpmjstest',
    redis: {
      host: 'localhost',
      port: 6379,
    },
    nfs: null, //use your own CND here
    enablePrivate: true, // enable private mode, only admin can publish, other use just can sync package from source npm
    admins: {
      admin: 'admin@cnpmjs.org',
    },
    syncModel: 'exist'
  };  
          
#### Install the Dependencies ``` make install ``` #### Run ``` $ npm run start Starting cnpmjs.org ... Start nodejs success. PID=27175 ``` #### Check ```bash #open registry and web # registry open http://localhost:7001 # web open http://localhost:7002 ```

使用cnpm作为私有库的客户端


# install cnpm first
npm install -g cnpm 

# then alias lnpm to cnpm, but change config to your own registry
alias lnpm='cnpm --registry=http://localhost:7001\
 --registryweb=http://localhost:7002\
 --cache=$HOME/.npm/.cache/lnpm\
 --userconfig=$HOME/.lnpmrc'

 #or put this in .zshrc or .bashrc
 echo "#lnpm alias\nalias lnpm='cnpm --registry=http://localhost:7001\
 --registryweb=http://localhost:7002\
 --cache=$HOME/.npm/.cache/lnpm\
 --userconfig=$HOME/.lnpmrc'" >> $HOME/.zshrc && source $HOME/.zshrc
          

Do It Now!

Q & A



thanks

EN