Knowledge→GROWI 移行 (4)
Visual Studio Code に GROWI の Docker コンテナを追加
GROWI は元々が Docker コンテナで導入するのが基本のようなので、それを利用します。
テスト用だし 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 コンテナ
- mongo コンテナと elasticsearch コンテナは変更なし
- volumes
デフォルトのままでもよかったが、なんとなくローカルのディレクトリを指定した。
最初、.devcontainer ディレクトリ下のディレクトリを指定したところ、パスに隠しディレトリがあるとコンテナのビルドでエラーになってしまいました。パスに隠しディレクトリを含まない場所にディレクトリを作成して指定しました。
設定は以上で終了です。Visual Studio Code を起動します。Docker コンテナが正常に起動されたならブラウザから http://localhost:3000 にアクセスして GROWI が正しく起動されていることを確認します。
上の画面から管理者ユーザを登録して GROWI の初期設定を行います。データ移行のテスト用なので、最低限の設定しか行いませんでした。
上の図のように「サイトURL」のみ設定しました。
次に実際に記事の移行先となる一般ユーザを登録して、プログラムから GROWI API を利用するための API Token を取得します。
- 管理者により「ユーザー管理」から一般ユーザの仮パスワードを発行
- 一般ユーザのメールアドレスと仮パスワードでログイン
- ユーザ情報の入力
API Token を発行
ページ右上に表示されているユーザ ID をクリックして [設定] ボタンをクリックします。
これで、Knowledge→GROWI データ移行のためのテスト環境が整いました。長かった。
毎度のことですが、プログラミングって環境作るのが大変で、経験したことない人は環境作るところで挫折するっていう話をどこかで聞いた (読んだ) ことがありますが、本当な気がします。