【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:

$

「CentOS8」におけるDocker環境「NAPT」の許可を実施

CentOS8のDocker環境ではFirewallで設定しないとコンテナ間での通信ができずエラーとなってしまします。
そのため以下にてNAPTの許可を実施します。

# firewall-cmd --add-masquerade --permanent
# firewall-cmd --reload

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対応設計となります。




エンジニアのオンライン学習

ITエンジニアにおすすめの教材、オンラインスクールです。
無料からエンジニアの学習ができる教材などまとめているので参考にしてください。

おすすめオンライン教材
自宅で学習ができるオンラインスクール

ITエンジニアの開発・検証・学習としてインターネット上で専用のサーバ(VPS)を利用しましょう!
実務経験はVPSで学べます。



コメントを残す

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

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

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