使用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を導入して、運用していく。