KVM環境にdocker-composeでknowledgeとRocket.Chatを立てるまで 

ちょっと前の話ですが、チーム内でのナレッジ共有を促進したいが，有料だと稟議が面倒・・・ということでオープンソース版Qiita的な「knowledge」と「Rocket.Chat」を導入した時の手順を備忘として残す。前半はKVM、後半はdocker周りのメモ。

# 前提
- knowledgeはお試しに自分のVPS環境に構築していたので、社内環境にデータのお引越しをする（練習も兼ねて）
- 社内ローカル環境にgitBucketとか動かしてるKVM環境があったので、1個VM追加して、Dockerホストとして今後もそこに複数サービスを立てていく運用とする。

# 概要
1. 社内のKVM環境でDockerホスト用のVM準備
2. ネットワーク関連の設定
3. 作成したVMにDockerインストール
4. Rocket.Chatとknowledgeをdocker-composeで構築
5. knowledgeのデータのお引越し

# KVMで環境準備
OSはUbuntu 16.04とする
ubuntuのisoは下記から取得（今回はUbuntu 16.04）
http://ftp.riken.jp/Linux/ubuntu-releases/16.04/ubuntu-16.04.4-server-amd64.iso

社内のKVM環境に接続して仮想マシン用ディスク作成

```
$ qemu-img create -f qcow2 /var/lib/libvirt/images/docker-svc.img 30G
```

virshコマンドで仮想マシン用ディスクをアタッチして仮想マシン作成

```
$ virt-install --connect=qemu:///system \
--name=docker-svc \
--hvm \
--disk path=/var/lib/libvirt/images/docker-svc.img,device=disk,bus=virtio,format=qcow2 \
--ram=4096 \
--vcpus=4 \
--cdrom /usr/local/kir/var/libvirt/images/ubuntu-16.04.4-server-amd64.iso \
--network bridge=br0,model=virtio \
--graphics vnc,listen=0.0.0.0,keymap=ja \
--os-type=linux
```

GUIでUbuntuインストール。下記参照
https://www.itcore.jp/tips/ubuntu1604.php<br>


VM確認

```
$ virsh list --all

 Id    名前                         状態
----------------------------------------------------
 99    docker-svc                     実行中
```

VNCのポート確認

```
$ virsh vncdisplay docker-svc
:0
```

# ネットワーク関連の設定
※VNC接続クライアントは別途入手

VNCで`10.x.x.yy:0`に接続

存在するNICを確認

```
$ ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether ・・・・ brd ・・・・
```

ネットワークの設定を編集してipを固定
loじゃない方のNICの設定を追記する

```
$ vi /etc/network/interfaces

auto lo　←↓ループバックの定義
iface lo inet loopback

auto ens3　←OS起動時に有効にする
iface ens3 inet static　←静的IPを使うこと定義(DHCP使うなら、staticの部分を dhcp にすればよい)
address 10.x.x.yy
netmask 255.255.0.0
gateway 10.x.x.1
dns-nameservers 10.z.z.zz
```

ネットワーク再起動

```
$ service networking restart
```

指定した固定IPにssh接続できる
```
ssh 10.x.x.yy -l ubuntu
```

毎回sudo打つのも面倒なのでrootパスワード設定

```
$ sudo passwd root
[sudo] password for <user名>        ← 現在のユーザのパスワードを入力
Enter new UNIX password:            ← 設定するパスワードを入力
Retype new UNIX password:           ← 設定するパスワードを入力
passwd: password updated successfully
```

su でユーザ変更を行う

```
$ su -
password:
#            ← プロンプトが#に変わる
```

Web用にポート開放

```
$ sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
```

# Dockerインストール
```
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install docker-ce
```

# Docker-Composeインストール

```
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
```

# RocketChat構築

 docker-composeで構築

```
cat <<EOF> docker-compose.yml
db:
  image: mongo:latest
  volumes:
    - ./data/runtime/db:/data/db
    - ./data/dump:/dump

rocketchat:
  image: rocketchat/rocket.chat:latest
  environment:
    - MONGO_URL=mongodb://db:27017/rocketchat
    - ROOT_URL=http://localhost
    - Accounts_UseDNSDomainCheck=false
  links:
    - db:db
  ports:
    - 3000:3000
EOF

docker-compose up -d
```

# knowledge構築

docker-composeで構築

```
cat <<EOF> docker-compose.yml
version: '2'
services:
    app:
        image: koda/docker-knowledge:latest
        #build: .
        volumes:
            - ./volumes/knowledge:/root/.knowledge
        ports:
            - 8080:8080
        restart: always
        depends_on:
            - "db"
    db:
        image: postgres:9
        environment:
            - POSTGRES_USER=postgres
            - POSTGRES_PASSWORD=password
            - POSTGRES_DB=knowledge_production
        volumes:
            #- ./volumes/initdb:/docker-entrypoint-initdb.d
            - ./volumes/postgres/data:/var/lib/postgresql/data
        restart: always

EOF

docker-compose up -d
```

# knowledgeのデータのお引越し
もともと仮で立てていVPSの環境からデータ移行&postgresにDB変更
※knowledgeでは初期では組み込みH2DBがDBとして設定されておりこれをとりあえず使っていたが，長期的に運用する場合はPostgres推奨となっている

1. 旧環境へログイン
1. 「システム設定」→「組み込みデータベースのバックアップと復元」
1. データベースサーバーの稼働状態を「停止する」
1. 「バックアップ（データダウンロード）」→「knowledge.zip」がDLされる
1. docker-composeで構築後，`10.x.x.yy:8080`にログイン
1. 初期設定用の管理者アカウントadmin/admin123でログイン
1. 「システム設定」→「組み込みデータベースのバックアップと復元」
1. データベースサーバーの稼働状態を「停止する」
1. 「復元（データアップロード）」→4. で入手した「knowledge.zip」をアップロード
1. 「システム設定」→「 データベースの接続先変更」で下記を入力

|項目|値|
|:--|:--|
|URL|jdbc:postgresql://db/knowledge_production|
|user|postgres|
|password|Password|
|schema|public|
|max connection|0（デフォルト）|
|auto commit|false（デフォルト）|

「組み込みDBで保存していたデータをカスタム設定のDBにコピー」　これでデータが組み込みのH2DB→Postgresに移行された