本書は、Task Scheduler Plus の現行実装を対象とした詳細設計書である。 Web 画面、Worker、サービス層、データモデル、設定ファイル、認証・認可、実行フローを整理し、保守・拡張時に参照できる状態にする。
src/TaskSchedulerPlus.Websrc/TaskSchedulerPlus.Workersrc/Parameterdocs/diagrams
- Bootstrap 配布ファイルの内部設計
- ASP.NET Core Identity 標準テーブルの詳細定義
- SQL Server 自体の物理設計
- OS、IIS、Windows Service の詳細なインフラ構成
Task Scheduler Plus は、ワークフロー単位でタスクを登録し、手動またはスケジュールにより実行するシステムである。
Web プロジェクトは画面操作、認証、設定参照、ユーザー管理を担当する。 Worker プロジェクトはスケジュール監視、実行キュー投入、タスク実行を担当する。
PlantUML:
docs/diagrams/system-architecture.puml
@startuml
title システム全体構成
actor "利用者" as User
actor "管理者" as Admin
node "Web サーバー" {
component "TaskSchedulerPlus.Web\nBlazor Server" as Web
}
node "Worker 実行環境" {
component "TaskSchedulerPlus.Worker\nHosted Service" as Worker
}
database "SQL Server\nTaskSchedulerPlus DB" as DB
folder "src/Parameter" as Parameter {
file "rds.json" as Rds
file "mail.json" as Mail
}
folder "App_Data" as AppData {
file "setup.json" as Setup
folder "keys" as Keys
}
folder "各プログラム実行直下\nlogs" as Logs
component "外部プロセス\nexe / bat / cmd" as Process
User --> Web : 画面操作
Admin --> Web : 管理操作
Web --> DB : 登録・参照・更新
Worker --> DB : 監視・実行状態更新
Web --> Parameter : 設定参照
Worker --> Parameter : 設定参照
Web --> AppData : 初期設定・DataProtection
Worker --> AppData : DataProtection
Web --> Logs : Webログ出力
Worker --> Logs : Workerログ出力
Worker --> Process : Process.Start
@enduml| 分類 | 内容 |
|---|---|
| 言語 | C# |
| ランタイム | .NET 9 |
| Web | ASP.NET Core / Blazor Server |
| Worker | .NET Worker Service |
| DB | SQL Server / LocalDB |
| ORM | Entity Framework Core |
| 認証 | ASP.NET Core Identity |
| ログ | NLog |
| UI | Bootstrap 5 |
src/
TaskSchedulerPlus.sln
TaskSchedulerPlus.slnLaunch
NuGet.Config
Parameter/
rds.json
mail.json
TaskSchedulerPlus.Web/
Components/
Data/
Services/
Program.cs
TaskSchedulerPlus.Worker/
Program.cs
docs/
DEVELOPMENT_PHILOSOPHY.md
DETAILED_DESIGN.md
diagrams/
Blazor Server による Web UI を提供する。 主な責務は次の通り。
- ログイン、ログアウト
- 初期設定
- ダッシュボード表示
- ワークフロー管理
- スケジュール設定
- タスク管理
- 実行履歴表示
- ユーザー管理
- パラメーター参照
- 管理者向け履歴削除
常駐処理を担当する Worker プロジェクトである。 主な責務は次の通り。
- スケジュール監視
- 実行キュー登録
- キュー済みワークフローの実行
- タスクの外部プロセス起動
- 実行状態の DB 更新
appsettings.json には設定値そのものではなく、設定ファイルの参照先を定義する。
Web:
{
"Setup": {
"ParameterPath": "Parameter"
}
}Worker:
{
"Setup": {
"AppDataPath": "..\\TaskSchedulerPlus.Web\\App_Data",
"ParameterPath": "Parameter"
}
}Parameter は src/Parameter に配置する。
src は開発用ソース一式のルートであり、.sln と共有設定を同じ階層で管理する。
Web と Worker は同じ src/Parameter フォルダを参照する。
| ファイル | 内容 |
|---|---|
rds.json |
SQL Server 接続文字列 |
mail.json |
SMTP メール送信設定 |
rds.json は Provider と ConnectionString のみを持つ。
接続文字列から取得できる派生項目は保存しない。
App_Data は Web プロジェクト配下に配置する。
| パス | 内容 |
|---|---|
App_Data/setup.json |
初期設定情報、保護済み接続文字列 |
App_Data/keys |
Data Protection キー |
Worker は Setup:AppDataPath により Web 側の App_Data を参照する。
src/TaskSchedulerPlus.Web/Program.cs で以下を登録する。
- NLog
- Razor Components
- Identity 認証
- 認可ポリシー
- Data Protection
- ParameterFileStore
- ISetupConfigurationStore
- DbContextFactory
- InitialSetupService
- IdentityCore
- ParameterEmailSender
- FlowExecutionQueue
初期設定済みの場合のみ、DB マイグレーションとロール作成を行う。
未設定の場合は /setup と静的リソース以外を /setup へリダイレクトする。
src/TaskSchedulerPlus.Worker/Program.cs で以下を登録する。
- NLog
- Data Protection
- Windows Service 名
- ParameterFileStore
- ISetupConfigurationStore
- DbContextFactory
- FlowExecutionQueue
- FlowScheduleDispatcher
- QueuedFlowRunDispatcher
初期設定済みの場合のみ、DB マイグレーションを行う。
ASP.NET Core Identity のローカル認証のみを使用する。 外部ログインは使用しない。
| ロール | 表示名 | 概要 |
|---|---|---|
Administrator |
管理者 | すべての操作が可能 |
GeneralUser |
一般ユーザー | ワークフロー・タスクの登録、変更、実行が可能 |
Viewer |
参照者 | 実行結果の参照のみ可能 |
| ポリシー | 対象ロール | 用途 |
|---|---|---|
ManageUsers |
Administrator | ユーザー管理、設定参照 |
ManageWorkflows |
Administrator, GeneralUser | ワークフロー、タスク、スケジュール管理 |
ViewExecutionResults |
Administrator, GeneralUser, Viewer | ダッシュボード、実行履歴参照 |
PlantUML:
docs/diagrams/auth-authorization-flow.puml
@startuml
title 認証・認可フロー
start
:利用者が画面へアクセス;
if (初期設定済み?) then (はい)
if (認証が必要な画面?) then (はい)
if (ログイン済み?) then (はい)
:Identity Cookie を検証;
:ロールを取得;
if (必要権限あり?) then (はい)
:画面表示;
else (いいえ)
:アクセス拒否画面;
endif
else (いいえ)
:ログイン画面へリダイレクト;
endif
else (いいえ)
:画面表示;
endif
else (いいえ)
if (/setup または静的リソース?) then (はい)
:アクセス許可;
else (いいえ)
:/setup へリダイレクト;
endif
endif
stop
@enduml| 項目 | 内容 |
|---|---|
| ルート | /setup |
| コンポーネント | Setup.razor |
| サービス | InitialSetupService |
| 認可 | AllowAnonymous |
- システム名
- SQL Server サーバー名
- データベース名
- 認証方式
- DB ユーザー名
- DB パスワード
- 暗号化接続
- サーバー証明書信頼
- タイムゾーン
- 初期管理者メールアドレス
- 初期管理者パスワード
- 初期管理者パスワード確認
- 初期設定済みか確認する。
- 入力値から接続文字列を生成する。
- DB へ接続する。
- EF Core Migration を適用する。
- 既存ユーザーが存在しないことを確認する。
setup.jsonを保存する。rds.jsonを保存する。- 必須ロールを作成する。
- 初期管理者を作成する。
- 初期管理者へ
Administratorロールを付与する。
PlantUML:
docs/diagrams/initial-setup-flow.puml
@startuml
title 初期設定フロー
start
:Webアプリ起動;
if (setup.json が存在し\n復号できる?) then (はい)
:DBマイグレーション実行;
:必須ロール作成;
:通常画面へ遷移;
else (いいえ)
:/setup へリダイレクト;
:DB接続情報・初期管理者を入力;
:接続文字列を生成;
if (DB接続とMigrationに成功?) then (はい)
if (既存ユーザーが存在する?) then (はい)
:エラー表示;
stop
else (いいえ)
:setup.json に保護済み接続文字列を保存;
:src/Parameter/rds.json を保存;
:初期管理者を作成;
:Administrator ロール付与;
:ログイン画面へ遷移;
stop
endif
else (いいえ)
:接続エラーを表示;
stop
endif
endif
@enduml| 画面 | ルート | コンポーネント | 認可 |
|---|---|---|---|
| ダッシュボード | / |
Home.razor |
ViewExecutionResults |
| 初期設定 | /setup |
Setup.razor |
AllowAnonymous |
| ワークフロー一覧 | /workflows, /flows |
Flows.razor |
ManageWorkflows |
| スケジュール設定 | /workflows/{WorkflowId:int}/schedule |
WorkflowSchedule.razor |
ManageWorkflows |
| タスク登録 | /workflows/{WorkflowId:int}/tasks |
WorkflowTasks.razor |
ManageWorkflows |
| タスク追加 | /workflows/{WorkflowId:int}/tasks/create |
WorkflowTaskCreate.razor |
ManageWorkflows |
| 実行履歴 | /runs, /runs/{RunId:int} |
Runs.razor |
ViewExecutionResults |
| ユーザー管理 | /users |
Users.razor |
ManageUsers |
| ユーザー追加 | /users/create |
UserCreate.razor |
ManageUsers |
| パラメーター参照 | /parameters |
Parameters.razor |
ManageUsers |
| 実行履歴管理 | /admin/run-history |
AdminRunHistory.razor |
Administrator |
| ワークフローJSON入出力 | /admin/workflow-json |
AdminWorkflowJson.razor |
Administrator |
| ワークフローJSONエクスポート | /admin/workflow-json/export |
AdminWorkflowJsonExport.razor |
Administrator |
| ワークフローJSONインポート | /admin/workflow-json/import |
AdminWorkflowJsonImport.razor |
Administrator |
| ログイン | /Account/Login |
Login.razor |
匿名 |
| パスワード再設定 | /Account/ForgotPassword |
ForgotPassword.razor |
匿名 |
MainLayout.razor が全体レイアウトを担当する。
- 左サイドバー
- 右上ログインユーザー表示
- アカウント操作
- 本文領域
- Blazor エラー表示
NavMenu.razor はログイン状態と権限によりメニューを出し分ける。
- Bootstrap 5 を基本にする。
- 文言は日本語を基本にする。
- ログイン画面は Bootstrap サンプルに近い中央配置とする。
- 管理者メニューはサイドバー内でドロップダウンにまとめる。
- サイドバーは開閉可能にする。
- サイドバーを閉じた状態ではヘッダーの開くボタンは表示せず、ブランド部分をクリックして開く。
- 設定参照画面は card を多用せず、システム設定画面のような構成にする。
- 削除操作は必ず
DeleteConfirmationModal.razorの Bootstrap モーダルで「削除しますか」と確認してから実行する。
PlantUML:
docs/diagrams/data-model.puml
@startuml
title 主要データモデル
entity "JobFlows" as JobFlows {
* Id : int
--
Name : nvarchar(100)
Description : nvarchar(500)
IsEnabled : bit
ScheduleEnabled : bit
ScheduleType : int
ScheduledStartAt : datetimeoffset
NextRunAt : datetimeoffset
LastScheduledRunQueuedAt : datetimeoffset
CreatedAt : datetimeoffset
UpdatedAt : datetimeoffset
}
entity "JobDefinitions" as JobDefinitions {
* Id : int
--
Name : nvarchar(100)
Description : nvarchar(500)
Command : nvarchar(500)
Arguments : nvarchar(1000)
WorkingDirectory : nvarchar(500)
SuccessExitCode : int
TimeoutSeconds : int
IsEnabled : bit
CreatedAt : datetimeoffset
UpdatedAt : datetimeoffset
}
entity "JobNodes" as JobNodes {
* Id : uniqueidentifier
--
JobFlowId : int
JobDefinitionId : int
Name : nvarchar(100)
DisplayOrder : int
RunNextOnSuccess : bit
StopOnFailure : bit
CreatedAt : datetimeoffset
UpdatedAt : datetimeoffset
}
entity "FlowRuns" as FlowRuns {
* Id : int
--
JobFlowId : int
RequestedByUserId : nvarchar(450)
RequestedAt : datetimeoffset
StartedAt : datetimeoffset
CompletedAt : datetimeoffset
Status : int
Message : nvarchar(1000)
CreatedAt : datetimeoffset
UpdatedAt : datetimeoffset
}
entity "JobRuns" as JobRuns {
* Id : int
--
FlowRunId : int
JobNodeId : uniqueidentifier
StartedAt : datetimeoffset
CompletedAt : datetimeoffset
Status : int
ExitCode : int
Output : nvarchar(max)
ErrorOutput : nvarchar(max)
CreatedAt : datetimeoffset
UpdatedAt : datetimeoffset
}
JobFlows ||--o{ JobNodes
JobDefinitions ||--o{ JobNodes
JobFlows ||--o{ FlowRuns
FlowRuns ||--o{ JobRuns
JobNodes ||--o{ JobRuns
@endumlワークフローの基本情報とスケジュール設定を保持する。
主な項目:
IdNameDescriptionIsEnabledScheduleEnabledScheduleTypeScheduledStartAtScheduleIntervalMinutesScheduleEveryDaysScheduleEveryWeeksScheduleDayOfMonthScheduleEveryMonthsScheduleDaysOfWeekScheduleEndAtRepeatEnabledRepeatIntervalMinutesRepeatDurationMinutesNextRunAtLastScheduledRunQueuedAtCreatedAtUpdatedAt
制約:
Nameは一意。ScheduleEnabledとNextRunAtにインデックスを持つ。
実行対象となるタスク定義を保持する。
主な項目:
IdNameDescriptionCommandArgumentsWorkingDirectorySuccessExitCodeTimeoutSecondsIsEnabledCreatedAtUpdatedAt
ワークフロー内に配置されたタスクを表す。
主キーは Guid とする。
主な項目:
IdJobFlowIdJobDefinitionIdNameRunNextOnSuccessStopOnFailureDisplayOrderCreatedAtUpdatedAt
制約:
JobFlowIdとNameの組み合わせは一意。JobFlow削除時は cascade。JobDefinition削除時は restrict。
ワークフロー1回分の実行履歴を保持する。
主な項目:
IdJobFlowIdRequestedByUserIdRequestedAtStartedAtCompletedAtStatusMessageCreatedAtUpdatedAt
ワークフロー実行内の個別タスク実行履歴を保持する。
主な項目:
IdFlowRunIdJobNodeIdStartedAtCompletedAtStatusExitCodeOutputErrorOutputCreatedAtUpdatedAt
制約:
FlowRunIdとJobNodeIdの組み合わせは一意。
以下のテーブルは CreatedAt と UpdatedAt を持つ。
JobDefinitionsJobFlowsJobNodesFlowRunsJobRuns
ApplicationDbContext.SaveChanges / SaveChangesAsync で自動更新する。
DB 側にも SYSUTCDATETIME() の既定値を持つ。
開発中は DB スキーマの後方互換性を保証しない。
公開前の途中マイグレーションは保持せず、現在の最終形態を InitialCreate として管理する。
開発DBは必要に応じて再作成する前提とする。 ワークフローとタスク定義を保持したい場合は、DB再作成前に JSON エクスポートを行い、再作成後に JSON インポートで復元する。
正式リリース後、利用者DBの互換性を保証する必要が出た場合は、その時点から追加マイグレーションを積み上げる。
初期設定を完了するサービス。
主な責務:
- 接続文字列生成
- DB 接続確認
- Migration 実行
- 初期ユーザー重複確認
- 初期設定保存
- 初期管理者作成
- ロール付与
App_Data/setup.json に初期設定を保存する。
主な責務:
- 初期設定の読み込み
- 初期設定の保存
- 初期設定の削除
- 接続文字列の保護と復号
src/Parameter/rds.jsonへの同期
Parameter フォルダの JSON ファイルを扱う。
主な責務:
rds.json読み込み、保存、削除mail.json読み込みmail.jsonが存在しない場合の既定ファイル作成- 管理画面用の JSON スナップショット取得
Identity のメール送信処理を担当する。
主な責務:
- メール確認リンク送信
- パスワード再設定リンク送信
- パスワード再設定コード送信
mail.json未設定時の送信スキップ
管理者向けのワークフローJSON入出力を担当する。
主な責務:
- ワークフロー、スケジュール、タスク定義のJSONエクスポート
- 検索、選択、全件指定によるワークフロー単位のZIPエクスポート
- JSONファイルの形式検証
- ワークフロー名重複時の別名登録
- タスクID重複時の再採番
- インポート時の次回実行日時再計算
実行履歴は環境ごとの運用結果であるため、エクスポートおよびインポート対象外とする。
ワークフロー実行要求を DB にキュー登録する。
主な責務:
- 対象ワークフロー取得
FlowRun作成JobRun作成- 作成した
FlowRun.Idを返す
スケジュール時刻を過ぎたワークフローを検出する常駐サービス。
主な責務:
- 30秒間隔で DB を確認
NextRunAt <= 現在時刻のワークフローを取得- 次回実行日時を再計算
- 実行キューへ登録
- 登録失敗時にスケジュール状態を戻す
キュー済みの実行履歴を取り出し、タスクを実行する常駐サービス。
主な責務:
- 5秒間隔で Queued の
FlowRunを確認 FlowRunを Running に更新JobNode.DisplayOrder順にタスクを実行Process.Startで外部プロセス起動- 標準出力、標準エラー、終了コードを保存
- タイムアウト時にプロセスツリーを終了
- 後続タスクの実行可否を制御
スケジュール設定から次回実行日時を計算する。
対応するスケジュール種別:
- 一回のみ
- 毎日
- 毎週
- 毎月
- 一定間隔
- 指定時間内の繰り返し
- 有効期限
Web と Worker 共通の NLog 設定をコードで構築する。
出力:
src/TaskSchedulerPlus.Web/logs/application.logsrc/TaskSchedulerPlus.Web/logs/error.logsrc/TaskSchedulerPlus.Worker/logs/application.logsrc/TaskSchedulerPlus.Worker/logs/error.log
WorkflowSchedule.razor でワークフローのスケジュール条件を登録する。
保存時に ScheduleCalculator.CalculateNextRun を呼び出し、次回実行日時を JobFlows.NextRunAt へ保存する。
Worker の FlowScheduleDispatcher が30秒ごとに DB を確認する。
対象条件は次の通り。
IsEnabled = trueScheduleEnabled = trueNextRunAt is not nullNextRunAt <= DateTimeOffset.UtcNow
PlantUML:
docs/diagrams/scheduled-execution-flow.puml
@startuml
title スケジュール実行フロー
start
:Worker 起動;
repeat
:FlowScheduleDispatcher が30秒待機;
if (初期設定済み?) then (はい)
:現在時刻 <= NextRunAt の\n有効ワークフローを取得;
while (対象ワークフローあり?)
:次回実行時刻を再計算;
if (次回実行なし?) then (はい)
:ScheduleEnabled = false;
endif
:FlowExecutionQueue.EnqueueAsync;
:FlowRun / JobRun を Queued で作成;
endwhile
else (いいえ)
:何もせず待機;
endif
repeat while (停止要求なし?)
stop
@enduml外部プロセス実行は System.Diagnostics.Process.Start を使用する。
.bat と .cmd は直接実行せず、cmd.exe /d /c 経由で実行する。
それ以外は解決済みパスを直接起動する。
UseShellExecute = false とし、標準出力と標準エラーを取得する。
| 条件 | 状態 |
|---|---|
ExitCode == SuccessExitCode |
Succeeded |
ExitCode != SuccessExitCode |
Failed |
| タイムアウト | TimedOut |
| タスク定義無効 | Skipped |
| 後続停止 | Skipped |
JobNode.RunNextOnSuccess:
true: 正常終了時に次のタスクへ進む。false: 正常終了後、残りのタスクをSkippedにする。
JobNode.StopOnFailure:
true: 失敗時に残りのタスクをSkippedにする。false: 失敗しても次のタスクへ進む。
PlantUML:
docs/diagrams/task-execution-flow.puml
@startuml
title タスク実行フロー
start
:QueuedFlowRunDispatcher が5秒ごとに確認;
if (Queued の FlowRun あり?) then (はい)
:FlowRun を Running に更新;
:JobNode を DisplayOrder 順に取得;
while (未処理タスクあり?)
if (タスク定義が有効?) then (はい)
:JobRun を Running に更新;
:ProcessStartInfo を作成;
if (.bat / .cmd ?) then (はい)
:cmd.exe /d /c 経由で起動;
else (いいえ)
:実行ファイルを直接起動;
endif
:標準出力・標準エラーを取得;
if (タイムアウト?) then (はい)
:プロセスツリーを Kill;
:JobRun = TimedOut;
:FlowRun = Failed;
stop
else (いいえ)
if (ExitCode == SuccessExitCode?) then (はい)
:JobRun = Succeeded;
if (RunNextOnSuccess?) then (はい)
:次のタスクへ;
else (いいえ)
:残りを Skipped;
:FlowRun = Succeeded;
stop
endif
else (いいえ)
:JobRun = Failed;
if (StopOnFailure?) then (はい)
:残りを Skipped;
:FlowRun = Failed;
stop
else (いいえ)
:次のタスクへ;
endif
endif
endif
else (いいえ)
:JobRun = Skipped;
endif
endwhile
:FlowRun = Succeeded または Failed;
else (いいえ)
:待機;
endif
stop
@endumlRuns.razor で実行履歴を表示する。
主な表示:
- 対象日
- 実行件数
- 成功件数
- 失敗件数
- 実行中件数
- 1日ガントチャート
- 実行一覧
- 個別実行詳細
対象日の 0:00 から 24:00 を横軸にし、FlowRun と JobRun の開始・終了時刻からバー位置を計算する。
状態ごとの表示色:
- Succeeded
- Failed
- TimedOut
- Running
- Skipped
- Queued
AdminRunHistory.razor で管理者のみ実行可能。
削除範囲:
- 全件
- 1か月以上前
- 2か月以上前
- ...
- 12か月以上前
削除条件の日付は CreatedAt を使用する。
削除実行前に Bootstrap モーダルで削除対象件数と条件を表示し、利用者が明示的に確認した場合のみ削除する。
Users.razor でユーザー一覧を表示する。
機能:
- ユーザー表示
- ロール変更
- ユーザー削除
- 自分自身の削除防止
- 自分自身の管理者権限解除防止
ユーザー削除は Bootstrap モーダルで確認してから実行する。 ログイン中の自分自身、または最後の管理者は削除できない。
UserCreate.razor でユーザーを追加する。
入力項目:
- メールアドレス
- 権限
- パスワード
- パスワード確認
AdminWorkflowJson.razor は入口画面とし、管理者のみ実行可能。
入口画面には「エクスポート」「インポート」ボタンを配置し、それぞれ専用画面へ遷移する。
処理画面:
- エクスポート:
AdminWorkflowJsonExport.razor - インポート:
AdminWorkflowJsonImport.razor
対象:
JobFlowsJobNodesJobDefinitions
対象外:
FlowRunsJobRuns- ユーザー情報
- システム設定ファイル
現在登録されているワークフロー、スケジュール、タスク定義をZIPファイルとしてダウンロードする。 エクスポート画面では、検索キーワードで対象ワークフローを絞り込み、チェックボックスで選択したワークフローのみを出力できる。 全件出力ボタンを使用した場合は、検索条件やチェック状態に関係なく全ワークフローを出力する。
ZIPファイル名は次の形式とする。
- 選択出力:
workflow-json-selected-yyyyMMddHHmmss.zip - 全件出力:
workflow-json-all-yyyyMMddHHmmss.zip
ZIP内にはワークフローごとにJSONファイルを作成する。 各JSONファイルには1件のワークフローと、そのワークフローに属するタスク定義を含める。
JSONには形式管理のため以下を含める。
formatVersionapplicationexportedAtworkflows
エクスポート済みJSONファイルを読み込み、ワークフローとタスク定義を新規登録する。
取り込み方針:
- 同じワークフロー名が既に存在する場合、既存データは上書きせず別名で登録する。
- タスクIDが既存データと重複する場合、新しいUUIDを採番する。
- タスク表示順はJSON内の
displayOrderを基準に再採番する。 - スケジュールが有効な場合、取り込み時点で
NextRunAtを再計算する。 - 実行履歴は取り込まない。
PlantUML:
docs/diagrams/workflow-json-transfer-flow.puml
@startuml
title ワークフローJSON入出力フロー
actor "管理者" as Admin
participant "AdminWorkflowJson.razor" as Page
participant "WorkflowJsonTransferService" as Service
database "SQL Server" as DB
collections "JSONファイル" as JsonFile
collections "ZIPファイル" as ZipFile
== エクスポート ==
Admin -> Page : キーワード検索
Page -> Service : SearchWorkflowsAsync(keyword)
Service -> DB : JobFlows を検索
Service --> Page : ワークフロー一覧
Admin -> Page : チェックしてZIP出力 / 全件出力
Page -> Service : ExportSelectedZipAsync(ids) / ExportAllZipAsync()
Service -> DB : JobFlows / JobNodes / JobDefinitions を取得
Service -> Service : 実行履歴を除外してワークフロー単位のJSONをZIP化
Service --> Page : ZIPバイト列とファイル名
Page -> ZipFile : ブラウザーでダウンロード
== インポート ==
Admin -> Page : JSONファイルを選択
Page -> Service : ImportAsync(json)
Service -> Service : 形式検証
Service -> Service : 同名ワークフローは別名化
Service -> Service : タスクID重複時は再採番
Service -> DB : JobFlows / JobNodes / JobDefinitions を追加
Service --> Page : 取込件数
Page --> Admin : 結果メッセージ表示
@endumlParameters.razor で管理者のみ参照可能。
表示対象:
rds.jsonmail.json
表示内容:
- JSON パス
- ファイル名
- 主要設定項目
- 元 JSON
メールパスワードは画面上ではマスクする。
| プロジェクト | application.log | error.log |
|---|---|---|
| Web | src/TaskSchedulerPlus.Web/logs/application.log |
src/TaskSchedulerPlus.Web/logs/error.log |
| Worker | src/TaskSchedulerPlus.Worker/logs/application.log |
src/TaskSchedulerPlus.Worker/logs/error.log |
| ログ | レベル |
|---|---|
| Console | Info - Fatal |
| application.log | Info - Fatal |
| error.log | Warn - Fatal |
- 日次アーカイブ
- 最大30世代
- UTF-8
ログは、処理の開始、終了、入力値、条件分岐、例外を追跡できる粒度で出力する。 画面操作、管理者操作、スケジュール監視、実行キュー登録、外部プロセス実行、メール送信は主要なログ対象とする。
ログレベルは次の方針とする。
| レベル | 用途 |
|---|---|
| Information | 通常の開始、終了、登録、更新、検索、実行キュー投入 |
| Warning | 失敗に近い分岐、権限不足、削除、タイムアウト、メール未設定、入力不備 |
| Error | 予期しない例外、DB更新失敗、JSON入出力失敗、実行キュー登録失敗 |
ログには、ID、件数、状態、ロール、処理時間、終了コード、対象コマンド名など、調査に必要な値を含める。 一方で、パスワード、DB接続文字列、SMTPパスワード、メール本文、コマンド引数、個人情報を過剰に含む値は出力しない。 外部コマンドはフルパスや引数ではなく、原則としてファイル名を出力する。
NLog の共通レイアウトには、日時、レベル、プロセスID、スレッドID、ロガー名、メッセージ、構造化プロパティ、例外情報を含める。
画面に表示するエラーは日本語を基本とする。
Identity の標準エラーは JapaneseIdentityErrorDescriber で日本語化する。
技術的な詳細はログに残す。 例外スタックトレースは NLog のレイアウトで出力する。 画面には利用者向けの日本語メッセージを出し、ログには原因調査に必要な技術情報を残す。
メール送信失敗時はログへ警告を出し、画面操作全体は止めない。 メール設定が未設定の場合も同様に送信をスキップする。
- 認証は ASP.NET Core Identity を使用する。
- 外部ログインは使用しない。
- ユーザー管理は管理者のみ可能。
- パラメーター参照は管理者のみ可能。
- DB 接続文字列は
setup.jsonでは保護して保存する。 rds.jsonは参照用の接続文字列を保持するため、公開時は取り扱いに注意する。- メールパスワードは画面表示時にマスクする。
- 未ログイン状態では保護画面へのメニューリンクを表示しない。
現状の QueuedFlowRunDispatcher は表示順の直列実行である。
並列実行を拡張する場合は、JobNodes 間の依存関係、同時実行数、失敗時の制御方法を追加設計する必要がある。
Worker は .AddWindowsService() を登録済みである。
本番運用では Windows Service としてインストールする手順、ログパス、実行権限、作業フォルダを別途設計する。
現状のパラメーター画面は参照のみである。 編集可能にする場合は、接続テスト、入力検証、機密情報の保存方式、監査ログを追加する。
実行履歴は運用で増加する。 現在は管理者による削除画面を持つが、将来的には自動削除ポリシーも検討する。
| 種別 | パス |
|---|---|
| 開発思想 | docs/DEVELOPMENT_PHILOSOPHY.md |
| 詳細設計書 | docs/DETAILED_DESIGN.md |
| 全体構成図 | docs/diagrams/system-architecture.puml |
| 初期設定フロー | docs/diagrams/initial-setup-flow.puml |
| 認証・認可フロー | docs/diagrams/auth-authorization-flow.puml |
| スケジュール実行フロー | docs/diagrams/scheduled-execution-flow.puml |
| タスク実行フロー | docs/diagrams/task-execution-flow.puml |
| ワークフローJSON入出力フロー | docs/diagrams/workflow-json-transfer-flow.puml |
| データモデル | docs/diagrams/data-model.puml |
| 削除確認モーダル | src/TaskSchedulerPlus.Web/Components/DeleteConfirmationModal.razor |