JS7® JobScheduler  docker-compose で起動(MySQL版)

# 概要

JS7 jobscheduler を手っ取り早く触りたい人向け
docker-composeでの実行方法

# 準備

必要なファイル、ディレクトリを準備します。

`docker-compose.yml`

```yaml:docker-compose.yml
version: '3'

services:

  db:
    image: mysql:8.0
    ports:
      - "3306:3306"
    command:
      - --default-authentication-plugin=caching_sha2_password
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_bin
      - --skip-character-set-client-handshake
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - js7network
    environment:
      MYSQL_ROOT_PASSWORD: iLoveMySQL8.0!
      MYSQL_DATABASE: js7db
      MYSQL_USER: js7user
      MYSQL_PASSWORD: js7password
    restart: "no"

  js7-joc-primary:
    depends_on:
      - db
    image: sosberlin/js7:joc-${JS7VERSION}
    hostname: js7-joc-primary
    ports:
      - "4446:4446"
    volumes:
      - js7-joc-primary-config:/var/sos-berlin.com/js7/joc/resources/joc
      - js7-joc-primary-logs:/var/log/sos-berlin.com/js7/joc
    networks:
      - js7network
    environment:
      RUN_JS_JAVA_OPTIONS: -Xmx256m
      RUN_JS_USER_ID: "${JS7USERID}:${JS7GROUPID}"
    restart: "no"

  js7-controller-primary:
    image: sosberlin/js7:controller-${JS7VERSION}
    hostname: js7-controller-primary
    volumes:
      - js7-controller-primary:/var/sos-berlin.com/js7/controller
    networks:
      - js7network
    environment:
      RUN_JS_JAVA_OPTIONS: -Xmx256m
      RUN_JS_USER_ID: "${JS7USERID}:${JS7GROUPID}"
    restart: "no"

  js7-agent-primary:
    image: sosberlin/js7:agent-${JS7VERSION}
    hostname: js7-agent-primary
    volumes:
      - js7-agent-primary:/var/sos-berlin.com/js7/agent/
    networks:
      - js7network
    environment:
      RUN_JS_JAVA_OPTIONS: -Xmx256m
      RUN_JS_USER_ID: "${JS7USERID}:${JS7GROUPID}"
    restart: "no"

volumes:

  db_data:
    driver: local
    driver_opts:
      type: none
      device: ${PWD}/db_data
      o: bind

  js7-joc-primary-config:
    driver: local
    driver_opts:
      type: none
      device: ${PWD}/js7-joc-primary-config
      o: bind

  js7-joc-primary-logs:
    driver: local
    driver_opts:
      type: none
      device: ${PWD}/js7-joc-primary-logs
      o: bind

  js7-controller-primary:
    driver: local
    driver_opts:
      type: none
      device: ${PWD}/js7-controller-primary
      o: bind

  js7-agent-primary:
    driver: local
    driver_opts:
      type: none
      device: ${PWD}/js7-agent-primary
      o: bind

networks:
  js7network:

```

:::note warn
ver 2.5.2 より、controller, agentのvolume指定パスが変更となっています。
本ページ下部に、ver 2.5.1 までの docker-compose.yml の例を残してありますので、利用バージョンによってはそちらを参照してください。
:::

`hibernate.cfg.xml`

```xml:hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<hibernate-configuration>
 <session-factory>
  <property name="hibernate.connection.driver_class">org.mariadb.jdbc.Driver</property>
  <property name="hibernate.connection.password">js7password</property>
  <property name="hibernate.connection.url">jdbc:mariadb://db:3306/js7db?allowPublicKeyRetrieval=true&amp;useSSL=false</property>
  <property name="hibernate.connection.username">js7user</property>
  <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
  <property name="hibernate.show_sql">false</property>
  <property name="hibernate.connection.autocommit">false</property>
  <property name="hibernate.format_sql">true</property>
  <property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>
  <property name="hibernate.connection.provider_class">org.hibernate.hikaricp.internal.HikariCPConnectionProvider</property>
  <property name="hibernate.hikari.maximumPoolSize">10</property>
 </session-factory>
</hibernate-configuration>
```

`.env` (環境変数用) ※バージョンは任意

```shell
echo -e "JS7USERID=$(id -u)\nJS7GROUPID=0\nJS7VERSION=2-5-7" > .env

# 確認
cat .env
JS7USERID=1000
JS7GROUPID=1000
JS7VERSION=2-5-7
```

ディレクトリ

```shell
mkdir db_data
mkdir js7-agent-primary
mkdir js7-controller-primary
mkdir js7-joc-primary-config
mkdir js7-joc-primary-logs
```

ここまでで、下記のような構成になります。

```shell
.
├── .env
├── db_data
├── docker-compose.yml
├── hibernate.cfg.xml
├── js7-agent-primary
├── js7-controller-primary
├── js7-joc-primary-config
└── js7-joc-primary-logs
```

# コンテナ起動

まずコンテナを起動

```shell
$ docker compose up -d

# 確認
$ docker compose ps
NAME                            COMMAND                  SERVICE                  STATUS              PORTS
js7-db-1                        "docker-entrypoint.s…"   db                       running             0.0.0.0:3306->3306/tcp, 33060/tcp
js7-js7-agent-primary-1         "sh /usr/local/bin/e…"   js7-agent-primary        running
js7-js7-controller-primary-1    "sh /usr/local/bin/e…"   js7-controller-primary   running
js7-js7-joc-primary-1           "sh /usr/local/bin/e…"   js7-joc-primary          running             0.0.0.0:4446->4446/tcp
```

`hibernate.cfg.xml`をVolumeマウント先に上書きコピー (インストール時に使用します)

```shell
cp -f hibernate.cfg.xml js7-joc-primary-config/
```

js7-joc-primary にて 上記ファイルを指定してインストール

```shell
docker compose exec js7-joc-primary /bin/sh -c /opt/sos-berlin.com/js7/joc/install/joc_install_tables.sh

# ログ確認
ls -l js7-joc-primary-logs/

# js7-joc-primary のみ再起動
docker compose restart js7-joc-primary
```

# 動作チェック

あとは、ブラウザで js7-joc-primary にて指定したポート番号にアクセスしてください。
http://localhost:4446/
※初期ユーザーは Account: root / password: root です
![login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/8f9a116f-688e-fed4-18c3-33b1fc599e99.png)

初回ログイン直後は、Controllerの登録画面が出てきますので、登録を行ってください。
本例では `http://js7-controller-primary:4444` です。
![add_controller.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/970eaaa9-2de4-2201-1e8d-8b612d6d8846.png)

次にエージェントの登録を行います。

もし画面が分からなくなった場合はこちらからManager/Agentの登録・編集画面が開けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/9b8181f9-801b-4e1a-90e8-d4f3ea87fe21.png)

Add Standalone Agent 開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/5c05eba9-9551-b412-581f-693c773cc9ac.png)

必要項目を入力して、登録してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/fa327eb0-7820-e198-0662-cbf4032e8f54.png)
Agent ID： `js7-agent-primary`（ホスト名でよい）
Agent Name： `js7-agent-primary`（ホスト名でよい）
Title： Descriptionにあたるもの（空でもよい）
Alias Names： 任意（空でもよい） ※本例ではサンプルデータ利用のために`primaryAgent` とします。
URL： 本例では`http://js7-agent-primary:4445` となります。

(Ver 2.3.x からの変更点 )
さらに登録したエージェントをDeployしてください。
これで本エージェントは利用可能となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/ac098deb-553d-ce58-c09a-37ebd9a1f57c.png)
Statusが synchronized に変わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/b609cbfa-d599-85f4-7f17-cfce1b5c0b63.png)

ダッシュボードを見ると、Controller, Agent, DB などの稼働状況を確認できます。
![dashboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/84091724-a9ba-89b6-9b92-d02541bb079b.png)

# 参考 agent-plus イメージについて

エージェント用のDockerイメージには、通常のエージェント以外にも、PowerShell、JS7モジュールを追加した、agent-plusイメージも提供されています。
もしPowerShellの利用に慣れている方は、こちらをお勧めします。

:::note
既に通常エージェントで構築した後でも、イメージの指定を`sosberlin/js7:agent-${JS7VERSION}-plus`と書き換えて起動しなおせば、すぐに反映できます。
:::

```diff_yaml:docker-compose.yml
version: '3'

services:
# (省略)
  js7-agent-primary:
-   image: sosberlin/js7:agent-${JS7VERSION}
+   image: sosberlin/js7:agent-${JS7VERSION}-plus
    hostname: js7-agent-primary
# (省略)
```

# 参考 アップデート時の対応

```shell
# もし稼働中の場合は一旦停止
docker compose stop

# .env を 新バージョン用に書き換え
echo -e "JS7USERID=$(id -u)\nJS7GROUPID=$(id -g)\nJS7VERSION=2-x-x" > .env

# joc,controllr,agent とも起動したことを確認
docker compose up -d
docker compose ps

# もしうまく起動しない場合は、コンテナ、ボリュームを削除し、起動し直してください
# ボリュームを削除しても、マウント先データは消えないので、設定は残ります
docker compose down -v
docker compose up -d
docker compose ps

# (db変更反映のため)上書きインストール実行
cp -f hibernate.cfg.xml js7-joc-primary-config/
docker compose exec js7-joc-primary /bin/sh -c /opt/sos-berlin.com/js7/joc/install/joc_install_tables.sh
docker compose restart js7-joc-primary
```

# 参考 docker-compose.yml ver 2.5.1まで

ver 2.5.2 より、controller, agentのvolume指定パスが変更となったため、念のため ver 2.5.1 までのファイルもしばらく残します。

```yml:docker-compose.yml
version: '3'

services:

  db:
    image: mysql:8.0
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - js7network
    environment:
      MYSQL_ROOT_PASSWORD: iLoveMySQL8.0!
      MYSQL_DATABASE: js7db
      MYSQL_USER: js7user
      MYSQL_PASSWORD: js7password
    restart: "no"

  js7-joc-primary:
    depends_on:
      - db
    image: sosberlin/js7:joc-${JS7VERSION}
    hostname: js7-joc-primary
    ports:
      - "4446:4446"
    volumes:
      - js7-joc-primary-config:/var/sos-berlin.com/js7/joc/resources/joc
      - js7-joc-primary-logs:/var/log/sos-berlin.com/js7/joc
    networks:
      - js7network
    environment:
      RUN_JS_JAVA_OPTIONS: -Xmx256m
      RUN_JS_USER_ID: "${JS7USERID}:${JS7GROUPID}"
    restart: "no"

  js7-controller-primary:
    image: sosberlin/js7:controller-${JS7VERSION}
    hostname: js7-controller-primary
    volumes:
      - js7-controller-primary:/var/sos-berlin.com/js7/controller/var
    networks:
      - js7network
    environment:
      RUN_JS_JAVA_OPTIONS: -Xmx256m
      RUN_JS_USER_ID: "${JS7USERID}:${JS7GROUPID}"
    restart: "no"

  js7-agent-primary:
    image: sosberlin/js7:agent-${JS7VERSION}
    hostname: js7-agent-primary
    volumes:
      - js7-agent-primary:/var/sos-berlin.com/js7/agent/var_4445
    networks:
      - js7network
    environment:
      RUN_JS_JAVA_OPTIONS: -Xmx256m
      RUN_JS_USER_ID: "${JS7USERID}:${JS7GROUPID}"
    restart: "no"

volumes:

  db_data:
    driver: local
    driver_opts:
      type: none
      device: ${PWD}/db_data
      o: bind

  js7-joc-primary-config:
    driver: local
    driver_opts:
      type: none
      device: ${PWD}/js7-joc-primary-config
      o: bind

  js7-joc-primary-logs:
    driver: local
    driver_opts:
      type: none
      device: ${PWD}/js7-joc-primary-logs
      o: bind

  js7-controller-primary:
    driver: local
    driver_opts:
      type: none
      device: ${PWD}/js7-controller-primary
      o: bind

  js7-agent-primary:
    driver: local
    driver_opts:
      type: none
      device: ${PWD}/js7-agent-primary
      o: bind

networks:
  js7network:
```

# 参考 MySQL 8.0 mysql_native_password 利用時の設定方法

本記事では、以前はmysql_native_passwordで記載していましたので、そちらを利用する場合の設定も残します。
※MySQL 8.0.34 以降で、認証Plugin mysql_native_password 利用時にログに警告が出るようになりました。いずれ廃止される見込みです。

```diff_yaml:docker-compose.yml
# default-authentication-pluginをmysql_native_passwordに変更
db:
    image: mysql:8.0
    ports:
      - "3306:3306"
    command:
-      - --default-authentication-plugin=caching_sha2_password
+      - --default-authentication-plugin=mysql_native_password
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_bin
      - --skip-character-set-client-handshake
```

```diff_xml:hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<hibernate-configuration>
 <session-factory>
  <property name="hibernate.connection.driver_class">org.mariadb.jdbc.Driver</property>
  <property name="hibernate.connection.password">js7password</property>
-  <property name="hibernate.connection.url">jdbc:mariadb://db:3306/js7db?allowPublicKeyRetrieval=true&amp;useSSL=false</property>
+  <property name="hibernate.connection.url">jdbc:mariadb://db:3306/js7db</property>
  <property name="hibernate.connection.username">js7user</property>
  <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
  <property name="hibernate.show_sql">false</property>
  <property name="hibernate.connection.autocommit">false</property>
  <property name="hibernate.format_sql">true</property>
  <property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>
  <property name="hibernate.connection.provider_class">org.hibernate.hikaricp.internal.HikariCPConnectionProvider</property>
  <property name="hibernate.hikari.maximumPoolSize">10</property>
 </session-factory>
</hibernate-configuration>

```