Deploy Your Own S3 Server

One of my biggest issues with using AWS S3 is the feeling that I'm tying myself in and possibly getting bitten if AWS increase their prices or suddenly decides to no longer provide or support the service. The Scality S3 server resolves this issue for me, giving me the freedom to change provider (self-hosting) without having to change my codebase. This also means that you can use S3 to begin with, and switch to self-hosting later to save money at scale, or possibly improve performance.

This tutorial aims to get you set up as quickly as possible with your own object storage server, by using docker and your server's local file storage. There are other storage configuration possibilities, and you don't have to use docker, but we will cover that in later tutorials.

Minimum Requirements

  • 1 vCPU
  • 1 GB of RAM


Run the following commands to create a local are where your data will be stored, and deploy the application.

mkdir -p $HOME/s3-data/data
mkdir -p $HOME/s3-data/metadata

docker run -d \
--name s3server \
--restart=always \
-v $HOME/s3-data/data:/usr/src/app/localData \
-v $HOME/s3-data/metadata:/usr/src/app/localMetadata \
-p 8000:8000 \

You will want to change the SCALITY_ACCESS_KEY_ID and SCALITY_SECRET_ACCESS_KEY values to something else, but make sure to take this into account in the future sections of this tutorial.

Congratulations, you now have a self-hosted S3-compatible object storage server.


Now let's demonstrate how to use your S3 server in PHP, using the AWS SDK to prove that it is compatible and you don't have to change your existing codebase.

Create a folder on your laptop or client server. We will work in here.

Use composer to install the SDK. We need to use version 3.

composer require "aws/aws-sdk-php:3.31.*"

Then copy/paste the following script in that folder.


require_once(__DIR__ . '/vendor/autoload.php');

# Specify the IP of the S3 server you deployed
# You cannot use a hostname (yet)
define('S3_SERVER_IP', '192.168.1.x');

$client = Aws\S3\S3Client::factory([
    'region' => 'us-east-1',
    'version' => 'latest',
    'use_path_style_endpoint' => true,
    'endpoint' => 'http://' . S3_SERVER_IP . ':8000',
    'credentials' => [
        'key' => 'myKeyID',
        'secret' => 'mySecretKey'

    'Bucket' => 'bucketphp',

Execute the script and you will have created your first bucket.


You now have working S3 server. Unfortunately, it is currently limited to the storage capacity of your one server for now and you cannot use a hostname to identify your S3 server. We will address those issues in future.



Stuart is a software developer with a passion for Linux and open source projects.

comments powered by Disqus
We are a participant in the Amazon Services LLC Associates Program, an affiliate advertising program designed to provide a means for us to earn fees by linking to and affiliated sites. More info.