SummerWind

Web, Photography, Space Development

npmのプライベートリポジトリを作る

先日、YUIコミッターのokuryu氏から、npmのプライベートリポジトリを作る手順をまとめたいい記事があるよと教えてもらいました。実は以前プライベートリポジトリの構築をしようとしてうまくいかずに諦めたことがあったので、記事に書いてある手順を読みながら、改めて手元の環境に構築できるかを試してみました。

CouchDBのインストール

npmリポジトリのバックエンドには、CouchDBが使われているので先にこれをインストールします。手元の環境にはHomebrewがインストールされているので、今回は手っ取り早くbrewコマンドからインストールしました。

$ brew install couchdb

npmのバックエンドとして使う場合には、CouchDBのsecure_rewriteオプションを無効化する必要があるようなので、以下のようにして設定を変更しておきましょう。

$ sudo vim /usr/local/etc/couchdb/local.ini

[httpd]
secure_rewrites=false

設定の変更が完了したら、CouchDBを起動します。設定に問題がなければ、5984ポートからHTTP経由でCouchDBにアクセスできるようになります。

$ couchdb &
$ curl http://localhost:5984
{"couchdb":"Welcome","version":"1.2.0"}

npmリポジトリの構築

CouchDBの準備ができたら、npmリポジトリを構築していきます。npmリポジトリのコードは全てGitHubで公開されているため、gitコマンドを使ってコードをチェックアウトします。

$ git clone git://github.com/isaacs/npmjs.org.git

以降の作業は全てリポジトリのディレクトリ内部でおこなうので、チェックアウトしたディレクトリに移動しておきましょう。ディレクトリを移動したら、構築に必要な依存モジュールをnpmコマンドでインストールします。

$ cd npmjs.org
$ npm install
$ npm install -g couchapp

npmリポジトリのコードは、CouchAppというCouchDB上で動作するJavaScriptアプリケーションとして実装されているため、以下のようにしてCouchDB上にDBを作成後、コードをデプロイします。

$ curl -X PUT http://localhost:5984/registry 
$ couchapp push registry/app.js http://localhost:5984/registry 
$ couchapp push www/app.js http://localhost:5984/registry

以上でnpmのプライベートリポジトリが構築されました。以下のようにして、–registryオプション付きでnpmコマンドを使用すれば、通常のnpmリポジトリとして利用することができます。</p

$ npm --registry http://localhost:5984/registry/_design/scratch/_rewrite search

なお、リポジトリ切り替え直後のnpm searchでは、ローカルに置かれているキャッシュが使われるため、正常な結果が表示されない場合があります。このような場合には、以下のようにしてキャッシュファイルを削除すると正常な結果が表示されるようになります。

$ rm -rf ~/.npm/-/all/.cache.json

また、常にプライベートリポジトリを使うような場合には、以下のようにしてnpmのregistry設定自体を変更してしまうほうが便利でしょう。

$ npm config set registry http://localhost:5984/registry/_design/scratch/_rewrite

レプリケーションの設定

ここまでの手順で、まっさらな状態のnpmプライベートリポジトリを構築できましたが、本家npmjs.orgで公開されているモジュールの情報も、自前のプライベートリポジトリで管理したいケースもあるかと思います。そのような場合には、以下のようにして本家とのレプリケーションをCouchDBに設定します。

プライベートリポジトリをすでに構築してある場合には、以下のようにして事前にリポジトリを一度削除する必要があります。

$ curl -X DELETE http://localhost:5984/registry

準備ができたら、レプリケーションを手動実行します。初回実行は全てのデータをコピーするのに時間がかかるようなので注意してください。

$ curl -X POST http://127.0.0.1:5984/_replicate \
       -d '{"source":"http://isaacs.iriscouch.com/registry/", "target":"registry", "create_target":true}' \
       -H "Content-Type: application/json"

レプリケーションを使って常にリポジトリの情報を更新しておきたい場合は、continuousオプションを指定して継続的レプリケーションの設定をします。

$ curl -X POST http://127.0.0.1:5984/_replicate \
       -d '{"source":"http://isaacs.iriscouch.com/registry/", "target":"registry", "continuous":true, "create_target":true}' \
       -H "Content-Type: application/json"

設定した継続的レプリケーションを中止したい場合は、cancelオプションを指定して以下のコマンドを実行します。

$ curl -X POST http://127.0.0.1:5984/_replicate \
       -d '{"source":"http://isaacs.iriscouch.com/registry/", "target":"registry", "continuous":true, "create_target":true, "cancel":true}' \
       -H "Content-Type: application/json"

実運用に向けた設定

例えば所属する会社内でnpmのプライベートリポジトリを使うようなケースもあるでしょう。そのようなケースでは、CouchDBのバーチャルホスト機能を利用してドメイン経由でアクセスできるようにするとよいでしょう。

$ sudo vim /usr/local/etc/couchdb/local.ini

[vhosts]
npm.yourcompany.co.jp = /registry/_design/scratch/_rewrite

また、管理者以外のユーザーがCouchDBのデータベースを操作できないようにするために、以下のようにして管理者ユーザーの設定もおこなう必要があるでしょう。

$ sudo vim /usr/local/etc/couchdb/local.ini

[admins]
admin = password

プライベートリポジトリを作るにあたっての手順は以上の通りです。プライベートリポジトリは、外部に公開したくないような社内モジュールを管理する目的に使えますし、レプリケーションを設定すれば高速なミラーリポジトリとしても使えるので便利かなと思ってます。

Moto Ishizawa

Moto Ishizawa
ソフトウェアエンジニア。ロケットの打上げを見学するために、たびたびフロリダや種子島にでかけるなど、宇宙開発分野のファンでもある。