# MyFSIO A lightweight, S3-compatible object storage system built with Flask. MyFSIO implements core AWS S3 REST API operations with filesystem-backed storage, making it ideal for local development, testing, and self-hosted storage scenarios. ## Features **Core Storage** - S3-compatible REST API with AWS Signature Version 4 authentication - Bucket and object CRUD operations - Object versioning with version history - Multipart uploads for large files - Presigned URLs (1 second to 7 days validity) **Security & Access Control** - IAM users with access key management and rotation - Bucket policies (AWS Policy Version 2012-10-17) - Server-side encryption (SSE-S3 and SSE-KMS) - Built-in Key Management Service (KMS) - Rate limiting per endpoint **Advanced Features** - Cross-bucket replication to remote S3-compatible endpoints - Hot-reload for bucket policies (no restart required) - CORS configuration per bucket **Management UI** - Web console for bucket and object management - IAM dashboard for user administration - Inline JSON policy editor with presets - Object browser with folder navigation and bulk operations - Dark mode support ## Architecture ``` +------------------+ +------------------+ | API Server | | UI Server | | (port 5000) | | (port 5100) | | | | | | - S3 REST API |<------->| - Web Console | | - SigV4 Auth | | - IAM Dashboard | | - Presign URLs | | - Bucket Editor | +--------+---------+ +------------------+ | v +------------------+ +------------------+ | Object Storage | | System Metadata | | (filesystem) | | (.myfsio.sys/) | | | | | | data// | | - IAM config | | | | - Bucket policies| | | | - Encryption keys| +------------------+ +------------------+ ``` ## Quick Start ```bash # Clone and setup git clone https://gitea.jzwsite.com/kqjy/MyFSIO cd s3 python -m venv .venv # Activate virtual environment # Windows PowerShell: .\.venv\Scripts\Activate.ps1 # Windows CMD: .venv\Scripts\activate.bat # Linux/macOS: source .venv/bin/activate # Install dependencies pip install -r requirements.txt # Start both servers python run.py # Or start individually python run.py --mode api # API only (port 5000) python run.py --mode ui # UI only (port 5100) ``` **Default Credentials:** `localadmin` / `localadmin` - **Web Console:** http://127.0.0.1:5100/ui - **API Endpoint:** http://127.0.0.1:5000 ## Configuration | Variable | Default | Description | |----------|---------|-------------| | `STORAGE_ROOT` | `./data` | Filesystem root for bucket storage | | `IAM_CONFIG` | `.myfsio.sys/config/iam.json` | IAM user and policy store | | `BUCKET_POLICY_PATH` | `.myfsio.sys/config/bucket_policies.json` | Bucket policy store | | `API_BASE_URL` | `http://127.0.0.1:5000` | API endpoint for UI calls | | `MAX_UPLOAD_SIZE` | `1073741824` | Maximum upload size in bytes (1 GB) | | `MULTIPART_MIN_PART_SIZE` | `5242880` | Minimum multipart part size (5 MB) | | `UI_PAGE_SIZE` | `100` | Default page size for listings | | `SECRET_KEY` | `dev-secret-key` | Flask session secret | | `AWS_REGION` | `us-east-1` | Region for SigV4 signing | | `AWS_SERVICE` | `s3` | Service name for SigV4 signing | | `ENCRYPTION_ENABLED` | `false` | Enable server-side encryption | | `KMS_ENABLED` | `false` | Enable Key Management Service | | `LOG_LEVEL` | `INFO` | Logging verbosity | ## Data Layout ``` data/ ├── / # User buckets with objects └── .myfsio.sys/ # System metadata ├── config/ │ ├── iam.json # IAM users and policies │ ├── bucket_policies.json # Bucket policies │ ├── replication_rules.json │ └── connections.json # Remote S3 connections ├── buckets// │ ├── meta/ # Object metadata (.meta.json) │ ├── versions/ # Archived object versions │ └── .bucket.json # Bucket config (versioning, CORS) ├── multipart/ # Active multipart uploads └── keys/ # Encryption keys (SSE-S3/KMS) ``` ## API Reference All endpoints require AWS Signature Version 4 authentication unless using presigned URLs or public bucket policies. ### Bucket Operations | Method | Endpoint | Description | |--------|----------|-------------| | `GET` | `/` | List all buckets | | `PUT` | `/` | Create bucket | | `DELETE` | `/` | Delete bucket (must be empty) | | `HEAD` | `/` | Check bucket exists | ### Object Operations | Method | Endpoint | Description | |--------|----------|-------------| | `GET` | `/` | List objects (supports `list-type=2`) | | `PUT` | `//` | Upload object | | `GET` | `//` | Download object | | `DELETE` | `//` | Delete object | | `HEAD` | `//` | Get object metadata | | `POST` | `//?uploads` | Initiate multipart upload | | `PUT` | `//?partNumber=N&uploadId=X` | Upload part | | `POST` | `//?uploadId=X` | Complete multipart upload | | `DELETE` | `//?uploadId=X` | Abort multipart upload | ### Bucket Policies (S3-compatible) | Method | Endpoint | Description | |--------|----------|-------------| | `GET` | `/?policy` | Get bucket policy | | `PUT` | `/?policy` | Set bucket policy | | `DELETE` | `/?policy` | Delete bucket policy | ### Versioning | Method | Endpoint | Description | |--------|----------|-------------| | `GET` | `//?versionId=X` | Get specific version | | `DELETE` | `//?versionId=X` | Delete specific version | | `GET` | `/?versions` | List object versions | ### Health Check | Method | Endpoint | Description | |--------|----------|-------------| | `GET` | `/myfsio/health` | Health check endpoint | ## IAM & Access Control ### Users and Access Keys On first run, MyFSIO creates a default admin user (`localadmin`/`localadmin`). Use the IAM dashboard to: - Create and delete users - Generate and rotate access keys - Attach inline policies to users - Control IAM management permissions ### Bucket Policies Bucket policies follow AWS policy grammar (Version `2012-10-17`) with support for: - Principal-based access (`*` for anonymous, specific users) - Action-based permissions (`s3:GetObject`, `s3:PutObject`, etc.) - Resource patterns (`arn:aws:s3:::bucket/*`) - Condition keys **Policy Presets:** - **Public:** Grants anonymous read access (`s3:GetObject`, `s3:ListBucket`) - **Private:** Removes bucket policy (IAM-only access) - **Custom:** Manual policy editing with draft preservation Policies hot-reload when the JSON file changes. ## Server-Side Encryption MyFSIO supports two encryption modes: - **SSE-S3:** Server-managed keys with automatic key rotation - **SSE-KMS:** Customer-managed keys via built-in KMS Enable encryption with: ```bash ENCRYPTION_ENABLED=true python run.py ``` ## Cross-Bucket Replication Replicate objects to remote S3-compatible endpoints: 1. Configure remote connections in the UI 2. Create replication rules specifying source/destination 3. Objects are automatically replicated on upload ## Docker ```bash docker build -t myfsio . docker run -p 5000:5000 -p 5100:5100 -v ./data:/app/data myfsio ``` ## Testing ```bash # Run all tests pytest tests/ -v # Run specific test file pytest tests/test_api.py -v # Run with coverage pytest tests/ --cov=app --cov-report=html ``` ## References - [Amazon S3 Documentation](https://docs.aws.amazon.com/s3/) - [AWS Signature Version 4](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html) - [S3 Bucket Policy Examples](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html)