使用Docker设置Growi.

总结

我一直对Growi感兴趣,但是使用docker-compose可以在几行命令内轻松安装。但是对于不熟悉的人来说,我总觉得不太想用,因为我不知道数据保存在哪里,对于这种不清楚存储位置的东西,我还是有些抵触感。特别是docker,当容器被删除时,容器内的数据也会被清除,所以在这样的东西上进行各种编写是很危险的。
我将记录下一种将数据保存在外部并且可以进行恢复的方法。
虽然还有使用mongodump等方法,但是我认为对于规模并不大的专用容器来说,完全可以通过复制整个容器来解决问题。

环境

    • Ubuntu 18.04

 

    ローカルで使用する (VirtualBox上で確認しました)

步驟

目录设置如下。

    • 作業ディレクトリ:/home/ubuntu

データの保存先 :/home/ubuntu/data

按照公式步骤下载并修改设置。

$ git clone https://github.com/weseek/growi-docker-compose.git
$ cd growi-docker-compose
$ vi docker-comopose.yml

以下是需要修改的地方。

    • ローカルで使用するのでports:のIPアドレスは削除します。(127.0.0.1のままでもいいはず)

 

    • environment:のPASSWORD_SEEDは任意の文字列に変更。この設定がないと自動で作成されるため、復元ができなくなる。取り出す方法もあるが、設定しておく方が簡単。毎回同じにする必要があるので、忘れないように。

 

    • FILE_UPLOAD=localを有効化する。

 

    • ホスト起動時に自動で起動するように設定する。具体的には、各コンテナに”restart: always”を設定する。(3か所)

 

    • volumes:にホストのディレクトリを設定する。

 

    例えば、”growi_data:/data”となっているが、growi_dataは一番最後のvolumes:に定義だけあるが、実際のディレクトリが設定されていないので、このままではマウントされない。直で書いてもいいとは思いますがせっかく定義されているので。(オプションの意味は分かってないです^^;)
services:
  app:
    build:
      context: .
      dockerfile: ./Dockerfile
    ports:
      - 3000:3000    ### ローカルで使用するのでIPアドレスは削除 ###
    links:
      - mongo:mongo
      - elasticsearch:elasticsearch
    depends_on:
      - mongo
      - elasticsearch
    environment:
      - MONGO_URI=mongodb://mongo:27017/growi
      - ELASTICSEARCH_URI=http://elasticsearch:9200/growi
      - PASSWORD_SEED=changeme   ### changemeをランダムな文字列(MAX64桁)に変更する ###
      - FILE_UPLOAD=local        ### ローカルで使用するのでコメントを外す ###
      # - MATHJAX=1             
      # - PLANTUML_URI=http://  
      # - HACKMD_URI=http://    
      # - HACKMD_URI_FOR_SERVER=http://hackmd:3000 

    command: "dockerize
              -wait tcp://mongo:27017
              -wait tcp://elasticsearch:9200
              -timeout 60s
              npm run server:prod"
    volumes:
      - growi_data:/data
    restart: always      ### 自動起動の設定(追加) ###

  mongo:
    image: mongo:3.4
    volumes:
      - mongo_configdb:/data/configdb
      - mongo_db:/data/db
    restart: always      ### 自動起動の設定(追加) ###

  elasticsearch:
    image: elasticsearch:5.3-alpine
    environment:
      - "ES_JAVA_OPTS=-Xms256m -Xmx256m"  # increase amount if you have enough memory
    command:
      - sh
      - -c
      - "./bin/elasticsearch-plugin list | grep -q analysis-kuromoji || ./bin/elasticsearch-plugin install analysis-kuromoji;
        ./bin/elasticsearch-plugin list | grep -q analysis-icu || ./bin/elasticsearch-plugin install analysis-icu;
        /docker-entrypoint.sh elasticsearch"
    volumes:
      - es_data:/usr/share/elasticsearch/data
      - es_plugins:/usr/share/elasticsearch/plugins
      - ./esconfig:/usr/share/elasticsearch/config
    restart: always      ### 自動起動の設定(追加) ###

volumes:    ### 以下のようにホストのディレクトリを追記する ###
   growi_data:
      driver_opts:
        type: none
        device: /home/ubuntu/data/growi_data
        o: bind
   mongo_configdb:
      driver_opts:
        type: none
        device: /home/ubuntu/data/mongo_configdb
        o: bind
   mongo_db:
      driver_opts:
        type: none
        device: /home/ubuntu/data/mongo_db
        o: bind
   es_data:
      driver_opts:
        type: none
        device: /home/ubuntu/data/es_data
        o: bind
   es_plugins:
      driver_opts:
        type: none
        device: /home/ubuntu/data/es_plugins
        o: bind

在启动之前创建主机目录,否则会出现错误。

$ cd /home/ubuntu
$ mkdir data
$ cd data
$ mkdir growi_data mongo_configdb mongo_db es_data es_plugins

启动Docker。

$ cd ~/growi-docker-compose
$ docker-compose up -d

当启动时,数据将保存在主机的/home/ubuntu/data内。
即使删除容器,数据也不会消失,因此很安全。
备份只需要将整个目录保存即可。
恢复时只需要覆盖保存的文件即可。

如果无法成功挂载,我觉得可能与UID等有关。

考慮

如果要使用mongoDB的恢复功能…
请查找其他信息网站以获取详细信息(也可以查看官方文档)。

也许以下是一种方法。
※请确保Growi正在运行。

# Dockerが使用しているネットワークを確認
$ docker network ls

# NAMEがgrowidockercompose_defaultというのがあるはず。("-"は省略される)
# 詳細を確認
$ docker network inspect growidockercompose_default

# "Name": "growidockercompose_mongo_1" みたいなのがあるはず。
# _defaultとmongo_1のネットワーク名を指定してコマンドを打つ

# バックアップ
$ docker run -it --rm --link growidockercompose_mongo_1 \
--network growidockercompose_default \
--volume $(pwd):/backup mongo bash -c "mongodump \
--host growidockercompose_mongo_1 --db growi --out /backup"

# アップロードしたファイルは、docker psでコンテナIDを確認し、
$ docker cp {your_growi_docker_container_id}:/data .


# リストア
$ docker run -it --rm --link growidockercompose_mongo_1 \
--network growidockercompose_default \
--volume $(pwd):/backup mongo bash -c "mongorestore \
-v --host growidockercompose_mongo_1 --db growi backup/growi"
$ docker cp ./data {your_growi_docker_container_id}:.
$ docker-compose restart

参考网站

    • Docker Composeのトップレベルvolumesでホストのディレクトリをマウントする

 

    Crowiを導入して、運用していく。
bannerAds