Crowi Plusの構築

# 概要
CentOSを構築し、その上でCrowi Plusを動かす。
バックアップも日々取得し、AWSに飛ばす。

# OS準備
以下の条件でCentOS7.4をインストール
Software: minimal
timezone: Asia/Tokyo
Keyboard: Japanese
Network Setting: 192.168.80.15
hostname: crowiplus1

# Docker Install

[参考](https://docs.docker.com/install/linux/docker-ce/centos/)

## Dockerレポジトリの登録
```
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
```

## Dockerインストール
```
yum install docker-ce
systemctl start docker
docker run hello-world
```

# Crowi Plusのインストール
## pipインストール(Epelレポジトリが必要)
[参考](https://packaging.python.org/guides/installing-using-linux-tools/)

```
yum install -y epel-release
yum install -y python-pip
```

## CrowiPlusのインストール

```
[root@crowiplus1 crowi-plus]# yum install -y git
[root@crowiplus1 crowi-plus]# pip install docker-compose
[root@crowiplus1 crowi-plus]# git clone https://github.com/weseek/crowi-plus-docker-compose.git crowi-plus
[root@crowiplus1 crowi-plus]# cd crowi-plus
[root@crowiplus1 crowi-plus]# cp -p docker-compose.yml docker-compose.yml.orig
[root@crowiplus1 crowi-plus]# vi docker-compose.yml
[root@crowiplus1 crowi-plus]# diff docker-compose.yml docker-compose.yml.orig
[root@crowiplus1 crowi-plus]# diff docker-compose.yml.orig docker-compose.yml
9c9
<       - 127.0.0.1:3000:3000    # localhost only by default
---
>       - 0.0.0.0:3000:3000    # localhost only by default
23c23
<       # - FILE_UPLOAD=local    # activate this line if you do not want to use AWS for file upload
---
>       - FILE_UPLOAD=local    # activate this line if you do not want to use AWS for file upload
34a35,36
>     ports:
>       - 0.0.0.0:27017:27017
47c49
<       - "ES_JAVA_OPTS=-Xms256m -Xmx256m"  # increase amount if you have enough memory
---
>       - "ES_JAVA_OPTS=-Xms512m -Xmx512m"  # increase amount if you have enough memory

[root@crowiplus1 crowi-plus]# docker-compose up
```

変更点としては、
- 外部からアクセスできるように、0.0.0.0に変更
- ローカルのファイルアップロードを有効化
- MongoDBのポートもフォワードさせる(バックアップのため)
- ElasticSearchのメモリサイズを256->512に(余裕があれば)

# 初期設定

ブラウザでIP:3000にアクセスして初期設定を行う。

![初期設定1](https://qiita-image-store.s3.amazonaws.com/0/159980/e4d1e89b-2639-dfca-56c4-f0c0a82e93ae.jpeg)
![初期設定2](https://qiita-image-store.s3.amazonaws.com/0/159980/bb46e3a0-8e82-bbeb-9345-0b108a705e5c.jpeg)
![初期設定3](https://qiita-image-store.s3.amazonaws.com/0/159980/e378f5a2-9b6a-56a8-07a9-32cc10ae6d0b.jpeg)

これで使用可能な状態になる。

# バックアップ
[こちら](https://qiita.com/SkyLaptor/items/d02b702764428a08e3f5)を参考に。

## バックアップすべき対象の確認
docker-compose.ymlより。

volumes:
  crowi_data:/data
  mongo_configdb:/data/configdb
  mongo_db:/data/db
  redis_data:/data
  es_data:/usr/share/elasticsearch/data
  es_plugins:/usr/share/elasticsearch/plugins
  ./esconfig:/usr/share/elasticsearch/config

これに対応するローカルは、
docker volume ls
docker volume inspect <volume name>
で確認できる。

/var/lib/docker/volumes/crowiplus_crowi_data/_data
/var/lib/docker/volumes/crowiplus_mongo_configdb/_data
/var/lib/docker/volumes/crowiplus_mongo_db/_data
/var/lib/docker/volumes/crowiplus_redis_data/_data
/var/lib/docker/volumes/crowiplus_es_data/_data
/var/lib/docker/volumes/crowiplus_es_plugins/_data

mongodbは専用のdumpツールでバックアップする。
crowiのdataボリュームの一部(アップロードされたファイル)はtarでバックアップ
他は不要らしい。

## AWS
S3にてバケットの作成

![バケット作成1](https://qiita-image-store.s3.amazonaws.com/0/159980/9aaa5ab6-a2c4-44ce-6f82-22a8d23971e2.jpeg)

![バケット作成2](https://qiita-image-store.s3.amazonaws.com/0/159980/e66a0ba6-debc-6882-8214-56fbb72f8a90.jpeg)

![バケット作成3](https://qiita-image-store.s3.amazonaws.com/0/159980/bd6c8ef1-c78b-9710-9678-afd5e0c17395.jpeg)

![バケット作成4](https://qiita-image-store.s3.amazonaws.com/0/159980/adad322e-9bb8-da8a-bb0a-1e817bdb0686.jpeg)

![バケット作成5](https://qiita-image-store.s3.amazonaws.com/0/159980/23ee2f2b-81c9-40bd-5d00-58b1816e15dd.jpeg)


IAMサービスから、ユーザを作成
![IAM1](https://qiita-image-store.s3.amazonaws.com/0/159980/045f28fd-9462-91fb-4073-23ef8e1a957e.jpeg)

![IAM2](https://qiita-image-store.s3.amazonaws.com/0/159980/2d0138d3-d462-fd90-709d-473a748febd5.jpeg)

![IAM3](https://qiita-image-store.s3.amazonaws.com/0/159980/7e155397-7c9a-1704-ae64-be51c6bb8efd.jpeg)

![IAM4](https://qiita-image-store.s3.amazonaws.com/0/159980/3f91572f-9e95-7c51-995f-ace931ce3251.jpeg)

![IAM5](https://qiita-image-store.s3.amazonaws.com/0/159980/3cead068-6808-7be2-7a9b-f21b43add659.jpeg)

![IAM6](https://qiita-image-store.s3.amazonaws.com/0/159980/9864f1bb-8b43-da13-f2b6-c26632158e8e.jpeg)

![IAM7](https://qiita-image-store.s3.amazonaws.com/0/159980/d8bac004-795b-c386-2498-15ce95ba05d2.jpeg)


この画面から、Access IDとシークレットアクセスキーを確認しておく。

```
[root@crowiplus1 ~]# pip install awscli
[root@crowiplus1 crowi-plus]# aws configure
AWS Access Key ID [None]: (AWSコンソールで確認)
AWS Secret Access Key [None]: (AWSコンソールで確認)
Default region name [None]:
Default output format [None]: json
[root@crowiplus1 crowi-plus]#
[root@crowiplus1 crowi-plus]# aws s3 cp docker-compose.yml s3://crowi-backup-keisuke1208
upload: ./docker-compose.yml to s3://crowi-backup-keisuke1208/docker-compose.yml
```

## mongodbのバックアップ
mongodumpのインストールから実施

```
[root@crowiplus1 tmp]# vi /etc/yum.repos.d/mongodb-org-3.6.repo
[root@crowiplus1 tmp]# cat /etc/yum.repos.d/mongodb-org-3.6.repo
[mongodb-org-3.6]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.6/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.6.asc

[root@crowiplus1 tmp]# yum install mongodb-org-shell
[root@crowiplus1 tmp]# yum install mongodb-org-tools
[root@crowiplus1 tmp]# mongodump --host=crowiplus1 --port=27017 -d crowi --gzip --archive=mongodbdump.gz
```

## アップロードファイルのバックアップ
Crowiにアップロードされたファイルのバックアップ

```
[root@crowiplus1 tmp]# tar cvf uploadfiles.tar /var/lib/docker/volumes/crowiplus_crowi_data/_data/uploads/
[root@crowiplus1 tmp]# gzip uploadfiles.tar
```

## AWSへのバックアップ

```
[root@crowiplus1 tmp]# ls
ks-script-2XhXhn  systemd-private-9853899e514c4a73ab85d7524772b40a-vgauthd.service-0iuEtk   uploadfiles.tar.gz
mongodbdump.gz    systemd-private-9853899e514c4a73ab85d7524772b40a-vmtoolsd.service-BVVso8  yum.log
[root@crowiplus1 tmp]#
[root@crowiplus1 tmp]# tar cvfz 20180305.tar.gz *.gz
[root@crowiplus1 tmp]# aws s3 cp 20180305.tar.gz s3://crowi-backup-keisuke1208
```

これでOK。後は参考同様にシェル化してcron登録しておけばよい。

```
[root@crowiplus1 crowi-plus]# cat backup.sh
#!/bin/bash

TODAY=`date +"%Y%m%d"`
WORKDIR=/root/crowi-plus
tar cvfz ${WORKDIR}/${TODAY}_uploads.tar /var/lib/docker/volumes/crowiplus_crowi_data/_data/uploads/
mongodump --host=crowiplus1 --port=27017 -d crowi --gzip --archive=${WORKDIR}/${TODAY}_mongodbdump.gz
tar cvfz ${WORKDIR}/${TODAY}_crowi-backup.tar.gz ${WORKDIR}/${TODAY}_uploads.tar ${WORKDIR}/${TODAY}_mongodbdump.gz
aws s3 cp ${WORKDIR}/${TODAY}_crowi-backup.tar.gz s3://crowi-backup-keisuke1208

rm -f ${WORKDIR}/${TODAY}_uploads.tar
rm -f ${WORKDIR}/${TODAY}_mongodbdump.gz
find ${WORKDIR} -name "*.tar.gz" -mtime +7 -delete

[root@crowiplus1 crowi-plus]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
[root@crowiplus1 crowi-plus]# crontab -l
0 3 * * * /root/crowi-plus/backup.sh

```

# 終わりに
これだけだとAWS上に無制限にバックアップがとられるので、要注意。