【Docker】Growiコンテナ構築とSSL対応まで(CentOS7,8対応)


資料の管理場所や資料を一つのツールに一元管理したかったのでGrowiをDockerコンテナで構築しました。
今回はGrowiのDockerコンテナ設計手順をまとめます。

GrowiはWikiをベースとしたコミュニケーションツールで、MarkDown形式で書けるソフトウェアです。
さらにMarkDownのリアルタイムプレビューや投稿ユーザの設定もできる機能があります。

公式のサイトは以下となります。
https://github.com/weseek/growi-docker-compose


「Growi」をDockerコンテナで構築とSSL対応設計

CentOSで「Growi」を構築するにあたり、事前に以下のインストールが必要となります。

  • Docker
  • Python3
  • docker-compose(pip install)
  • git(yum install)

CentOSでDockerインストール方法

【CentOS7】Dockerインストールと起動(無償版CE)

CentOSでpythonインストール方法

【CentOS8】Python3インストールと実行

それでは以下で「Growi」の構築手順を説明します。

Githubから「Growi」をダウンロード

gitコマンドでgrowiの設計ファイルをダウンロードします。
※任意のディレクトりでダウンロード

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

ダウンロードされると以下のようにgrowiフォルダが表示されます。
フォルダ内にはGrowiコンテナを構築するためのファイルが保存されています。

$ ll
total 4
drwxr-xr-x 6 root root 4096 May 12 13:34 growi
$
$ cd growi
$ ll
total 32
-rw-r--r-- 1 root root  946 May 12 13:34 Dockerfile
-rw-r--r-- 1 root root 1069 May 12 13:34 LICENSE
-rw-r--r-- 1 root root 3557 May 12 13:34 README.md
-rw-r--r-- 1 root root 1150 May 12 13:34 docker-compose.dev.yml
-rw-r--r-- 1 root root 2212 May 12 13:34 docker-compose.yml
drwxr-xr-x 3 root root 4096 May 12 13:34 elasticsearch
drwxr-xr-x 6 root root 4096 May 12 13:34 examples
drwxr-xr-x 2 root root 4096 May 12 13:34 hackmd

Growiの「docker-compose」を編集

公式でも書かれている通り、「ports」の設定を10行目で変更しています。
今回構築したサーバーはメモリを4GBとっているので、55行目で2GBに変更しています。

メモリは多めにとっておいた方が、検索時に動作が良いとか書いていたので変更してます。

また、ファイルアップロードはサーバーのローカルストレージを使用するので、22行目でアクティブ化します

version: '3'

services:
  app:
    build:
      context: .
      dockerfile: ./Dockerfile
    ports:
      #- 127.0.0.1:3000:3000    # localhost only by default
      - 3000:3000
    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

    command: "dockerize
              -wait tcp://mongo:27017
              -wait tcp://elasticsearch:9200
              -timeout 60s
              npm run server:prod"
    restart: unless-stopped
    volumes:
      - growi_data:/data

  mongo:
    image: mongo:3.6
    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
      - "ES_JAVA_OPTS=-Xms2g -Xmx2g"  # 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:

Docker起動前にfirewall開放

Growiではポート番号(3000)を使用するので、起動前に対象のポートを開放します。

firewall-cmd --add-port=3000/tcp --zone=public --permanent
firewall-cmd --reload

以下でポートの開放ができていることが確認できます。

$ firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: cockpit dhcpv6-client http https ssh
  ports: 3000/tcp
  protocols:
  masquerade: yes
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

$

Growiを「docker-compose」コマンドで起動

上記設定後、Growiコンテナを起動します。

$ docker-compose up -d

起動後、ブラウザを開いて対象のアドレスにアクセスします。

https://ipアドレス:3000

起動後少し時間はかかりますが、以下のページが表示され、管理ユーザーを作成します。

管理ユーザー作成後、Growiが使用できるようになります。

SSL(https)対応(無料)

以下ではSSL対応の手順となりますが、事前にグローバル環境でドメインで名前解決ができることが前提となります。

SSL対応は「https-portal」を使用します。

docker-compose.ymlへの追加設定は以下となります。

  https-portal:
    image: steveltn/https-portal:1
    ports:
            - 80:80
            - 443:443
    links:
            - web
    restart: always
    environment:
      DOMAINS: 'example.com -> http://app:3000'
      STAGE: 'staging' # Don't use production until staging works
      #FORCE_RENEW: 'true'
    container_name: https-portal
    volumes:
            - ./ssl_certs:/var/lib/https-portal

volumes:
    ssl_certs:

「docker-compose.yml」の設定例

SSL対応時のdocker-composeの設定例は以下となります。

version: '3'

services:
  app:
    build:
      context: .
      dockerfile: ./Dockerfile
    ports:
      #- 127.0.0.1:3000:3000    # localhost only by default
      - 3000:3000
    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

    command: "dockerize
              -wait tcp://mongo:27017
              -wait tcp://elasticsearch:9200
              -timeout 60s
              npm run server:prod"
    restart: unless-stopped
    volumes:
      - growi_data:/data

  mongo:
    image: mongo:3.6
    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
      - "ES_JAVA_OPTS=-Xms2g -Xmx2g"  # 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

  https-portal:
    image: steveltn/https-portal:1
    ports:
            - 80:80
            - 443:443
    links:
            - web
    restart: always
    environment:
      DOMAINS: 'test.engineers-life.com -> http://app:3000'
      STAGE: 'staging' # Don't use production until staging works
      #FORCE_RENEW: 'true'
    container_name: https-portal
    volumes:
            - ./ssl_certs:/var/lib/https-portal
volumes:
  growi_data:
  mongo_configdb:
  mongo_db:
  es_data:
  ssl_certs:

以上でGrowiのDockerコンテナ構築+SSL対応設計となります。

Docker実践ガイド 第2版 impress top gearシリーズ

Docker実践ガイド 第2版 impress top gearシリーズ

古賀 政純
3,762円(07/11 15:07時点)
発売日: 2019/02/18
Amazonの情報を掲載しています


関連記事


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

ABOUTこの記事をかいた人

blank

インターネット関連のSEをやっています。 ネットワーク、サーバー、ストレージ、仮想基盤まで幅広く手を出しており、MVNOの構築経験もあります。 現在は、Pythonを使ったプログラミングの開発をしネットワークの自動化ツールを作成しています! Pythonの入門書も作成しているので、ぜひ参考にしてください!