NAS の定期ジョブ:ログと失敗通知付きの cron
Bucket & Code Server IDE の Jobs ページは、cron のスケジュールに従ってコマンドを実行し、各実行のログを保存します。ジョブは失敗時に QTS のシステムログへ通知できます。宛先を追加すれば Telegram、Discord、Slack、メールにも送信できます。
- スケジュールcron のフィールドと次回実行
- コマンドbash、root として実行
- 今すぐ実行実行とそのログ
- 組み込みパッケージ自身のジョブ
- 通知システムログとチャット
画像はテスト用 NAS のもので、バージョン 1.0.0-49 の表示を使用しています。Notifications の画像にあるアドレスは例です。
01Jobs ページ
ページには 2 つのタブがあります。Scheduled にはパッケージ組み込みと各アカウント作成の cron ジョブが表示されます。Operations には、インストールやデータ移動など、bvsd が実行した時間のかかる操作の直近 50 件が新しい順に表示されます。
Scheduled の各行には、ジョブと所有者、文章と式によるスケジュール、次回実行、有効・無効のスイッチが表示されます。行を開くとコマンド、実行履歴、ログを確認できます。上部のバッジは NAS のタイムゾーンを示し、ページ内の時刻はすべてそのタイムゾーンです。
- 開発者はジョブを作成し、自分のジョブを変更・削除できます。管理者はすべてのジョブを変更できます。
- ログイン済みのすべてのアカウントが一覧、コマンド、ログを読めます。閲覧者も同様です。
02ジョブを新規作成する
- New job を押し、Name に名前を入力します。
- Schedule に 5 フィールド(分 時 日 月 曜日)、先頭に秒を加えた 6 フィールド、または
@daily、@hourly、@every 90mを入力します。下の例を選ぶと入力できます。その下にはスケジュールの説明と、NAS のタイムゾーンでの次回 5 回分が表示されます。CRON_TZ=Europe/London 0 3 * * *のような接頭辞で別のタイムゾーンを使えます。 - Command (bash) はターミナルに入力するのと同じように記述します。複数行は 1 つのスクリプトとして実行され、出力が実行ログになります。
- Runs は On the NAS または作成済みの環境を選びます。環境内ではそのシステムのツールとライブラリが見えます。Working folder はデータフォルダー内の
projects/からの相対パスまたは絶対パスです。空欄はprojects/を意味します。環境内ではprojects/だけが/projectsとして見えます。 - Timeout in seconds を過ぎても実行中であれば停止し、タイムアウトとして記録します。新規ジョブの初期値は 3600 で、0 は無制限です。When the previous run is still going は Skip this run または Run it after the previous one を選びます。後者では待機できる実行は最大 1 件です。
- 新規ジョブでは Notify on failure と On がオンです。無効にしたジョブも設定は保持され、手動でのみ実行されます。Create the job を押します。
夏時間の切り替えがある夜は Debian cron の規則に従います。分または時フィールドが * または */N で始まるジョブ、@hourly、@every は経過時間に従います。秋は繰り返す時間帯の両方で実行され、春の飛ばされる時間帯は発生しません。その他のジョブは各予定時刻に 1 回実行されます。繰り返す時間帯の予定は 1 回、飛ばされる時間帯の予定は切り替え直後に実行されます。
03今すぐ実行、実行履歴、ログ
ジョブのダイアログにある Run now は、そのジョブが実行中でなければ、スケジュールとは別に即時実行します。ダイアログには各実行の開始、所要時間、結果、終了コードが表示されます。実行を選ぶと一覧の下にログが表示されます。
- ログの最初と最後の行は bvsd が書き込みます。最初の行は実行とジョブ、開始時刻、開始元のアカウントまたはスケジュールを示します。この時刻は UTC ですが、実行一覧は NAS の時刻です。最後の行には結果と所要時間が表示されます。
- ジョブは直近 100 回の実行を保持し、それぞれ出力の末尾 4 KB を保存します。実行の完全なログは 30 日間保持されます。
- 失敗またはタイムアウトになると、一覧でジョブの隣に赤い last run failed が付きます。Overview の Jobs タイルでも failing に数えられます。
- コマンドが終了しても、起動したバックグラウンドプロセスは動き続けます。タイムアウト、ジョブの削除、パッケージの停止では、実行のプロセスグループ全体に SIGTERM を送り、5 秒後に SIGKILL を送ります。
- Edit はジョブを変更します。Delete は実行中の処理を停止し、ジョブと実行履歴、ログを削除します。これらのボタンは所有者と管理者だけに表示され、それ以外には Close が表示されます。
04組み込みジョブ
built in と表示されるジョブは bvsd 自身のもので、所有者は system です。
| ジョブと実行時刻 | 処理内容 |
|---|---|
| バックアップ 既定は @daily | バックアップ ページで設定するバックアップ。そのページで Scheduled backups をオンにすると実行され、スケジュールとスイッチも同ページで管理します |
| メンテナンス 毎日 03:30 | データフォルダー内の tmp/ から 10 日間変更のないものを削除し、10 MB を超えた log/audit.log をローテーションします |
| ゴミ箱を空にする 毎日 03:45 | データフォルダー内の trash/ へ移動してから 7 日を超えたものを削除します。削除済みのリポジトリ、バケット、アカウントのホームフォルダーが対象です |
| ツールチェーンカタログの更新 毎日 04:15 | 署名付きツールチェーンカタログを取得し、署名が有効で新しい場合に使用します |
| nginx のログのローテーション 毎時 7 分 | nginx-access.log または nginx-error.log が 20 MB を超えると .1 に名前を変更し、古いファイルを 5 つ保持して nginx にログを開き直させます |
管理者は組み込みジョブのスケジュール、タイムアウト、実行中の動作、失敗通知を変更し、ジョブを無効にできます。名前、コマンド、環境、作業フォルダーは固定で、Delete はありません。
05通知
bvsd はすべての通知を QTS システムログへ書き込みます。System ページの Notifications は、shoutrrr URL を使ってチャットやメールにも送信します。Telegram、Discord、Slack、メール、Webhook などを利用できます。
- Addresses (shoutrrr URLs) で Add an address を押し、サービスごとに 1 つの URL を貼り付けます。たとえば
telegram://<token>@telegram?chats=<chat id>またはgeneric+https://example.com/hookです。 - Also sent to the addresses で、システムログだけに残す通知のチェックを外します。新規インストールでは 4 つともオンです。
- Save を押します。
| スイッチ | 通知される条件 |
|---|---|
| ジョブが失敗したとき | 失敗通知を有効にした cron ジョブが失敗またはタイムアウトになった場合、またはビルド、データ移動、インストールなどの操作が失敗した場合 |
| バックアップが終了したとき | バックアップ、検証、復元が終了した場合。成功時も含みます。または定期バックアップを開始できなかった場合 |
| モジュールが再起動を繰り返しているとき | プロセスが終了と再起動を繰り返す場合 |
| 証明書 | アップロード済み証明書の残りが 30 日以下になった場合、nginx が自己署名証明書へ切り替わった場合、または bvsd が新しい自己署名証明書を作成した場合 |
| なし、常に送信 | 起動時に設定が拒否された場合、未完了のデータ移動が見つかった場合、残っていたプロセスを終了した場合、または設定を書き込めなかった場合 |
- 同じ件名の通知は、システムログを含め、10 分に最大 1 回送信されます。次の通知には抑制した件数が表示されます。
- 各アドレスへの送信は個別で、制限時間は 10 秒です。失敗時には URL のスキームだけを記録します。残りの部分にはトークンが含まれるためです。
- アドレスとスイッチを変更できるのは管理者だけです。他のアカウントにはスイッチと各 URL のスキームが表示されます。
NAS の管理者はパッケージの CLI ソケットからも宛先を設定できます。送信した一覧が既存の宛先を置き換え、スイッチの値は保持されます。
/usr/bin/bucketvs/bin/curl --unix-socket /usr/bin/bucketvs/var/run/bvsd-cli.sock \
-X PUT -H 'Content-Type: application/json' \
-d '{"notify":{"shoutrrr_urls":["telegram://<token>@telegram?chats=<chat id>"]}}' \
http://bvsd/api/v1/settings
06Root 権限と他のアカウントが読める内容
- ジョブのコマンドは root として実行されます。NAS 上でも環境内でも、作成者は問いません。開発者はジョブを作成できるため、NAS 上で任意のコマンドを root として実行できます。開発者ロールは NAS の root 権限を渡せる相手だけに付与してください。
- ジョブは所有者が有効な開発者または管理者の場合だけ動きます(バージョン 1.0.0-52 以降)。所有者が無効、またはメンバー・閲覧者ロールの場合、各予定時刻は理由付きのスキップとして記録されます。たとえば its owner ola is disabled です。Run now も同じ理由を返し、実行中の処理は停止します。アカウントが有効になるか開発者に戻ると再開します。アカウントを削除すると、そのジョブ、実行履歴、ログも削除されます。組み込みジョブはアカウントの状態にかかわらず動作します。
- ログイン済みのすべてのアカウントは、閲覧者も含め、すべてのジョブのコマンドと出力を読めます。パスワードやトークンをコマンドに書かず、データフォルダー内の
etc/に root だけが読めるファイルを作成し(chmod 600)、コマンドからそのファイルを読ませてください。