A lightweight S3-compatible object storage server implemented in PHP, using local filesystem as storage backend.
- S3 Object API compatibility (PUT/GET/DELETE/HEAD)
- Multipart upload support (create/UploadPart/complete/abort)
- AWS Signature V4 authentication
- Pure filesystem storage (no database required)
- Per-key upload size limits (KB)
- Per-key bucket access control
- Upload to your web server
Upload all files to your website root directory.
- Configure
Edit .config.ini file:
; Access Keys configuration
; Format: [keys.{access_key_id}]
[keys.key1]
secret_key=your-secret-key1
allowed_buckets=bucket1,bucket2
file_max_size=10240
[keys.key2]
secret_key=your-secret-key2
allowed_buckets=bucket3
[keys.admin_key]
secret_key=admin-secret-key- Start using
Connect using any S3-compatible client:
import boto3
s3 = boto3.client(
's3',
endpoint_url='https://your-domain.com',
aws_access_key_id='key1',
aws_secret_access_key='your-secret-key1',
region_name='us-east-1', # Can be any value
verify=True
)
# Upload file
s3.upload_file('local.txt', 'bucket', 'remote.txt')
# Download file
s3.download_file('bucket', 'remote.txt', 'local.txt')The configuration is stored in .config.ini file with INI format:
| Variable | Description | Default |
|---|---|---|
DATA_DIR |
Data storage directory | ../data |
APP_DEBUG |
Application debug mode | false |
Do not put DATA_DIR in the same directory as the gateway files. It is recommended to put it in a parent directory to avoid exposing the storage directory.
Access keys are configured with the keys.{access_key_id} section format:
[keys.my_access_key]
secret_key=your-secret-key
allowed_buckets=bucket1,bucket2
file_max_size=10240| Field | Required | Description |
|---|---|---|
secret_key |
Yes | The secret key for authentication |
allowed_buckets |
No | Comma-separated list of buckets, or * for all (default: *) |
file_max_size |
No | Max upload size in KB, unset means no limit |
- Bucket: List, Create, Delete
- Object: Put, Get, Head, Delete, Copy, List
- Multipart: Create, UploadPart, Complete, Abort, ListParts
Objects are stored at: ../data/{bucket}/{key}
This gateway does not support MinIO client of Python. It inserts line breaks (\n) in the Authorization header, which violates HTTP specifications:
Authorization: AWS4-HMAC-SHA256 Credential=key/date/\n /s3/aws4_request, ...
This causes Apache to fail parsing the request. LiteSpeed handles this correctly. Nginx has not been tested.
Please use AWS CLI, boto3, or other standard S3 clients instead.
MIT