S3-Compatible Object Storage

Store unlimited files, backups, and media with AWS S3 API compatibility.

Overview

DanubeData 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.

Key Benefits

  • 100% S3 API Compatible: Use any S3 SDK, CLI, or tool without modifications
  • GDPR Compliant: All data stored in Germany datacenters
  • Simple Pricing: €5.49/month includes 1TB storage and 1TB egress
  • Secure by Default: AES-256 encryption at rest, TLS 1.3 in transit
  • Built-in Browser: Manage files directly from the dashboard

Features

Core Storage

  • Buckets: Up to 10 buckets per team
  • Large File Support: Objects up to 5TB each
  • Multipart Uploads: Chunked uploads for large files with automatic recovery
  • Presigned URLs: Generate temporary access links for sharing
  • Bucket Size Limits: Optionally cap a bucket's size (10 GB up to 5 TB, or leave it unlimited)

Security & Access Control

  • Encryption: AES-256 encryption at rest, TLS 1.3 in transit
  • Access Keys: Team-wide or per-bucket scoped credentials, with read-only, read-write, or full permission levels and an optional expiry date
  • Public Access Control: Enable/disable public read access per bucket
  • Bucket Policies: Restrict access by source IP range (CIDR allow-lists) with a visual or JSON policy editor
  • Object Lock (WORM): Lock object versions against deletion or overwrite for a fixed retention period

Advanced Features

  • Object Versioning: Protect against accidental deletion
  • Lifecycle Rules: Automatic object expiration and cleanup
  • CORS Support: Configure cross-origin access for web applications
  • Object Tagging: Organize objects with key-value tags

Monitoring & Management

  • 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
  • Bucket Health: Surfaces reclaimable space from pending multipart uploads and non-current object versions
  • Object Browser: Built-in file management in the dashboard, with direct uploads (live progress, speed, and ETA) and bulk delete
  • Usage Tracking: Per-bucket storage and traffic statistics

Use Cases

Media & File Storage

Store images, videos, documents, and user uploads for web and mobile applications.

Database Backups

Automatically back up your MySQL, PostgreSQL, and MariaDB databases to durable object storage.

Static Website Hosting

Host static websites and single-page applications with high availability.

Data Archives

Archive infrequently accessed data with lifecycle rules for cost optimization.

CDN Origins

Use as origin storage for content delivery networks.

Application Logs

Store and archive application logs for compliance and debugging.

Access Methods

Path-Style Access

Text
https://s3.danubedata.ro/bucket-name/object-key

Virtual-Host Style Access

Text
https://bucket-name.s3.danubedata.ro/object-key

Both access styles are fully supported. Use whichever works best with your tools.

SFTP Access

For tools and users that speak SFTP but not the S3 API, you can also reach a bucket over SFTP:

Text
Host: sftp.new-s3.danubedata.ro
Port: 2222

Each 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 for details.

Object Lock (WORM)

Object 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.

Retention modes

  • 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.
  • Compliance: No one — including the bucket owner — can delete a locked object version or shorten its retention until the retention period expires.

How it works

  • 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.
  • Default retention: Optionally set a default mode and retention period (1–36,500 days) applied to every new object version.
  • Per-object retention: Apply or extend a retention date on individual object versions.
  • 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.

Object Lock works through the standard S3 API actions (PutObjectLockConfiguration, PutObjectRetention, PutObjectLegalHold) and from the dashboard.

Pricing

Simple, transparent pricing with generous included quotas.

Base Subscription

PlanPriceIncluded StorageIncluded Egress
Object Storage€5.49/month1 TB1 TB

Overage Pricing

ResourcePrice
Additional Storage€5.49/TB/month
Additional Egress€1.00/TB
Ingress (uploads)Always free

Example Costs

ScenarioMonthly Cost
500 GB storage, 200 GB egress€5.49 (within included quota)
2 TB storage, 1 TB egress€10.98 (€5.49 + €5.49 storage overage)
5 TB storage, 3 TB egress€29.45 (€5.49 + €21.96 storage + €2.00 egress overage)

Note: Minimum billable object size is 64 KB. Smaller objects are billed as 64 KB.

Technical Specifications

SpecificationValue
S3 API VersionAWS S3 (2006-03-01)
Maximum Object Size5 TB
Maximum Buckets per Team10
Bucket Size LimitOptional: 10 GB–5 TB, or unlimited
Bucket Name Length3-63 characters
Encryption at RestAES-256
Encryption in TransitTLS 1.3
Data LocationGermany (EU)
Replication3× replicated across physical servers

S3 API Compatibility

DanubeData Object Storage supports all common S3 operations:

Bucket Operations

  • ListBuckets / HeadBucket
  • GetBucketLocation
  • GetBucketVersioning / PutBucketVersioning
  • GetBucketPolicy / PutBucketPolicy
  • GetBucketCors / PutBucketCors
  • GetBucketLifecycle / PutBucketLifecycle
  • GetObjectLockConfiguration / PutObjectLockConfiguration

Buckets are created and deleted from the DanubeData dashboard or API, not through the S3 CreateBucket / DeleteBucket calls. See S3 API supported actions for the full compatibility matrix.

Object Operations

  • PutObject / GetObject / DeleteObject
  • ListObjects / ListObjectsV2
  • CopyObject
  • HeadObject
  • GetObjectTagging / PutObjectTagging
  • GetObjectRetention / PutObjectRetention
  • GetObjectLegalHold / PutObjectLegalHold

Multipart Upload

  • CreateMultipartUpload
  • UploadPart
  • CompleteMultipartUpload
  • AbortMultipartUpload
  • ListMultipartUploads

Presigned URLs

  • Generate temporary download/upload URLs
  • Configurable expiration (default: 60 minutes)

Comparison

DanubeData vs AWS S3

FeatureDanubeDataAWS S3
Pricing€5.49/month (1TB included)Pay per request + storage
Egress1TB included, then €1.00/TB€0.09/GB (90€/TB)
Data LocationGermany onlyMultiple regions
ComplexitySimpleComplex IAM & policies
GDPRCompliant by defaultRequires configuration

DanubeData vs Hetzner Object Storage

FeatureDanubeDataHetzner
DashboardIntegrated with DanubeDataSeparate Hetzner Cloud
BillingUnified with other servicesSeparate
SupportSingle providerHetzner support
FeaturesVersioning, lifecycle, CORSBasic S3

Integration Examples

AWS CLI

Bash
# Configure AWS CLI
aws configure set aws_access_key_id YOUR_ACCESS_KEY
aws configure set aws_secret_access_key YOUR_SECRET_KEY

# List buckets
aws --endpoint-url https://s3.danubedata.ro s3 ls

# Upload a file
aws --endpoint-url https://s3.danubedata.ro s3 cp file.txt s3://my-bucket/

# Download a file
aws --endpoint-url https://s3.danubedata.ro s3 cp s3://my-bucket/file.txt ./

Python (boto3)

Python
import boto3

s3 = boto3.client(
    's3',
    endpoint_url='https://s3.danubedata.ro',
    aws_access_key_id='YOUR_ACCESS_KEY',
    aws_secret_access_key='YOUR_SECRET_KEY'
)

# Upload file
s3.upload_file('local-file.txt', 'my-bucket', 'remote-file.txt')

# Download file
s3.download_file('my-bucket', 'remote-file.txt', 'local-file.txt')

# List objects
response = s3.list_objects_v2(Bucket='my-bucket')
for obj in response.get('Contents', []):
    print(obj['Key'])

Node.js (AWS SDK v3)

JavaScript
import { S3Client, PutObjectCommand, GetObjectCommand } from '@aws-sdk/client-s3';

const s3 = new S3Client({
  endpoint: 'https://s3.danubedata.ro',
  region: 'fsn1',
  credentials: {
    accessKeyId: 'YOUR_ACCESS_KEY',
    secretAccessKey: 'YOUR_SECRET_KEY',
  },
  forcePathStyle: true,
});

// Upload file
await s3.send(new PutObjectCommand({
  Bucket: 'my-bucket',
  Key: 'file.txt',
  Body: 'Hello, World!',
}));

// Download file
const response = await s3.send(new GetObjectCommand({
  Bucket: 'my-bucket',
  Key: 'file.txt',
}));
const content = await response.Body.transformToString();

PHP (Laravel)

PHP
// config/filesystems.php
'disks' => [
    's3' => [
        'driver' => 's3',
        'key' => env('DANUBEDATA_S3_KEY'),
        'secret' => env('DANUBEDATA_S3_SECRET'),
        'region' => 'fsn1',
        'bucket' => env('DANUBEDATA_S3_BUCKET'),
        'url' => env('DANUBEDATA_S3_URL'),
        'endpoint' => 'https://s3.danubedata.ro',
        'use_path_style_endpoint' => true,
    ],
],

// Usage
Storage::disk('s3')->put('file.txt', 'Hello, World!');
$content = Storage::disk('s3')->get('file.txt');
$url = Storage::disk('s3')->temporaryUrl('file.txt', now()->addHour());

Go

Go
package main

import (
    "context"
    "github.com/aws/aws-sdk-go-v2/aws"
    "github.com/aws/aws-sdk-go-v2/config"
    "github.com/aws/aws-sdk-go-v2/credentials"
    "github.com/aws/aws-sdk-go-v2/service/s3"
)

func main() {
    cfg, _ := config.LoadDefaultConfig(context.TODO(),
        config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(
            "YOUR_ACCESS_KEY",
            "YOUR_SECRET_KEY",
            "",
        )),
        config.WithRegion("fsn1"),
    )

    client := s3.NewFromConfig(cfg, func(o *s3.Options) {
        o.BaseEndpoint = aws.String("https://s3.danubedata.ro")
        o.UsePathStyle = true
    })

    // Use client for S3 operations
}

FAQ

Is it really 100% S3 compatible?

Yes! 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.

Can I access my data from anywhere?

Yes. 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).

Can I restrict access to specific IP addresses?

Yes. 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.

Can I make objects immutable (WORM)?

Yes. 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 above.

Can I connect over SFTP?

Yes. 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.

What happens if I exceed my included quota?

You're automatically billed for overage usage at the rates shown above. There are no service interruptions - your storage continues to work normally.

How is billing calculated?

Storage is billed based on the average GB stored per hour. Traffic is billed based on total egress (download) bytes. Ingress (upload) is always free.

Can I use this for website hosting?

Yes! Enable public access on your bucket and configure your DNS to serve static content directly from Object Storage.

How do I migrate from AWS S3?

Use 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.

Is my data replicated?

Yes. All data is replicated across multiple storage nodes for durability and high availability.

Next Steps


Questions? Contact support at support@danubedata.ro