{"id":40955691,"url":"https://github.com/akam1o/arca-storage","last_synced_at":"2026-05-10T22:11:49.724Z","repository":{"id":331194430,"uuid":"1119723185","full_name":"akam1o/arca-storage","owner":"akam1o","description":"arca-storage is Software-Defined Storage system with Storage Virtual Machine (SVM) functionality, built using Linux standard technologies.","archived":false,"fork":false,"pushed_at":"2026-01-11T07:27:46.000Z","size":365,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-11T13:47:05.282Z","etag":null,"topics":["drbd","sds","software-defined-storage","storage"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/akam1o.png","metadata":{"files":{"readme":"README.ja.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-19T18:29:25.000Z","updated_at":"2026-01-11T07:27:47.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/akam1o/arca-storage","commit_stats":null,"previous_names":["akam1o/arca-storage"],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/akam1o/arca-storage","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akam1o%2Farca-storage","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akam1o%2Farca-storage/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akam1o%2Farca-storage/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akam1o%2Farca-storage/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/akam1o","download_url":"https://codeload.github.com/akam1o/arca-storage/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akam1o%2Farca-storage/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28656383,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-22T01:17:37.254Z","status":"online","status_checked_at":"2026-01-22T02:00:07.137Z","response_time":144,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["drbd","sds","software-defined-storage","storage"],"created_at":"2026-01-22T05:36:34.838Z","updated_at":"2026-05-10T22:11:49.715Z","avatar_url":"https://github.com/akam1o.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Arca Storage\n\n[English](README.md) | 日本語\n\n[![CI](https://github.com/akam1o/arca-storage/actions/workflows/ci.yml/badge.svg)](https://github.com/akam1o/arca-storage/actions/workflows/ci.yml)\n[![Python Tests](https://github.com/akam1o/arca-storage/actions/workflows/python-tests.yml/badge.svg)](https://github.com/akam1o/arca-storage/actions/workflows/python-tests.yml)\n[![Ansible Lint](https://github.com/akam1o/arca-storage/actions/workflows/ansible-lint.yml/badge.svg)](https://github.com/akam1o/arca-storage/actions/workflows/ansible-lint.yml)\n\nLinux標準技術を使用して構築された、Storage Virtual Machine (SVM) 機能を備えたソフトウェア・デファインド・ストレージシステム。\n\n## 概要\n\nArca Storageは、Linux標準技術を使用してNetApp ONTAPのようなSVM機能を提供するソフトウェア・デファインド・ストレージシステムです：\n\n- **マルチプロトコル**: NFS v4.1 / v4.2 (デフォルト)、オプションでNFSv3サポート\n- **マルチテナンシー**: SVMごとの Ganesha bind アドレス分離。必要に応じて Network Namespace/VLAN 分離も利用可能\n- **高可用性**: Pacemakerベースのアクティブ/アクティブ・フェイルオーバー\n- **データ効率**: LVM Thin Provisioningによるオーバーコミット\n- **クライアント統合**: Kubernetes (CSI)（[ドキュメント](csi-arca-storage/README.ja.md)）および OpenStack（[Cinder NFS Driver](docs/openstack-cinder.ja.md)、[Manila](docs/openstack-manila.ja.md)）サポート\n\n## アーキテクチャ\n\nシステムは以下のコンポーネントを組み合わせています：\n- **Pacemaker + Corosync**: HAクラスタリングとリソース管理\n- **NFS-Ganesha**: ユーザースペースNFSサーバー (SVM毎に1プロセス)\n- **Network Namespace**: VLAN-backed SVM で利用する任意のテナントネットワーク分離\n- **XFS**: NVMe最適化ファイルシステム\n- **LVM Thin Provisioning**: 仮想ボリューム管理とスナップショット\n- **DRBD**: ノード間同期データミラーリング\n\n### 内部設計\n\nPython コードベースは **宣言的リコンシリエーション** アーキテクチャを採用しています：\n\n- **リソースモデル** (`models/`): SVM・Volume・Snapshot・Export の各リソースに対して Spec（期待状態）と Status（実際の状態）を持つ Pydantic モデル。\n- **リコンサイラー** (`reconcilers/`): リソースを期待状態から実際の状態へ冪等に遷移させるループ。各ステップの結果を永続化し、リトライ時は最後の成功ステップから再開。\n- **アダプター** (`adapters/`): システム操作（LVM, XFS, Network Namespace, Pacemaker, NFS-Ganesha, systemd）の Protocol ベース抽象化。本番実装は実コマンドを呼び出し、Fake 実装により root 権限なしのインメモリテストが可能。\n- **状態ストア** (`db/`): SQLite WAL バックエンドの状態データベース。ACID トランザクション対応。\n- **構造化エラー** (`errors.py`): マシンリーダブルなエラーコード（`NOT_FOUND`, `ALREADY_EXISTS` など）。HTTP ステータスコードにマッピングされ、Go CSI ドライバから利用可能。\n- **統合設定** (`config.py`): Pydantic で検証される TOML ベースの設定。\n- **アプリケーションコンテキスト** (`context.py`): 依存性の配線 — `AppContext` が DB・アダプター・リコンサイラーを CLI と API の両方に提供。\n\n## クイックスタート\n\n### 前提条件\n\n- RHEL/Alma/Rocky Linux 8/9, Debian, または Ubuntu\n- Pacemaker/Corosync/pcs, NFS-Ganesha, LVM2, DRBD がインストール済み\n- 2ノードクラスター構成\n\n### インストール\n\n1. **OS 依存パッケージのインストール（例）:**\n\n   ```bash\n   # EL9 (RHEL/Alma/Rocky 9)\n   sudo dnf install -y pacemaker corosync pcs resource-agents \\\n     nfs-ganesha nfs-ganesha-utils \\\n     lvm2 xfsprogs \\\n     drbd-utils drbd-kmod\n\n   # Debian/Ubuntu（パッケージ名はディストリ/リポジトリにより異なる場合があります）\n   sudo apt-get update\n   sudo apt-get install -y pacemaker corosync pcs resource-agents \\\n     nfs-ganesha \\\n     lvm2 xfsprogs \\\n     drbd-utils\n   ```\n\n2. **`arca-storage` パッケージのインストール（rpm/deb）:**\n\n   GitHub Releases から最新のパッケージを取得してインストールします。\n\n   ```bash\n   # EL9 (rpm)\n   sudo dnf install -y ./arca-storage-*.rpm\n\n   # Debian/Ubuntu (deb)\n   sudo apt-get install -y ./arca-storage_*.deb\n   ```\n\n3. **MVPセットアップガイドに従う:**\n\n   詳細なセットアップ手順については [docs/mvp-setup.md](docs/mvp-setup.md) を参照してください。\n\n## 設定\n\n### NFSv3サポート (オプション)\n\nデフォルトでは、Arca StorageはNFSv4のみを使用します。NFSv3サポートを有効にするには：\n\n1. **設定の編集:**\n\n   `/etc/arca-storage/config.toml` に設定します：\n\n   ```toml\n   [ganesha]\n   # NFSv3 を有効化（v3 + v4 の両方を利用）\n   protocols = [3, 4]\n\n   # 固定ポート（NFSv3 利用時に推奨）\n   mountd_port = 20048\n   nlm_port = 32768\n   ```\n\n2. **設定の再生成と reload:**\n\n   ```bash\n   # 設定変更後に env を同期（任意だが推奨）\n   sudo arca bootstrap render-env\n\n   # SVM ごとの ganesha.conf を再生成して reload\n   sudo arca export sync --all\n   ```\n\n3. **NFSv3有効時に必要なファイアウォールポート:**\n\n   ```\n   111/tcp,udp   (rpcbind/portmapper)\n   2049/tcp,udp  (NFS)\n   20048/tcp,udp (mountd)\n   32768/tcp,udp (NLM)\n   ```\n\n4. **クライアントマウント例:**\n\n   ```bash\n   # NFSv4 (デフォルト)\n   mount -t nfs4 server:/101 /mnt\n\n   # NFSv3 (有効時)\n   mount -t nfs -o vers=3 server:/exports /mnt\n   ```\n\n**注意**: NFSv3 を利用する場合、`rpcbind` がインストールされて起動していることを確認してください。NFSv3 と NFSv4 の両プロトコルが同時に利用可能になります。\n\n## 使い方\n\n### CLIツール (arca)\n\n```bash\n# Ansibleなしでのブートストラップ\nsudo arca bootstrap install\n\n# (任意) 設定の編集\nsudo vi /etc/arca-storage/config.toml\n\n# 設定変更後に /etc/arca-storage/arca-storage.env を再生成\nsudo arca bootstrap render-env\n\n# SVMの作成\n# --vlan は省略可です。省略時は host namespace で SVM VIP に Ganesha を bind します。\n# VLAN-backed SVM では --gateway は省略可です（未指定の場合は --ip から推定。/31,/32 は指定してください）\narca svm create tenant_a --vlan 100 --ip 192.168.10.5/24\n# VLAN を使わない場合:\narca svm create tenant_b --ip 192.168.20.5/32\n\n# ボリュームの作成\narca volume create vol1 --svm tenant_a --size 100\n\n# エクスポートの追加\narca export add --volume vol1 --svm tenant_a --client 10.0.0.0/24 --access rw\n\n# SVMの一覧表示\narca svm list\n```\n\n### REST API\n\nBearer token 認証を有効にして API サーバーを起動します:\n\n```bash\nexport ARCA_API_TOKEN=\"$(openssl rand -hex 32)\"\narca-storage-api --host 127.0.0.1 --port 8080\n```\n\nクライアントからのリクエストでは同じ token を使用します:\n\n```bash\ncurl -H \"Authorization: Bearer \u003ctoken\u003e\" http://localhost:8080/v1/svms\n```\n\nまたは systemd サービスとして起動します（パッケージインストール時）:\n\n```bash\nAPI_TOKEN=\"$(openssl rand -hex 32)\"\nsudo install -m 0600 /dev/null /etc/arca-storage/api.env\nprintf 'ARCA_API_TOKEN=%s\\n' \"$API_TOKEN\" | sudo tee /etc/arca-storage/api.env \u003e/dev/null\nunset API_TOKEN\nsudo systemctl enable --now arca-storage-api\n```\n\nloopback のみの開発用途では、明示的に無認証アクセスを許可できます:\n\n```bash\nunset ARCA_API_TOKEN ARCA_AUTH_TOKEN\nARCA_ALLOW_UNAUTHENTICATED_LOOPBACK=true arca-storage-api --host 127.0.0.1 --port 8080\n```\n\nAPIエンドポイント:\n\n- `POST /v1/svms` - SVM作成\n- `GET /v1/svms` - SVM一覧\n- `GET /v1/svms/{name}` - SVM詳細取得\n- `DELETE /v1/svms/{name}` - SVM削除\n- `POST /v1/directories` - CSI 管理ボリューム用ディレクトリ作成\n- `DELETE /v1/directories/{svm_name}` - ディレクトリ削除\n- `POST /v1/quotas` - ディレクトリ quota 設定\n- `PATCH /v1/quotas` - ディレクトリ quota 拡張\n- `GET /v1/quotas/{svm_name}` - ディレクトリ quota 取得\n- `POST /v1/volumes` - ボリューム作成\n- `GET /v1/volumes` - ボリューム一覧\n- `PATCH /v1/volumes/{name}` - ボリュームリサイズ\n- `DELETE /v1/volumes/{name}` - ボリューム削除\n- `POST /v1/volumes/{name}/clone` - Snapshot からのボリューム clone\n- `PATCH /v1/volumes/{name}/qos` - QoS 制限適用\n- `GET /v1/volumes/{name}/qos` - QoS 設定取得\n- `DELETE /v1/volumes/{name}/qos` - QoS 制限削除\n- `POST /v1/exports` - エクスポート追加\n- `GET /v1/exports` - エクスポート一覧\n- `DELETE /v1/exports` - エクスポート削除\n- `POST /v1/snapshots` - Snapshot 作成\n- `GET /v1/snapshots` - Snapshot 一覧\n- `DELETE /v1/snapshots/{name}` - Snapshot 削除\n\nサーバー起動時に `http://localhost:8080/docs` でAPIドキュメントを参照できます。\ntoken 認証が有効な場合、このエンドポイントも API と同じように保護されます。\nSwagger UI をブラウザで開く開発用途では、loopback のみの明示的な無認証モードを使用してください。\n\n### OpenStack (Cinder)\n\n[docs/openstack-cinder.ja.md](docs/openstack-cinder.ja.md) を参照してください。\n\n### OpenStack (Manila)\n\n[docs/openstack-manila.ja.md](docs/openstack-manila.ja.md) を参照してください。\n\n## プロジェクト構成\n\n```\narca-storage/\n├── arca_storage/               # Pythonパッケージ\n│   ├── arca_storage/           # パッケージソースコード\n│   │   ├── api/                # FastAPI REST API\n│   │   │   ├── main.py         # APIアプリケーション \u0026 エラーハンドラ\n│   │   │   ├── models.py       # リクエスト/レスポンス Pydantic モデル\n│   │   │   └── services/       # サービス層（リコンサイラーに委譲）\n│   │   ├── cli/                # CLIツール (Typer)\n│   │   │   ├── cli.py          # メインCLIエントリ\n│   │   │   ├── commands/       # コマンド実装\n│   │   │   └── lib/            # バリデータ、ヘルパー\n│   │   ├── models/             # リソースモデル (Spec/Status)\n│   │   │   ├── svm.py          # SVM リソース\n│   │   │   ├── volume.py       # Volume リソース\n│   │   │   ├── snapshot.py     # Snapshot リソース\n│   │   │   └── export.py       # Export リソース\n│   │   ├── reconcilers/        # リコンシリエーションループ\n│   │   │   ├── svm.py          # SVM リコンサイラー\n│   │   │   ├── volume.py       # Volume リコンサイラー\n│   │   │   ├── snapshot.py     # Snapshot リコンサイラー\n│   │   │   └── export.py       # Export リコンサイラー\n│   │   ├── adapters/           # システム操作アダプター\n│   │   │   ├── lvm.py          # LVM (Protocol + Subprocess + Fake)\n│   │   │   ├── xfs.py          # XFS\n│   │   │   ├── netns.py        # Network Namespace\n│   │   │   ├── pacemaker.py    # Pacemaker\n│   │   │   ├── ganesha.py      # NFS-Ganesha\n│   │   │   └── systemd.py      # systemd\n│   │   ├── db/                 # SQLite WAL 状態ストア\n│   │   ├── errors.py           # 構造化エラーコード\n│   │   ├── config.py           # TOML 設定 (Pydantic)\n│   │   ├── context.py          # 依存性の配線 (AppContext)\n│   │   ├── openstack/          # OpenStack ドライバ (Cinder, Manila)\n│   │   ├── resources/          # Pacemaker RA, systemd ユニット\n│   │   └── templates/          # 設定テンプレート\n│   ├── tests/                  # テストスイート\n│   │   ├── unit/               # ユニットテスト (models, errors, db, reconcilers)\n│   │   └── integration/        # 統合テスト (CLI, API, シナリオ)\n│   ├── pyproject.toml          # パッケージ設定\n│   └── pytest.ini              # テスト設定\n├── csi-arca-storage/           # Go CSI ドライバ\n│   ├── pkg/arca/               # ARCA API クライアント \u0026 構造化エラー\n│   ├── cmd/                    # CLI エントリポイント\n│   └── deploy/                 # Kubernetes マニフェスト\n├── ansible/                    # Ansibleプレイブック\n│   ├── roles/                  # Ansibleロール\n│   └── site.yml                # メインプレイブック\n├── docs/                       # プロジェクトドキュメント\n│   └── mvp-setup.md            # MVPセットアップガイド\n└── README.md                   # このファイル\n```\n\n## 開発\n\n### 開発環境のセットアップ\n\n```bash\n# リポジトリのクローン\ngit clone https://github.com/akam1o/arca-storage.git\ncd arca-storage/arca_storage\n\n# 仮想環境の作成\npython3 -m venv venv\nsource venv/bin/activate\n\n# 開発モードで開発用依存関係と共にインストール\npip install -e \".[dev]\"\n```\n\n### テストの実行\n\n```bash\ncd arca_storage\n\n# 全テストの実行\npytest\n\n# カバレッジ付きで実行\npytest --cov=arca_storage --cov-report=html\n\n# 特定のテストの実行\npytest tests/unit/\npytest tests/integration/\n```\n\n### コーディングスタイル\n\nPythonコードは PEP 8 に従ってください。\n\n## ドキュメント\n\n- [docs/mvp-setup.md](docs/mvp-setup.md) - MVPセットアップガイド\n- [csi-arca-storage/docs/quickstart.ja.md](csi-arca-storage/docs/quickstart.ja.md) - CSI クイックスタート\n- [csi-arca-storage/docs/deployment.ja.md](csi-arca-storage/docs/deployment.ja.md) - CSI デプロイガイド\n- [csi-arca-storage/docs/deployment-checklist.ja.md](csi-arca-storage/docs/deployment-checklist.ja.md) - CSI デプロイチェックリスト\n- [arca_storage/arca_storage/resources/pacemaker/](arca_storage/arca_storage/resources/pacemaker/) - Pacemaker RAドキュメント\n- [arca_storage/arca_storage/resources/systemd/](arca_storage/arca_storage/resources/systemd/) - systemd ユニットファイル\n- [arca_storage/arca_storage/templates/](arca_storage/arca_storage/templates/) - テンプレートドキュメント\n\n## ライセンス\n\nApache License 2.0\n\n## コントリビューション\n\nコントリビューションを歓迎します！[CONTRIBUTING.ja.md](CONTRIBUTING.ja.md) を参照してください。\n\n## Contact\n\nお問い合わせは [GitHub Issues](https://github.com/akam1o/arca-storage/issues) に Issue を作成してください。セキュリティ報告は [GitHub Security Advisories](https://github.com/akam1o/arca-storage/security/advisories) をご利用ください。\n\n## ステータス\n\nこのプロジェクトは活発に開発中です。MVP実装は完了していますが、追加機能と最適化が計画されています。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fakam1o%2Farca-storage","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fakam1o%2Farca-storage","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fakam1o%2Farca-storage/lists"}