ほぼ老人のプログラミング日記

定年後の平凡なサラリーマンの趣味の日記

Knowledge→GROWI 移行 (4)

Visual Studio Code に GROWI の Docker コンテナを追加

GROWI は元々が Docker コンテナで導入するのが基本のようなので、それを利用します。

docs.growi.org

テスト用だし git clone する必要はないので、ここ から growi-docker-compose を zip ファイルでダウンロードします。
ダウンロードしたファイルを作業ディレクトリに解凍します。

% unzip growi-docker-compose-master.zip
% ls -l growi-docker-compose-master
total 64
-rw-r--r--@ 1 tiger  staff   412 12 30 23:02 Dockerfile
-rw-r--r--@ 1 tiger  staff   980 12 30 23:02 Dockerfile.v42x
-rw-r--r--@ 1 tiger  staff  1069 12 30 23:02 LICENSE
-rw-r--r--@ 1 tiger  staff  3612 12 30 23:02 README.md
-rw-r--r--@ 1 tiger  staff  1266 12 30 23:02 docker-compose.dev.yml
-rw-r--r--@ 1 tiger  staff  2217 12 30 23:02 docker-compose.v42x.yml
-rw-r--r--@ 1 tiger  staff  2305 12 30 23:02 docker-compose.v43x-v446.yml
-rw-r--r--@ 1 tiger  staff  2429 12 30 23:02 docker-compose.yml
drwxr-xr-x@ 4 tiger  staff   128 12 30 23:02 elasticsearch
drwxr-xr-x@ 7 tiger  staff   224 12 30 23:02 examples
drwxr-xr-x@ 5 tiger  staff   160 12 30 23:02 hackmd

かるく(?) docker-compose.yml を覗いてみます。growi 本体と mongodb, elasticsearch の 3 つのコンテナで構成されているようです。
.devcontainer フォルダの直下に GROWI 用の Dockerfile を置くフォルダ growi を作成して growi-docker-compose-master/Dockerfile, LICENSE, README.md をコビーします (LICENSE, README.md は動作には必要ないですが)。
以下の例はカレントディレクトがプロジェクトフォルダでプロジェクトフォルダ直下に growi-docker-compose-master.zip を展開しています。

% mkdir -p .devcontainer/growi
% cp growi-docker-compose-master/Dockerfile .devcontainer/growi
% cp growi-docker-compose-master/LICENSE .devcontainer/growi
% cp growi-docker-compose-master/README.md .devcontainer/growi

次に growi-docker-compose-master/elasticsearch をフォルダごと .devcontainer にコピーします。

% cp -R growi-docker-compose-master/elasticsearch .devcontainer

.devcontainer/docker-compose.yml に GROWI の設定を記述するのですが、基本的には growi-docker-compose-master/docker-compose.yml の内容を追記すれば良いはずです。

version: '3'
services:
  python38:
    restart: always
    build: python
    container_name: 'python38'
    working_dir: '/workspace'
    tty: true
    extra_hosts:
      - "fluorine.kt.asasystems.co.jp:192.168.100.78"
    environment:
      - DISPLAY=${IP_ADDR}:0.0
    volumes:
      - ..:/workspace:cached
      - /tmp/.X11-unix:/tmp/.X11-unix

  postgres:
    restart: always
    build: postgres
    container_name: 'postgres12'
    ports:
      - 5433:5433
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
    volumes:
      - ./postgres/initdb:/docker-entrypoint-initdb.d

  growi:
    build: growi
    container_name: 'growi'
    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
    container_name: 'mongo'
    restart: unless-stopped
    volumes:
      - mongo_configdb:/data/configdb
      - mongo_db:/data/db

  elasticsearch:
    build: elasticsearch
    container_name: 'elasticsearch'
    environment:
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms256m -Xmx256m"  # increase amount if you have enough memory
      - LOG4J_FORMAT_MSG_NO_LOOKUPS=true # CVE-2021-44228 mitigation for Elasticsearch <= 6.8.20/7.16.0
    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:
    driver_opts:
      type: none
      device: /Users/user/workspace/project/ToolsByPython/docker_volumes/growi_data
      o: bind
  mongo_configdb:
    driver_opts:
      type: none
      device: /Users/user/workspace/project/ToolsByPython/docker_volumes/mongo_configdb
      o: bind
  mongo_db:
    driver_opts:
      type: none
      device: /Users/user/workspace/project/ToolsByPython/docker_volumes/mongo_db
      o: bind
  es_data:
    driver_opts:
      type: none
      device: /Users/user/workspace/project/ToolsByPython/docker_volumes/es_data
      o: bind
  es_plugins:
    driver_opts:
      type: none
      device: /Users/user/workspace/project/ToolsByPython/docker_volumes/es_plugins
      o: bind

変更点は以下の通りです。

  • growi コンテナ
    • サービス名が app になっているので、growi に変更
    • カレントディレクトリの Dockerfile をビルドする様になっているで growi ディレクトリ下の Dockerfile をビルドするように変更
    • コンテナ名を "growi" に設定
    • FILE_UPLOAD に "mongodb" を指定して、添付ファイルを MongoDB に格納するよう設定
  • mongo コンテナと elasticsearch コンテナは変更なし
  • volumes
    デフォルトのままでもよかったが、なんとなくローカルのディレクトリを指定した。
    最初、.devcontainer ディレクトリ下のディレクトリを指定したところ、パスに隠しディレトリがあるとコンテナのビルドでエラーになってしまいました。パスに隠しディレクトリを含まない場所にディレクトリを作成して指定しました。


設定は以上で終了です。Visual Studio Code を起動します。Docker コンテナが正常に起動されたならブラウザから http://localhost:3000 にアクセスして GROWI が正しく起動されていることを確認します。

f:id:tiger62shin:20220131193511p:plain

上の画面から管理者ユーザを登録して GROWI の初期設定を行います。データ移行のテスト用なので、最低限の設定しか行いませんでした。

f:id:tiger62shin:20220131193954p:plain

上の図のように「サイトURL」のみ設定しました。
次に実際に記事の移行先となる一般ユーザを登録して、プログラムから GROWI API を利用するための API Token を取得します。

  • 管理者により「ユーザー管理」から一般ユーザの仮パスワードを発行
  • 一般ユーザのメールアドレスと仮パスワードでログイン
  • ユーザ情報の入力
  • API Token を発行
    ページ右上に表示されているユーザ ID をクリックして [設定] ボタンをクリックします。

    f:id:tiger62shin:20220131194634p:plain

    API設定」タブの [API Token を更新] ボタンをクリックして API Token を発行します。


これで、Knowledge→GROWI データ移行のためのテスト環境が整いました。長かった。
毎度のことですが、プログラミングって環境作るのが大変で、経験したことない人は環境作るところで挫折するっていう話をどこかで聞いた (読んだ) ことがありますが、本当な気がします。