JS7® JobScheduler インストール方法（Docker版）

##1.JS7®JobSchedulerについて

JS7®JobSchedulerは独SOS社(Software- und Organisations-Service GmbH)によって開発されている、ジョブ管理システムです。
OSSジョブ管理ツールの定番JobSchedulerをリニューアルし、従来より耐障害性、大規模環境対応を強化し、ミッションクリティカルな要求に対応しました。
JS7® の主な特徴は、下記となります。

- オープンソース（GNU Public License V.3）
 - Linux/Windows版は、無料で使用可能。（但しクラスタリング構成は有償ライセンスが必要）
 - 有償ライセンスを購入すれば、クラスタリング構成に加えて、障害対応、バグフィックス／ワークアラウンドの提供、新機能の早期提供、などのサービスが提供される。
 - 有償ライセンスの機能が使用できる、３０日間無償トライアルライセンスも提供されている。申し込みは[こちら](https://www.ossl.co.jp/?page_id=46)から
- 耐障害性
 - 自律型アーキテクチャー（非同期疎結合）による高可用性
 - データベース/ネットワーク障害時もジョブ実行継続
 - ３秒以内のコントローラーフェイルオーバー
- 大規模環境対応
 - 〜 20万ワークフロー
 - 〜 100万ジョブ
 - 〜 1,000エージェント
 - 〜 20,000タスク並列実行
- 高性能
 - ジョブ起動オーバーヘッドなし
 - 1万タスクを5ミリ秒で同時起動
- 高セキュリティ
 - JOC・コントローラー・エージェント間の全通信にクライアント・サーバー認証
 - 定義ファイルにも証明書を付加
 - 外部認証局（CA）をサポート

詳細な情報については、以下をご覧下さい。

- ナレッジベース（英語）　https://kb.sos-berlin.com/display/PKB/JS7
- 日本語紹介資料 https://www.ossl.co.jp/
- フォーラム　https://groups.google.com/forum/?hl=ja#!forum/jobscheduler-ja
- Facebook https://www.facebook.com/Jobscheduler-Japan-%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97-594469610565511/timeline/
- 日本JobSchedulerユーザーグループ https://sites.google.com/site/jobschedulerja/
- JIRA（英語） 　https://change.sos-berlin.com/secure/Dashboard.jspa
- User Forum（英語）　http://sourceforge.net/projects/jobscheduler/forums/forum/486122
- SOS社ホームページ　http://www.sos-berlin.com

ジョブ・ワークフローの実行方法については、[JS7® JobSchedulerクイックスタート](https://qiita.com/satoruf/items/96f21ef25bcb35e47b21#2-%E3%82%B9%E3%82%B1%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90)、[JS7® JobSchedulerワークフロー間連携](https://qiita.com/satoruf/items/64b185880f4ac0e05c5d)を御覧ください。

##2. JS7®の構成について

JS7®は以下のコンポーネントで構成されています。

- JOCコックピット
 - WEB GUI/REST API
 - ジョブ実行制御配布
 - 履歴情報収集・保存
 - ジョブ定義・リソースの作成
 - ジョブ定義の管理とコントローラーへの配布
 - クラスター制御、イベントキュー、ロギングなど
- コントローラー
 - DB接続を廃止
 - ジョブ定義をJOCコックピットから取得
 - 実行履歴をJOCコックピットに送信
 - 実行計画とジョブ定義をエージェントに配布
- 自律型エージェント
 - コントローラーとの通信障害時にも自律的にジョブ実行制御
 - エージェントクラスター内で実行計画とジョブ定義を同期
 - 実行履歴をコントローラーに送信
![js7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/cefc8941-c716-ebe5-e16a-f7653eb92be5.png)

##3.稼働条件
V.2.2.0 (2021/12現在）
**コントローラー/JOCコックピット**
- CPU 2core<、メモリ8GB<、ディスク空き容量10GB<
- OracleJDK/openJDK 8 - 12
- RHEL/CentOS 7 < (32/64bit)
- Windows Server 2016 < (32/64bit)
**エージェント**
- Any Linux/Windows (OracleJDK/openJDK 1.8がサポートされる環境)
- AIX 6,7 PowerPC
- Solaris 9,10,11 SPARC/x86-64
- HP-UX 11 IA64
- etc.

詳細はこちらを参照（英語）
https://kb.sos-berlin.com/display/PKB/JS7+-+Platforms

##4.データベースサポート
 - Oracle® 12c, 18c, 19c
 - SQL Server®	2012, 2014, 2017, 2019
 - MariaDB® 10.x
 - MySQL® 5.7, 8.0
 - PostgreSQL®	10 - 13
 - H2 1.4.200

詳細はこちらを参照（英語）
https://kb.sos-berlin.com/display/PKB/JS7+-+Database


##5.インストール手順
本手順は、JS7®の機能確認を目的とした検証環境のスタンドアロン構成構築の手順です。
実業務では使用しないで下さい。

JS7® JobScheduler インストール方法（Linux/CLI版）は以下の記事をご確認ください。
https://qiita.com/satoruf/items/fa9846f4376d1a50a67e

JS7® JobScheduler インストール方法（Windows版）は以下の記事をご確認ください。
https://qiita.com/Yoshitami/items/6804584592956a483364

詳細な手順はこちらを参照（英語）
 https://kb.sos-berlin.com/display/PKB/JS7+-+Installation

**(1)前提条件**
本手順は以下の前提条件での手順です。
* SOS社が提供するAlpineベースのDockerイメージを使用
https://hub.docker.com/repository/docker/sosberlin/js7
* Dockerのインストール手順はここでは記載しません

**(2)Postgresインストール**
参考：https://hub.docker.com/_/postgres
https://www.kimullaa.com/entry/2019/12/01/133740

```shell-session
# mkdir -p docker/postgres13 ## データ保存用ディレクトリの作成
# docker run -d \
    --name postgresql13 \
    --network=js7 -p 15432:5432 \
    -e POSTGRES_INITDB_ARGS="--encoding=UTF-8 --locale=ja_JP.UTF-8" \
    -e POSTGRES_PASSWORD=postgres \
    -v ~/docker/postgres13:/var/lib/postgresql/data \
    -d postgres:13-alpine
# vim docker/postgres13/pg_hba.conf ## 外部接続の設定
----
　　# IPv4 local connections:
　　host    all             all             0.0.0.0/0            trust ##変更し保存
----
# docker restart postgresql13
# docker exec -it postgresql13 psql -U postgres　##　schedulerデータベースの作成
    postgres=# CREATE DATABASE scheduler;
```
**(3)JOCインストール**

https://kb.sos-berlin.com/display/PKB/JS7+-+JOC+Cockpit+Installation+for+Docker+Containers

```shell-session
# docker image pull sosberlin/js7:joc-2-X-X  ##最新イメージの取得
# mkdir -p /home/sos/js7/js7-joc-primary/config /home/sos/js7/js7-joc-primary/logs ## ログデータ、設定データ保存用ディレクトリの作成
# docker volume create --driver local --opt o=bind --opt type=none --opt device="/home/sos/js7/js7-joc-primary/config" js7-joc-primary-config
# docker volume create --driver local --opt o=bind --opt type=none --opt device="/home/sos/js7/js7-joc-primary/logs" js7-joc-primary-logs
# docker run -dit --rm \
      --hostname=js7-joc-primary \
      --network=js7 \
      --publish=17446:4446 \
      --env="RUN_JS_JAVA_OPTIONS=-Xmx256m" \
      --env="RUN_JS_USER_ID=$(id -u $USER):$(id -g $USER)" \
      --mount="type=volume,src=js7-joc-primary-config,dst=/var/sos-berlin.com/js7/joc/resources/joc" \
      --mount="type=volume,src=js7-joc-primary-logs,dst=/var/log/sos-berlin.com/js7/joc" \
      --name js7-joc-primary \
      sosberlin/js7:joc-2-X-X
# vi /home/sos/js7/js7-joc-primary/config/hibernate.cfg.xml　## DB接続設定作成、下記内容で保存
##参考　https://kb.sos-berlin.com/display/PKB/JS7+-+Database#JS7-Database-HibernateConfigurationforPostgreSQL%C2%AE
----
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<hibernate-configuration>
 <session-factory>
  <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
  <property name="hibernate.connection.password">postgres</property>
  <property name="hibernate.connection.url">jdbc:postgresql://postgres13:5432/scheduler</property>
  <property name="hibernate.connection.username">postgres</property>
  <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</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>
----
# docker exec -ti js7-joc-standalone /bin/sh -c /opt/sos-berlin.com/js7/joc/install/joc_install_tables.sh ##データベーステーブルの作成
```
**動作確認**

ブラウザから
http://Your_Docker_host:17446
account: root
password: root
でログインできダッシュボードが表示されることを確認

**(4)コントローラーインストール**

https://kb.sos-berlin.com/display/PKB/JS7+-+Controller+Installation+for+Docker+Containers


```shell-session
# docker image pull sosberlin/js7:controller-2-X-X ##最新イメージの取得
# mkdir -p /home/sos/js7/js7-controller-primary/var ##ログデータ、設定データの保存用ディレクトリの作成
# docker volume create --driver local --opt o=bind --opt type=none --opt device="/home/sos/js7/js7-controller-primary/var" js7-controller-primary-var
# docker run -dit --rm \
      --hostname=js7-controller-primary \
      --network=js7 \
      --publish=15444:4444 \
      --env="RUN_JS_JAVA_OPTIONS=-Xmx256m" \
      --env="RUN_JS_ID=jobscheduler" \
      --env="RUN_JS_USER_ID=$(id -u $USER):$(id -g $USER)" \
      --mount="type=volume,src=js7-controller-primary-var,dst=/var/sos-berlin.com/js7/controller/var" \
      --name js7-controller-primary \
      sosberlin/js7:controller-2-X-X
```

**(5)エージェントインストール**

https://kb.sos-berlin.com/display/PKB/JS7+-+Agent+Installation+for+Docker+Containers

```shell-session
# docker image pull sosberlin/js7:agent-2-X-X##最新イメージの取得
# mkdir -p /home/sos/js7/js7-agent-primary/var ##ログデータ、設定データの保存用ディレクトリの作成
# docker volume create --driver local --opt o=bind --opt type=none --opt device="/home/sos/js7/js7-agent-primary/var" js7-agent-primary-var
# docker run -dit --rm \
      --hostname=js7-agent-primary \
      --network=js7 \
      --publish=16445:4445 \
      --env="RUN_JS_JAVA_OPTIONS=-Xmx256m" \
      --env="RUN_JS_USER_ID=$(id -u $USER):$(id -g $USER)" \
      --mount="type=volume,src=js7-agent-primary-var,dst=/var/sos-berlin.com/js7/agent/var_4445" \
      --name js7-agent-primary \
      sosberlin/js7:agent-2-X-X
```

**(6)コントローラー/エージェントの登録**

Postgres/JOC/コントローラー/エージェントを起動したら、正常に起動されているか確認します。

```shell-session
# docker ps
CONTAINER ID   IMAGE                                     COMMAND                  CREATED        STATUS        PORTS                                                  NAMES
4f9e5392a8c7   sosberlin/js7:controller-2-X-X   "sh /usr/local/bin/e…"   10 days ago    Up 10 days    0.0.0.0:15444->4444/tcp, :::15444->4444/tcp            js7-controller-primary
43ba07ebb7bb   sosberlin/js7:joc-2-X-X         "sh /usr/local/bin/e…"   10 days ago    Up 10 days    0.0.0.0:17446->4446/tcp, :::17446->4446/tcp            js7-joc-primary
5202afba7970   sosberlin/js7:agent-2-X-X        "sh /usr/local/bin/e…"   11 days ago    Up 11 days    0.0.0.0:16445->4445/tcp, :::16445->4445/tcp            js7-agent-primary
9f0534fa10d7   postgres:13-alpine                        "docker-entrypoint.s…"   5 weeks ago    Up 5 weeks    0.0.0.0:5432->5432/tcp, :::5432->5432/tcp              postgresql13
```

ブラウザから
http://Your_Docker_host:17446
account: root
password: root
でログインすると、コントローラ登録画面が表示されます。
![スクリーンショット 2021-07-11 12.52.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/0cc624aa-704f-2a3d-87d1-27767505a247.png)
スタンドアロンタイプを選択し、URLは```http://[コントローラーコンテナ名]:[ポート番号]```
を入力し登録します。
次にJobSchedulerメニューから"Add Agent"を選択
![スクリーンショット 2021-07-11 12.54.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/4145a11a-8fcd-cb8f-4a1e-4d9073e32a1a.png)
エージェントコンテナ名で登録します。
![スクリーンショット 2021-07-11 12.54.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/43c1aae9-f37b-c699-1d47-29c8c04299e4.png)
エイリアス名とは、開発環境と本番環境でエージェント名が異なっても、ジョブ定義では共通のエイリアス名を使用するとワークフロージョブの定義内容を変える必要がありません。
最後にアカウントメニューのProfileを選択し
![スクリーンショット 2021-07-11 12.55.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/1db4f249-9a40-7029-68f5-15272d1e7344.png)
言語やタイムゾーンなどを設定
![スクリーンショット 2021-07-11 12.56.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/44f177c4-563e-423e-e70a-5a29ab4047ec.png)
ダッシュボードを選択すると、コントローラーやエージェントの状態が表示されます。
![スクリーンショット 2021-07-11 12.57.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/6ab1e16d-c6d8-7813-71ee-8b2dfec99f67.png)

**(7)ログファイル**
ログファイルは、各コンテナの設定ファイルディレクトリの/logsに保存されます。
https://kb.sos-berlin.com/display/PKB/JS7+-+Log+Files+and+Locations