cronをGUIで管理できるDkronとは

## Dkronとは何か
### 概要
Dkronは、分散ジョブスケジューリングシステムであり、クラスタ全体でスケジュールされたジョブを分散して実行することができます
これは耐障害性とスケーラビリティを提供し、クラウドネイティブな環境や大規模な分散システムで適しています
また、スケジュールされたジョブである`cron`をGUIで管理することができます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282722/edadf7e3-8e1f-e272-e631-e81b6669eb82.png)
（[公式ページ](https://dkron.io/)から引用）

## Dkronのインストール方法
### バイナリの実行
1. ダウンロード
    - プラットフォームに適したパッケージ化されたアーカイブを[ダウンロードページ](https://github.com/distribworks/dkron/releases)からダウンロードし、/opt/local/binなどの共有場所にパッケージを展開します 
1. Dkronの実行
    ```sh
    dkron agent --server --bootstrap-expect=1
    ```
1. UIへのアクセス
    - http://localhost:8080/ui にアクセスします

### Dockerでの実行
Dkronは公式のDockerイメージを提供しており、Docker Hubからダウンロードして任意のシステムでデプロイできます
### 新しいコンテナとしてのDkronの起動
1. クイックスタート
    ```sh
    docker run -d -p 8080:8080 --name dkron dkron/dkron agent --server --bootstrap-expect=1 --node-name=node1
    ```
1. ログの確認
    ```sh
    docker logs -f dkron
    ```
1. アクセス
    - Dkronの起動が完了したら、http://localhost:8080 でアプリケーションにアクセスできます

起動後は以下のような画面が出てきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282722/0d2aada0-3383-4b60-e39c-cb46c05f80d6.png)

## 基本的な使い方とコマンド例
### Dkronの設定ファイル
Dkronの設定はYAMLファイルで行います
以下はサンプルの設定ファイルです

```yaml
backend: "etcd"
backend_machine:
  - "127.0.0.1:2379"
log_level: "debug"
server: true
```

### ジョブの作成と管理
#### ジョブの作成
[公式のサンプルジョブ](https://dkron.io/docs/basics/getting-started/#:~:text=the%20CLI%20docs-,Create%20a%20Job,-This%20job%20will)を作成します
GUIから作成するより`curl`を使ってHTTPからAPI叩いた方が楽でした

```json
curl localhost:8080/v1/jobs -XPOST -d '{
  "name": "job1",
  "schedule": "@every 10s",
  "timezone": "Europe/Berlin",
  "owner": "Platform Team",
  "owner_email": "platform@example.com",
  "disabled": false,
  "tags": {
    "server": "true:1"
  },
  "metadata": {
    "user": "12345"
  },
  "concurrency": "allow",
  "executor": "shell",
  "executor_config": {
    "command": "date"
  }
}'
```

#### ジョブの一覧表示
こちらで作成したジョブを確認できます

http://localhost:8080/ui/#/jobs

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282722/807c2291-93c3-29cf-6f97-cfe359a3fdc4.png)

チェックボックスをクリックすると実行や削除などのアイコンが表示されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282722/e956e709-148e-d69d-3ba6-1c2b8711b67a.png)


## 具体的なユースケースと実例

### データベースのバックアップ
企業ではデータベースの定期的なバックアップが重要です
以下は毎日深夜にバックアップを実行するジョブの例です

```sh
curl localhost:8080/v1/jobs -XPOST -d '{
  "name": "db-backup",
  "schedule": "@daily",
  "timezone": "Asia/Tokyo",
  "owner": "YourName",
  "owner_email": "youremail@example.com",
  "disabled": false,
  "tags": {
    "server": "true:1"
  },
  "metadata": {
    "user": "12345"
  },
  "concurrency": "allow",
  "executor": "shell",
  "executor_config": {
    "command": "pg_dump -U user -h db_host mydatabase > /backup/db_backup.sql"
  }
}'
```

### ログローテーション
ログファイルが大きくなるのを防ぐために、ログの回転を定期的に実行します
以下は毎週ログローテーションをするジョブの例です
```sh
curl localhost:8080/v1/jobs -XPOST -d '{
  "name": "logrotate",
  "schedule": "@weekly",
  "timezone": "Asia/Tokyo",
  "owner": "YourName",
  "owner_email": "youremail@example.com",
  "disabled": false,
  "tags": {
    "server": "true:1"
  },
  "metadata": {
    "user": "12345"
  },
  "concurrency": "allow",
  "executor": "shell",
  "executor_config": {
    "command": "logrotate /etc/logrotate.conf"
  }
}'

```

## まとめ
`cron`も良いですがCLI上での操作になるので理解が遅れることがありますよね
`Dkron`ならGUI上での操作なので見た目が良いしわかりやすいです
上記のようにコマンドでも実行できるのでそこはお好みですが、一覧での確認やステータスの確認ならGUIの方が理解しやすいと思うので`Dkron`の使用がおすすめです

## 参考リンク

https://dkron.io/docs/intro/

https://dkron.io/docs/basics/installation/

https://dkron.io/docs/basics/getting-started/

https://dkron.io/docs/v2/basics/configuration/