Crowi環境をアップデートしました

約1年前に、Dockerを使ってパッとCrowiを導入しました。

以前の記事でも追記していますがdocker-composeのバージョンで挙動が変わったり、docker imageをalpineに変更したりと、ちょこちょこアップデートしたのでまとめておこうと思います。

基本となるファイルはこちらを利用させていただいてます、感謝です。このリポジトリをgit cloneした状態で進めていきます。使用するのはalpineフォルダです。

docker-compose.yml

cloneしたフォルダ直下(alpineフォルダの並列)にdocker-compose.ymlを作成し、以下を記述しています。

version: '3'

services:
  crowi:
    build:
      context: ./alpine
      dockerfile: Dockerfile
    environment:
      - MATHJAX=1
      - PLANTUML_URI=http://localhost:18080
    env_file: .env
    ports:
      - 3000:3000
    volumes:
      - crowi-data:/data

  db:
    image: mongo:3.6.5
    volumes:
      - mongo-data:/data/db

  redis:
    image: redis:4.0.9-alpine

  es:
    image: docker.elastic.co/elasticsearch/elasticsearch:5.6.4
    environment:
      - xpack.security.enabled=false
      - "ES_JAVA_OPTS=-Xms256m -Xmx256m"
    entrypoint:
      - bash
      - -c
      - >-
        elasticsearch-plugin list | grep -q analysis-kuromoji
        || elasticsearch-plugin install analysis-kuromoji
        && exec $$0 $$@
    command:
      - /bin/bash
      - bin/es-docker

  plantuml:
    image: plantuml/plantuml-server:jetty
    ports:
      - 18080:8080

volumes:
  crowi-data:
    driver: local

  mongo-data:
    driver: local

13行目のコロンより左側の番号がCrowiのポート番号です。環境に応じて変更してください。

また、11行目に指定している.envファイルにPASSWORD_SEEDを記述しています。

PASSWORD_SEED=blablablablablablablablabla…

今回私のケースではバージョンアップに伴うalpineへの移行だったので、事前にPASSWORD_SEEDの値を持っていました。新規稼働の場合は1度バックアップデータを作成して中にあるPASSWORD_SEEDを取り出して記述するか、同等のハッシュ値を事前に記述しておいてください。

PASSWORD_SEEDについてや、[1]: max virtual memory areas vm.max_map_count [65530] is too low とエラーが出てElasticsearchコンテナが起動しない場合の対応は以前の記事をご参考ください。

バックアップとリストア

docker-composeのバージョンによってbackupとrestoreのコマンドが変わってしまうようでは各々のローカル環境および本番環境でコマンドを置き換えるのが面倒です。

なのでバージョンによるコンテナ名まで考慮したShellを作成して使用しています。が、 container_name を付けて固定化するほうが効率が良いと思います。一応Shellを置いておきます。

backup.sh

#!/bin/bash

# container name's prefix differs depending on docker-compose version
displayed_docker_compose_version=$(docker-compose --version)
if [[ ${displayed_docker_compose_version} =~ ^.*v?([0-9]+)\.([0-9]+)\.([0-9]+).*$ ]]; then
  major=${BASH_REMATCH[1]}
  minor=${BASH_REMATCH[2]}
fi

prefix="docker-crowi_"
# The prefix has been changed since v1.21.0
if [ "${major}" -le 1 ] && [ "${minor}" -lt 21 ]; then
  prefix="dockercrowi_"
fi

app_container_name=${prefix}crowi_1
database_container_name=${prefix}db_1
network_container_name=${prefix}default

rm -rf $(pwd)/crowi $(pwd)/data
mkdir $(pwd)/crowi $(pwd)/data
docker run -it --rm --link ${database_container_name} --network ${network_container_name} --volume $(pwd):/backup mongo:3.6.5 bash -c "mongodump --host ${database_container_name} --db crowi --out /backup"
docker cp ${app_container_name}:/data .

restore.sh

#!/bin/bash

# container name's prefix differs depending on docker-compose version
displayed_docker_compose_version=$(docker-compose --version)
if [[ ${displayed_docker_compose_version} =~ ^.*v?([0-9]+)\.([0-9]+)\.([0-9]+).*$ ]]; then
  major=${BASH_REMATCH[1]}
  minor=${BASH_REMATCH[2]}
fi

prefix="docker-crowi_"
# The prefix has been changed since v1.21.0
if [ "${major}" -le 1 ] && [ "${minor}" -lt 21 ]; then
  prefix="dockercrowi_"
fi

app_container_name=${prefix}crowi_1
database_container_name=${prefix}db_1
network_container_name=${prefix}default

docker run -it --rm --link ${database_container_name} --network ${network_container_name} --volume $(pwd):/backup mongo:3.6.5 bash -c "mongorestore -v --host ${database_container_name} --db crowi backup/crowi"
docker cp ./data ${app_container_name}:.
`docker-compose down`
`docker-compose up -d`

この2つのShellを実行するとバックアップファイル生成と、生成した状態のファイルを復元できます。必要ないと判断したので、docker-composeがインストールされていない場合のエラー処理は行っていません。

実行方法

フォルダ構成

.
├── .env
├── Dockerfile
├── LICENSE
├── README.md
├── alpine
│   ├── Dockerfile
│   ├── LICENSE
│   └── docker-entrypoint.sh
├── backup.sh
├── docker-compose.yml
├── docker-entrypoint.sh
├── example.env
└── restore.sh

起動

docker-compose up -d

停止

docker-compose down

バックアップ

Shellに実行権限を付与(chmod +x backup.sh)することを忘れずに。

./backup.sh

リストア

Shellに実行権限を付与(chmod +x restore.sh)することを忘れずに。

./restore.sh

それでは引き続き楽しいCrowiライフを!