2015年6月26日金曜日

Let's Chatを入れてみた

slackを使っていのだけど、やはりプロジェクトによっては社外のサービスを使うのはなぁ?という懸念が上がるときがある。抜け道を考えるのが面倒なので、社内にChatサーバーを立ててることにした(BYOSというの?)。折角なのでSlack風Chatの「Let's Chat」を使ってみようと思ったので、備忘録。


0.環境準備

使った環境は以下の通り。

  ・vagrant
  ・CentOS 6.5
  ・Let's Chat 0.3.12

1.インストール

Let's Chatの導入要件となっている、以下のツール群を導入する。
  ・nodejs v0.12.4
  ・mongodb 3.0
  ・Python 2.7

1.1 nodejsを入れる
 ここを参照しつつ入れる!

1.2 mongodbを入れる

$ wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.0.3.tgz
$ tar xvfz mongodb-linux-x86_64-rhel62-3.0.3.tgz
$ cd mongodb-linux-x86_64-rhel62-3.0.3 mongo

1.3 python2.7を入れる

$ wget https://www.python.org/ftp/python/2.7.6/Python-2.7.6.tgz
$ tar xvfz Python-2.7.6.tgz
$ cd Python-2.7.6
$ ./configure --enable-shared --with-threads
$ make
$ sudo make install

$ python -V

python: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory

なんだかエラーがでてる。

$ ldd /usr/local/bin/python
        linux-vdso.so.1 =>  (0x00007fffc0ad3000)
        libpython2.7.so.1.0 => not found
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f112bed4000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f112bcd0000)
        libutil.so.1 => /lib64/libutil.so.1 (0x00007f112bacd000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f112b848000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f112b4b4000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f112c0fb000)

同じですが、libpython2.7.so.1.0がないと言われている。ただ実際には、、

$ sudo find / -name 'libpython2.7.so.1.0'
/home/vagrant/Python-2.7.6/libpython2.7.so.1.0
/usr/local/lib/libpython2.7.so.1.0

といストールされている。のでリンクで対応する。

$ sudo ln /usr/local/lib/libpython2.7.so.1.0 /lib64/libpython2.7.so.1.0
$ python -V

Python 2.7.6

無事。インストールができたみたいです。

1.4 Let's Chatを入れる

最後にLet's Chatを入れる。

$ git clone https://github.com/sdelements/lets-chat.git
$ cd lets-chat/
$ npm install

gyp: Call to 'which icu-config > /dev/null || echo n' returned exit status 0. while trying to load binding.gyp


何やらエラーがでて失敗した。ライブラリを追加で入れる。

$ sudo yum install libicu-devel.x86_64

で、再チャレンジです

$ npm install

node-xmpp-core@1.0.0-alpha14 node_modules/node-xmpp-core
├- tls-connect@0.2.2
├- debug@2.2.0 (ms@0.7.1)
├- reconnect-core@0.0.1 (backoff@2.3.0)
├- node-stringprep@0.7.0 (bindings@1.2.1, debug@2.0.0, nan@1.8.4)
└- mqq ltx@0.9.0 (sax@0.6.1, node-expat@2.3.8)

をーインストール完了。

2. Let's Chatの設定

$ cp settings.yml.sample settings.yml
$ vi settings.yml
================
# Let's Chat Settings
#
# See defaults.yml for all available options
#

env: production # development / production

http:
  enable: true
  host: '0.0.0.0'
  port: 80

https:
  enable: false
  port: 5001
  key: key.pem
  cert: certificate.pem

files:
  enable: true
  provider: local
  local:
    dir: uploads

xmpp:
  enable: false
  port: 5222
  domain: example.com

database:
  uri: mongodb://localhost/letschat

secrets:
  cookie: secretsauce

auth:
  providers: [local]
  local:
    enableRegistration: true
================


$ npm start

 [Error: Cannot find module '../build/Release/bson'] code: 'MODULE_NOT_FOUND' }
js-bson: Failed to load c++ bson extension, using pure JS version

あがるっちゃ、あがるんだけど、エラーがでている。いろいろググってみたけど、

npm cache clean; rm -rf node_modules ;npm install

これで再インストールすればいけるみたい。
ということでやってみたら・・・行けた!

3.検索をカスタマイズ
chatの履歴から全文検索ができるようになっているのですが、、mongodbの全文検索機能を使っており、mongodbのそれは日本語には対応していない。なので、全くといっていいほど使えない。それだったらせめてmessagesの検索だけでも意味があるかなと思い、少しソースを修正。

lets-chat/app/core/messages.js

    if (options.query) {
        find = find.find({$text: {$search: options.query}});
    }


    if (options.query) {
        var r = new RegExp(options.query, "i")
        find = find.find({"text": {$regex:r}});
    }

に変更してみた。これだけでも結構便利!

4.ldap認証

デフォルトでは、local認証となっていて、さらに自由にアカウント登録ができてしまう。今回インターネット経由でアクセスをさせるので、この状態はよろしくない。
とうことで、openldapを立てて、アカウント管理!
※openldapの導入はこちら

settings.yml
===
auth:
  providers: [ldap]
  ldap:
    connect_settings:
      url: ldap://192.168.x.x:389/
    bind_options:
      bindDN: uid=bind,ou=Account,dc=example,dc=com
      bindCredentials: password
    search:
      base: "ou=Account,dc=example,dc=com"
      opts:
        scope: one
        filter: (uid={{username}})
        #filter: (sAMAccountName={{username}})
    field_mappings:
      uid: uid
      firstName: givenName
      lastName: sn
      displayName: givenName

      email: mail
===
いや~バカになるくらいで簡単にできた・・。すごい!

0 件のコメント:

コメントを投稿