オフライン環境でGrowi(Docker)を利用して構築する
想定する環境
- インターネットに接続できる環境がある
- Growiを構築する環境にはインターネットへの接続不可
構築する環境
- Growi 4.4.9
- Growiをオフライン環境で利用する
- ファイルアップロード先はローカル
- 連携するサービス
- PLANTUML
- HACKMD
構築するサーバのIPアドレスとポート番号
サービス名 | IPアドレス:ポート番号 |
---|---|
Growi | 192.168.0.251:3000 |
PLANTUML | 192.168.0.251:8080 |
HACKMD | 192.168.0.251:3100 |
最終的なファイル構成
growi ├── docker-compose.override.yml # ./examples/integrate-with-hackmd/docker-compose.override.ymlをコピー ├── docker-compose.yml ├── download-frozen-image-v2.sh # ダウンロード ├── elasticsearch │ ├── Dockerfile │ ├── analysis-icu-6.8.10.zip # ダウンロード │ ├── analysis-kuromoji-6.8.10.zip # ダウンロード │ ├── config # growi-docker-composeをクローンしてきたディレクトリからコピー │ │ ├── elasticsearch.yml │ │ └── log4j2.properties │ └── docker-compose.yml ├── growiapp │ ├── Dockerfile # ./Dockerfileをコピー │ └── dockerize-linux-amd64-v0.6.1.tar.gz # ダウンロード └── hackmd ├── Dockerfile ├── apply-growi-agent.sh └── config.json
- 2021/11/15 ./elasticsearch/config以下のファイルの入手先を追記
ダウンロードが必要なファイルのまとめ
- まとめてファイルをダウンロードしたい人向け
git clone https://github.com/weseek/growi-docker-compose.git curl https://raw.githubusercontent.com/moby/moby/master/contrib/download-frozen-image-v2.sh -O /bin/bash ./download-frozen-image-v2.sh growi_4.4.9-nocdn weseek/growi:4.4.9-nocdn /bin/bash ./download-frozen-image-v2.sh elasticsearch_6.8.10 elasticsearch:6.8.10 /bin/bash ./download-frozen-image-v2.sh mongo_4.4 mongo:4.4 /bin/bash ./download-frozen-image-v2.sh hackmd_1.3.0-alpine hackmdio/hackmd:1.3.0-alpine /bin/bash ./download-frozen-image-v2.sh mariadb_10.3 mariadb:10.3 /bin/bash ./download-frozen-image-v2.sh jetty_v1.2021.12 plantuml/plantuml-server:jetty-v1.2021.12 curl -L https://github.com/jwilder/dockerize/releases/download/v0.6.1/dockerize-linux-amd64-v0.6.1.tar.gz -O curl https://artifacts.elastic.co/downloads/elasticsearch-plugins/analysis-icu/analysis-icu-6.8.10.zip -O curl https://artifacts.elastic.co/downloads/elasticsearch-plugins/analysis-kuromoji/analysis-kuromoji-6.8.10.zip -O
- 2021/11/15 dockerizeをダウンロードしようとした時に302でリダイレクトがされる為、ファイルのダウンロードが失敗するため-Lオプションを追加
構築手順
- growi-docker-composeをgit clone
- Docker Hubからコンテナのダウンロード
- 2-1. Dockerコマンドが利用できない場合
- 2-2. Dockerコマンドが利用できる場合
- 2-3. 共通
- 必要なファイルのダウンロード
- docker-compose.yamlの変更
- docker-compose-override.yamlの変更
- docker-compose up -dで起動
1. growi-docker-composeをgit clone
- growi-docker-composeリポジトリをクローンする
git clone https://github.com/weseek/growi-docker-compose.git
2-1. Dockerコンテナのダウンロード(Dockerコマンドが利用できない場合)
Docker imageのダウンロードツール(Dockerコマンドが利用できない場合)
The Moby Project
https://github.com/moby/moby.gitmoby/contrib/download-frozen-image-v2.shをダウンロード
https://github.com/moby/moby/blob/master/contrib/download-frozen-image-v2.sh
curl https://raw.githubusercontent.com/moby/moby/master/contrib/download-frozen-image-v2.sh -O
Dockerコンテナのダウンロード(Dockerコマンドが利用できない場合)
- Docker HubからGrowiを構築する際に利用するコンテナのイメージを取得する
/bin/bash ./download-frozen-image-v2.sh growi_4.4.9-nocdn weseek/growi:4.4.9-nocdn /bin/bash ./download-frozen-image-v2.sh elasticsearch_6.8.10 elasticsearch:6.8.10 /bin/bash ./download-frozen-image-v2.sh mongo_4.4 mongo:4.4 /bin/bash ./download-frozen-image-v2.sh hackmd_1.3.0-alpine hackmdio/hackmd:1.3.0-alpine /bin/bash ./download-frozen-image-v2.sh mariadb_10.3 mariadb:10.3 /bin/bash ./download-frozen-image-v2.sh jetty_v1.2021.12 plantuml/plantuml-server:jetty-v1.2021.12
コンテナをオフライン環境へ移行する(Dockerコマンドが利用できない場合)
- 取得したコンテナイメージをオフライン環境へ移行する為にtarでアーカイブする
tar -C growi_4.4.9-nocdn -cf growi_4.4.9-nocdn.tar . tar -C elasticsearch_6.8.10 -cf elasticsearch_6.8.10.tar . tar -C mongo_4.4 -cf mongo_4.4.tar . tar -C hackmd_1.3.0-alpine -cf hackmd_1.3.0-alpine.tar . tar -C mariadb_10.3 -cf mariadb_10.3.tar . tar -C jetty_v1.2021.12 -cf jetty_v1.2021.12.tar .
2-2. Dockerコンテナのダウンロード(Dockerコマンド利用)
Dockerコンテナのダウンロード(Dockerコマンド利用)
docker pull weseek/growi:4.4.9-nocdn docker pull elasticsearch:6.8.10 docker pull mongo:4.4 docker pull hackmdio/hackmd:1.3.0-alpine docker pull mariadb:10.3 docker pull plantuml/plantuml-server:jetty-v1.2021.12
コンテナをオフライン環境へ移行する(Dockerコマンド利用)
docker save weseek/growi -o growi_4.4.9-nocdn.tar docker save elasticsearch -o elasticsearch_6.8.10.tar docker save mongo -o mongo_4.4.tar docker save hackmdio/hackmd -o hackmd_1.3.0-alpine.tar docker save mariadb -o mariadb_10.3.tar docker save plantuml/plantuml-server -o jetty_v1.2021.12.tar
2-3. Docker imageをdockerへインポートする(共通)
- オフライン環境へ移行したイメージをdocker loadでコンテナイメージを取り込む
docker load -i growi_4.4.9-nocdn.tar docker load -i elasticsearch_6.8.10.tar docker load -i mongo_4.4.tar docker load -i hackmd_1.3.0-alpine.tar docker load -i mariadb_10.3.tar docker load -i jetty_v1.2021.12.tar
3. 必要なファイルのダウンロード
Growi
Dockerfileの変更
- 変更前
FROM weseek/growi:4 LABEL maintainer Yuki Takei <yuki@weseek.co.jp> # install dockerize ENV DOCKERIZE_VERSION v0.6.1 USER root RUN apt-get update && apt-get install -y curl \ && curl -sL https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \ | tar -xz -C /usr/local/bin \ && apt-get clean \ && rm -rf /var/lib/apt/lists/*
- 変更後
FROM weseek/growi:4.4.9-nocdn LABEL maintainer Yuki Takei <yuki@weseek.co.jp> # install dockerize # ENV DOCKERIZE_VERSION v0.6.1 USER root ADD ./dockerize-linux-amd64-v0.6.1.tar.gz /usr/local/bin
dockerize-linux-amd64-v0.6.1.tar.gz のダウンロード
- 変更前のDockerfileにダウンロードするバージョンの記載(
ENV DOCKERIZE_VERSION v0.6.1
)があるので合わせたものをダウンロードする - ダウンロードしたファイルはgrowiappのDockerfileと同じディレクトリに配置する
curl https://github.com/jwilder/dockerize/releases/download/v0.6.1/dockerize-linux-amd64-v0.6.1.tar.gz -O
Elasticsearch
- elasticsearch/Dockerfileを書き換えてローカルからelasticsearchのプラグインの読み込みができるようにする
- elasticsearch/config以下のファイルについてはgit cloneしたgrowi-docker-composeからコピーしてください
Dockerfileを書き換え
- 変更前
FROM docker.elastic.co/elasticsearch/elasticsearch:6.8.10 LABEL maintainer Yuki Takei <yuki@weseek.co.jp> RUN bin/elasticsearch-plugin install analysis-kuromoji RUN bin/elasticsearch-plugin install analysis-icu
- 変更後
- ローカルに置いたファイルを利用してプラグインを組み込む
FROM elasticsearch:6.8.10 LABEL maintainer Yuki Takei <yuki@weseek.co.jp> WORKDIR /usr/share/elasticsearch/ COPY ./analysis-kuromoji-6.8.10.zip /tmp COPY ./analysis-icu-6.8.10.zip /tmp RUN bin/elasticsearch-plugin install file:///tmp/analysis-kuromoji-6.8.10.zip RUN bin/elasticsearch-plugin install file:///tmp/analysis-icu-6.8.10.zip RUN rm -f /tmp/*.zip
pluginのダウンロード
- ダウンロードしたプラグインをElasticsearchのDockerfileと同じディレクトリに配置する
- Dockerファイルに書いたelasticsearchのバージョンと合わせたファイルをダウンロードすること
curl https://artifacts.elastic.co/downloads/elasticsearch-plugins/analysis-icu/analysis-icu-6.8.10.zip -O curl https://artifacts.elastic.co/downloads/elasticsearch-plugins/analysis-kuromoji/analysis-kuromoji-6.8.10.zip -O
4. docker-compose.yamlの変更
- Growiを構築する環境に合わせて変更を行う
変更前と変更後の全文
変更前
version: '3' services: app: build: context: . dockerfile: ./Dockerfile ports: - 127.0.0.1:3000:3000 # localhost only by default 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 # - FILE_UPLOAD=mongodb # activate this line if you use MongoDB GridFS rather than AWS # - FILE_UPLOAD=local # activate this line if you use local storage of server rather than AWS # - MATHJAX=1 # activate this line if you want to use MathJax # - PLANTUML_URI=http:// # activate this line and specify if you use your own PlantUML server rather than public plantuml.com # - HACKMD_URI=http:// # activate this line and specify HackMD server URI which can be accessed from GROWI client browsers # - HACKMD_URI_FOR_SERVER=http://hackmd:3000 # activate this line and specify HackMD server URI which can be accessed from this server container # - FORCE_WIKI_MODE='public' # activate this line to force wiki public mode # - FORCE_WIKI_MODE='private' # activate this line to force wiki private mode entrypoint: "dockerize -wait tcp://mongo:27017 -wait tcp://elasticsearch:9200 -timeout 60s /docker-entrypoint.sh" command: ["yarn migrate && node -r dotenv-flow/config --expose_gc dist/server/app.js"] restart: unless-stopped volumes: - growi_data:/data mongo: image: mongo:4.4 restart: unless-stopped volumes: - mongo_configdb:/data/configdb - mongo_db:/data/db elasticsearch: build: context: ./elasticsearch dockerfile: ./Dockerfile environment: - bootstrap.memory_lock=true - "ES_JAVA_OPTS=-Xms256m -Xmx256m" # increase amount if you have enough memory ulimits: memlock: soft: -1 hard: -1 restart: unless-stopped volumes: - es_data:/usr/share/elasticsearch/data - ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml volumes: growi_data: mongo_configdb: mongo_db: es_data:
変更後
version: '3' services: app: build: context: ./growiapp dockerfile: ./Dockerfile ports: - 3000:3000 # localhost only by default 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 # - FILE_UPLOAD=mongodb # activate this line if you use MongoDB GridFS rather than AWS - FILE_UPLOAD=local # activate this line if you use local storage of server rather than AWS # - MATHJAX=1 # activate this line if you want to use MathJax - PLANTUML_URI=http://192.168.0.251:8080 # activate this line and specify if you use your own PlantUML server rather than public plantuml.com - HACKMD_URI=http://192.168.0.251:3100 # activate this line and specify HackMD server URI which can be accessed from GROWI client browsers - HACKMD_URI_FOR_SERVER=http://hackmd:3000 # activate this line and specify HackMD server URI which can be accessed from this server container # - FORCE_WIKI_MODE='public' # activate this line to force wiki public mode # - FORCE_WIKI_MODE='private' # activate this line to force wiki private mode entrypoint: "dockerize -wait tcp://mongo:27017 -wait tcp://elasticsearch:9200 -timeout 60s /docker-entrypoint.sh" command: ["yarn migrate && node -r dotenv-flow/config --expose_gc dist/server/app.js"] restart: unless-stopped volumes: - growi_data:/data mongo: image: mongo:4.4 restart: unless-stopped volumes: - mongo_configdb:/data/configdb - mongo_db:/data/db elasticsearch: build: context: ./elasticsearch dockerfile: ./Dockerfile environment: - bootstrap.memory_lock=true - "ES_JAVA_OPTS=-Xms256m -Xmx256m" # increase amount if you have enough memory ulimits: memlock: soft: -1 hard: -1 restart: unless-stopped volumes: - es_data:/usr/share/elasticsearch/data - ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml volumes: growi_data: mongo_configdb: mongo_db: es_data:
変更前と変更後の差分
- 変更の差分
- growiの構築に利用するDockerファイルをgrowiapp以下のものを利用するように変更
# 変更前 app: build: context: . dockerfile: ./Dockerfile # 変更後 app: build: context: ./growiapp dockerfile: ./Dockerfile
- 外部からの接続を許可
# 変更前 ports: - 127.0.0.1:3000:3000 # localhost only by default # 変更後 ports: - 3000:3000 # localhost only by default
# 変更前 environment: - MONGO_URI=mongodb://mongo:27017/growi - ELASTICSEARCH_URI=http://elasticsearch:9200/growi - PASSWORD_SEED=changeme # - FILE_UPLOAD=mongodb # activate this line if you use MongoDB GridFS rather than AWS # - FILE_UPLOAD=local # activate this line if you use local storage of server rather than AWS # - MATHJAX=1 # activate this line if you want to use MathJax # - PLANTUML_URI=http:// # activate this line and specify if you use your own PlantUML server rather than public plantuml.com # - HACKMD_URI=http:// # activate this line and specify HackMD server URI which can be accessed from GROWI client browsers # - HACKMD_URI_FOR_SERVER=http://hackmd:3000 # activate this line and specify HackMD server URI which can be accessed from this server container # - FORCE_WIKI_MODE='public' # activate this line to force wiki public mode # - FORCE_WIKI_MODE='private' # activate this line to force wiki private mode # 変更後 environment: - MONGO_URI=mongodb://mongo:27017/growi - ELASTICSEARCH_URI=http://elasticsearch:9200/growi - PASSWORD_SEED=changeme - FILE_UPLOAD=local # activate this line if you use local storage of server rather than AWS - PLANTUML_URI=http://192.168.0.251:8080 # activate this line and specify if you use your own PlantUML server rather than public plantuml.com - HACKMD_URI=http://192.168.0.251:3100 # activate this line and specify HackMD server URI which can be accessed from GROWI client browsers - HACKMD_URI_FOR_SERVER=http://hackmd:3000 # activate this line and specify HackMD server URI which can be accessed from this server container
5. docker-compose-override.yamlの変更
- examples/integrate-with-hackmd/docker-compose.override.ymlをgrowi配下へコピーして変更を行う
変更前と変更後の全文
version: '3' services: ## # HackMD(CodiMD) container # see https://github.com/hackmdio/codimd#configuration # hackmd: build: context: ./hackmd environment: - GROWI_URI=http://CHANGE-HERE - CMD_DB_URL=mysql://hackmd:hackmdpass@mariadb:3306/hackmd - CMD_CSP_ENABLE=false ports: - 127.0.0.1:3100:3000 # localhost only by default depends_on: - mariadb restart: unless-stopped ## # MariaDB # see https://hub.docker.com/_/mariadb/ mariadb: image: mariadb:10.3 command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci environment: - MYSQL_USER=hackmd - MYSQL_PASSWORD=hackmdpass - MYSQL_DATABASE=hackmd - MYSQL_RANDOM_ROOT_PASSWORD=true restart: unless-stopped volumes: - mariadb_data:/var/lib/mysql volumes: mariadb_data:
version: '3' services: ## # HackMD(CodiMD) container # see https://github.com/hackmdio/codimd#configuration # hackmd: build: context: ./hackmd environment: - GROWI_URI=http://192.168.0.251:3000 - CMD_DB_URL=mysql://hackmd:hackmdpass@mariadb:3306/hackmd - CMD_CSP_ENABLE=false - CMD_USECDN=false - CMD_PLANTUML_SERVER=http://192.168.0.251:8080 ports: - 3100:3000 # localhost only by default depends_on: - mariadb restart: unless-stopped ## # MariaDB # see https://hub.docker.com/_/mariadb/ mariadb: image: mariadb:10.3 command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci environment: - MYSQL_USER=hackmd - MYSQL_PASSWORD=hackmdpass - MYSQL_DATABASE=hackmd - MYSQL_RANDOM_ROOT_PASSWORD=true restart: unless-stopped volumes: - mariadb_data:/var/lib/mysql plantuml: image: plantuml/plantuml-server:jetty-v1.2021.12 restart: unless-stopped ports: - "8080:8080" volumes: mariadb_data:
変更前と変更後の差分
- HACKMDがCDNを利用しないオプションを追加、外部からの接続を許可、HACKMDとPLANTUMLの連携を追加
# 変更前 services: hackmd: build: context: ./hackmd environment: - GROWI_URI=http://CHANGE-HERE - CMD_DB_URL=mysql://hackmd:hackmdpass@mariadb:3306/hackmd - CMD_CSP_ENABLE=false ports: - 127.0.0.1:3100:3000 # localhost only by default depends_on: - mariadb restart: unless-stopped # 変更後 hackmd: build: context: ./hackmd environment: - GROWI_URI=http://192.168.0.251:3000 - CMD_DB_URL=mysql://hackmd:hackmdpass@mariadb:3306/hackmd - CMD_CSP_ENABLE=false - CMD_USECDN=false - CMD_PLANTUML_SERVER=http://192.168.0.251:8080 ports: - 3100:3000 # localhost only by default depends_on: - mariadb restart: unless-stopped
- PLANTUMLを新規で追加
plantuml:
image: plantuml/plantuml-server:jetty-v1.2021.12
restart: unless-stopped
ports:
- "8080:8080"
6. docker-compose up -dで起動
- ./docker-compose.yamlファイルのある場所でdocker-compose up -dを実行
docker-compose up -d
- 以下のように表示されていたら正常起動している
- elasticsearchが異常終了した場合は
elasticsearchがcode78 exitするとき
を参照して設定を変更してください
docker-compose ps Name Command State Ports ------------------------------------------------------------------------------------------------------------------------ growi-docker-compose_app_1 dockerize -wait tcp://mong ... Up 0.0.0.0:3000->3000/tcp,:::3000->3000/tcp growi-docker-compose_elasticsearch_1 /usr/local/bin/docker-entr ... Up 9200/tcp, 9300/tcp growi-docker-compose_hackmd_1 /usr/local/bin/docker-entr ... Up 0.0.0.0:3100->3000/tcp,:::3100->3000/tcp growi-docker-compose_mariadb_1 docker-entrypoint.sh mysql ... Up 3306/tcp growi-docker-compose_mongo_1 docker-entrypoint.sh mongod Up 27017/tcp growi-docker-compose_plantuml_1 /docker-entrypoint.sh java ... Up 0.0.0.0:8080->8080/tcp,:::8080->8080/tcp
elasticsearchがcode78 exitするとき
- Elasticsearchコンテナを起動しても、数秒後には【Exit 78】で停止状態になる
https://qiita.com/pipest/items/bcfc9deb52768c0aecdb
sudo sysctl -w vm.max_map_count=262144
- Growiを再起動して再度確認する
docker-compose down docker-compose up -d docker-compose ps