Tigris Discord Server
Tigris Discord Server
All things Tigris: the Globally Distributed S3-Compatible Object Storage.
Channels
help
Deleted three buckets and now can't recreate them
Open thread: Deleted three buckets and now can't recreate them
Answer Overflow APP7/16/26, 11:50 PM
Dismissed message!
help
Does pre-signed POST uploads support metadata fields?
Open thread: Does pre-signed POST uploads support metadata fields?
Jume 7/14/26, 2:43 PM
I’m doing browser uploads using a POST policy. The upload itself succeeds perfectly, but I've noticed that my custom metadata (x-amz-meta-\* fields) isn't being saved to the object, even though it's correctly included in both the policy conditions and the form data.
I was looking at following docs, which made me think POST uploads would support metadata as in the example "x-amz-meta-uuid" is used : https://www.tigrisdata.com/docs/objects/upload-via-html-form/
Can anyone confirm if custom metadata is supported for POST uploads, or is this a known limitation on the backend? (I know PUT works, just specifically wondering about POST).
Browser-Based Uploads Using HTTP POST | Tigris Object Storage Docum...
Tigris facilitates the posting of objects via HTTP, which proves beneficial in
help
Open thread: Problem with Cache Control
6/30/26, 3:54 PM
I don't know if I'm doing something wrong, but when I set a cache-control field on tigris it just ignores it:
aws s3 cp \
--content-type "application/json; charset=utf-8" \
--cache-control 'public, max-age=300' \
--metadata-directive REPLACE \
"$MY_FILE" \
"s3://$BUCKET_NAME/$MY_FILE" \
; \
sleep 60
; \
aws s3api head-object \
--bucket "$BUCKET_NAME" \
--key "$MY_FILE" \
--output json |
jq -r '.CacheControl'
# public, max-age=259200, stale-while-revalidate=3600, stale-if-error=600
The returned value is the bucket-wide default I have set (Bucket Settings -> Storage Settings -> Cache Control).
The description of the field ( This lets you set the default Cache-Control header for objects in the bucket) gives me the impression that it shouldn't smash my own settings.
Maybe it's some sort of timeout or data race since I first uploaded the file without a cache-control header before deleting/modifying it (UPDATE: happens on new files as well).
Giving it 60s seemed more than enough for everything to settle (Global, public bucket, Standard storage tier, Strict consistency, object ACLs enabled).
If these settings are incompatible in some way it would be a real shame since I really don't wanna manually set each cache-control, but I need some files to be short-lived
help
Solved
tomciopp 6/22/26, 1:13 PM
Is there a way to set this value to true when creating a bucket? I don't want to have to do this manually.
Object ACL
Use Object ACLs to manage permissions at the object level, such as having private objects in a public bucket or public objects in a private bucket.
help
How to add additional headers if reverse proxy isn't supported on public bucket?
Solved
Open thread: How to add additional headers if reverse proxy isn't supported on public bucket?
エイダ🌸 6/20/26, 11:04 PM
Hi! I have a public bucket and I want to add custom headers on its content like content-security-policy and permissions-policy. But enabling the proxy mode on Cloudflare CDN breaks the certificate renewal How to go about it?
help
Hi, can anyone here help with a partner id for my startup.
Open thread: Hi, can anyone here help with a partner id for my startup.
Ileri⚡ 5/28/26, 1:00 PM
We want to resell a storage bucket feature on https://brimble.io to our users
Brimble
Brimble - The only cloud platform you’ll ever need
Ship faster with Brimble: the all-in-one platform to deploy, scale, and manage every part of your stack.
help
Strong consistency within a global bucket?
Open thread: Strong consistency within a global bucket?
Simon 5/23/26, 7:48 AM
Is X-Tigris-Consistent: true``X-Tigris-Consistent: true supported for a "global" bucket?
Alternatively can X-Tigris-Regions: fra``X-Tigris-Regions: fra be specified for both PUT``PUTs and GET``GETs in a global bucket?
I'm looking for a way to guarantee strong consistency for write-then-read across clients in different regions (at the cost of increased latency) for a small subset of keys within a single global bucket. Is this possible?
help
Solved
Open thread: SOC2 / Security Assessment
Tim M 5/2/26, 7:24 AM
Hi there, I'm taking our company through a SOC2 audit and I was wondering if Tigris has a trust center or a way to get any documents/reports related to compliance and security? I wasn't able to find any details in the docs other than a blog post about SOC2.
Specifically, we're using a platform called Vanta and I have to do assessments for each vendor. They require uploading documents and/or linking to a trust center. If there's anything you can provide, that would be super helpful! Thank you.
help
Bucket ownership transfer between orgs
Open thread: Bucket ownership transfer between orgs
Naman 4/30/26, 4:59 AM
Hey folks, is there a supported way to transfer a bucket from one org to another?
Context: Railway uses Tigris for multi-tenant object storage, with one Tigris org per Railway workspace. When a customer moves a project between workspaces, the bucket stays in the original org and becomes inaccessible from the destination. We’d like to migrate the bucket (and its objects) to the new org as part of that flow.
Is there anything on the partner API for this today? If not, what’s the recommended pattern?
help
guymograbi 4/27/26, 7:15 PM
Hi, I want to sign BAA with you - I sent an email to help@.. but no reply.
help
Are notifications at least once?
Solved
Open thread: Are notifications at least once?
algads 4/25/26, 1:15 PM
In the docs, it states: "If a 200 status is not received, Tigris will retry for a maximum of 3 times before giving up and marking the notifications as sent." I read that as it will retry three times and then give up without noting an error and instead it will be seen as sent even though it has not been. Am I reading this incorrectly and misunderstanding it? I am considering turning to this pattern for docs that need to move through a pipeline but not having an error state won't work for our use case.
help
CompleteMultipartUpload - can it return error on 200 OK like S3 can?
Solved
Open thread: CompleteMultipartUpload - can it return error on 200 OK like S3 can?
spicy_heck_boi 4/23/26, 12:44 PM
So it turns out that S3 can theoritically return a 200 OK for a CompleteMultipartUpload call, but still return an error in the body, which is insane, but here we are: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html
Does Tigris have this same behavior? I guess in general, should I always be parsing the XML responses from S3 calls to look for errors, or can I rely on a 200 OK meaning we have successfully completed the request?
CompleteMultipartUpload - Amazon Simple Storage Service
Completes a multipart upload by assembling previously uploaded parts.
help
Checksum support on multipart upload S3 compatibility?
Solved
Open thread: Checksum support on multipart upload S3 compatibility?
spicy_heck_boi 4/21/26, 6:42 PM
Hi Tigris team - does Tigris support the x-amz-checksum methods to validate the uploaded content? I just tried this with CreateMultipartUpload / UploadPart / CompleteMultipartUpload and it seems like the headers are accepted and pushed through, but the data is not rejected with 400 BadDigest if the checksum is mismatched. A regular PutObject with a mismatched Content-MD5 header does return 400 BadDigest, but not with a mismatched crc32.
Is there any way to do checksums on multipart uploads?
help
Open thread: BOM region availability
Vlad 4/13/26, 10:13 AM
I'm CTO of a Fintech startup, we already use Fly io and are pretty happy with it, and are really interested in using Tigris storage. But, due to India's DPDP Act and the RBI Payment Data Localization requirements, our company is obligated to store data exclusively in India.
We already use BOM - Mumbai region in fly.io for our workload, so I was expecting that the BOM region would also be available in Tigris, but as far as I can see in the documentation, it is not present.
Can you share when it will be available? And if it is planned to be launched soon, is there any way to enable it for us in some form of beta testing?
help
console.storage.dev’s server IP address could not be found.
Solved
Open thread: console.storage.dev’s server IP address could not be found.
Coddo 4/13/26, 9:56 AM
Absolutely no clue what could be causing this, never had an issue like this before.
help
Solved
Open thread: Migration finalization
da_man_rocks 4/7/26, 1:28 AM
Is there a way to get a report of which objects have not been migrated? Better yet, is there a method to migrate objects without downloading them to the client?
help
seeing continuous HTTP 500 errors on HeadObject calls for ~3 hours with no recovery
Solved
Open thread: seeing continuous HTTP 500 errors on HeadObject calls for ~3 hours with no recovery
Jie Wang 4/5/26, 8:05 PM
▎ Details:
▎ - Endpoint: https://t3.storage.dev
▎ - Bucket: meshy-learning``meshy-learning
▎ - Affected paths: checkpoints/meshylatv_avocado/VAE_20251019_d0e667e7/``checkpoints/meshylatv_avocado/VAE_20251019_d0e667e7/ and checkpoints/meshylatv_avocado/GSHead_GANS_20251109_38541c8e/``checkpoints/meshylatv_avocado/GSHead_GANS_20251109_38541c8e/
▎ - Operation: HeadObject via boto3/s3fs
▎ - Error: ClientError: An error occurred (500) when calling the HeadObject operation (reached max retries: 4): Internal Server Error
▎ - Started: ~20:03 UTC, April 5, 2026
▎ What we've ruled out:
▎ - Same bucket and paths work fine from AWS us-west-2
▎ - Fails from multiple independent non-AWS networks (bare metal datacenters and DigitalOcean)
▎ - Rotated credentials, same 500 with new key
▎ - Other paths in the same bucket accessible from AWS
▎ - Status page shows all operational
Tigris
Tigris - The Storage Layer Purpose Built for AI
Tigris is globally distributed, S3-compatible object storage with zero egress fees. Scales infinitely, works across any cloud, and provides instant access to your data worldwide.
help
DNS Issues with t-mobile's default DNS server
Open thread: DNS Issues with t-mobile's default DNS server
lethargicgeek 4/1/26, 1:31 AM
I'm not able to access console.storage.dev or t3.storage.dev through t-mobile's network. Is this a known issue? It was working fine last week so something changed. Switching to google's 8.8.8.8 or cloudflare's 1.1.1.1 works fine. Disabling that override and using my cellphone's default DNS (t-mobile) all of my assets are now broken image links. Is Tigris working to resolve this or do I need to work towards a workaround? Thanks!
help
Tigris storage + Cloudflare image resizing suddenly stopped working
Open thread: Tigris storage + Cloudflare image resizing suddenly stopped working
Deniz A. 3/23/26, 8:22 AM
Our app uses a Tigris bucket (via Fly.io) to store images, and Cloudflare's image transformations to optimize them. Today, all these images have stopped loading with the error "ERROR 9504: Could not fetch the image - download timed out". Was there a change from Tigris that might block Cloudflare from accessing the bucket? It was working previously and we've made no changes to bucket configuration or any other part of the app...
Example image: https://lively-leaf-6126.fly.storage.tigris.dev/6e7dbe24-49a6-4ca8-9924-35ed6311209e.png
Failing resize URL: https://runelab.ai/cdn-cgi/image/width=1200,height=675,fit=crop,format=auto,gravity=5.0x5.0/https://lively-leaf-6126.fly.storage.tigris.dev/6e7dbe24-49a6-4ca8-9924-35ed6311209e.png
help
Snapshot and Fork put performance
Open thread: Snapshot and Fork put performance
vmg 3/16/26, 10:25 AM
Hi, I was testing snapshots and forking and noticed for each additional layer there was a pretty significant increase in latency for different ops. For example, a 1kb put could go from 7-8 ms to 15 ms on a fork and each additional fork caused an additional increase in latency.
My assumptions with how forks work is it's basically like a CoW filesystem. Out of curiosity is there some compaction step that brings down this latency over time or is this additional latency always present with an increased number of layers?
help
I cannot open the tigris bucket from fly.io
Solved
Open thread: I cannot open the tigris bucket from fly.io
Vitalie 3/15/26, 12:57 PM
Retrieving authentication status...
Looks like you don't have access to the Org or the Org doesn't exist.
Redirecting in 2s...
Do I need somehow to connect Tigris and Fly.io and tell that I am the same user who owns both accounts?
For now, I am just curious to be able to list the objects in the bucket.
Thank you for any hint.
help
Question about upload / download bandwidth
Open thread: Question about upload / download bandwidth
vmg 2/26/26, 4:59 PM
Hi, I'm running some benchmarks on ovh dedicated servers in us-east-vin, my bucket is set to single region in IAD.
The benchmark was with tigrisfs. I noticed that upload / download was capped around 40 - 50 MB/s
Is this just because my account is newish?
I also noticed when looking at metrics that my traffic was going through ord and not iad
help
Can I use forks and snapshots with buckets created on Fly?
Solved
Open thread: Can I use forks and snapshots with buckets created on Fly?
Katie Schilling 2/24/26, 11:52 AM
I have buckets created with fly storage create can I use forks and snapshots within flyctl?
help
Tigris CLI - Provisioning Access keys
Solved
Open thread: Tigris CLI - Provisioning Access keys
Katie Schilling 2/23/26, 5:00 PM
I'm making an Agent and want to create a quick access key for it with permission to read and write to a bucket. How can I do this from the CLI?
help
Stream wrapper fails on file_get_contents() due to non-seekable stream (Tigris)
Solved
Open thread: Stream wrapper fails on file_get_contents() due to non-seekable stream (Tigris)
Metallized 2/16/26, 5:02 AM
Hey guys i was trying to use Tigris for a drupal site using the s3fs module and i get the following issue:
https://www.drupal.org/project/s3fs/issues/3573338
As you can see when i patch the module to allow me to pass by the response_checksum_validation``response_checksum_validation option to aws-sdk-php``aws-sdk-php my error goes away.
Is this some kind of compatibility issue with the Tigris service?
Drupal.org
Stream wrapper fails on file_get_contents() due to non-seekable str...
Currently i am using this module in a site with locale module active, and i getting this warning: User warning: Stream is not seekable in Aws\S3\StreamWrapper->triggerError() (line 788 of /var/www/html/vendor/aws/aws-sdk-php/src/S3/StreamWrapper.php). Error message Warning: file_get_contents(public://languages/es_VDvIBCKufkGMU2tQ1_KFvYXnRgrAosuv...
help
Cannot install sprites CLI. Tigris bucket unreachable from spain during LaLiga matches
Solved
Open thread: Cannot install sprites CLI. Tigris bucket unreachable from spain during LaLiga matches
Lord Larry Hamill 1/21/26, 3:13 PM
Unable to install sprites CLI.
curl -fsSL https://sprites.dev/install.sh | bash
✗ Fetching latest version
Error: Network error: could not connect to https://sprites-binaries.t3.storage.dev
Then checked the docs; this section gave hope but it has a broken link to GitHub Releases. I looked for sprite repos under the project's GitHub and couldn’t see one for the CLI.
So I’m out of ideas.
Sprites Documentation
Install the Sprites CLI on macOS, Linux, or Windows
help
presigned url unmatching signature
Solved
Open thread: presigned url unmatching signature
Prof. Kody Reilly 1/21/26, 3:13 PM
Hello,
Apologize me if the question seemed noob. I wasted hours trying to debug it.
If I copy a presigned put url from Tigris web interface, the following works:
curl -X PUT --upload-file ~/Pictures/profile.jpg $URL
curl -X PUT --upload-file ~/Pictures/profile.jpg $URL
However, if I generate a presigned url from AWS CLI I get a signature failure:
<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message><Resource>/hidden-resonance-7222/cover-auc.jpg</Resource><RequestId>1765142028485770133</RequestId><Key>cover-auc.jpg</Key><BucketName>hidden-resonance-7222</BucketName></Error>
It is generated by:
URL=$(aws s3 presign s3://hidden-resonance-7222/cover-auc.jpg --expires-in 3600 --endpoint-url https://t3.storage.dev)
URL=$(aws s3 presign s3://hidden-resonance-7222/cover-auc.jpg --expires-in 3600 --endpoint-url https://t3.storage.dev)
Running aws configure``aws configure yields:
AWS Access Key ID [****************_lvN]:
AWS Secret Access Key [****************0yEe]:
Default region name [auto]:
Default output format [json]:
AWS Access Key ID [****************_lvN]:
AWS Secret Access Key [****************0yEe]:
Default region name [auto]:
Default output format [json]:
and the access key matches the one shown in the Tigris web interface.
I saw this but it does not seem relevant.
P.S. The working URL generated from the web interface looks like:
https://hidden-resonance-7222.t3.storage.dev/cover-auc.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=tid_..._lvN%2F20251207%2Fauto%2Fs3%2Faws4_request&X-Amz-Date=20251207T213238Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=...
The failed URL generated by AWS CLI looks like:
https://t3.storage.dev/hidden-resonance-7222/cover-auc.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=tid_..._lvN%2F20251207%2Fauto%2Fs3%2Faws4_request&X-Amz-Date=20251207T213420Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=...
Fly.io
SignatureDoesNotMatch when using pre-signed URL with AWS-SDK
I’m getting SignatureDoesNotMatch when creating a presigned-url for PUT. const url = await getSignedUrl( s3Client, new PutObjectCommand({ Bucket: config.AWS_BUCKET, Key: key, }), { expiresIn: dayjs.duration(10, 'minutes').asSeconds(), } ); Log output for debugging purposes: [3:12:26 ...
help
•
Tigris setting bucket path in client
Solved
Open thread: Tigris setting bucket path in client
Dr. Jarred Schneider 1/21/26, 3:12 PM
Hi – I'm reading through the Tigris examples and I'm a bit confused by how they implemented their multipart upload strategy. It seems that the path is sent from the client to the server in their example. Is this not something that should be set server‑side for security (e.g. tenants/tenantId/files/content``tenants/tenantId/files/content)? Maybe I'm missing something, but I ran into errors when I tried to set the path from the server. Thanks!
Examples | Tigris Object Storage Documentation
If you want to see it the Storage SDK used with your tool of choice, we have
help
•
Destroying storage does not remove access keys in the Tigris console
Open thread: Destroying storage does not remove access keys in the Tigris console
Dr. Adalberto Monahan 1/21/26, 3:12 PM
If I destroy the storage using flyctl storage destroy $APP_NAME --yes --app $APP_NAME``flyctl storage destroy $APP_NAME --yes --app $APP_NAME(which was previously created with flyctl storage create --yes --app $APP_NAME --name $APP_NAME``flyctl storage create --yes --app $APP_NAME --name $APP_NAME), the access key remains active in the Tigris console. Is there a way to revoke these tokens, either automatically or manually (e.g., via flags)?
We have an automated preview deployment, so we are accumulating many inactive tokens in the console.
Thanks.
help
•
API for configuring S3 bucket notifications programmatically?
Open thread: API for configuring S3 bucket notifications programmatically?
Lady Destinee Lebsack 1/21/26, 3:12 PM
Hi, I have a Tigris question about creating bucket notifications programmatically.
We’re building a multi-tenant application on Fly.io using Tigris for object storage. We provision one bucket per tenant (currently ~100 tenants, scaling to 1000+), and we’d like to use S3 event notifications to trigger real‑time sync operations.
I’ve read the blog post about object notifications ( https://www.tigrisdata.com/blog/how-we-built-object-notifications/) and the docs ( https://www.tigrisdata.com/docs/buckets/object-notifications/). I’m trying to understand:
- Is there an API to configure bucket notifications programmatically?
- We need to configure notifications when creating each tenant bucket via code.
- Standard S3 APIs like PUT /?notification``PUT /?notification or boto3’s put_bucket_notification_configuration``put_bucket_notification_configuration?
The only way I have seen to configure notifications so far is the admin console, but that isn’t practical for buckets that get created dynamically.
Thanks.
help
•
Presigned PUT Fails With 403
Open thread: Presigned PUT Fails With 403
Mrs. Violette Predovic 1/21/26, 3:11 PM
Hi,
I am creating pre‑signed PUT URLs in my app and getting 403 Forbidden errors.
When creating URLs via the Tigris dashboard they look like:
\
https://files.allaboutholes.vip/import-jobs.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=...&X-Amz-Date=20251107T020219Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=...\
```\
\
```\
https://files.allaboutholes.vip/import-jobs.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=...&X-Amz-Date=20251107T020219Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=...\
```\
\
When creating URLs via the application code below I get this shape:\
\
```\
const endpoint = 'https://fly.storage.tigris.dev';\
const bucketName = 'holehub-dev';\
const forcePathStyle = false;\
const deleteAfter = new Date(Date.now() + 1000 * 60 * 60);\
\
const s3Client = new S3Client({\
region: 'auto',\
endpoint,\
credentials: { accessKeyId, secretAccessKey },\
forcePathStyle,\
});\
\
const signedUrl = await getSignedUrl(\
s3Client,\
new PutObjectCommand({\
Bucket: bucketName,\
Key: '/jobs/imports/uploads/01K9E0WRQT8P0DM5GX65NZWXB2.csv',\
Expires: deleteAfter,\
ContentLength: fileSize,\
}),\
{ expiresIn: 3600 },\
);\
```\
\
```\
const endpoint = 'https://fly.storage.tigris.dev';\
const bucketName = 'holehub-dev';\
const forcePathStyle = false;\
const deleteAfter = new Date(Date.now() + 1000 * 60 * 60);\
\
const s3Client = new S3Client({\
region: 'auto',\
endpoint,\
credentials: { accessKeyId, secretAccessKey },\
forcePathStyle,\
});\
\
const signedUrl = await getSignedUrl(\
s3Client,\
new PutObjectCommand({\
Bucket: bucketName,\
Key: '/jobs/imports/uploads/01K9E0WRQT8P0DM5GX65NZWXB2.csv',\
Expires: deleteAfter,\
ContentLength: fileSize,\
}),\
{ expiresIn: 3600 },\
);\
```\
\
Resulting URL:\
\
```\
https://holehub-dev.fly.storage.tigris.dev/jobs/imports/uploads/01K9E0WRQT8P0DM5GX65NZWXB2.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=...&X-Amz-Date=20251107T020358Z&X-Amz-Expires=3600&X-Amz-Signature=...&X-Amz-SignedHeaders=host&x-id=PutObject\
```\
\
```\
https://holehub-dev.fly.storage.tigris.dev/jobs/imports/uploads/01K9E0WRQT8P0DM5GX65NZWXB2.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=...&X-Amz-Date=20251107T020358Z&X-Amz-Expires=3600&X-Amz-Signature=...&X-Amz-SignedHeaders=host&x-id=PutObject\
```\
\
The dashboard‑generated URL works, but the S3 client‑generated one returns:\
\
```\
HTTP/1.1 403 Forbidden\
Content-Length: 433\
Content-Type: application/xml\
...\
\
<?xml version="1.0" encoding="UTF-8"?>\
<Error>\
<Code>SignatureDoesNotMatch</Code>\
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>\
<Resource>/jobs/imports/uploads/01K9E0WRQT8P0DM5GX65NZWXB2.csv</Resource>\
<RequestId>1762481194277975954</RequestId>\
</Error>\
```\
\
```\
HTTP/1.1 403 Forbidden\
Content-Length: 433\
Content-Type: application/xml\
...\
\
<?xml version="1.0" encoding="UTF-8"?>\
<Error>\
<Code>SignatureDoesNotMatch</Code>\
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>\
<Resource>/jobs/imports/uploads/01K9E0WRQT8P0DM5GX65NZWXB2.csv</Resource>\
<RequestId>1762481194277975954</RequestId>\
</Error>\
```\
\
What could be wrong? I’m familiar with presigned URLs but new to Tigris.\
\
help\
\
•\
\
[Having multiple buckets (one public, one private) in Tigris for one Fly app](https://community.tigrisdata.com/m/1463627170365575244)\
\
[Open thread: Having multiple buckets (one public, one private) in Tigris for one Fly app](https://community.tigrisdata.com/m/1463627170365575244)\
\
\
\
[Queen Shana Schaefer](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 3:11 PM\
\
Hello\
\
My initial idea was to use one private Tigris bucket with a public prefix—something achievable in S3 with a bucket policy configuration. Looking at the Tigris documentation, that doesn’t appear possible. It seems I would need to either use an [object ACL](/content/docs/objects/acl/index.html) and set the ACL for each object, or use a public bucket. For my case, the latter makes more sense.\
\
The problem is that I cannot find a way to have two buckets in one application:\
\
```\
❯ fly storage create --public --name public-named-bucket\
Error: A Tigris project named previous-bucket-name already exists for app existing-app-name\
```\
\
```\
❯ fly storage create --public --name public-named-bucket\
Error: A Tigris project named previous-bucket-name already exists for app existing-app-name\
```\
\
I can create a bucket in the Tigris dashboard, but it appears in my organization, and I don’t see a way to add it to the application. I could create a new key in Tigris and configure it programmatically in the app, but it feels odd that the bucket will appear in the org without being linked to the app. Is there any way to achieve this?\
\
[Object ACLs \| Tigris Object Storage Documentation](/content/docs/objects/acl/index.html)\
\
Object ACLs (Access Control Lists) are used to control access to individual\
\
\
\
help\
\
•\
\
[Configure custom domain to Tigris programmatically](https://community.tigrisdata.com/m/1463627086349734071)\
\
Solved\
\
[Open thread: Configure custom domain to Tigris programmatically](https://community.tigrisdata.com/m/1463627086349734071)\
\
\
\
[King Llewellyn McCullough](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 3:11 PM\
\
Hi, I’m building a CMS and want to generate hundreds of buckets, assigning a custom subdomain to each. I tried setting up the public bucket with cache controls for each file and created the CNAME record in Cloudflare, but it didn’t work. I had to add the new subdomain manually via the Tigris console.\
\
Another idea was to use the Fly CLI and assign a domain via the CLI, but that command only allows creating one bucket per app:\
\
```\
fly storage create --public\
Error: A Tigris project named damp-tree-1234 already exist\
```\
\
```\
fly storage create --public\
Error: A Tigris project named damp-tree-1234 already exist\
```\
\
So this isn’t a suitable solution.\
\
Is there an API from Tigris to set this up programmatically, or perhaps via the S3 SDK?\
\
Thanks.\
\
help\
\
•\
\
[Docker & Tigrisfs](https://community.tigrisdata.com/m/1463626981563433205)\
\
Solved\
\
[Open thread: Docker & Tigrisfs](https://community.tigrisdata.com/m/1463626981563433205)\
\
\
\
[Prof. Nolan Leffler](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 3:11 PM\
\
Hello,\
\
I set up tigrisfs locally, and now I’m trying to set it up in a Docker container on Render. However, I’m running into issues. I managed to get as far as here with a Dockerfile and `start.sh``start.sh`:\
\
```\
FROM python:3.11-slim-bookworm\
\
WORKDIR /app\
\
COPY requirements.txt ./\
RUN pip install --no-cache-dir -r requirements.txt\
\
RUN playwright install-deps\
RUN playwright install\
\
RUN apt-get update && \\
apt-get install -y automake autotools-dev g++ git libcurl4-gnutls-dev libfuse-dev && \\
apt-get install -y wget tar curl jq rclone s3fs mailcap fuse3 gvfs-fuse && \\
wget https://github.com/tigrisdata/tigrisfs/releases/download/v1.2.1/tigrisfs_1.2.1_linux_amd64.tar.gz -O /app/tigrisfs.tar.gz && \\
tar -xzf /app/tigrisfs.tar.gz && \\
apt-get clean\
\
COPY . .\
\
RUN mkdir -p /app/vol\
#RUN /app/tigrisfs test /app/vol\
RUN ls -lA /app # C\
RUN chmod +x /app/start.sh\
RUN chmod +x /app/tigrisfs\
\
#ENTRYPOINT ["/app/tigrisfs"]\
ENTRYPOINT ["/app/start.sh"]\
#CMD ["timeout", "15m", "python3", "app.py"]\
CMD ["test", "/app/vol"]\
```\
\
```\
FROM python:3.11-slim-bookworm\
\
WORKDIR /app\
\
COPY requirements.txt ./\
RUN pip install --no-cache-dir -r requirements.txt\
\
RUN playwright install-deps\
RUN playwright install\
\
RUN apt-get update && \\
apt-get install -y automake autotools-dev g++ git libcurl4-gnutls-dev libfuse-dev && \\
apt-get install -y wget tar curl jq rclone s3fs mailcap fuse3 gvfs-fuse && \\
wget https://github.com/tigrisdata/tigrisfs/releases/download/v1.2.1/tigrisfs_1.2.1_linux_amd64.tar.gz -O /app/tigrisfs.tar.gz && \\
tar -xzf /app/tigrisfs.tar.gz && \\
apt-get clean\
\
COPY . .\
\
RUN mkdir -p /app/vol\
#RUN /app/tigrisfs test /app/vol\
RUN ls -lA /app # C\
RUN chmod +x /app/start.sh\
RUN chmod +x /app/tigrisfs\
\
#ENTRYPOINT ["/app/tigrisfs"]\
ENTRYPOINT ["/app/start.sh"]\
#CMD ["timeout", "15m", "python3", "app.py"]\
CMD ["test", "/app/vol"]\
```\
\
```\
#!/bin/bash\
\
# 1. Check if the mount directory exists and is a directory\
if [ ! -d "$2" ]; then\
echo "Mount directory $2 does not exist."\
exit 1\
fi\
\
# 2. Start TigrisFS mount in the BACKGROUND (&)\
# This uses the arguments passed to the script: $1 (bucket) and $2 (mount point)\
echo "Starting TigrisFS mount for $1 at $2..."\
/app/tigrisfs --debug --debug_fuse --debug_s3 "$1" "$2" &\
\
# 4. Wait for the mount to stabilize (Optional but safer for FUSE)\
sleep 5\
ls\
df -h\
\
# 5. Start your main Python application in the FOREGROUND\
# This command will block, keeping the container running.\
echo "Mount established. Starting Python script..."\
python /app/app.py\
\
# 7. Exit with the Python script's exit code\
exit $?\
```\
\
```\
#!/bin/bash\
\
# 1. Check if the mount directory exists and is a directory\
if [ ! -d "$2" ]; then\
echo "Mount directory $2 does not exist."\
exit 1\
fi\
\
# 2. Start TigrisFS mount in the BACKGROUND (&)\
# This uses the arguments passed to the script: $1 (bucket) and $2 (mount point)\
echo "Starting TigrisFS mount for $1 at $2..."\
/app/tigrisfs --debug --debug_fuse --debug_s3 "$1" "$2" &\
\
# 4. Wait for the mount to stabilize (Optional but safer for FUSE)\
sleep 5\
ls\
df -h\
\
# 5. Start your main Python application in the FOREGROUND\
# This command will block, keeping the container running.\
echo "Mount established. Starting Python script..."\
python /app/app.py\
\
# 7. Exit with the Python script's exit code\
exit $?\
```\
\
However, the bucket is still not mounting (as seen by the output of `df -h``df -h`), and `app.py``app.py` cannot read the text file. Does anyone know what I’m missing to make this work?\
\
help\
\
•\
\
[Question about Tigris bucket access and IAM policies](https://community.tigrisdata.com/m/1463626897467510867)\
\
Solved\
\
[Open thread: Question about Tigris bucket access and IAM policies](https://community.tigrisdata.com/m/1463626897467510867)\
\
\
\
[Prof. Columbus Grimes](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 3:10 PM\
\
Hi Tigris community,\
\
I have a question regarding IAM policies.\
\
I currently have an access key that allows me to edit a specific bucket, and I can interact with all resources in that bucket.\
\
Now, if I attach a policy that allows interaction only with a specific path within the bucket, does this policy stack with the existing permissions (and is therefore mostly redundant), or does the policy take precedence?\
\
If the policy takes precedence, then is access to everything allowed by default?\
\
I’m trying to understand the exact behavior so I can safely design workflows with minimal permissions.\
\
Thanks!\
\
help\
\
•\
\
[Tigris webhooks not firing?](https://community.tigrisdata.com/m/1463626834720723038)\
\
[Open thread: Tigris webhooks not firing?](https://community.tigrisdata.com/m/1463626834720723038)\
\
\
\
[King Ward Streich](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 3:10 PM\
\
Are Tigris webhooks currently down for anyone else? According to the logs, webhooks stopped being received sometime between 2025‑08‑15 18:55:34.652235 +00 UTC and 2025‑08‑18 20:00:07.191308 +00 UTC (so between August 15th and August 18th).\
\
help\
\
•\
\
[Can't use the same statics guest\_path for separate url\_prefixes?](https://community.tigrisdata.com/m/1463626813828894810)\
\
[Open thread: Can't use the same statics guest_path for separate url_prefixes?](https://community.tigrisdata.com/m/1463626813828894810)\
\
\
\
[Ms. Rossie Weimann](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 3:10 PM\
\
I originally deployed my app with the configuration set to serve static files from Tigris at one URL prefix, which has been working fine:\
\
```\
[[statics]]\
# Also serve them at the legacy path for the mobile apps\
url_prefix = "/aci/uploads"\
guest_path = "/uploads"\
tigris_bucket = "appname-media"\
```\
\
```\
[[statics]]\
# Also serve them at the legacy path for the mobile apps\
url_prefix = "/aci/uploads"\
guest_path = "/uploads"\
tigris_bucket = "appname-media"\
```\
\
However, I subsequently added a second path for compatibility reasons and it just 404s at the **/uploads** path. Meanwhile **/aci/uploads** is still functioning fine.\
\
```\
[[statics]]\
# Serve media files directly from Fly's web proxy\
url_prefix = "/uploads"\
guest_path = "/uploads"\
tigris_bucket = "appname-media"\
\
[[statics]]\
# Also serve them at the legacy path for the mobile apps\
url_prefix = "/aci/uploads"\
guest_path = "/uploads"\
tigris_bucket = "appname-media"\
```\
\
```\
[[statics]]\
# Serve media files directly from Fly's web proxy\
url_prefix = "/uploads"\
guest_path = "/uploads"\
tigris_bucket = "appname-media"\
\
[[statics]]\
# Also serve them at the legacy path for the mobile apps\
url_prefix = "/aci/uploads"\
guest_path = "/uploads"\
tigris_bucket = "appname-media"\
```\
\
It looks like the 404 is coming from my application server rather than Fly’s edge. So it seems Fly’s edge proxy is ignoring that path and not intercepting the requests for it.\
\
Any help is very welcome.\
\
help\
\
•\
\
[Using fly statics with Tigris serving static assets really slow](https://community.tigrisdata.com/m/1463626625311707230)\
\
Solved\
\
[Open thread: Using fly statics with Tigris serving static assets really slow](https://community.tigrisdata.com/m/1463626625311707230)\
\
\
\
[Prof. Devan Wilderman](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 3:09 PM\
\
We’re using the `[[statics]]``[[statics]]` section to [serve up static assets from tigris](https://fly.io/docs/reference/configuration/#serving-statics-from-tigris-object-storage). However, requests to those static assets take anywhere from 1 seconds to 21 seconds, and it doesn’t seem to get quicker (hoping it would be cached on read).\
\
The pertinent config looks like this:\
\
```\
[[statics]]\
guest_path = "/"\
url_prefix = "/app"\
tigris_bucket = "{bucket-name}"\
index_document = "index.html"\
```\
\
```\
[[statics]]\
guest_path = "/"\
url_prefix = "/app"\
tigris_bucket = "{bucket-name}"\
index_document = "index.html"\
```\
\
Are we missing some cache config on the Tigris or Fly side to make this faster? Or is there a better way to accomplish what we’re doing?\
\
Fly\
\
[App configuration (fly.toml)](https://fly.io/docs/reference/configuration/)\
\
Documentation and guides from the team at Fly.io.\
\
\
\
help\
\
•\
\
[tigris presigned urls give access denied (using ExAws)](https://community.tigrisdata.com/m/1463626541228626086)\
\
[Open thread: tigris presigned urls give access denied (using ExAws)](https://community.tigrisdata.com/m/1463626541228626086)\
\
\
\
[Miss Micaela Kuphal](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 3:09 PM\
\
When I try to upload a presigned URL using ExAws, I get a URL like:\
\
```\
https://(url)?...\
```\
\
```\
https://(url)?...\
```\
\
The image uploads correctly to the bucket, but when I later try to display it on my page I receive an **AccessDenied** error.\
\
The problem is that the generated URL places the bucket name **after** the domain instead of as a sub‑domain.\
\
I can fix this by adding the parameter `virtual_host: true``virtual_host: true` to the `presigned_url``presigned_url` call, which makes the bucket name appear in the sub‑domain, allowing the file to be accessed via the URL. However, using this option causes an error during the upload process:\
\
```\
create:1 Access to XMLHttpRequest at '(url)' from origin 'https://(url)' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.\
app-368ae2410464362c35571e4889b79eb8.js?vsn=d:721 PUT https://[PRESIGNED_URL] net::ERR_FAILED\
(anonymous) @ app-368ae2410464362c35571e4889b79eb8.js?vsn=d:721\
S3 @ app-368ae2410464362c35571e4889b79eb8.js?vsn=d:721\
initAdapterUpload @ app-368ae2410464362c35571e4889b79eb8.js?vsn=d:714\
...\
```\
\
```\
create:1 Access to XMLHttpRequest at '(url)' from origin 'https://(url)' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.\
app-368ae2410464362c35571e4889b79eb8.js?vsn=d:721 PUT https://[PRESIGNED_URL] net::ERR_FAILED\
(anonymous) @ app-368ae2410464362c35571e4889b79eb8.js?vsn=d:721\
S3 @ app-368ae2410464362c35571e4889b79eb8.js?vsn=d:721\
initAdapterUpload @ app-368ae2410464362c35571e4889b79eb8.js?vsn=d:714\
...\
```\
\
Any ideas on how to make this work?\
\
help\
\
•\
\
[unsuccessful command flyctl ext tigris create](https://community.tigrisdata.com/m/1463626478322454692)\
\
Solved\
\
[Open thread: unsuccessful command flyctl ext tigris create](https://community.tigrisdata.com/m/1463626478322454692)\
\
\
\
[Mr. Nolan Cassin](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 3:09 PM\
\
Hello\
\
I've just set up a [fly.io](http://fly.io/) account and added my backend repo. My backend uses S3, however fly.io tries to automatically use Tigris. I don't even want to use Tigris, but there is nowhere in the UI to turn it off, and whenever my deployment gets to provisioning Tigris, it fails with the error: unsuccessful command `flyctl ext tigris create``flyctl ext tigris create`.\
\
How can I resolve this?\
\
I have also tried accepting the Tigris ToC just to at least get my app running with Tigris, but I'm stuck in a broken flow where fly tries to use Tigris because I use S3 and I can't configure it and stop it because it isn’t properly deployed for the first time yet.\
\
Any help is appreciated, thanks.\
\
help\
\
•\
\
[Question about custom domain and t3.storage.dev](https://community.tigrisdata.com/m/1463626373351346352)\
\
[Open thread: Question about custom domain and t3.storage.dev](https://community.tigrisdata.com/m/1463626373351346352)\
\
\
\
[Mr. Johnathon Wehner](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 3:08 PM\
\
I see you guys are now suggesting to use [t3.storage.dev](http://t3.storage.dev/) as the endpoint for anything that doesn’t run inside the Fly network. I have users all around the world accessing my buckets using a custom domain. These custom domains were set with the suggested CNAME which seems to point to [fly.storage.tigris.dev](http://fly.storage.tigris.dev/), which according to the new UI is the endpoint optimized for Fly Apps.\
\
So… how can I use the default endpoint for high performance across all cloud providers and regions when using a custom domain? Or is that not possible? Should I switch to using the new [t3.storage.dev](http://t3.storage.dev/) endpoint instead of my custom domain if I want to take advantage of this high performance?\
\
help\
\
•\
\
[Can you have two Tigris buckets in an app?](https://community.tigrisdata.com/m/1463626311301071051)\
\
Solved\
\
[Open thread: Can you have two Tigris buckets in an app?](https://community.tigrisdata.com/m/1463626311301071051)\
\
\
\
[Mr. Deven Rosenbaum](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 3:08 PM\
\
If I already have one bucket, `my-app-bucket-1``my-app-bucket-1`, in an app, then:\
\
```\
fly --app my-app storage create --name my-app-bucket-2\
```\
\
```\
fly --app my-app storage create --name my-app-bucket-2\
```\
\
returns\
\
```\
Error: A Tigris project named my-app-bucket-1 already exists for app my-app\
```\
\
```\
Error: A Tigris project named my-app-bucket-1 already exists for app my-app\
```\
\
If I can’t have two buckets in the same Fly app, then would there be any problems/conflict with connecting both [TigrisFS](/content/docs/training/tigrisfs/index.html)(for non-database files) and [Litestream](https://litestream.io/)(for a SQLite database that’s at a different local path than the one mounted to TigrisFS) to the same bucket? Would they automatically use differently named objects within the bucket and stay out of each other’s way?\
\
[TigrisFS \| Tigris Object Storage Documentation](/content/docs/training/tigrisfs/index.html)\
\
For AI workloads, most runtimes assume data is accessible via a filesystem. By\
\
\
\
[Litestream](https://litestream.io/)\
\
Litestream is an open-source, real-time streaming replication tool that lets you safely run SQLite applications on a single node.\
\
\
\
help\
\
•\
\
[Cannot access objects from public tigris bucket](https://community.tigrisdata.com/m/1463626268611186860)\
\
Solved\
\
[Open thread: Cannot access objects from public tigris bucket](https://community.tigrisdata.com/m/1463626268611186860)\
\
\
\
[Miss Ivah Schmeler](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 3:08 PM\
\
Hello,\
\
I created a bucket on Tigris and made it public. When I (or my app) navigate to any object of the bucket (images) I get **Access denied (403)**.\
\
Any ideas about what could be going on?\
\
help\
\
•\
\
[Struggle to deploy a new Rails application (Litestream + Tigris)](https://community.tigrisdata.com/m/1463626059059564700)\
\
[Open thread: Struggle to deploy a new Rails application (Litestream + Tigris)](https://community.tigrisdata.com/m/1463626059059564700)\
\
\
\
[Prince Aidan Nicolas](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 3:07 PM\
\
`fly launch``fly launch` is failing for me\
\
This has worked before, I’m wondering if something off.\
\
Here is the application I’m trying to deploy.\
\
Repository: **somaliska\_svenska\_kompis\_klubben**– a project for contributing to its development.\
\
help\
\
•\
\
[Cannot create new Tigris bucket](https://community.tigrisdata.com/m/1463625996010913934)\
\
[Open thread: Cannot create new Tigris bucket](https://community.tigrisdata.com/m/1463625996010913934)\
\
\
\
[Dr. Adalberto Monahan](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 3:07 PM\
\
I am unable to create a new storage bucket through either the UI ( [Sign in to Your Account · Fly](https://fly.io/dashboard/my-org/tigris)) or CLI.\
\
UI error: `There was an error creating your bucket. Please try again.``There was an error creating your bucket. Please try again.`\
\
CLI error: `Error: input:3: createAddOn domain name is required``Error: input:3: createAddOn domain name is required`\
\
In the CLI, I tried both selecting the name and leaving it empty, but the problem remains the same.\
\
help\
\
•\
\
[fly.storage.tigris.dev blocked/flagged by Bitdefender](https://community.tigrisdata.com/m/1463625849503744072)\
\
Solved\
\
[Open thread: fly.storage.tigris.dev blocked/flagged by Bitdefender](https://community.tigrisdata.com/m/1463625849503744072)\
\
\
\
[King Silas Hills](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 3:06 PM\
\
I’ve seen previous posts about [tigris.dev](http://tigris.dev/) being flagged due to a bad actor hosting malicious material there, but it seems this issue is still present.\
\
Also, I only discovered the error today, even though it’s been around for months. I’m using Tigris storage buckets in my app, and Bitdefender on Windows 10 is flagging it (only as of today):\
\
! [image](https://global.discourse-cdn.com/fly1/original/3X/1/8/1882fb561fc976b1b1981f5d3bf3aecb28d76cd4.png)\
\
How can this be fixed? I’ve tried adding exceptions to Bitdefender, but nothing works except disabling all protections. This is really unacceptable… What are the possible work‑arounds?\
\
\
\
help\
\
•\
\
[OBJECT\_CREATED\_PUT on object deletion](https://community.tigrisdata.com/m/1463625807640662168)\
\
[Open thread: OBJECT_CREATED_PUT on object deletion](https://community.tigrisdata.com/m/1463625807640662168)\
\
\
\
[King Ward Streich](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 3:06 PM\
\
When I delete an object from my Tigris bucket, the webhook payload specifies the event as `OBJECT_CREATED_PUT``OBJECT_CREATED_PUT`. Shouldn’t it be `OBJECT_DELETED``OBJECT_DELETED`?\
\
help\
\
•\
\
[Tigris Webhooks and Flycast](https://community.tigrisdata.com/m/1463625764845912066)\
\
Solved\
\
[Open thread: Tigris Webhooks and Flycast](https://community.tigrisdata.com/m/1463625764845912066)\
\
\
\
[King Ward Streich](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 3:06 PM\
\
Are Tigris webhooks able to hit Flycast URLs, or will it result in a DNS resolution failure?\
\
I’m currently spec‑ing out an image processing pipeline, where images get uploaded to Tigris via presigned URLs, get processed by a Fly app only available via Flycast, and then get moved to a final destination bucket. I don’t think I can fully avoid polling, but I’d like to minimize it if I can.\
\
help\
\
•\
\
[Tigris Billing for inbound data from Fly→Tigris](https://community.tigrisdata.com/m/1463625681425535230)\
\
Solved\
\
[Open thread: Tigris Billing for inbound data from Fly→Tigris](https://community.tigrisdata.com/m/1463625681425535230)\
\
\
\
[Prince Laurel Bauch](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 3:05 PM\
\
Hi there! I am migrating a Cloudflare R2 bucket with about 4 TB over to Tigris archived storage. From what I understood, I would not be billed for data transfer from Fly into Tigris.\
\
Currently, I am using Fly machines with rclone to migrate the data, and it appears I am being billed in Fly for the outbound data transfer. Am I missing something?\
\
help\
\
•\
\
[Tigris Consistency Questions](https://community.tigrisdata.com/m/1463625639033831591)\
\
[Open thread: Tigris Consistency Questions](https://community.tigrisdata.com/m/1463625639033831591)\
\
\
\
[Dr. Josiah Tromp](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 3:05 PM\
\
Hi, I am evaluating using Tigris as a distributed storage layer for my application. I plan on storing data in multiple regions globally and will be frequently ‘updating’ objects (new put over already existing objects). I have a few questions about the specifics of Tigris’ multi‑region consistency model.\
\
1. What is the atomicity of a put operation to multiple regions? For example, I try to update an object in the `iad``iad` and `fra``fra` regions. For whatever reason, the put to `fra``fra` fails. _Could_ the `iad``iad` put still be executed? Will the put request report a failure?\
\
2. If the `iad``iad` put still goes through, what happens if I then make a get request in the `fra``fra` region with the `x-tigris-cas: true``x-tigris-cas: true` header set? Would the request get routed to the `iad``iad` region with the stored data that’s been more recently updated? Would Tigris _eventually_ update the existing/outdated stored object in the `fra``fra` region?\
\
3. What is the default behavior for a get request with the `x-tigris-cas: true``x-tigris-cas: true` header when there are multiple copies of data stored? Will it get routed to the closest region with the object stored?\
\
Thanks!\
\
help\
\
•\
\
[How to opt into virtual hosts for existing buckets](https://community.tigrisdata.com/m/1463625577264320552)\
\
[Open thread: How to opt into virtual hosts for existing buckets](https://community.tigrisdata.com/m/1463625577264320552)\
\
\
\
[Dr. Marlon Wolf](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 3:05 PM\
\
I noticed that [Tigris](/content/blog/virtual-hosted-urls/index.html) defaults to virtual hosts for new buckets, but nothing is mentioned about the migration for existing buckets. I tried to interact with one of our existing buckets using a virtual host, but the request fails, so I’d appreciate any pointers to adopt the new convention.\
\
Thanks in advance.\
\
[Moving to Virtual Hosted URLs \| Tigris Object Storage](/content/blog/virtual-hosted-urls/index.html)\
\
We're transitioning to virtual hosted style URLs for all new buckets created after February 19, 2025.\
\
\
\
help\
\
•\
\
[Having troubles with tigris bucket for a few different url\_prefixes](https://community.tigrisdata.com/m/1463625555189432490)\
\
[Open thread: Having troubles with tigris bucket for a few different url_prefixes](https://community.tigrisdata.com/m/1463625555189432490)\
\
\
\
[King Maynard Ernser](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 3:05 PM\
\
I’m having issues serving various static assets (based on the _url\_prefix_) from a single Tigris bucket.\
\
When I define only one `tigris/storage``tigris/storage` rule in the `toml``toml` file, the assets are served from the Tigris bucket.\
\
```\
primary_region = "lhr"\
\
[build]\
\
[http_service]\
internal_port = 3000\
force_https = true\
auto_stop_machines = "stop"\
auto_start_machines = true\
min_machines_running = 0\
processes = ["app"]\
\
[[statics]]\
guest_path = "/client-assets/assets"\
url_prefix = "/assets"\
tigris_bucket = "my-bucket"\
\
[[vm]]\
memory = "1gb"\
cpu_kind = "shared"\
cpus = 1\
```\
\
```\
primary_region = "lhr"\
\
[build]\
\
[http_service]\
internal_port = 3000\
force_https = true\
auto_stop_machines = "stop"\
auto_start_machines = true\
min_machines_running = 0\
processes = ["app"]\
\
[[statics]]\
guest_path = "/client-assets/assets"\
url_prefix = "/assets"\
tigris_bucket = "my-bucket"\
\
[[vm]]\
memory = "1gb"\
cpu_kind = "shared"\
cpus = 1\
```\
\
But when I add an additional Tigris rule, only the second rule takes effect. For example, with this `toml``toml`:\
\
```\
primary_region = "lhr"\
\
[build]\
\
[http_service]\
internal_port = 3000\
force_https = true\
auto_stop_machines = "stop"\
auto_start_machines = true\
min_machines_running = 0\
processes = ["app"]\
\
[[statics]]\
guest_path = "/client-assets/assets"\
url_prefix = "/assets"\
tigris_bucket = "my-bucket"\
\
[[statics]]\
guest_path = "/client-assets/brand"\
url_prefix = "/brand"\
tigris_bucket = "my-bucket"\
\
[[vm]]\
memory = "1gb"\
cpu_kind = "shared"\
cpus = 1\
```\
\
```\
primary_region = "lhr"\
\
[build]\
\
[http_service]\
internal_port = 3000\
force_https = true\
auto_stop_machines = "stop"\
auto_start_machines = true\
min_machines_running = 0\
processes = ["app"]\
\
[[statics]]\
guest_path = "/client-assets/assets"\
url_prefix = "/assets"\
tigris_bucket = "my-bucket"\
\
[[statics]]\
guest_path = "/client-assets/brand"\
url_prefix = "/brand"\
tigris_bucket = "my-bucket"\
\
[[vm]]\
memory = "1gb"\
cpu_kind = "shared"\
cpus = 1\
```\
\
Files from the **brand** folder are served from the Tigris bucket, while those from **assets** are not.\
\
Am I doing something wrong here?\
\
help\
\
•\
\
[Question about bandwidth pricing, Machines and Tigris](https://community.tigrisdata.com/m/1463625513129218084)\
\
[Open thread: Question about bandwidth pricing, Machines and Tigris](https://community.tigrisdata.com/m/1463625513129218084)\
\
\
\
[Mr. Johnathon Wehner](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 3:05 PM\
\
Say I have a web service running on a Fly App that receives files from users and stores them on a Tigris bucket.\
\
How’s the bandwidth pricing calculated and billed for this operation?\
\
According to the [pricing page](https://fly.io/docs/about/pricing/), inbound data is free. So a user uploading a 1‑GB file to the web service won’t be billed.\
\
The docs also say that data transfer to Tigris Object Storage is also free, so the 1‑GB transfer from the Fly machine to the Tigris bucket is also free.\
\
Is this correct?\
\
Are there any billed data transfers I’m missing here?\
\
Thanks\
\
help\
\
•\
\
[Tigris bucket APIs failing?](https://community.tigrisdata.com/m/1463625346308903045)\
\
Solved\
\
[Open thread: Tigris bucket APIs failing?](https://community.tigrisdata.com/m/1463625346308903045)\
\
\
\
[Mr. Immanuel Olson](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 3:04 PM\
\
Is there an outage on Tigris Data? I’m unable to upload content using a previously functional token with a mysterious “dispatch error.” When I sign into the Tigris Storage dashboard, I’m unable to load the bucket and the UI displays “Type error / Unable to load” messages.\
\
help\
\
•\
\
[\[Golang\] PutObject Failing with StatusCode: 501 (NotImplemented)](https://community.tigrisdata.com/m/1463624989772087481)\
\
Solved\
\
[Open thread: [Golang] PutObject Failing with StatusCode: 501 (NotImplemented)](https://community.tigrisdata.com/m/1463624989772087481)\
\
\
\
[Prof. Jennings Hermann](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 3:03 PM\
\
Hello everyone :wave:\
\
I hope you are having a good end to the week. Me, on the other hand, I went on an S3 scavenger hunt :sweat\_smile:\
\
For context, my production code works fine but I haven't run any deployments or dependency upgrades in a few days. Today, I was working on a feature on my local machine and after upgrading my deps (`go get -u ./…``go get -u ./…` and `go mod tidy``go mod tidy`) all my requests to Tigris started failing with the following error:\
\
```\
operation error S3: PutObject, https response error StatusCode: 501, RequestID: 1737729871240111208, HostID: , api error NotImplemented: A header you provided implies functionality that is not implemented”\
```\
\
```\
operation error S3: PutObject, https response error StatusCode: 501, RequestID: 1737729871240111208, HostID: , api error NotImplemented: A header you provided implies functionality that is not implemented”\
```\
\
I tried connecting to a different bucket, changing permissions etc. but with no luck – and the error message isn't very clear as to what is not implemented. However, I came across the AWS S3 Go SDK changelog for v1.73.0:\
\
> **Feature**: S3 client behavior is updated to always calculate a checksum by default for operations that support it (such as PutObject or UploadPart), or require it (such as DeleteObjects). The checksum algorithm used by default now becomes CRC32.\
\
So it seems that the checksum calculation is causing errors on Tigris' side. I fixed the error by requesting the checksum be calculated only when required:\
\
```\
svc := s3.NewFromConfig(config, func(o *s3.Options) {\
o.BaseEndpoint = aws.String(u)\
o.Region = r\
o.RequestChecksumCalculation = aws.RequestChecksumCalculationWhenRequired // new line\
})\
```\
\
```\
svc := s3.NewFromConfig(config, func(o *s3.Options) {\
o.BaseEndpoint = aws.String(u)\
o.Region = r\
o.RequestChecksumCalculation = aws.RequestChecksumCalculationWhenRequired // new line\
})\
```\
\
I am not sure if this is a robust solution as I haven't tested `DeleteObject``DeleteObject` yet, but it's something that might affect people upgrading their dependencies.\
\
Hope this helps :love\_you\_gesture:\
\
help\
\
•\
\
[Supabase Storage → Tigris Issue, "No Such Host"](https://community.tigrisdata.com/m/1463624926262198495)\
\
[Open thread: Supabase Storage → Tigris Issue, "No Such Host"](https://community.tigrisdata.com/m/1463624926262198495)\
\
\
\
[Dr. Rory Heidenreich](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 3:02 PM\
\
I'm looking to move from the S3 compatible Supabase Storage to Tigris Data, but am seeing this error from Tigris' “Enable Data Migration” feature in the web UI:\
\
```\
Get "https://[supabase_bucket_name].[supabase_project_reference_id].co/storage/v1/s3?delimiter=&list-type=2&max-keys=1&prefix=": dial tcp: lookup [supabase_bucket_name].[supabase_project_reference_id].supabase.co on [fdaa::3]:53: no such host\
```\
\
```\
Get "https://[supabase_bucket_name].[supabase_project_reference_id].co/storage/v1/s3?delimiter=&list-type=2&max-keys=1&prefix=": dial tcp: lookup [supabase_bucket_name].[supabase_project_reference_id].supabase.co on [fdaa::3]:53: no such host\
```\
\
Screenshot of set‑up in the UI:\
\
! [CleanShot 2024-10-10 at 14.39.16](https://global.discourse-cdn.com/fly1/original/3X/6/5/65c4ef0beb8ce044016b449b54b673c93c15bc98.jpeg)\
\
I have no issues accessing the Supabase Storage bucket using the S3 credentials via Cyber/Mountain Duck and also using the higher‑level credentials via Supabase’s Python library.\
\
What have I missed?\
\
\
\
help\
\
•\
\
[Using both AWS and Tigris in one application](https://community.tigrisdata.com/m/1463624884260438088)\
\
[Open thread: Using both AWS and Tigris in one application](https://community.tigrisdata.com/m/1463624884260438088)\
\
\
\
[Prof. Macey Cartwright](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 3:02 PM\
\
Much like [this question](https://community.fly.io/t/how-to-handle-two-different-aws-access-key-id-with-aws-and-tigris-object-store/21216/1)… I’m hoping to use AWS _and_ Tigris. How am I supposed to configure the AWS credentials I use to interact with S3 proper, alongside the AWS credentials used to interact with Tigris?\
\
help\
\
•\
\
[automatically adding trailing slashes when serving static files from Tigris S3](https://community.tigrisdata.com/m/1463624716924227655)\
\
[Open thread: automatically adding trailing slashes when serving static files from Tigris S3](https://community.tigrisdata.com/m/1463624716924227655)\
\
\
\
[Prince Jovanny Medhurst](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 3:02 PM\
\
I've used statics to serve static web pages out of Tigris. It works for URLs that end in a slash, but ones that don’t fail, and the logs never see them reaching my Nginx server. Am I wrong about how this works? I expected that incoming requests were first handled by Fly directly, based on my `statics``statics` setting of `tigris_bucket``tigris_bucket`, `index_document``index_document`, etc., and that if there was nothing matching in the bucket, the request would come to my Nginx server. Is that wrong?\
\
My plan is to have Nginx redirect when it receives URLs without trailing slashes, but Nginx has to get control in order to do that.\
\
help\
\
•\
\
[How does Tigris caching work with content-range requests](https://community.tigrisdata.com/m/1463624653615399044)\
\
Solved\
\
[Open thread: How does Tigris caching work with content-range requests](https://community.tigrisdata.com/m/1463624653615399044)\
\
\
\
[Prof. Moses Effertz](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 3:01 PM\
\
I’m curious how content‑range requests work with Tigris caching in other regions.\
\
Let’s say I upload a file in North America and then request only a fraction of the file in Europe. Will the cache only cache the fraction requested in the EU, or will it proactively cache the entire file? If the latter is true, will my content‑range request be delayed while the entire file is copied to the EU, or will I get a response as soon as the partial response is ready?\
\
Thanks!\
\
help\
\
•\
\
[Tigris and egress billing](https://community.tigrisdata.com/m/1463624590730465281)\
\
Solved\
\
[Open thread: Tigris and egress billing](https://community.tigrisdata.com/m/1463624590730465281)\
\
\
\
[Lord Hershel Swift](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 3:01 PM\
\
I’m evaluating tigris (and fly itself) for my upcoming project.\
\
I see on the [tigris docs](/content/docs/pricing/index.html) that there are no egress fees. However, [fly does charge egress fees](https://fly.io/docs/about/pricing/#data-transfer-pricing), and it only calls out that data transfer _to_ tigris is not billed. It’s also unclear on the pricing page for fly tigris:\
\
> This pricing can change as data transfer costs are worked out between Fly.io and Tigris.\
\
So I’m curious, given the following line implying tigris deploys on fly:\
\
> [Tigris](/content/site-root.html) is a globally caching, S3‑compatible object storage service built on Fly.io infrastructure.\
\
Will provisioning tigris storage with `fly storage create``fly storage create` subject the storage to fly’s egress fees? I’m comparing vs. Cloudflare R2 which is already slightly cheaper as below:\
\
**Tigris**\
\
\- Data Storage: $0.02 / GB / month\
\
\- Class A Operations: $5.00 / million requests\
\
\- Class B Operations: $0.50 / million requests\
\
\- Data Transfer (Egress): Free\
\
**Cloudflare R2 (Standard)**\
\
\- Data Storage: $0.015 / GB / month\
\
\- Class A Operations: $4.50 / million requests\
\
\- Class B Operations: $0.36 / million requests\
\
\- Data Transfer (Egress): Free\
\
Assuming egress is free for both, I’d like to go with tigris to have everything contained in fly. But if fly’s egress fees apply, I will likely need to go with R2.\
\
[Pricing \| Tigris Object Storage Documentation](/content/docs/pricing/index.html)\
\
S3-compatible, globally distributed, zero egress fees. Fast, flexible object\
\
\
\
[Tigris \| Multi-cloud Object Storage for AI](/content/site-root.html)\
\
Purpose-built storage infrastructure for AI teams and developers. Get high-performance, portable, and cost-effective storage across any cloud.\
\
\
\
help\
\
•\
\
[Changing a Tigris key's MIME type](https://community.tigrisdata.com/m/1463624422979145739)\
\
Solved\
\
[Open thread: Changing a Tigris key's MIME type](https://community.tigrisdata.com/m/1463624422979145739)\
\
\
\
[Dr. Juvenal Schmitt](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 3:00 PM\
\
I need to be able to change the MIME content type of a key after creating it in Tigris.\
\
The AWS API is extremely poorly designed and doesn’t provide a means of editing metadata of a key after creation; however, one workaround used with S3 is calling `CopyObject``CopyObject` and setting the source and destination to the same key with a new `ContentType``ContentType` specified. This workaround incurs a cost but at least allows the content type to be updated. Unfortunately, this approach does not appear to work with the Tigris API.\
\
Can anyone advise on a way to resolve this or suggest another possible workaround? I’ve been impressed with Tigris so far, but the AWS API (and its periodic divergences from compatibility) are causing issues.\
\
help\
\
•\
\
[Cannot delete an old Fly.io account](https://community.tigrisdata.com/m/1463624380797030433)\
\
[Open thread: Cannot delete an old Fly.io account](https://community.tigrisdata.com/m/1463624380797030433)\
\
\
\
[Prof. Trystan Schaefer](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 3:00 PM\
\
I am trying to delete my old [Fly.io](http://fly.io/) account but it won’t let me due to a linked Tigris bucket that needs to be destroyed. However, every time I attempt to destroy the bucket I get an error even though it appears to exist:\
\
_Error: input:3: deleteAddOn The specified bucket does not exist_\
\
help\
\
•\
\
[Tigris support for lifecycle rules?](https://community.tigrisdata.com/m/1463624339047059568)\
\
Solved\
\
[Open thread: Tigris support for lifecycle rules?](https://community.tigrisdata.com/m/1463624339047059568)\
\
\
\
[King Tyree Reichert](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 3:00 PM\
\
\
\
I see on the [Tigris docs](/content/docs/api/s3/index.html) it supports `PutBucketLifecycleConfiguration``PutBucketLifecycleConfiguration`.\
\
However, when I try to put an expiration lifecycle rule on my bucket I get an error:\
\
```\
<Error><Code>NotImplemented</Code><Message>A header you provided implies functionality that is not implemented</Message><Resource>/</Resource><RequestId>1724964649093304104</RequestId><BucketName>***</BucketName></Error>\
```\
\
```\
<Error><Code>NotImplemented</Code><Message>A header you provided implies functionality that is not implemented</Message><Resource>/</Resource><RequestId>1724964649093304104</RequestId><BucketName>***</BucketName></Error>\
```\
\
Can you please clarify if lifecycle rules are supported and, if so, which rules are supported? \
\
[S3 API Compatibility \| Tigris Object Storage Documentation](/content/docs/api/s3/index.html)\
\
Tigris is compatible with the AWS S3 API. This means that you can use the\
\
\
\
help\
\
•\
\
[How to sync new upload files URL to my database with Tigris?](https://community.tigrisdata.com/m/1463624277478740165)\
\
Solved\
\
[Open thread: How to sync new upload files URL to my database with Tigris?](https://community.tigrisdata.com/m/1463624277478740165)\
\
\
\
[Lord Stewart Bergstrom](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 3:00 PM\
\
Hey I have set up file upload on my app, it works well but I’m not an expert with that. At work with AWS, every time a user uploads to S3 it triggers a Lambda function to update our DB with the new upload file.\
\
How can I achieve this with Tigris?\
\
Should I do it this way?\
\
\- The user gets a signed URL\
\
\- Then the user uploads the file to the signed URL\
\
\- Then the front end calls an endpoint to get the last uploaded file and retrieve the information to be saved in the DB (`GetObjectCommand``GetObjectCommand`)\
\
My app uses Bun, Hono and Turso btw.\
\
I like Fly and Tigris, really easy to use \
\
help\
\
•\
\
[Recursively Download from a Shadow Bucket](https://community.tigrisdata.com/m/1463624150391197890)\
\
[Open thread: Recursively Download from a Shadow Bucket](https://community.tigrisdata.com/m/1463624150391197890)\
\
\
\
[Dr. Bradly Howe](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 2:59 PM\
\
I have a shadow bucket setup that we are using to mirror objects from S3. I need to download all objects under a specific prefix but I get a 404 unless I download a specific object. Is it possible to do this with a shadow bucket?\
\
help\
\
•\
\
[Configuring Tigris via the API](https://community.tigrisdata.com/m/1463624066630942822)\
\
Solved\
\
[Open thread: Configuring Tigris via the API](https://community.tigrisdata.com/m/1463624066630942822)\
\
\
\
[Dr. Bradly Howe](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 2:59 PM\
\
I am attempting to set up and configure a bucket in Tigris using the API. I have a bucket created and am trying to curl it with this:\
\
```\
curl -f https://fly.storage.tigris.dev/mybucket.example.com \\
--aws-sigv4 \\
--user $AWS_ACCESS_KEY_ID:$AWS_SECRET_ACCESS_KEY \\
-X PATCH \\
-H "Content-Type: application/json" \\
-H "Accept: application/json" \\
-H "x-amz-acl: public-read" \\
--data-raw '{"cache_control":"", "website":{"domain_name": "mybucket.example.com"}, "object_regions": "","additional_http_headers":""}' \\
-i\
```\
\
```\
curl -f https://fly.storage.tigris.dev/mybucket.example.com \\
--aws-sigv4 \\
--user $AWS_ACCESS_KEY_ID:$AWS_SECRET_ACCESS_KEY \\
-X PATCH \\
-H "Content-Type: application/json" \\
-H "Accept: application/json" \\
-H "x-amz-acl: public-read" \\
--data-raw '{"cache_control":"", "website":{"domain_name": "mybucket.example.com"}, "object_regions": "","additional_http_headers":""}' \\
-i\
```\
\
However I get the following error from curl:\
\
```\
curl: (22) The requested URL returned error: 403\
curl: (3) URL rejected: Port number was not a decimal number between 0 and 65535\
```\
\
```\
curl: (22) The requested URL returned error: 403\
curl: (3) URL rejected: Port number was not a decimal number between 0 and 65535\
```\
\
I’ve replaced the credentials several times to ensure they are correct and they definitely have admin access to the bucket.\
\
I’m also wondering if I can configure the shadow bucket options via the API, and if so, how?\
\
help\
\
•\
\
[Golang Tigris Secrets](https://community.tigrisdata.com/m/1463624003582296167)\
\
[Open thread: Golang Tigris Secrets](https://community.tigrisdata.com/m/1463624003582296167)\
\
\
\
[Prof. Brendan Abshire](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 2:59 PM\
\
Hi, I am trying to set up Tigris, and I follow along the tutorial displayed on the Tigris page.\
\
I set up the storage, I set up secrets, and I try to do a simple listing of the buckets from Tigris. For some reason that I do not know, Tigris does not read the secrets properly. I have tried printing the secrets myself to see if they are there and they are; I used `fly ssh console -C "printenv"``fly ssh console -C "printenv"`. I then tried to print the secret directly from Go with:\
\
```\
log.Println(os.Getenv("AWS_ACCESS_KEY_ID"))\
```\
\
```\
log.Println(os.Getenv("AWS_ACCESS_KEY_ID"))\
```\
\
and it works.\
\
```\
sdkConfig, err := config.LoadDefaultConfig(context.TODO())\
```\
\
```\
sdkConfig, err := config.LoadDefaultConfig(context.TODO())\
```\
\
→ This fails to get my secrets. Can anyone help me understand why this fails.\
\
```\
sdkConfig, err := config.LoadDefaultConfig(context.TODO())\
if err != nil {\
log.Printf("Couldn't load default configuration. Here's why: %v\n", err)\
return\
}\
\
// Create S3 service client\
svc := s3.NewFromConfig(sdkConfig, func(o *s3.Options) {\
o.BaseEndpoint = aws.String("https://fly.storage.tigris.dev")\
o.Region = "auto"\
})\
\
result, err := svc.ListObjectsV2(context.TODO(), &s3.ListObjectsV2Input{Bucket: aws.String("bucketName")})\
if err != nil {\
log.Printf("Unable to list buckets. Here's why: %v\n", err)\
}\
\
log.Println("Contents:")\
\
for _, b := range result.Contents {\
log.Printf("key=%s size=%d\n", aws.ToString(b.Key), b.Size)\
}\
```\
\
```\
sdkConfig, err := config.LoadDefaultConfig(context.TODO())\
if err != nil {\
log.Printf("Couldn't load default configuration. Here's why: %v\n", err)\
return\
}\
\
// Create S3 service client\
svc := s3.NewFromConfig(sdkConfig, func(o *s3.Options) {\
o.BaseEndpoint = aws.String("https://fly.storage.tigris.dev")\
o.Region = "auto"\
})\
\
result, err := svc.ListObjectsV2(context.TODO(), &s3.ListObjectsV2Input{Bucket: aws.String("bucketName")})\
if err != nil {\
log.Printf("Unable to list buckets. Here's why: %v\n", err)\
}\
\
log.Println("Contents:")\
\
for _, b := range result.Contents {\
log.Printf("key=%s size=%d\n", aws.ToString(b.Key), b.Size)\
}\
```\
\
help\
\
•\
\
[Tigris Regions and x-tigris-regions header](https://community.tigrisdata.com/m/1463623940235595809)\
\
Solved\
\
[Open thread: Tigris Regions and x-tigris-regions header](https://community.tigrisdata.com/m/1463623940235595809)\
\
\
\
[Mr. Adrien Jacobson](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 2:59 PM\
\
Hey!\
\
I have both a request and a question about Tigris regions.\
\
The regions page for Tigris mentions Tigris is deployed in Singapore. I have a server in Singapore which [debug.fly.dev](http://debug.fly.dev/) shows hitting SIN:\
\
```\
=== Headers ===\
Host: debug.fly.dev\
Fly-Request-Id: 01J16MRRX4PZYF27K629PY04A9-sin\
…\
Fly-Region: sin\
```\
\
```\
=== Headers ===\
Host: debug.fly.dev\
Fly-Request-Id: 01J16MRRX4PZYF27K629PY04A9-sin\
…\
Fly-Region: sin\
```\
\
However, in the Grafana Metrics Panel for Tigris I don’t see any requests hitting the `sin``sin` location. It would be really nice if there was more information exposed in Tigris’s response headers (edge location hit, storage location retrieved from) for debugging. Based on the latency (~250 ms) even after a few requests to a 10 KB object, I assume I’m going somewhere else. I do ~1‑2 ms when ICMP pinging the Tigris endpoint directly.\
\
Secondly, I forced my object to be in all regions via the `x-tigris-regions``x-tigris-regions` header, and I see some curious information being returned sometimes:\
\
```\
< x-tigris-regions: fra,syd,sjc,hkg,jnb,lhr,mad,iad,ord,gru,nrt\
```\
\
```\
< x-tigris-regions: fra,syd,sjc,hkg,jnb,lhr,mad,iad,ord,gru,nrt\
```\
\
_Sometimes without `sin``sin`?_\
\
```\
< x-tigris-regions: fra,gru,jnb,nrt,mad,hkg,iad_mr,ord,lhr,syd,sjc_mr\
```\
\
```\
< x-tigris-regions: fra,gru,jnb,nrt,mad,hkg,iad_mr,ord,lhr,syd,sjc_mr\
```\
\
_Sometimes with `_mr``_mr`?_\
\
```\
< x-tigris-regions: fra,sjc_mr,sin,gru,syd,iad,ord,jnb,lhr,nrt,mad\
```\
\
```\
< x-tigris-regions: fra,sjc_mr,sin,gru,syd,iad,ord,jnb,lhr,nrt,mad\
```\
\
_Sometimes `sin``sin` comes back?_\
\
What’s with that, and what does `_mr``_mr` mean?\
\
Thanks for your help!\
\
help\
\
•\
\
[aws s3 ls returns unexpected results in Tigris](https://community.tigrisdata.com/m/1463623815438401813)\
\
[Open thread: aws s3 ls returns unexpected results in Tigris](https://community.tigrisdata.com/m/1463623815438401813)\
\
\
\
[Mrs. Amina Kunde](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 2:58 PM\
\
I ran into some unexpected behavior that might be a bug with Tigris.\
\
I’ve been uploading files to a bucket in Tigris using Elixir and then using the AWS CLI to validate that the files were uploaded successfully. As you know, when you run `aws s3 ls s3://bucket/path/``aws s3 ls s3://bucket/path/` you have to include the trailing slash to have the AWS CLI expand that “directory” and show its contents.\
\
**Typical behavior**\
\
```\
# without trailing slash\
aws s3 ls s3://bucket/path\
PRE path/\
\
# with trailing slash\
aws s3 ls s3://bucket/path/\
file1.json\
file2.json\
...\
file10.json\
```\
\
```\
# without trailing slash\
aws s3 ls s3://bucket/path\
PRE path/\
\
# with trailing slash\
aws s3 ls s3://bucket/path/\
file1.json\
file2.json\
...\
file10.json\
```\
\
This is typically how it works for me with Tigris as well, but I have a case where running `aws s3 ls s3://bucket/path``aws s3 ls s3://bucket/path` without the trailing slash instead shows the first item in that path. Then if I run it again with the trailing slash, I see that first file and all of the other files as well.\
\
**Unexpected behavior**\
\
```\
# without trailing slash\
aws s3 ls s3://bucket/path\
file1.json\
\
# with trailing slash\
aws s3 ls s3://bucket/path/\
file1.json\
file2.json\
...\
file10.json\
```\
\
```\
# without trailing slash\
aws s3 ls s3://bucket/path\
file1.json\
\
# with trailing slash\
aws s3 ls s3://bucket/path/\
file1.json\
file2.json\
...\
file10.json\
```\
\
The bucket and path can be provided privately.\
\
help\
\
•\
\
[Deleting multiple Objects in Tigris](https://community.tigrisdata.com/m/1463623772870545530)\
\
[Open thread: Deleting multiple Objects in Tigris](https://community.tigrisdata.com/m/1463623772870545530)\
\
\
\
[King Gerson Schulist](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 2:58 PM\
\
Yes, a presigned URL can only authorize **one** S3 operation.\
\
The `DeleteObjects``DeleteObjects` API (which deletes several keys in one call) is **not** supported by the presigning helpers, so a URL generated for it cannot be used successfully.\
\
### Why the request fails\
\
When the SDK creates the signature it signs only the headers that are allowed for the operation.\
\
`DeleteObjects``DeleteObjects` requires a request body that contains the list of keys, but a presigned URL can only sign query‑string parameters – it can’t sign the body. Consequently the request you send contains extra headers/body data that weren’t part of the signature, and S3 returns:\
\
```\
There were headers present in the request which were not signed\
```\
\
```\
There were headers present in the request which were not signed\
```\
\
### What you can do\
\
\\* **Delete a single object**– use `GetObjectCommand``GetObjectCommand` or `DeleteObjectCommand``DeleteObjectCommand` with `getSignedUrl``getSignedUrl`.\
\
\\* **Delete multiple objects**– either:\
\
1. **Call the API directly** from a trusted backend (no presigned URL needed), or\
\
2. **Use a POST request with a policy document** that lists the objects to delete. This is more involved and still requires a backend to generate the policy and signature.\
\
###\# Example: delete a single object with a presigned URL\
\
```\
import { getSignedUrl } from "@aws-sdk/s3-request-presigner";\
import { DeleteObjectCommand, S3Client } from "@aws-sdk/client-s3";\
\
const s3 = new S3Client({ region: "us-east-1" });\
\
const url = await getSignedUrl(\
s3,\
new DeleteObjectCommand({\
Bucket: process.env.BUCKET_NAME,\
Key: "path/to/object.txt",\
}),\
{ expiresIn: 3600 } // seconds\
);\
\
// The client can now issue a DELETE request to `url`.\
```\
\
```\
import { getSignedUrl } from "@aws-sdk/s3-request-presigner";\
import { DeleteObjectCommand, S3Client } from "@aws-sdk/client-s3";\
\
const s3 = new S3Client({ region: "us-east-1" });\
\
const url = await getSignedUrl(\
s3,\
new DeleteObjectCommand({\
Bucket: process.env.BUCKET_NAME,\
Key: "path/to/object.txt",\
}),\
{ expiresIn: 3600 } // seconds\
);\
\
// The client can now issue a DELETE request to `url`.\
```\
\
### Bottom line\
\
Presigned URLs cannot be used for `DeleteObjects``DeleteObjects`(multiple‑object delete). Use a server‑side call or a signed POST policy if you need batch deletion.\
\
help\
\
•\
\
[What does Tigris consider a small object?](https://community.tigrisdata.com/m/1463623668147163248)\
\
Solved\
\
[Open thread: What does Tigris consider a small object?](https://community.tigrisdata.com/m/1463623668147163248)\
\
\
\
[Prof. Moses Effertz](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 2:57 PM\
\
In order to evaluate if Tigris would be suited for a project I am working on, I need to know how big a small object can be. Ideally objects up to 8 KiB would be inlined for my use case. Thanks!\
\
help\
\
•\
\
[Upload zip file to Tigris](https://community.tigrisdata.com/m/1463623584554684476)\
\
[Open thread: Upload zip file to Tigris](https://community.tigrisdata.com/m/1463623584554684476)\
\
\
\
[King Gerson Schulist](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 2:57 PM\
\
Hi\
\
Is it possible to upload a zip file from the client/browser (using a presigned URL), which will then be unzipped and each file stored as separate objects in Tigris? The intent is to achieve faster uploads from the client.\
\
help\
\
•\
\
[Tigris Upload Failed to Dispatch](https://community.tigrisdata.com/m/1463623458339688600)\
\
Solved\
\
[Open thread: Tigris Upload Failed to Dispatch](https://community.tigrisdata.com/m/1463623458339688600)\
\
\
\
[King Jayce Stracke](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 2:57 PM\
\
Hi, I’m trying to use Tigris to upload a few images using `aws-sdk-s3``aws-sdk-s3` Rust crate. Here is a snippet:\
\
```\
pub async fn example(\
access_key_id: String,\
secret_access_key: String,\
bucket_name: String,\
key: String,\
data: Vec<u8>,\
) -> Result<()> {\
let creds = Credentials::new(\
access_key_id,\
secret_access_key,\
None,\
None,\
"provider_name",\
);\
\
let config = aws_config::defaults(BehaviorVersion::latest())\
.credentials_provider(creds)\
.region(Region::new("auto"))\
.load()\
.await;\
\
let client = S3Client::new(&config);\
let data = ByteStream::from(data);\
\
client\
.put_object()\
.bucket(bucket_name)\
.key(&key)\
.body(data)\
.send()\
.await\
.map_err(|e| anyhow::anyhow!(e))?;\
\
Ok(())\
}\
```\
\
```\
pub async fn example(\
access_key_id: String,\
secret_access_key: String,\
bucket_name: String,\
key: String,\
data: Vec<u8>,\
) -> Result<()> {\
let creds = Credentials::new(\
access_key_id,\
secret_access_key,\
None,\
None,\
"provider_name",\
);\
\
let config = aws_config::defaults(BehaviorVersion::latest())\
.credentials_provider(creds)\
.region(Region::new("auto"))\
.load()\
.await;\
\
let client = S3Client::new(&config);\
let data = ByteStream::from(data);\
\
client\
.put_object()\
.bucket(bucket_name)\
.key(&key)\
.body(data)\
.send()\
.await\
.map_err(|e| anyhow::anyhow!(e))?;\
\
Ok(())\
}\
```\
\
I’m getting back a dispatch error from the `put_object()``put_object()` call:\
\
```\
Tigris PUT Failed: dispatch failure\
```\
\
```\
Tigris PUT Failed: dispatch failure\
```\
\
I’ve verified that all my credentials are populating from environment variables. This is the signature for `Credentials::new``Credentials::new`:\
\
```\
pub fn new(\
access_key_id: impl Into<String>,\
secret_access_key: impl Into<String>,\
session_token: Option<String>,\
expires_after: Option<SystemTime>,\
provider_name: &'static str,\
) -> Self\
```\
\
```\
pub fn new(\
access_key_id: impl Into<String>,\
secret_access_key: impl Into<String>,\
session_token: Option<String>,\
expires_after: Option<SystemTime>,\
provider_name: &'static str,\
) -> Self\
```\
\
Anyone have an idea of why the dispatch failure may be happening on Tigris?\
\
help\
\
•\
\
[Does Tigris charge for 403/Unauthorized bucket access request?](https://community.tigrisdata.com/m/1463623416287461528)\
\
Solved\
\
[Open thread: Does Tigris charge for 403/Unauthorized bucket access request?](https://community.tigrisdata.com/m/1463623416287461528)\
\
\
\
[King Gerson Schulist](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 2:56 PM\
\
I know Tigris offers that they can cut down the bill in case of an attack, but I’d still like to know if requests that result in a 403, for example, are billed to the user. Here’s an example: [scenario](https://medium.com/@maciej.pocwierz/how-an-empty-s3-bucket-can-make-your-aws-bill-explode-934a383cb8b1).\
\
Also, to clarify on the egress pricing, what are the minority cases you mean when you say:\
\
> we don’t charge for regional data transfer, region‑to‑region data transfer, or data transfer out to the internet (egress) in the majority of use cases\
\
I’d like to know if I have services within [fly.io](http://fly.io/) and Azure, whether a request from Azure Functions will incur an egress fee. It just seems unclear with that statement, and I don’t want a surprise bill since I’m comparing using Tigris with Cloudflare R2 (which, from calculations, appears cheaper than Tigris and Linode/Akamai).\
\
help\
\
•\
\
[POST Policies in Tigris](https://community.tigrisdata.com/m/1463623039026462930)\
\
[Open thread: POST Policies in Tigris](https://community.tigrisdata.com/m/1463623039026462930)\
\
\
\
[King Amari Hoppe](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 2:55 PM\
\
Hi,\
\
I'm trying to implement post policies to enforce a content‑length limit, but receive 405 responses when I upload to any URL I can imagine being correct (I'm using custom domains but have tried [tigris.dev](http://tigris.dev/), with/out object key, etc). Is POST supported yet?\
\
help\
\
•\
\
[Getting Started Using Tigris + .NET AWS SDK](https://community.tigrisdata.com/m/1463622975856050401)\
\
[Open thread: Getting Started Using Tigris + .NET AWS SDK](https://community.tigrisdata.com/m/1463622975856050401)\
\
\
\
[King Alexander Mayert](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 2:55 PM\
\
I’m running into issues with some basic requests using the .NET AWS S3 client and tigris.\
\
The examples only have `ListBuckets``ListBuckets` and `ListObjectsV2``ListObjectsV2` usage and `ListBuckets``ListBuckets` does return my newly created bucket name, so it appears that the client is configured properly (it’s able to get a correct response from the API). However, when I try to `PutObject``PutObject` the request hangs and eventually fails with an `IOException``IOException`“The response ended prematurely”. Not really sure how to begin debugging this one. The request is straightforward with the bucket name, key (`test``test`), and content body (`test``test`).\
\
help\
\
•\
\
[Tigris Base Latency](https://community.tigrisdata.com/m/1463622891861180437)\
\
Solved\
\
[Open thread: Tigris Base Latency](https://community.tigrisdata.com/m/1463622891861180437)\
\
\
\
[Dr. Hilton Emmerich](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 2:54 PM\
\
We’re using Tigris to host web content, mostly pretty small objects (<10 KB). Based on the marketing material I was hoping for low latency, but in my experience even tiny objects (200 bytes) take around 100 ms.\
\
Most of the requests land in the 200–500 ms range:\
\
! [Screenshot 2024-03-22 at 10.54.17](https://global.discourse-cdn.com/fly1/original/3X/e/b/eb5dc46ec637f65bcfb2312f70fcd59ad7dfc01d.png)\
\
The application runs in `ams``ams` and the objects are fetched with plain old `GetObject``GetObject` without any extra options. Before that we used a MinIO instance running on Fly with the same content and usage patterns: the latency in that setup was mostly in the 0–5 ms range.\
\
Just to compare notes: Is this latency to be expected? Is there anything to optimise?\
\
\
\
help\
\
•\
\
[Celery worker](https://community.tigrisdata.com/m/1463622807781900372)\
\
Solved\
\
[Open thread: Celery worker](https://community.tigrisdata.com/m/1463622807781900372)\
\
\
\
[Prince Warren Heidenreich](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 2:54 PM\
\
I have a Django app running on one machine and a Celery worker on another.\
\
The Django app uploads files to a folder, and I need to access these files from the Celery task.\
\
How can I do this? Can files on one machine be accessed from another?\
\
help\
\
•\
\
[Tigris - HTTP range requests!](https://community.tigrisdata.com/m/1463622766413746352)\
\
Solved\
\
[Open thread: Tigris - HTTP range requests!](https://community.tigrisdata.com/m/1463622766413746352)\
\
\
\
[Dr. Jarod Conroy](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 2:54 PM\
\
Does Tigris object storage support HTTP Range requests?\
\
help\
\
•\
\
[Using a custom domain for Tigris storage](https://community.tigrisdata.com/m/1463622682984845596)\
\
[Open thread: Using a custom domain for Tigris storage](https://community.tigrisdata.com/m/1463622682984845596)\
\
\
\
[King Paris Bayer](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 2:54 PM\
\
I’m evaluating using Tigris in a project.\
\
Is it possible to use a custom domain for a Tigris bucket for publicly served buckets?\
\
For example, if I have the link:\
\
```\
https://fly.storage.tigris.dev/my-bucket/my-image.png\
```\
\
```\
https://fly.storage.tigris.dev/my-bucket/my-image.png\
```\
\
Can I use a custom domain to make this URL:\
\
```\
https://images.mydomain.com/my-image.png\
```\
\
```\
https://images.mydomain.com/my-image.png\
```\
\
Can I use a simple `CNAME``CNAME` record on my domain to make this happen, or does Tigris do something to make this not possible?\
\
help\
\
•\
\
[Bucket policy support](https://community.tigrisdata.com/m/1463622577531387975)\
\
Solved\
\
[Open thread: Bucket policy support](https://community.tigrisdata.com/m/1463622577531387975)\
\
\
\
[Prof. Sheridan Klein](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 2:53 PM\
\
Hello! Currently, the documentation states that we can use IAM policies for buckets ( [Authentication & Authorization \| Tigris Object Storage Documentation](/content/docs/concepts/authnz/#authorization/index.html)).\
\
But when I try to do that it gives me the following error:\
\
! [error screenshot](https://global.discourse-cdn.com/fly1/optimized/3X/6/e/6e9a8eb23bbd5c2a9f8ebfdeefd302b06e5e031c_2_690x112.png)\
\
How can I attach policies to buckets? Or create policies using the AWS CLI?\
\
\
\
[Authentication & Authorization \| Tigris Object Storage Documentation](/content/docs/concepts/authnz/index.html)\
\
Tigris, being S3-compatible, offers S3-supported authentication and\
\
\
\
help\
\
•\
\
[Fly secrets](https://community.tigrisdata.com/m/1463622493385265331)\
\
[Open thread: Fly secrets](https://community.tigrisdata.com/m/1463622493385265331)\
\
\
\
[Prince Terrill Treutel](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 2:53 PM\
\
Hey, I’m relatively new to Fly and I’m encountering a basic issue. I’m using Tigris for data storage, which sets all database values as Fly secrets by default, so I can’t just copy‑paste them. I need these values to configure my site to send and receive data. I’ve read the docs on secrets, and they only explain how to set them, not how to use them in code. How do I use secrets? Do I need to import something or run a special command? Any help is appreciated.\
\
help\
\
•\
\
[Feature Request: flyctl storage attach/detatch](https://community.tigrisdata.com/m/1463622430798123204)\
\
[Open thread: Feature Request: flyctl storage attach/detatch](https://community.tigrisdata.com/m/1463622430798123204)\
\
\
\
[Prof. Grayce Upton](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 2:53 PM\
\
The option to run something like **attach** and **detach**, similar to Postgres, would be a nice QoL improvement for using the Tigris buckets or moving a bucket from one project to another from the command line.\
\
help\
\
•\
\
[fly storage list doesn't include buckets created in the web dashboard](https://community.tigrisdata.com/m/1463622347125690418)\
\
[Open thread: fly storage list doesn't include buckets created in the web dashboard](https://community.tigrisdata.com/m/1463622347125690418)\
\
\
\
[Mrs. Amina Kunde](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 2:52 PM\
\
I initially created my bucket using `fly storage create``fly storage create`. After that, I created buckets using the dashboard. I noticed today that those extra buckets don’t appear in `fly storage list``fly storage list` output, and I believe they need to in order for me to delete them.\
\
help\
\
•\
\
[Error copying object in Tigris](https://community.tigrisdata.com/m/1463622221074272405)\
\
Solved\
\
[Open thread: Error copying object in Tigris](https://community.tigrisdata.com/m/1463622221074272405)\
\
\
\
[Mrs. Amina Kunde](https://community.tigrisdata.com/u/1463621808036122728) 1/21/26, 2:52 PM\
\
I have run into a problem doing a copy in Tigris. I’m using Elixir with the latest versions of `ex_aws``ex_aws` and `ex_aws_s3``ex_aws_s3`.\
\
```\
from_bucket = "my-bucket"\
to_bucket = from_bucket\
from_key = "landing/file.txt"\
to_key = "archive/file.txt"\
\
ExAws.S3.put_object_copy(\
to_bucket,\
to_key,\
from_bucket,\
from_key\
)\
|> ExAws.request()\
```\
\
```\
from_bucket = "my-bucket"\
to_bucket = from_bucket\
from_key = "landing/file.txt"\
to_key = "archive/file.txt"\
\
ExAws.S3.put_object_copy(\
to_bucket,\
to_key,\
from_bucket,\
from_key\
)\
|> ExAws.request()\
```\
\
Running this in S3 works fine. In Tigris I get 10 failed attempts and then this error:\
\
```\
{:error,\
{:http_error, 500,\
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error><Code>InternalError</Code><Message>We encountered an internal errors, please try again.</Message><Resource>/my-bucket/archive/file.txt</Resource><RequestId>...</RequestId><Key>archive/file.txt</Key><BucketName>my-bucket</BucketName></Error>"}}\
```\
\
```\
{:error,\
{:http_error, 500,\
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error><Code>InternalError</Code><Message>We encountered an internal errors, please try again.</Message><Resource>/my-bucket/archive/file.txt</Resource><RequestId>...</RequestId><Key>archive/file.txt</Key><BucketName>my-bucket</BucketName></Error>"}}\
```\
\
Other operations have been working with this bucket, so it doesn’t seem to be a credentials issue.\
\
```\
Application.get_all_env :ex_aws\
[\
s3: [scheme: "https://", host: "fly.storage.tigris.dev", region: "auto"],\
region: [{:system, "AWS_REGION"}, :instance_role],\
debug_requests: true,\
secret_access_key: "...",\
json_codec: Jason,\
access_key_id: "..."\
]\
```\
\
```\
Application.get_all_env :ex_aws\
[\
s3: [scheme: "https://", host: "fly.storage.tigris.dev", region: "auto"],\
region: [{:system, "AWS_REGION"}, :instance_role],\
debug_requests: true,\
secret_access_key: "...",\
json_codec: Jason,\
access_key_id: "..."\
]\
```\
\
help\
\
•\
\
[When I upload data to Tigris, where is it stored?](https://community.tigrisdata.com/m/1463205793405861999)\
\
Solved\
\
[Open thread: When I upload data to Tigris, where is it stored?](https://community.tigrisdata.com/m/1463205793405861999)\
\
\
\
[Twi](https://community.tigrisdata.com/u/201841370023985153) 1/20/26, 11:17 AM\
\
I'm looking at using Tigris for something but I'm wondering where my data actually gets uploaded when I upload it. How do I tell where things get stored and how can I influence that so that EU data is only stored in the EU?\
\
Tigris Discord Server