Quickstart
This guide takes about ten minutes. You need a workspace and the AWS CLI version 2 or any S3 SDK.
1. Create an access key
In the console, open Access keys → New key. Choose the bucket scope All buckets and the permission set Read and write for this guide. Copy the secret: it is displayed only once.
2. Configure your client
[profile tcn]
region = fra1
endpoint_url = https://fra1.s3.tcnstorage.store
s3 =
addressing_style = virtual[tcn]
aws_access_key_id = TCNK7Q2M4X9EXAMPLE
aws_secret_access_key = <your secret key>3. Create a bucket and upload
# Point any S3 tool at your region endpoint
export AWS_ACCESS_KEY_ID="TCNK7Q2M4X9EXAMPLE"
export AWS_SECRET_ACCESS_KEY="<your secret key>"
aws s3 mb s3://media-assets --endpoint-url https://fra1.s3.tcnstorage.store
aws s3 cp ./poster.jpg s3://media-assets/2026/poster.jpg \
--endpoint-url https://fra1.s3.tcnstorage.store \
--cache-control "public, max-age=86400"import boto3
s3 = boto3.client(
"s3",
endpoint_url="https://fra1.s3.tcnstorage.store",
region_name="fra1",
)
s3.upload_file("poster.jpg", "media-assets", "2026/poster.jpg",
ExtraArgs={"ContentType": "image/jpeg"})
url = s3.generate_presigned_url(
"get_object",
Params={"Bucket": "media-assets", "Key": "2026/poster.jpg"},
ExpiresIn=3600,
)
print(url)import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
import { readFile } from "node:fs/promises";
const s3 = new S3Client({
region: "fra1",
endpoint: "https://fra1.s3.tcnstorage.store",
});
await s3.send(new PutObjectCommand({
Bucket: "media-assets",
Key: "2026/poster.jpg",
Body: await readFile("poster.jpg"),
ContentType: "image/jpeg",
}));Large files — the CLI and SDKs switch to multipart upload automatically above 8 MiB and upload parts in parallel.
4. Enable edge delivery
Edge delivery serves public objects from every point of presence. Enable it in the console under Bucket → Edge, or with the management API:
curl
curl -X PATCH https://api.tcnstorage.store/v1/buckets/media-assets \
-H "Authorization: Bearer $TCN_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"edge":{"enabled":true,"default_ttl":86400}}'5. Verify
Edge URL
# Public buckets are served from the nearest edge PoP
curl -I https://media-assets.cdn.tcnstorage.store/2026/poster.jpg
HTTP/2 200
content-type: image/jpeg
cache-control: public, max-age=86400
x-tcn-edge: hit
x-tcn-region: fra1The x-tcn-edge header shows miss on the first request to a PoP and hit afterwards. That's it — your bucket is live.