Fly.io の「Crontab with Supercronic」のページに従って定期処理の設定をやってみた

### 前提

- [Fly.io](https://fly.io/)のページについては、2024年8月10日時点の構成で説明しています。
- 検証環境
    - MacBook Pro(Intel)
        - macOS Sonoma 14.5
- ローカル環境にFly.ioにデプロイ済みのアプリケーションがある。
    - デプロイ用のDockerfileとfly.tomlが作成済みの状態。

---

[Fly.io](https://fly.io/)のページにアクセスし、画面上部メニューのから「[Docs](https://fly.io/docs/)」をクリックします。

![スクリーンショット 2024-08-07 9.16.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/36ed6739-5556-5ef5-5623-1df4fba37262.png)

---

検索フォームから「Cron」と入力します。

![スクリーンショット 2024-08-07 9.17.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/d6e8072f-567d-2a30-f6dc-f6ac6bf3b7da.png)

「Crontab with Supercronic」がヒットするのでクリックします。


![スクリーンショット 2024-08-10 20.59.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/cef2d68a-36dd-ff90-2731-fc40d230bb68.png)



「[Crontab with Supercronic](https://fly.io/docs/blueprints/supercronic/)」のページに従って作業を進めていきます。

---

以下の説明が記載されています。

![スクリーンショット 2024-08-10 21.06.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/4d68cf85-671f-ce7a-9466-1809e78b5489.png)

コンテナ内で定期処理を実現するために、Go言語製の「[Supercronic](https://github.com/aptible/supercronic)」を利用するとのことなので、設定を行っていきましょう。

---

Fly.ioにデプロイ済みのアプリケーションのディレクトリを「/app」と仮定します。
「/app」配下に「crontab」ファイルを作成し、このファイルにcronの設定を記述します。
ここでは5分に1回「hello fly.io!」と表示することにします。

```
% echo '*/5 * * * * echo "hello fly.io!"' > crontab
% cat crontab                                      
*/5 * * * * echo "hello fly.io!"
```

---

- Fly.ioのデプロイで利用しているDockerfileに以下の記述を追加します。
- 「[Crontab with Supercronic](https://fly.io/docs/blueprints/supercronic/)」のページでは [v0.2.29](https://github.com/aptible/supercronic/releases/tag/v0.2.29) をインストールするように説明されていますが、Supercronicの「[Releaseページ](https://github.com/aptible/supercronic/releases)」を参照すると、2024年8月10日時点では [v0.2.30](https://github.com/aptible/supercronic/releases/tag/v0.2.30) が最新のようなので、ここでは v0.2.30 をインストールすることとします。
- 私が利用しているイメージ(node:20.16.0-slim)の場合は curl コマンドのインストールが別途必要だったため、Supercronicのインストールの手前で行っています。
- 事前に作成しておいた「crontab」をコピーします。

```
RUN apt-get update -qq && \
    apt-get install -y curl

ENV SUPERCRONIC_URL=https://github.com/aptible/supercronic/releases/download/v0.2.30/supercronic-linux-amd64 \
    SUPERCRONIC=supercronic-linux-amd64 \
    SUPERCRONIC_SHA1SUM=9f27ad28c5c57cd133325b2a66bba69ba2235799

RUN curl -fsSLO "$SUPERCRONIC_URL" \
 && echo "${SUPERCRONIC_SHA1SUM}  ${SUPERCRONIC}" | sha1sum -c - \
 && chmod +x "$SUPERCRONIC" \
 && mv "$SUPERCRONIC" "/usr/local/bin/${SUPERCRONIC}" \
 && ln -s "/usr/local/bin/${SUPERCRONIC}" /usr/local/bin/supercronic

COPY crontab crontab
```

- コンテナ起動時のコマンドの行をコメントアウト、もしくは、削除します。

```
#CMD [ "npm", "run", "start" ]
```

---

- Fly.ioのデプロイで利用しているfly.tomlに以下の記述を追加します。
- 「[[vm]]」の修正
    - 「processes」に「['cron', 'web']」を指定します。
    - これまでは「processes」が「web」だけでしたが、今回から「cron」のプロセスが増えるためです。
- 「[processes]」の修正
    - 「cron」のプロセスには supercronic コマンドを指定し、引数に crontab ファイルのパスを与えます。
    - 「web」のプロセスには Dockerfile 内でコメントアウトしたコンテナ起動時に実行するコマンドを指定します。

```
[processes]
  cron = 'supercronic /app/crontab'
  web = 'npm run start'

[http_service]
  ・
  ・
  processes = ['web']

[[vm]]
  size = 'shared-cpu-1x'
  processes = ['cron', 'web']
```

---

準備が整いましたのでデプロイを実行します。

```
% fly deploy
```

---

Machinesの画面を表示すると、Supercronic用のコンテナ（「Process」に「cron」と表示されているコンテナ）が2台作成されています。
Fly.ioではデプロイを実行すると、デフォルトでアプリケーション用のコンテナが2台作成するようです。
なので、Supercronic用のコンテナも2台作成された？ようです。
これにより、合計4台が動作している状態となっています。

![スクリーンショット_2024-08-10_22_18_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/436aaeef-3ef7-9a5e-6db0-6bd331a267b1.png)

Supercronic用のコンテナは1台で動作可能なようなので、以下のコマンドでスケールインさせます。
今回は　アプリケーション用のコンテナを1台、Supercronic用のコンテナを1台とします。

```
% fly scale count cron=1 web=1
```

アプリケーション名を指定して実行する場合は「-a」オプションを付与します。

```
% fly scale count cron=1 web=1 -a アプリケーション名
```

fly.tomlを指定して実行する場合は「-c」オプションを付与します。

```
% fly scale count cron=1 web=1 -ｃ fly.tomlのパス
```

スケールインが成功すると、Machinesの画面で以下のようにコンテナの台数が減っています。

![スクリーンショット_2024-08-10_22_32_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/44b42098-e7e8-719d-48eb-eb009a674297.png)

---

Supercronicによる定期処理の動作確認のためにLive Logsの画面を表示すると、5分に1回「hello fly.io!」と出力されていることが確認できました。

![スクリーンショット_2024-08-10_22_35_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/fa9fd636-05f3-7e9f-f756-9407e46be02b.png)

---

- 参考URL
    - [fly.ioでWebアプリケーションと定期処理プロセス(Cron)を爆速デプロイ](https://qiita.com/solt9029/items/bd6a9bae247f74f3e3a2)
    - [Fly.io で cron を使って定期ジョブを実行する 🕰️](https://qiita.com/miyuc/items/fc926aaa9650e38bae4d)
    - [RailsアプリをHerokuからFly.ioに移行した](https://zenn.dev/hassan/articles/ab4fb368ac4679)
    - [【Fly.io + Rails】cronでrakeタスクを定期実行する](https://ama-tech.hatenablog.com/flyio-rails-cron)
    - [fly-apps/supercronic](https://github.com/fly-apps/supercronic)