skydum

個人的な作業記録とか備忘録代わりのメモ

オフライン環境でDockerを使ってGrowiを構築する

オフライン環境でGrowi(Docker)を利用して構築する

想定する環境

  • インターネットに接続できる環境がある
  • Growiを構築する環境にはインターネットへの接続不可

構築する環境

  1. Growi 4.4.9
  2. Growiをオフライン環境で利用する
  3. ファイルアップロード先はローカル
  4. 連携するサービス
    • 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オプションを追加

構築手順

  1. growi-docker-composeをgit clone
  2. Docker Hubからコンテナのダウンロード
    • 2-1. Dockerコマンドが利用できない場合
    • 2-2. Dockerコマンドが利用できる場合
    • 2-3. 共通
  3. 必要なファイルのダウンロード
  4. docker-compose.yamlの変更
  5. docker-compose-override.yamlの変更
  6. docker-compose up -dで起動

1. growi-docker-composeをgit clone

git clone https://github.com/weseek/growi-docker-compose.git

2-1. Dockerコンテナのダウンロード(Dockerコマンドが利用できない場合)

Docker imageのダウンロードツール(Dockerコマンドが利用できない場合)

curl https://raw.githubusercontent.com/moby/moby/master/contrib/download-frozen-image-v2.sh -O

Dockerコンテナのダウンロード(Dockerコマンドが利用できない場合)

  • Docker HubからGrowiを構築する際に利用するコンテナのイメージを取得する
    • Growi 4.4.9 NO CDN
    • Elasticsearch 6.8.10
    • MongoDB 4.4
    • HACKMD 1.3.0(alpine)
    • MariaDB 10.3
    • PLANTUML V1.2021.12
/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

  1. growiappディレクトリを作成
  2. growiディレクトリ直下のDockerファイルをgrowiappディレクトリへ移動する

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
  • PASSWORD_SEED, FILE_UPLOAD, PLANTUML_URI, HACKMD_URI, HACKMD_URI_FOR_SERVERの値を変更する
    # 変更前
    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するとき

sudo sysctl -w vm.max_map_count=262144
  • Growiを再起動して再度確認する
docker-compose down
docker-compose up -d
docker-compose ps