Object storage
Buckets hold files of any size behind an S3-compatible endpoint in each region. A tool that speaks S3 works here once you give it the endpoint.
Endpoints
Each region has an endpoint of its own, https://s3.<region>.logi-ciel.co. A bucket in Tallinn, for example, lives at https://s3.ee1.logi-ciel.co.
A bucket stays in the region you create it in. Path-style and virtual-host addresses both reach the same file:
https://s3.ee1.logi-ciel.co/acme-assets/img/logo.svghttps://acme-assets.s3.ee1.logi-ciel.co/img/logo.svg
Create a bucket and keys
- Create the bucket in a region, such as
ee1. - Create an access key for it, read-only or read-write.
- Store the key pair where your tools can read it, because the secret is shown once.
$ lc bucket create acme-assets --region ee1
$ lc bucket key create --bucket acme-assets --access read-write
Access key LCAK7XQ2M4PZ
Secret key wJb9...Qe3s
A key can reach one bucket or every bucket in the project. Give each app its own key, so you can delete one without breaking the others.
Use S3 tools
AWS CLI
Point the AWS CLI at the endpoint, and it works as it does with S3:
$ export AWS_ACCESS_KEY_ID=LCAK7XQ2M4PZ
$ export AWS_SECRET_ACCESS_KEY=wJb9...Qe3s
$ aws s3 cp ./logo.svg s3://acme-assets/img/logo.svg \
--endpoint-url https://s3.ee1.logi-ciel.co --region ee1
$ aws s3 ls s3://acme-assets/img/ \
--endpoint-url https://s3.ee1.logi-ciel.co --region ee1
Python
With boto3, set endpoint_url and region_name, and the rest of the code stays as it is:
import os
import boto3
s3 = boto3.client(
"s3",
endpoint_url="https://s3.ee1.logi-ciel.co",
region_name="ee1",
aws_access_key_id=os.environ["AWS_ACCESS_KEY_ID"],
aws_secret_access_key=os.environ["AWS_SECRET_ACCESS_KEY"],
)
s3.upload_file("report.pdf", "acme-assets", "reports/2026-10.pdf")
url = s3.generate_presigned_url(
"get_object", Params={"Bucket": "acme-assets", "Key": "reports/2026-10.pdf"}
)
rclone, restic and Terraform’s s3 backend work the same way, with the endpoint and the region set.
Public files and links
A bucket is private when you create it. Each request needs a key, or a signed link like the one the Python example makes. A signed link expires after the time you choose.
To serve images or downloads to anyone, make a prefix public:
$ lc bucket public acme-assets --prefix img/
Files under img/ can then be read without a key, and the rest of the bucket stays private. To serve them from your own domain, add a CNAME record in DNS.
Public files can be read, never listed or changed, and every write needs a key.
Prices
Stored data costs €0.0080 per TB an hour, up to €5.49 per TB a month. Uploads are inbound traffic, which is not counted. Downloads count toward the project’s pooled outbound traffic, like any server’s.
Every other storage price is on the pricing page, beside the server plans. For a disk that one server mounts, use a volume. For a file system several servers share over NFS, use file storage.