アーキテクチャ¶
rfbはモジュラー設計のPythonパッケージです。このページではコア設計と仕組みを説明します。
全体構造¶
rfbは以下の主要コンポーネントで構成されています:
rfb/
├── __init__.py # パッケージ初期化
├── backuper.py # バックアップ実行ロジック
├── cli.py # コマンドラインインターフェース
├── config.py # 設定モデルと読み込み機能
├── fetcher.py # フェッチ実行ロジック
├── gear.py # rsync実行ユーティリティ
├── generator.py # 設定ファイル生成
└── reader.py # 設定ファイル読み込み
コンポーネント概要¶
CLI (cli.py)¶
Typerを使用したコマンドラインインターフェース。主要コマンド(fetch, backup, sync, init, status)を定義し、適切なモジュールに処理を委譲します。
設定モデル (config.py)¶
Pydanticを使用した設定データモデル:
RsyncTaskConfig- 単一のrsyncタスク設定RfbConfig- 全体の設定モデル(fetchとbackupセクションを含む)
設定ローダー (reader.py)¶
設定ファイルの検索と読み込みを担当:
ConfigReader- 複数の候補パスから設定を検索- 環境変数の展開機能
- 設定ステータスの出力
rsync実行エンジン (gear.py)¶
rsyncコマンドの実行を担当:
run_rsync()- シンプルなrsync実行_run_rsync_with_password()- パスワード入力の自動化
フェッチャー (fetcher.py)¶
リモートからローカルへのデータ取得を担当:
- SSH接続によるリモートデータ取得
- 設定からrsyncオプションの適用
バックアッパー (backuper.py)¶
ローカルから外部ストレージへのバックアップを担当:
- 主にローカルディスク間の転送
- OneDriveなどのクラウドストレージへの転送
設定ジェネレーター (generator.py)¶
新規設定ファイルの生成を担当:
- テンプレートからの設定生成
- 開発用と本番用の区別
認証フロー¶
SSHパスワード認証はpexpectライブラリを使用して自動化されています:
- rsyncコマンドがSSH接続を開始
- pexpectがパスワードプロンプトを検出
- 環境変数または
--ssh-passwordオプションからパスワードを取得 - パスワードを自動入力
ファイルパス解決¶
設定ファイルの読み込みは以下の優先順位で試行されます:
- コマンドライン引数で明示的に指定されたパス
- カレントディレクトリの
rfb.toml - XDG規格に沿ったユーザー設定ディレクトリ
- Windowsの場合はAppDataディレクトリ
- 開発用の
examples/config.toml
主な処理フロー¶
syncコマンドの処理フロー¶
graph TD
A[sync コマンド実行] --> B[設定ファイル読み込み]
B --> C{タスクが見つかった?}
C -->|Yes| D[fetchタスク実行]
C -->|No| Z[エラー: タスクが見つからない]
D --> E{fetchが成功?}
E -->|Yes| F[backupタスク実行]
E -->|No| Z
F --> G{backupが成功?}
G -->|Yes| H[完了]
G -->|No| Z
エラーハンドリング¶
各コンポーネントは適切な例外を発生させ、上位レベルのコンポーネントでキャッチして処理します:
FileNotFoundError- 設定ファイルが見つからないValueError- 設定内容が無効subprocess.CalledProcessError- rsyncコマンドの実行エラーpexpect.TIMEOUT- SSHパスワードプロンプトのタイムアウト
将来の拡張性¶
コード設計は以下の将来の拡張を考慮しています:
- クラウドストレージAPIの直接サポート
- スナップショット機能(日付付きバックアップ)
- バックアップ検証機能
- 通知システム(エラー発生時のメール/Slack通知)
- バックアップスケジューリング