{"slug":"object-storage","title":"S3-Compatible Object Storage","description":"Store unlimited files, backups, and media with AWS S3 API compatibility.","section":"Features","url":"https://docs.danubedata.ro/object-storage","markdown_url":"https://docs.danubedata.ro/object-storage.md","breadcrumbs":[{"title":"Features","slug":null},{"title":"Storage","slug":"storage-overview"},{"title":"Object Storage (S3)","slug":"object-storage"}],"headings":[{"level":1,"title":"S3-Compatible Object Storage","id":"s3-compatible-object-storage"},{"level":2,"title":"Overview","id":"overview"},{"level":3,"title":"Key Benefits","id":"key-benefits"},{"level":2,"title":"Features","id":"features"},{"level":3,"title":"Core Storage","id":"core-storage"},{"level":3,"title":"Security & Access Control","id":"security-access-control"},{"level":3,"title":"Advanced Features","id":"advanced-features"},{"level":3,"title":"Monitoring & Management","id":"monitoring-management"},{"level":2,"title":"Use Cases","id":"use-cases"},{"level":3,"title":"Media & File Storage","id":"media-file-storage"},{"level":3,"title":"Database Backups","id":"database-backups"},{"level":3,"title":"Static Website Hosting","id":"static-website-hosting"},{"level":3,"title":"Data Archives","id":"data-archives"},{"level":3,"title":"CDN Origins","id":"cdn-origins"},{"level":3,"title":"Application Logs","id":"application-logs"},{"level":2,"title":"Access Methods","id":"access-methods"},{"level":3,"title":"Path-Style Access","id":"path-style-access"},{"level":3,"title":"Virtual-Host Style Access","id":"virtual-host-style-access"},{"level":3,"title":"SFTP Access","id":"sftp-access"},{"level":2,"title":"Object Lock (WORM)","id":"object-lock-worm"},{"level":3,"title":"Retention modes","id":"retention-modes"},{"level":3,"title":"How it works","id":"how-it-works"},{"level":2,"title":"Pricing","id":"pricing"},{"level":3,"title":"Base Subscription","id":"base-subscription"},{"level":3,"title":"Overage Pricing","id":"overage-pricing"},{"level":3,"title":"Example Costs","id":"example-costs"},{"level":2,"title":"Technical Specifications","id":"technical-specifications"},{"level":2,"title":"S3 API Compatibility","id":"s3-api-compatibility"},{"level":3,"title":"Bucket Operations","id":"bucket-operations"},{"level":3,"title":"Object Operations","id":"object-operations"},{"level":3,"title":"Multipart Upload","id":"multipart-upload"},{"level":3,"title":"Presigned URLs","id":"presigned-urls"},{"level":2,"title":"Comparison","id":"comparison"},{"level":3,"title":"DanubeData vs AWS S3","id":"danubedata-vs-aws-s3"},{"level":3,"title":"DanubeData vs Hetzner Object Storage","id":"danubedata-vs-hetzner-object-storage"},{"level":2,"title":"Integration Examples","id":"integration-examples"},{"level":3,"title":"AWS CLI","id":"aws-cli"},{"level":3,"title":"Python (boto3)","id":"python-boto3"},{"level":3,"title":"Node.js (AWS SDK v3)","id":"nodejs-aws-sdk-v3"},{"level":3,"title":"PHP (Laravel)","id":"php-laravel"},{"level":3,"title":"Go","id":"go"},{"level":2,"title":"FAQ","id":"faq"},{"level":3,"title":"Is it really 100% S3 compatible?","id":"is-it-really-100-s3-compatible"},{"level":3,"title":"Can I access my data from anywhere?","id":"can-i-access-my-data-from-anywhere"},{"level":3,"title":"Can I restrict access to specific IP addresses?","id":"can-i-restrict-access-to-specific-ip-addresses"},{"level":3,"title":"Can I make objects immutable (WORM)?","id":"can-i-make-objects-immutable-worm"},{"level":3,"title":"Can I connect over SFTP?","id":"can-i-connect-over-sftp"},{"level":3,"title":"What happens if I exceed my included quota?","id":"what-happens-if-i-exceed-my-included-quota"},{"level":3,"title":"How is billing calculated?","id":"how-is-billing-calculated"},{"level":3,"title":"Can I use this for website hosting?","id":"can-i-use-this-for-website-hosting"},{"level":3,"title":"How do I migrate from AWS S3?","id":"how-do-i-migrate-from-aws-s3"},{"level":3,"title":"Is my data replicated?","id":"is-my-data-replicated"},{"level":2,"title":"Next Steps","id":"next-steps"}],"format":"markdown","word_count":1862,"content":"# S3-Compatible Object Storage\n\nStore unlimited files, backups, and media with AWS S3 API compatibility.\n\n## Overview\n\nDanubeData Object Storage provides fully managed, S3-compatible storage on replicated Ceph infrastructure. It offers industry-standard S3 API compatibility, GDPR-compliant EU data residency, and simple transparent pricing.\n\n### Key Benefits\n\n- **100% S3 API Compatible**: Use any S3 SDK, CLI, or tool without modifications\n- **GDPR Compliant**: All data stored in Germany datacenters\n- **Simple Pricing**: €5.49/month includes 1TB storage and 1TB egress\n- **Secure by Default**: AES-256 encryption at rest, TLS 1.3 in transit\n- **Built-in Browser**: Manage files directly from the dashboard\n\n## Features\n\n### Core Storage\n\n- **Buckets**: Up to 10 buckets per team\n- **Large File Support**: Objects up to 5TB each\n- **Multipart Uploads**: Chunked uploads for large files with automatic recovery\n- **Presigned URLs**: Generate temporary access links for sharing\n- **Bucket Size Limits**: Optionally cap a bucket's size (10 GB up to 5 TB, or leave it unlimited)\n\n### Security & Access Control\n\n- **Encryption**: AES-256 encryption at rest, TLS 1.3 in transit\n- **Access Keys**: Team-wide or per-bucket scoped credentials, with read-only, read-write, or full permission levels and an optional expiry date\n- **Public Access Control**: Enable/disable public read access per bucket\n- **Bucket Policies**: Restrict access by source IP range (CIDR allow-lists) with a visual or JSON policy editor\n- **Object Lock (WORM)**: Lock object versions against deletion or overwrite for a fixed retention period\n\n### Advanced Features\n\n- **Object Versioning**: Protect against accidental deletion\n- **Lifecycle Rules**: Automatic object expiration and cleanup\n- **CORS Support**: Configure cross-origin access for web applications\n- **Object Tagging**: Organize objects with key-value tags\n\n### Monitoring & Management\n\n- **Per-Bucket Metrics**: Storage size and object count, plus request counts by method, egress, latency (mean and p95), and a 2xx/4xx/5xx status breakdown — over selectable time ranges and with a data-freshness indicator\n- **Bucket Health**: Surfaces reclaimable space from pending multipart uploads and non-current object versions\n- **Object Browser**: Built-in file management in the dashboard, with direct uploads (live progress, speed, and ETA) and bulk delete\n- **Usage Tracking**: Per-bucket storage and traffic statistics\n\n## Use Cases\n\n### Media & File Storage\nStore images, videos, documents, and user uploads for web and mobile applications.\n\n### Database Backups\nAutomatically back up your MySQL, PostgreSQL, and MariaDB databases to durable object storage.\n\n### Static Website Hosting\nHost static websites and single-page applications with high availability.\n\n### Data Archives\nArchive infrequently accessed data with lifecycle rules for cost optimization.\n\n### CDN Origins\nUse as origin storage for content delivery networks.\n\n### Application Logs\nStore and archive application logs for compliance and debugging.\n\n## Access Methods\n\n### Path-Style Access\n```\nhttps://s3.danubedata.ro/bucket-name/object-key\n```\n\n### Virtual-Host Style Access\n```\nhttps://bucket-name.s3.danubedata.ro/object-key\n```\n\nBoth access styles are fully supported. Use whichever works best with your tools.\n\n### SFTP Access\n\nFor tools and users that speak SFTP but not the S3 API, you can also reach a bucket over SFTP:\n\n```\nHost: sftp.new-s3.danubedata.ro\nPort: 2222\n```\n\nEach SFTP user is tied to a single bucket and one of your S3 access keys, so its permissions match that key. Create and manage SFTP users from the bucket's **SFTP** section in the dashboard, which shows the exact username to use; the password is the access key's secret. See [Object Storage security](https://docs.danubedata.ro/object-storage-security#sftp-access) for details.\n\n## Object Lock (WORM)\n\nObject Lock provides write-once-read-many (WORM) protection: a locked object version cannot be deleted or overwritten until its retention period expires. Use it for regulatory compliance, ransomware protection, and tamper-proof audit trails.\n\n### Retention modes\n\n- **Governance**: Protected object versions can't be deleted or overwritten by normal requests, but a user with elevated permissions can shorten or remove the lock when needed.\n- **Compliance**: No one — including the bucket owner — can delete a locked object version or shorten its retention until the retention period expires.\n\n### How it works\n\n- **Enable at creation**: Object Lock is turned on when you create the bucket; it can't be added to an existing bucket. Enabling it automatically enables versioning, which Object Lock relies on.\n- **Default retention**: Optionally set a default mode and retention period (1–36,500 days) applied to every new object version.\n- **Per-object retention**: Apply or extend a retention date on individual object versions.\n- **Legal hold**: Place an indefinite hold on a specific object version, independent of any retention period — the object can't be deleted until you remove the hold explicitly.\n\nObject Lock works through the standard S3 API actions (`PutObjectLockConfiguration`, `PutObjectRetention`, `PutObjectLegalHold`) and from the dashboard.\n\n## Pricing\n\nSimple, transparent pricing with generous included quotas.\n\n### Base Subscription\n\n| Plan | Price | Included Storage | Included Egress |\n|------|-------|------------------|-----------------|\n| **Object Storage** | €5.49/month | 1 TB | 1 TB |\n\n### Overage Pricing\n\n| Resource | Price |\n|----------|-------|\n| Additional Storage | €5.49/TB/month |\n| Additional Egress | €1.00/TB |\n| Ingress (uploads) | Always free |\n\n### Example Costs\n\n| Scenario | Monthly Cost |\n|----------|-------------|\n| 500 GB storage, 200 GB egress | €5.49 (within included quota) |\n| 2 TB storage, 1 TB egress | €10.98 (€5.49 + €5.49 storage overage) |\n| 5 TB storage, 3 TB egress | €29.45 (€5.49 + €21.96 storage + €2.00 egress overage) |\n\n> **Note**: Minimum billable object size is 64 KB. Smaller objects are billed as 64 KB.\n\n## Technical Specifications\n\n| Specification | Value |\n|--------------|-------|\n| **S3 API Version** | AWS S3 (2006-03-01) |\n| **Maximum Object Size** | 5 TB |\n| **Maximum Buckets per Team** | 10 |\n| **Bucket Size Limit** | Optional: 10 GB–5 TB, or unlimited |\n| **Bucket Name Length** | 3-63 characters |\n| **Encryption at Rest** | AES-256 |\n| **Encryption in Transit** | TLS 1.3 |\n| **Data Location** | Germany (EU) |\n| **Replication** | 3× replicated across physical servers |\n\n## S3 API Compatibility\n\nDanubeData Object Storage supports all common S3 operations:\n\n### Bucket Operations\n- `ListBuckets` / `HeadBucket`\n- `GetBucketLocation`\n- `GetBucketVersioning` / `PutBucketVersioning`\n- `GetBucketPolicy` / `PutBucketPolicy`\n- `GetBucketCors` / `PutBucketCors`\n- `GetBucketLifecycle` / `PutBucketLifecycle`\n- `GetObjectLockConfiguration` / `PutObjectLockConfiguration`\n\n> Buckets are created and deleted from the DanubeData dashboard or API, not through the S3 `CreateBucket` / `DeleteBucket` calls. See [S3 API supported actions](https://docs.danubedata.ro/object-storage-supported-actions) for the full compatibility matrix.\n\n### Object Operations\n- `PutObject` / `GetObject` / `DeleteObject`\n- `ListObjects` / `ListObjectsV2`\n- `CopyObject`\n- `HeadObject`\n- `GetObjectTagging` / `PutObjectTagging`\n- `GetObjectRetention` / `PutObjectRetention`\n- `GetObjectLegalHold` / `PutObjectLegalHold`\n\n### Multipart Upload\n- `CreateMultipartUpload`\n- `UploadPart`\n- `CompleteMultipartUpload`\n- `AbortMultipartUpload`\n- `ListMultipartUploads`\n\n### Presigned URLs\n- Generate temporary download/upload URLs\n- Configurable expiration (default: 60 minutes)\n\n## Comparison\n\n### DanubeData vs AWS S3\n\n| Feature | DanubeData | AWS S3 |\n|---------|------------|--------|\n| **Pricing** | €5.49/month (1TB included) | Pay per request + storage |\n| **Egress** | 1TB included, then €1.00/TB | €0.09/GB (90€/TB) |\n| **Data Location** | Germany only | Multiple regions |\n| **Complexity** | Simple | Complex IAM & policies |\n| **GDPR** | Compliant by default | Requires configuration |\n\n### DanubeData vs Hetzner Object Storage\n\n| Feature | DanubeData | Hetzner |\n|---------|------------|---------|\n| **Dashboard** | Integrated with DanubeData | Separate Hetzner Cloud |\n| **Billing** | Unified with other services | Separate |\n| **Support** | Single provider | Hetzner support |\n| **Features** | Versioning, lifecycle, CORS | Basic S3 |\n\n## Integration Examples\n\n### AWS CLI\n\n```bash\n# Configure AWS CLI\naws configure set aws_access_key_id YOUR_ACCESS_KEY\naws configure set aws_secret_access_key YOUR_SECRET_KEY\n\n# List buckets\naws --endpoint-url https://s3.danubedata.ro s3 ls\n\n# Upload a file\naws --endpoint-url https://s3.danubedata.ro s3 cp file.txt s3://my-bucket/\n\n# Download a file\naws --endpoint-url https://s3.danubedata.ro s3 cp s3://my-bucket/file.txt ./\n```\n\n### Python (boto3)\n\n```python\nimport boto3\n\ns3 = boto3.client(\n    's3',\n    endpoint_url='https://s3.danubedata.ro',\n    aws_access_key_id='YOUR_ACCESS_KEY',\n    aws_secret_access_key='YOUR_SECRET_KEY'\n)\n\n# Upload file\ns3.upload_file('local-file.txt', 'my-bucket', 'remote-file.txt')\n\n# Download file\ns3.download_file('my-bucket', 'remote-file.txt', 'local-file.txt')\n\n# List objects\nresponse = s3.list_objects_v2(Bucket='my-bucket')\nfor obj in response.get('Contents', []):\n    print(obj['Key'])\n```\n\n### Node.js (AWS SDK v3)\n\n```javascript\nimport { S3Client, PutObjectCommand, GetObjectCommand } from '@aws-sdk/client-s3';\n\nconst s3 = new S3Client({\n  endpoint: 'https://s3.danubedata.ro',\n  region: 'fsn1',\n  credentials: {\n    accessKeyId: 'YOUR_ACCESS_KEY',\n    secretAccessKey: 'YOUR_SECRET_KEY',\n  },\n  forcePathStyle: true,\n});\n\n// Upload file\nawait s3.send(new PutObjectCommand({\n  Bucket: 'my-bucket',\n  Key: 'file.txt',\n  Body: 'Hello, World!',\n}));\n\n// Download file\nconst response = await s3.send(new GetObjectCommand({\n  Bucket: 'my-bucket',\n  Key: 'file.txt',\n}));\nconst content = await response.Body.transformToString();\n```\n\n### PHP (Laravel)\n\n```php\n// config/filesystems.php\n'disks' => [\n    's3' => [\n        'driver' => 's3',\n        'key' => env('DANUBEDATA_S3_KEY'),\n        'secret' => env('DANUBEDATA_S3_SECRET'),\n        'region' => 'fsn1',\n        'bucket' => env('DANUBEDATA_S3_BUCKET'),\n        'url' => env('DANUBEDATA_S3_URL'),\n        'endpoint' => 'https://s3.danubedata.ro',\n        'use_path_style_endpoint' => true,\n    ],\n],\n\n// Usage\nStorage::disk('s3')->put('file.txt', 'Hello, World!');\n$content = Storage::disk('s3')->get('file.txt');\n$url = Storage::disk('s3')->temporaryUrl('file.txt', now()->addHour());\n```\n\n### Go\n\n```go\npackage main\n\nimport (\n    \"context\"\n    \"github.com/aws/aws-sdk-go-v2/aws\"\n    \"github.com/aws/aws-sdk-go-v2/config\"\n    \"github.com/aws/aws-sdk-go-v2/credentials\"\n    \"github.com/aws/aws-sdk-go-v2/service/s3\"\n)\n\nfunc main() {\n    cfg, _ := config.LoadDefaultConfig(context.TODO(),\n        config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(\n            \"YOUR_ACCESS_KEY\",\n            \"YOUR_SECRET_KEY\",\n            \"\",\n        )),\n        config.WithRegion(\"fsn1\"),\n    )\n\n    client := s3.NewFromConfig(cfg, func(o *s3.Options) {\n        o.BaseEndpoint = aws.String(\"https://s3.danubedata.ro\")\n        o.UsePathStyle = true\n    })\n\n    // Use client for S3 operations\n}\n```\n\n## FAQ\n\n### Is it really 100% S3 compatible?\n\nYes! Our storage layer provides complete AWS S3 API compatibility. Any tool, SDK, or application that works with AWS S3 will work with DanubeData Object Storage.\n\n### Can I access my data from anywhere?\n\nYes. Object Storage is accessible from anywhere on the internet. Use access keys to authenticate, or generate presigned URLs for temporary public access. To limit access to specific networks, apply a bucket policy (see below).\n\n### Can I restrict access to specific IP addresses?\n\nYes. A bucket policy can allow access only from source IP ranges you specify (CIDR allow-lists). Build it with the visual editor or write it as JSON from the bucket's **Settings** tab; custom statements merge automatically with your public-access setting and any scoped access keys, and built-in guardrails stop you from locking yourself out.\n\n### Can I make objects immutable (WORM)?\n\nYes. Enable **Object Lock** when you create a bucket to protect object versions from deletion or overwrite for a fixed retention period, in either Governance or Compliance mode. You can also place an indefinite legal hold on individual versions. See [Object Lock](#object-lock-worm) above.\n\n### Can I connect over SFTP?\n\nYes. In addition to the S3 API, each bucket can be reached over SFTP at `sftp.new-s3.danubedata.ro:2222`. Create an SFTP user from the bucket's SFTP section; it uses one of your S3 access keys, so its permissions match that key.\n\n### What happens if I exceed my included quota?\n\nYou're automatically billed for overage usage at the rates shown above. There are no service interruptions - your storage continues to work normally.\n\n### How is billing calculated?\n\nStorage is billed based on the average GB stored per hour. Traffic is billed based on total egress (download) bytes. Ingress (upload) is always free.\n\n### Can I use this for website hosting?\n\nYes! Enable public access on your bucket and configure your DNS to serve static content directly from Object Storage.\n\n### How do I migrate from AWS S3?\n\nUse the AWS CLI or any S3-compatible tool to copy data between AWS and DanubeData. Both use the same S3 API, so migration is straightforward.\n\n### Is my data replicated?\n\nYes. All data is replicated across multiple storage nodes for durability and high availability.\n\n## Next Steps\n\n- [Quick Start: Create Your First Bucket](https://docs.danubedata.ro/object-storage-quickstart) - Get started in 5 minutes\n- [S3 Access Keys](https://docs.danubedata.ro/object-storage-access-keys) - Team-wide vs per-bucket scoped credentials\n- [Object Storage Security](https://docs.danubedata.ro/object-storage-security) - Learn about access control\n- [S3 API Supported Actions](https://docs.danubedata.ro/object-storage-supported-actions) - Full compatibility matrix\n\n---\n\n**Questions?** Contact support at support@danubedata.ro\n","prev":{"title":"Storage","slug":"storage-overview","url":"https://docs.danubedata.ro/storage-overview","markdown_url":"https://docs.danubedata.ro/storage-overview.md","json_url":"https://docs.danubedata.ro/storage-overview.json"},"next":{"title":"Object Storage Quick Start","slug":"object-storage-quickstart","url":"https://docs.danubedata.ro/object-storage-quickstart","markdown_url":"https://docs.danubedata.ro/object-storage-quickstart.md","json_url":"https://docs.danubedata.ro/object-storage-quickstart.json"},"index_url":"https://docs.danubedata.ro/index.json"}