CINXE.COM
<!doctype html> <html lang="en" dir="ltr" class="blog-wrapper blog-list-page plugin-blog plugin-id-default" data-has-hydrated="false"> <head> <meta charset="UTF-8"> <meta name="generator" content="Docusaurus v3.1.1"> <title data-rh="true">Tigris Blog | Tigris Object Storage</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://www.tigrisdata.com/blog/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" property="og:title" content="Tigris Blog | Tigris Object Storage"><meta data-rh="true" name="description" content="A blog dedicated to all things storage!"><meta data-rh="true" property="og:description" content="A blog dedicated to all things storage!"><meta data-rh="true" name="docusaurus_tag" content="blog_posts_list"><meta data-rh="true" name="docsearch:docusaurus_tag" content="blog_posts_list"><link data-rh="true" rel="icon" href="/blog/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://www.tigrisdata.com/blog/"><link data-rh="true" rel="alternate" href="https://www.tigrisdata.com/blog/" hreflang="en"><link data-rh="true" rel="alternate" href="https://www.tigrisdata.com/blog/" hreflang="x-default"><script data-rh="true">function insertBanner(){var n=document.createElement("div");n.id="__docusaurus-base-url-issue-banner-container";n.innerHTML='\n<div id="__docusaurus-base-url-issue-banner" style="border: thick solid red; background-color: rgb(255, 230, 179); margin: 20px; padding: 20px; font-size: 20px;">\n <p style="font-weight: bold; font-size: 30px;">Your Docusaurus site did not load properly.</p>\n <p>A very common reason is a wrong site <a href="https://docusaurus.io/docs/docusaurus.config.js/#baseUrl" style="font-weight: bold;">baseUrl configuration</a>.</p>\n <p>Current configured baseUrl = <span style="font-weight: bold; color: red;">/blog/</span> </p>\n <p>We suggest trying baseUrl = <span id="__docusaurus-base-url-issue-banner-suggestion-container" style="font-weight: bold; color: green;"></span></p>\n</div>\n',document.body.prepend(n);var e=document.getElementById("__docusaurus-base-url-issue-banner-suggestion-container"),s=window.location.pathname,o="/"===s.substr(-1)?s:s+"/";e.innerHTML=o}document.addEventListener("DOMContentLoaded",(function(){void 0===window.docusaurus&&insertBanner()}))</script><link rel="alternate" type="application/rss+xml" href="/blog/rss.xml" title="Tigris Object Storage RSS Feed"> <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Tigris Object Storage Atom Feed"> <link rel="alternate" type="application/json" href="/blog/feed.json" title="Tigris Object Storage JSON Feed"> <link rel="preconnect" href="https://www.google-analytics.com"> <link rel="preconnect" href="https://www.googletagmanager.com"> <script async src="https://www.googletagmanager.com/gtag/js?id=G-GW2DNH9EW4"></script> <script>function gtag(){dataLayer.push(arguments)}window.dataLayer=window.dataLayer||[],gtag("js",new Date),gtag("config","G-GW2DNH9EW4",{anonymize_ip:!0})</script> <link rel="preconnect" href="https://ph.tigrisdata.com"> <script>!function(t,e){var o,p,i,n;e.__SV||(window.posthog=e,e._i=[],e.init=function(r,s,a){function c(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(i=t.createElement("script")).type="text/javascript",i.async=!0,i.src=s.api_host+"/static/array.js",(n=t.getElementsByTagName("script")[0]).parentNode.insertBefore(i,n);var _=e;for(void 0!==a?_=e[a]=[]:a="posthog",_.people=_.people||[],_.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},_.people.toString=function(){return _.toString(1)+".people (stub)"},o="capture identify alias people.set people.set_once set_config register register_once unregister opt_out_capturing has_opted_out_capturing opt_in_capturing reset".split(" "),p=0;p<o.length;p++)c(_,o[p]);e._i.push([r,s,a])},e.__SV=1)}(document,window.posthog||[]),posthog.init("phc_6a2zd9w9hGzIqYl527bL4dXk3Wz8J9pEHyXTwP1hHq4",{api_host:"https://ph.tigrisdata.com",opt_in_site_apps:!0,id:"default"})</script><link rel="stylesheet" href="/blog/assets/css/styles.3340e877.css"> <script src="/blog/assets/js/runtime~main.834be7a5.js" defer="defer"></script> <script src="/blog/assets/js/main.c666a4f4.js" defer="defer"></script> </head> <body class="navigation-with-keyboard"> <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"dark")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a href="https://www.tigrisdata.com" target="_self" rel="noopener noreferrer" class="navbar__brand"><div class="navbar__logo"><img src="/blog/logo/light.png" alt="Tigris Blog" class="themedComponent_mlkZ themedComponent--light_NVdE" height="26px"><img src="/blog/logo/dark.png" alt="Tigris Blog" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="26px"></div></a><a href="https://www.tigrisdata.com/docs/" target="_self" rel="" class="navbar__item navbar__link disable-external-icon">Docs<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a><a href="https://www.tigrisdata.com/docs/overview/" target="_self" rel="" class="navbar__item navbar__link disable-external-icon">Overview<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a><a href="https://www.tigrisdata.com/docs/about/" target="_self" rel="" class="navbar__item navbar__link disable-external-icon">About<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a><a href="https://www.tigrisdata.com/docs/get-started/" target="_self" rel="" class="navbar__item navbar__link disable-external-icon">Get Started<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a><a href="https://www.tigrisdata.com/docs/sdks/fly/" target="_self" rel="" class="navbar__item navbar__link disable-external-icon">Fly.io<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a><a href="https://www.tigrisdata.com/docs/sdks/s3/" target="_self" rel="" class="navbar__item navbar__link disable-external-icon">AWS S3 SDKs<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a><a href="https://www.tigrisdata.com/docs/migration/" target="_self" rel="" class="navbar__item navbar__link disable-external-icon">Migration<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/blog/">Blog</a><a href="https://www.tigrisdata.com/docs/pricing/" target="_self" rel="" class="navbar__item navbar__link disable-external-icon">Pricing<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></div><div class="navbar__items navbar__items--right"><a href="https://twitter.com/TigrisData" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link pseudo-icon twitter-icon"></a><a href="https://console.tigris.dev/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link wc-portal-signup wc-portal-link">Dashboard<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="Switch between dark and light mode (currently dark mode)" aria-label="Switch between dark and light mode (currently dark mode)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0"><div class="container margin-vert--lg"><div class="row"><aside class="col col--3"><nav class="sidebar_re4s thin-scrollbar" aria-label="Blog recent posts navigation"><div class="sidebarItemTitle_pO2u margin-bottom--md">All our posts</div><ul class="sidebarItemList_Yudw clean-list"><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/pullthru-cache/">Setting up a Docker Hub pull-through cache with Tigris</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/virtual-hosted-urls/">Moving to Virtual Hosted URLs</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/ai-left-pad/">AI’s Impending Left-pad Scenario</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/thoughts-deepseek-r1/">DeepSeek R1 is good enough</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/tigris-fixes-s3-libs/">Tigris now supports recent releases of the S3 SDK</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/chonky-models/">How do large language models get so large?</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/downgrade-py-js/">If you’ve upgraded boto3 or the JavaScript S3 client in the last week, uploading files won’t work. Here’s how to fix it.</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/tigris-filesystem/">Using Tigris as a Filesystem</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/case-study-beam/">How Beam runs GPUs anywhere</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/training-any-cloud/">Training with Big Data on Any Cloud</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/nomadic-compute/">Nomadic Infrastructure Design for AI Workloads</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/tigris-supports-storage-tiers/">Tigris supports Storage Tiers</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/how-we-built-object-notifications/">How we built object notifications in Tigris</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/docker-registry-at-home/">Becoming your own Docker Registry with Tigris</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/availability-metrics-public/">We're making our availability metrics public</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/case-study-falai/">How fal.ai offers the fastest generative ai in the world</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/shadow-bucket-thumbnails/">Using Shadow Buckets for Fun and Thumbnails</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/s3-conditional-writes/">What’s the Big Deal with Conditional Writes Support in S3?</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/metadata-quering-with-elixir/">Metadata Querying for Object Storage feat. Elixir</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/fly-tigris-juicefs/">Sharing your Ollama models between Fly Machines using JuiceFS and Tigris</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/eager-and-lazy-caching/">Eager & Lazy Caching feat. Elixir</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/enabling-billing-for-tigris-in-july/">We're enabling billing for Tigris in July</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/ai-image-generator-with-stability-and-tigris/">AI Image Generator with Stability and Tigris</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/tigris-vs-s3-cloudfront/">Tigris vs. S3 & Cloudfront</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/a16z-round-press-release/">Announcing Tigris Seed Round led by Andreessen Horowitz</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/object-storage-public-beta/">Tigris, the globally distributed S3-compatible object storage</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/data-layer-foundationdb/">How we built our metadata layer on FoundationDB</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/tigris-authentication-authorization/">Tigris's object store's authentication & authorization</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/foundationdb-meetup-indexes-talk/">A developer-driven approach to building secondary indexes presentation</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/client-side-encryption/">Navigating Client-Side Encryption</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/backing-up-foundationdb/">Backing up FoundationDB</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/srp/">SRP Demystified: Strengthening Authentication in the Digital Age</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/transaction-internals-tigris/">Tigris transaction internals</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/building-a-database-using-foundationdb/">Skipping the boring parts of building a storage platform using FoundationDB</a></li></ul></nav></aside><main class="col col--7" itemscope="" itemtype="https://schema.org/Blog"><article class="margin-bottom--xl" itemprop="blogPost" itemscope="" itemtype="https://schema.org/BlogPosting"><meta itemprop="description" content="A pull-through cache is a local cache of Docker images that can be used to speed up deployments and defend against the upcoming rate limit decreases for the Docker Hub. Learn how to make one on top of Tigris! "><link itemprop="image" href="https://www.tigrisdata.com/blog/assets/images/prone-tiger-vibe-66cd6f13352c4d5f3d0c36bcf514a683.webp"><meta itemprop="keywords" content="docker,docker hub,pull-through cache"><header><h2 class="title_f1Hy" itemprop="headline"><a itemprop="url" href="/blog/pullthru-cache/">Setting up a Docker Hub pull-through cache with Tigris</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2025-02-25T00:00:00.000Z" itemprop="datePublished">February 25, 2025</time> · <!-- -->5 min read</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--6 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://xeiaso.net" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo" src="https://avatars.githubusercontent.com/u/529003?v=4" alt="Xe Iaso" itemprop="image"></a><div class="avatar__intro" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><div class="avatar__name"><a href="https://xeiaso.net" target="_blank" rel="noopener noreferrer" itemprop="url"><span itemprop="name">Xe Iaso</span></a></div><small class="avatar__subtitle" itemprop="description">Senior Cloud Whisperer</small></div></div></div></div></header><div class="markdown" itemprop="articleBody"><p>The Docker Hub is going to drastically decrease the rate limits for free accounts on April first. Are you ready for those changes? Here’s a high level overview of <a href="https://docs.docker.com/docker-hub/usage/" target="_blank" rel="noopener noreferrer">the rate limit changes we’re about to have</a>:</p> <table><thead><tr><th style="text-align:left">Account type</th><th style="text-align:left">Old rate limit</th><th style="text-align:left">New rate limit (April 1st)</th></tr></thead><tbody><tr><td style="text-align:left">Free, authenticated</td><td style="text-align:left">200 image pulls per hour</td><td style="text-align:left">100 image pulls per hour</td></tr><tr><td style="text-align:left">Free, unauthenticated</td><td style="text-align:left">100 image pulls per hour</td><td style="text-align:left">10 image pulls per hour (per IPv4 address or IPv6 /64 subnet)</td></tr></tbody></table> <p>What if you could easily cache images so these rate limits don’t impact your workloads? Today I’m going to show you how you can set up your own pull-through cache of the docker hub so that your workloads only have to download images once.</p></div><footer class="row docusaurus-mt-lg"><div class="col col--9"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/docker/">docker</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/tigris/">tigris</a></li></ul></div><div class="col text--right col--3"><a aria-label="Read more about Setting up a Docker Hub pull-through cache with Tigris" href="/blog/pullthru-cache/"><b>Read More</b></a></div></footer></article><article class="margin-bottom--xl" itemprop="blogPost" itemscope="" itemtype="https://schema.org/BlogPosting"><meta itemprop="description" content="We’re transitioning to virtual hosted style URLs for all new buckets created after February 19, 2025. "><meta itemprop="keywords" content="object storage,blob storage,s3"><header><h2 class="title_f1Hy" itemprop="headline"><a itemprop="url" href="/blog/virtual-hosted-urls/">Moving to Virtual Hosted URLs</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2025-02-19T00:00:00.000Z" itemprop="datePublished">February 19, 2025</time> · <!-- -->3 min read</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--6 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://www.linkedin.com/in/katieschilling" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo" src="https://avatars.githubusercontent.com/u/8411213?s=400&u=762567c65decb82e1433a7d1c42a2ffdcc59a125&v=4" alt="Katie Schilling" itemprop="image"></a><div class="avatar__intro" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><div class="avatar__name"><a href="https://www.linkedin.com/in/katieschilling" target="_blank" rel="noopener noreferrer" itemprop="url"><span itemprop="name">Katie Schilling</span></a></div><small class="avatar__subtitle" itemprop="description">DevRel Enthusiast</small></div></div></div></div></header><div class="markdown" itemprop="articleBody"><p>We’re transitioning to virtual hosted style URLs for all new buckets created after February 19, 2025. For new buckets, we will stop supporting path style URLs. Buckets created before February 19, 2025 will continue to work with either path style or virtual host style URLs.</p> <p>The path style URL looks like this: <code>https://fly.storage.tigris.dev/tigris-example/bar.txt</code></p> <p>The virtual host style URL looks like this: <code>https://tigris-example.fly.storage.tigris.dev/bar.txt</code></p> <p>With the path style URL, the subdomain is always <code>fly.storage.tigris.dev</code>. By moving to virtual host style URLs, the subdomain is specific to the bucket. This additional specificity allows us to make some key improvements for security and scalability.</p> <h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-make-this-change-now">Why make this change now?<a href="#why-make-this-change-now" class="hash-link" aria-label="Direct link to Why make this change now?" title="Direct link to Why make this change now?"></a></h2> <p>Recently some ISPs blocked the Tigris subdomain after <a href="https://status.tigris.dev/incidents/01JKCBMAVT1W09PGVEAB4XCWMZ" target="_blank" rel="noopener noreferrer">malicious content was briefly shared</a> using our platform. Though we removed the malicious content, the subdomain was the common denominator across several reports and added to blocklist maintained by security vendors. This block of our domain resulted in failed downloads on several ISPs with unclear error messages. Either the DNS resolved to another IP not owned by Tigris, or there were connection errors that implied a network issue. We’re sure this was frustrating for folks to debug.</p> <p>We have been working with the security vendors to remove our domain from their blocklists. However, the long term solution is to move to virtual hosted style URLs so that the subdomains are no longer the common denominator when identifying content.</p> <h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-does-this-impact-your-code">How does this impact your code?<a href="#how-does-this-impact-your-code" class="hash-link" aria-label="Direct link to How does this impact your code?" title="Direct link to How does this impact your code?"></a></h2> <p>You’ll need to update your code anywhere you have path based access like for presigned URLs. You’ll also need to configure your S3 client libraries to use the virtual hosted style URL. Some examples are below. If we’ve missed your framework, please reach out, and we’ll help.</p> <div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">Python</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Go</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">.NET</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Ruby</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">JavaScript</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Elixir</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">svc </span><span class="token operator">=</span><span class="token plain"> boto3</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">client</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'s3'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> endpoint_url</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">'https://fly.storage.tigris.dev'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> config</span><span class="token operator">=</span><span class="token plain">Config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">s3</span><span class="token operator">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string" style="color:rgb(255, 121, 198)">'addressing_style'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'virtual'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">sdkConfig</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> err </span><span class="token operator">:=</span><span class="token plain"> config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">LoadDefaultConfig</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">ctx</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> err </span><span class="token operator">!=</span><span class="token plain"> </span><span class="token boolean">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Fatalf</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Couldn't load default configuration. Here's why: %v"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> err</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// Create S3 service client</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">svc </span><span class="token operator">:=</span><span class="token plain"> s3</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">NewFromConfig</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">sdkConfig</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">func</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">o </span><span class="token operator">*</span><span class="token plain">s3</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Options</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> o</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">BaseEndpoint </span><span class="token operator">=</span><span class="token plain"> aws</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">String</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"https://fly.storage.tigris.dev"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> o</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Region </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"auto"</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> o</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">UsePathStyle </span><span class="token operator">=</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">IAmazonS3 s3Client = new AmazonS3Client(</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> new AmazonS3Config {</span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> ForcePathStyle = false,</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ServiceURL = "https://fly.storage.tigris.dev"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">);</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-ruby codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ruby codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">s3 </span><span class="token operator">=</span><span class="token plain"> Aws</span><span class="token double-colon punctuation" style="color:rgb(248, 248, 242)">::</span><span class="token constant" style="color:rgb(189, 147, 249)">S3</span><span class="token double-colon punctuation" style="color:rgb(248, 248, 242)">::</span><span class="token class-name">Client</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token symbol" style="color:rgb(248, 248, 242)">region</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:rgb(255, 121, 198)">"auto"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token symbol" style="color:rgb(248, 248, 242)">endpoint</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:rgb(255, 121, 198)">"https://fly.storage.tigris.dev"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token symbol" style="color:rgb(248, 248, 242)">force_path_style</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-jsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-jsx codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token constant" style="color:rgb(189, 147, 249)">S3</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">S3Client</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token literal-property property">region</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"auto"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token literal-property property">endpoint</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"https://fly.storage.tigris.dev"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token literal-property property">s3ForcePathStyle</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">config :ex_aws, :s3,</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> scheme: "https://",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> host: "fly.storage.tigris.dev",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> region: "auto",</span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> virtual_host: true</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>NOTE: There is a <a href="https://github.com/ex-aws/ex_aws/issues/1119" target="_blank" rel="noopener noreferrer">known bug</a> with ex-aws that prevents bucket-less calls like ListBuckets from working, however most other calls work.</p></div></div></div> <p>With this move to virtual hosted style URLs, we’re undoubtedly going to break some existing workflows as new buckets are created. If this creates a hardship on you, please contact us at <a href="mailto:help@tigrisdata.com" target="_blank" rel="noopener noreferrer">help@tigrisdata.com</a> and we'll find a solution.</p> <div><div><div class="is--color_gradient_back"><div class="sl_card_m-2 card_static cta-flex"><div class="cta-margin-left"><h1 class="sl_title_m fix-1px">Want to try Tigris?</h1><p>Make a bucket and store your models, training data, and artifacts across the globe! No egress fees.</p></div><div class="cta-flex-item cta-margin-right"><div style="white-space:nowrap"><a href="https://www.tigrisdata.com/docs/get-started/" class="cta-link"><div>I want that!<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="icon-margin iconExternalLink_node_modules-@docusaurus-theme-classNameic-lib-theme-Icon-ExternalLink-styles-module"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></div></a></div></div></div></div></div></div></div><footer class="row docusaurus-mt-lg"><div class="col"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/s-3/">s3</a></li></ul></div></footer></article><article class="margin-bottom--xl" itemprop="blogPost" itemscope="" itemtype="https://schema.org/BlogPosting"><meta itemprop="description" content="Your AI workflows rely on models that other people post on the Internet. How can you be sure that they'll stay up? Today Xe covers the history of the infamous left-pad incident of 2016 and how it could happen again with AI. "><link itemprop="image" href="https://www.tigrisdata.com/blog/assets/images/the-server-on-fire-7aa9a3a251bcc5c5e16d5cfd39420e83.webp"><meta itemprop="keywords" content="object storage,blob storage,s3,ai,architecture"><header><h2 class="title_f1Hy" itemprop="headline"><a itemprop="url" href="/blog/ai-left-pad/">AI’s Impending Left-pad Scenario</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2025-02-11T00:00:00.000Z" itemprop="datePublished">February 11, 2025</time> · <!-- -->9 min read</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--6 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://xeiaso.net" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo" src="https://avatars.githubusercontent.com/u/529003?v=4" alt="Xe Iaso" itemprop="image"></a><div class="avatar__intro" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><div class="avatar__name"><a href="https://xeiaso.net" target="_blank" rel="noopener noreferrer" itemprop="url"><span itemprop="name">Xe Iaso</span></a></div><small class="avatar__subtitle" itemprop="description">Senior Cloud Whisperer</small></div></div></div></div></header><div class="markdown" itemprop="articleBody"><p><img decoding="async" loading="lazy" alt="A cartoon tiger desperately runs away from a datacentre fire" src="/blog/assets/images/the-server-on-fire-7aa9a3a251bcc5c5e16d5cfd39420e83.webp" width="1280" height="715" class="img_ev3q"></p> <center><small><em><p>A cartoon tiger desperately runs away from a datacentre fire. Image generated using Flux [pro].</p></em></small></center> <p>The software ecosystem is built on a bedrock of implicit trust. We trust the software won’t have deliberately placed security vulnerabilities and won’t be yanked away offline without warning. AI models aren’t exactly software, but they’re distributed using a lot of the same platforms and technology as software. Thus, people assume they’re distributed using the same social contract as with software.</p> <p>The AI ecosystem has a lot of the same distribution and trust challenges as software ecosystems do, but with much larger blobs of data that are harder to introspect. There are fears that something bad is going to happen with some large model and create a splash even greater than the infamous left-pad incident of 2016. These kinds of attacks seem unthinkable, but are inevitable.</p> <p>How can you defend against AI supply-chain attacks? What are the risks? Today I’m going to cover what we can learn from the left-pad incident and how making a copy of the models you depend on can make your products more resilient.</p></div><footer class="row docusaurus-mt-lg"><div class="col col--9"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/ai/">ai</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/left-pad/">left-pad</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/architecture/">architecture</a></li></ul></div><div class="col text--right col--3"><a aria-label="Read more about AI’s Impending Left-pad Scenario" href="/blog/ai-left-pad/"><b>Read More</b></a></div></footer></article><article class="margin-bottom--xl" itemprop="blogPost" itemscope="" itemtype="https://schema.org/BlogPosting"><meta itemprop="description" content="DeepSeek R1 is a frontier-grade reasoning model that you can run on your own hardware. In this article, Xe digs through the papers and slices past the hype to explain what DeepSeek R1 really gives users and how the model is revolutionary for what it is. "><link itemprop="image" href="https://www.tigrisdata.com/blog/assets/images/tiger-surfing-afe7600fbd8f48e34febd8ded2432cb1.webp"><meta itemprop="keywords" content="object storage,blob storage,s3,ai,architecture"><header><h2 class="title_f1Hy" itemprop="headline"><a itemprop="url" href="/blog/thoughts-deepseek-r1/">DeepSeek R1 is good enough</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2025-01-29T00:00:00.000Z" itemprop="datePublished">January 29, 2025</time> · <!-- -->19 min read</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--6 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://xeiaso.net" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo" src="https://avatars.githubusercontent.com/u/529003?v=4" alt="Xe Iaso" itemprop="image"></a><div class="avatar__intro" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><div class="avatar__name"><a href="https://xeiaso.net" target="_blank" rel="noopener noreferrer" itemprop="url"><span itemprop="name">Xe Iaso</span></a></div><small class="avatar__subtitle" itemprop="description">Senior Cloud Whisperer</small></div></div></div></div></header><div class="markdown" itemprop="articleBody"><p><img decoding="async" loading="lazy" alt="A majestic blue tiger surfing on the back of a killer whale. The image evokes Ukiyo-E style framing." src="/blog/assets/images/tiger-surfing-afe7600fbd8f48e34febd8ded2432cb1.webp" width="1280" height="714" class="img_ev3q"></p> <center><small><em><p>A majestic blue tiger surfing on the back of a killer whale. The image evokes Ukiyo-E style framing. Image generated using Flux [pro].</p></em></small></center> <p>DeepSeek R1 is a mixture of experts reasoning frontier AI model; it was released by DeepSeek on <a href="https://api-docs.deepseek.com/news/news250120" target="_blank" rel="noopener noreferrer">January 20th, 2025</a>. Along with the model being available by <a href="https://api-docs.deepseek.com/" target="_blank" rel="noopener noreferrer">DeepSeek's API</a>, they released the <a href="https://huggingface.co/deepseek-ai/DeepSeek-R1" target="_blank" rel="noopener noreferrer">model weights on HuggingFace</a> and <a href="https://arxiv.org/abs/2501.12948" target="_blank" rel="noopener noreferrer">a paper about how they got it working</a>.</p> <p>DeepSeek R1 is a <a href="https://huggingface.co/blog/moe" target="_blank" rel="noopener noreferrer">Mixture of Experts</a> model. This means that instead of all of the model weights being trained and used at the same time, the model is broken up into 256 "experts" that each handle different aspects of the response. This doesn't mean that one "expert" is best at philosophy, music, or other subjects; in practice one expert will end up specializing with the special tokens (begin message, end message, role of interlocutor, etc), another will specialize on punctuation, some will focus on visual description words or verbs, and some can even focus on proper names or numbers. The main advantage of a Mixture of Experts model is that it allows you to get much better results with much less compute spent in training and at inference time. There are some minor difficulties involved in making sure that tokens get spread out between the experts in training, but it works out in the end.</p></div><footer class="row docusaurus-mt-lg"><div class="col col--9"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/ai/">ai</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/deepseek/">deepseek</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/reasoning/">reasoning</a></li></ul></div><div class="col text--right col--3"><a aria-label="Read more about DeepSeek R1 is good enough" href="/blog/thoughts-deepseek-r1/"><b>Read More</b></a></div></footer></article><article class="margin-bottom--xl" itemprop="blogPost" itemscope="" itemtype="https://schema.org/BlogPosting"><meta itemprop="description" content="You can update your S3 libraries again. All is good. "><link itemprop="image" href="https://www.tigrisdata.com/blog/assets/images/tools-47b05e95dc3c617373a7f1bf2c0af0ed.jpg"><meta itemprop="keywords" content="object storage,blob storage,s3,cloud storage"><header><h2 class="title_f1Hy" itemprop="headline"><a itemprop="url" href="/blog/tigris-fixes-s3-libs/">Tigris now supports recent releases of the S3 SDK</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2025-01-28T00:00:00.000Z" itemprop="datePublished">January 28, 2025</time> · <!-- -->One min read</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--6 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://xeiaso.net" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo" src="https://avatars.githubusercontent.com/u/529003?v=4" alt="Xe Iaso" itemprop="image"></a><div class="avatar__intro" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><div class="avatar__name"><a href="https://xeiaso.net" target="_blank" rel="noopener noreferrer" itemprop="url"><span itemprop="name">Xe Iaso</span></a></div><small class="avatar__subtitle" itemprop="description">Senior Cloud Whisperer</small></div></div></div></div></header><div class="markdown" itemprop="articleBody"><p><img decoding="async" loading="lazy" alt="A bunch of wrenches on a tool rack." src="/blog/assets/images/tools-47b05e95dc3c617373a7f1bf2c0af0ed.jpg" width="1280" height="655" class="img_ev3q"></p> <p>Recently Amazon <a href="https://www.tigrisdata.com/blog/downgrade-py-js/" target="_blank" rel="noopener noreferrer">made changes to the S3 libraries that broke Tigris support</a>. We have made fixes on our end and you can upgrade to the latest releases of the AWS CLI, AWS SDK for Python (boto3), AWS SDK for JavaScript, AWS SDK for Java and AWS SDK for PHP.</p> <p>If you are running into any issues with these updated SDK releases, please reach out via <a href="https://bsky.app/profile/tigrisdata.com" target="_blank" rel="noopener noreferrer">Bluesky</a>, <a href="https://www.linkedin.com/company/tigrisdata/?viewAsMember=true" target="_blank" rel="noopener noreferrer">LinkedIn</a>, or <a href="https://x.com/TigrisData/" target="_blank" rel="noopener noreferrer">X (formerly Twitter)</a>.</p></div><footer class="row docusaurus-mt-lg"><div class="col"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/object-storage/">object storage</a></li></ul></div></footer></article><article class="margin-bottom--xl" itemprop="blogPost" itemscope="" itemtype="https://schema.org/BlogPosting"><meta itemprop="description" content="AI models, comprised mainly of floating-point numbers, function by processing inputs through various components like tokenizers and embedding models. They range in size from gigabytes to terabytes, with larger parameter counts enhancing performance and nuance representation. How do they get so large though? "><link itemprop="image" href="https://www.tigrisdata.com/blog/assets/images/tiger-ship-bc25048dacd81302f92172bac532377f.webp"><meta itemprop="keywords" content="object storage,blob storage,s3,ai,architecture"><header><h2 class="title_f1Hy" itemprop="headline"><a itemprop="url" href="/blog/chonky-models/">How do large language models get so large?</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2025-01-23T00:00:00.000Z" itemprop="datePublished">January 23, 2025</time> · <!-- -->8 min read</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--6 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://xeiaso.net" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo" src="https://avatars.githubusercontent.com/u/529003?v=4" alt="Xe Iaso" itemprop="image"></a><div class="avatar__intro" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><div class="avatar__name"><a href="https://xeiaso.net" target="_blank" rel="noopener noreferrer" itemprop="url"><span itemprop="name">Xe Iaso</span></a></div><small class="avatar__subtitle" itemprop="description">Senior Cloud Whisperer</small></div></div></div></div></header><div class="markdown" itemprop="articleBody"><p><img decoding="async" loading="lazy" alt="A majestic blue tiger riding on a sailing ship. The tiger is very large." src="/blog/assets/images/tiger-ship-bc25048dacd81302f92172bac532377f.webp" width="1280" height="723" class="img_ev3q"></p> <center><small><em><p>A majestic blue tiger riding on a sailing ship. The tiger is very large. Image generated using PonyXL.</p></em></small></center> <p>AI models can get pretty darn large. Larger models seem to perform better than smaller models, but we don’t quite know why. My work MacBook has 64 gigabytes of RAM and I’m able to use nearly all of it when I do AI inference. Somehow these 40+ gigabyte blobs of floating point numbers are able to take a question about the color of the sky and spit out an answer. At some level this is a miracle of technology, but how does it work?</p> <p>Today I’m going to cover what an AI model really is and the parts that make it up. I’m not going to cover the linear algebra at play nor any of the neural networks. Most people want to start with an off the shelf model, anyway.</p></div><footer class="row docusaurus-mt-lg"><div class="col col--9"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/object-storage/">object storage</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/reliability/">reliability</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/performance/">performance</a></li></ul></div><div class="col text--right col--3"><a aria-label="Read more about How do large language models get so large?" href="/blog/chonky-models/"><b>Read More</b></a></div></footer></article><article class="margin-bottom--xl" itemprop="blogPost" itemscope="" itemtype="https://schema.org/BlogPosting"><meta itemprop="description" content="If you've recently upgraded boto3 or the JavaScript S3 client, file uploads may fail due to a required Content-Length header. Downgrade boto3 to version 1.35.x and the JavaScript client to v3.728.0 to resolve this issue until Tigris releases an update for compatibility with new versions. "><link itemprop="image" href="https://www.tigrisdata.com/blog/assets/images/commands-5fa21b03005bb03166d267fd679504f2.webp"><meta itemprop="keywords" content="object storage,blob storage,s3,cloud storage"><header><h2 class="title_f1Hy" itemprop="headline"><a itemprop="url" href="/blog/downgrade-py-js/">If you’ve upgraded boto3 or the JavaScript S3 client in the last week, uploading files won’t work. Here’s how to fix it.</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2025-01-21T00:00:00.000Z" itemprop="datePublished">January 21, 2025</time> · <!-- -->4 min read</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--6 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://xeiaso.net" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo" src="https://avatars.githubusercontent.com/u/529003?v=4" alt="Xe Iaso" itemprop="image"></a><div class="avatar__intro" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><div class="avatar__name"><a href="https://xeiaso.net" target="_blank" rel="noopener noreferrer" itemprop="url"><span itemprop="name">Xe Iaso</span></a></div><small class="avatar__subtitle" itemprop="description">Senior Cloud Whisperer</small></div></div></div></div></header><div class="markdown" itemprop="articleBody"><p>Hey all. Recently AWS released <a href="https://boto3.amazonaws.com/v1/documentation/api/latest/index.html" target="_blank" rel="noopener noreferrer">boto3</a> version 1.36.0, and in the process they changed how the <code>upload_file</code> call works. This will cause uploads to Tigris with boto3 version 1.36.0 or higher to fail with the following error message:</p> <div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">boto3.exceptions.S3UploadFailedError: Failed to upload ./filename.jpg to mybucket/filename.jpg: An error occurred (MissingContentLength) when calling the PutObject operation: You must provide the Content-Length HTTP header.</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <p>In order to work around this, downgrade boto3 to the last release of version 1.35.x:</p> <div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">pip install boto3==1.35.95</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <p>Make sure that you persist this in your <code>requirements.txt</code>, <code>pyproject.toml</code>, or whatever you use to do dependency management.</p> <p>You might also hit this with the JavaScript client at version <a href="https://github.com/aws/aws-sdk-js-v3/issues/6810" target="_blank" rel="noopener noreferrer">v3.729.0</a> or later. In order to fix that, downgrade to version <a href="https://github.com/aws/aws-sdk-js-v3/releases/tag/v3.728.0" target="_blank" rel="noopener noreferrer">v3.728.0</a>:</p> <div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">npm install @aws-sdk/client-s3@3.728.0</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">npm install @aws-sdk/s3-request-presigner@3.728.0</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <p>Make sure the changes are saved in your package.json file.</p> <p>We’re fixing this on our end, but we want to take a minute to clarify why this is happening and what it means for Tigris to be S3 compatible.</p> <h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-does-it-mean-to-be-s3-compatible">What does it mean to be S3 compatible?<a href="#what-does-it-mean-to-be-s3-compatible" class="hash-link" aria-label="Direct link to What does it mean to be S3 compatible?" title="Direct link to What does it mean to be S3 compatible?"></a></h2> <p>At some level, an API is just a set of calls that have listed side effects. You upload an object by name and later are able to get that object back when you give the name. The devil is in the details, and like any good API there are a lot of details.</p> <p>In a perfect world, when you switch to using Tigris, you drop Tigris into place and then you don’t need to think anymore. We don’t live in a perfect world, and as such Tigris has a <a href="https://www.tigrisdata.com/docs/api/s3/" target="_blank" rel="noopener noreferrer">list of compatible API calls</a>, and if your app only uses those calls you’ll be fine. Most apps are perfectly happy with that set of calls (in fact only use about 5 of them at most). We are adding support for any missing calls as reality demands and time allows. Our goal is that there’s no breaking changes when anything else gets released. Client or server.</p> <p>S3’s API was originally meant to be used with Amazon S3. It has since become a cross-cloud standard, any cloud you can think of likely has a S3-compatible object storage system. It’s become the POSIX abstraction for the cloud. Any changes to the API change a whole host of edge cases that the creators of S3 probably don’t have in mind.</p> <p>Tigris, Digital Ocean, MinIO, R2, and others were all affected by this change. We found out about this breakage when one of our tests broke in a new and exciting way that confused us. From what we can tell, users of boto3 and the JavaScript client found out about this change by their production code breaking without warning. Even some of AWS’ own example code broke with this change.</p> <p>I feel bad for the team behind the S3 API changes, they’re probably not getting very much love from the developer community right now. If this was an outage, I’d say <a href="https://www.ibm.com/think/insights/supporting-your-sysadmins-with-hugops" target="_blank" rel="noopener noreferrer">#hugops</a>. I’m not sure what to say this time other than I hope that this post helps you make your code work again.</p> <p>We’re taking this incident seriously and are updating our testing practices to make sure that we have more advance warning should this happen again as we take S3 compatibility seriously.</p> <p>We’re updating Tigris so that developers can use this new version of the S3 client. We’ll have that rolled out soon. Follow us on <a href="https://bsky.app/profile/tigrisdata.com" target="_blank" rel="noopener noreferrer">Bluesky</a> @tigrisdata.com or on <a href="https://www.linkedin.com/company/tigrisdata/posts/?feedView=all" target="_blank" rel="noopener noreferrer">LinkedIn</a> to keep up to date!</p> <div><div><div class="is--color_gradient_back"><div class="sl_card_m-2 card_static cta-flex"><div class="cta-margin-left"><h1 class="sl_title_m fix-1px">Want to try it out?</h1><p>Make a global bucket with no egress fees and use it with Python or JavaScript.</p></div><div class="cta-flex-item cta-margin-right"><div style="white-space:nowrap"><a href="https://www.tigrisdata.com/docs/get-started/" class="cta-link"><div>Get Started<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="icon-margin iconExternalLink_node_modules-@docusaurus-theme-classNameic-lib-theme-Icon-ExternalLink-styles-module"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></div></a></div></div></div></div></div></div></div><footer class="row docusaurus-mt-lg"><div class="col"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/object-storage/">object storage</a></li></ul></div></footer></article><article class="margin-bottom--xl" itemprop="blogPost" itemscope="" itemtype="https://schema.org/BlogPosting"><meta itemprop="description" content="Object storage can be used as a filesystem in Kubernetes with the right setup. Here's how I set it up on my homelab cluster and the tradeoffs I made in the process. "><link itemprop="image" href="https://www.tigrisdata.com/blog/assets/images/kubernetes-iris-2658c65eaf1d8ae4387514dca7afaae6.webp"><meta itemprop="keywords" content="object storage,blob storage,s3,cloud storage,kubernetes"><header><h2 class="title_f1Hy" itemprop="headline"><a itemprop="url" href="/blog/tigris-filesystem/">Using Tigris as a Filesystem</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2024-12-19T00:00:00.000Z" itemprop="datePublished">December 19, 2024</time> · <!-- -->10 min read</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--6 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://xeiaso.net" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo" src="https://avatars.githubusercontent.com/u/529003?v=4" alt="Xe Iaso" itemprop="image"></a><div class="avatar__intro" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><div class="avatar__name"><a href="https://xeiaso.net" target="_blank" rel="noopener noreferrer" itemprop="url"><span itemprop="name">Xe Iaso</span></a></div><small class="avatar__subtitle" itemprop="description">Senior Cloud Whisperer</small></div></div></div></div></header><div class="markdown" itemprop="articleBody"><p>Earlier this year I started consolidating some workloads to my homelab Kubernetes cluster. One of the last ones was a doozy. It's not a compute-hard or a memory-hard workload, it's a storage-hard workload. I needed to move the DJ set recording bot for an online radio station off of its current cloud and onto my homelab, but I still wanted the benefits of the cloud such as no thinking remote backups.</p> <p>This bot has been running for a decade and the dataset well predates that, over 675 Gi of DJ sets, including ones that were thought to be lost media. Each of these sets is a 320 KiB/sec MP3 file that is anywhere from 150 to 500 MB, with smaller text files alongside them.</p> <p>Needless to say, this dataset is very important to me. The community behind this radio station is how I've met some of my closest friends. I want to make sure that it's backed up and available for anyone that wants to go back and listen to the older sets. I want to preserve these files and not just dump them in an <a href="https://www.tigrisdata.com/docs/objects/tiers/" target="_blank" rel="noopener noreferrer">Archive bucket</a> or something that would make it hard or slow to access them. I want these to be easily accessible to help preserve the work that goes into live music performances.</p> <p>Here's how I did it and made it easy with Tigris.</p> <p><img decoding="async" loading="lazy" alt="An extreme close-up of a tiger with blue and orange fur. The Kubernetes logo replaces its iris." src="/blog/assets/images/kubernetes-iris-2658c65eaf1d8ae4387514dca7afaae6.webp" width="1280" height="714" class="img_ev3q"></p> <div style="font-size:0.75rem;text-align:center;max-width:65ch;margin-left:auto;margin-right:auto"><p>An extreme close-up of a tiger with blue and orange fur. The Kubernetes logo replaces its iris.</p></div></div><footer class="row docusaurus-mt-lg"><div class="col col--9"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/object-storage/">object storage</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/kubernetes/">kubernetes</a></li></ul></div><div class="col text--right col--3"><a aria-label="Read more about Using Tigris as a Filesystem" href="/blog/tigris-filesystem/"><b>Read More</b></a></div></footer></article><article class="margin-bottom--xl" itemprop="blogPost" itemscope="" itemtype="https://schema.org/BlogPosting"><meta itemprop="description" content="Learn how Beam offers serverless GPUs optimized for developer productivity, across many clouds. By moving object storage to a separate managed service, Beam no longer needed to worry about it as another variable when designing for consistency across clouds. "><link itemprop="image" href="https://www.tigrisdata.com/blog/assets/images/beam-372234260535bbf608d61b6c1ab34715.png"><meta itemprop="keywords" content="object storage,blob storage,s3,ai,generative ai,serverless,GPUs,inference,performance,cost"><header><h2 class="title_f1Hy" itemprop="headline"><a itemprop="url" href="/blog/case-study-beam/">How Beam runs GPUs anywhere</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2024-12-12T00:00:00.000Z" itemprop="datePublished">December 12, 2024</time> · <!-- -->6 min read</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--6 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://www.linkedin.com/in/katieschilling" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo" src="https://avatars.githubusercontent.com/u/8411213?s=400&u=762567c65decb82e1433a7d1c42a2ffdcc59a125&v=4" alt="Katie Schilling" itemprop="image"></a><div class="avatar__intro" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><div class="avatar__name"><a href="https://www.linkedin.com/in/katieschilling" target="_blank" rel="noopener noreferrer" itemprop="url"><span itemprop="name">Katie Schilling</span></a></div><small class="avatar__subtitle" itemprop="description">DevRel Enthusiast</small></div></div></div></div></header><div class="markdown" itemprop="articleBody"><p>What do you do when you need to serve up a completely custom, 7+ billion parameter model with sub 10 second cold start times? And without writing a Dockerfile or managing scaling policies yourself. It sounds impossible, but <a href="https://beam.cloud" target="_blank" rel="noopener noreferrer">Beam</a>'s serverless GPU platform provides performant, scalable AI infrastructure with minimal configuration. Your code already does the AI inference in a function. Just add a decorator to get that function running somewhere in the cloud with whatever GPU you specify. It turns on when you need it, it turns off when you don't. This can save you orders of magnitude over running a persistent GPU in the cloud.</p> <p><img decoding="async" loading="lazy" alt="Tigris tiger watching a beam from a ground satellite. Image generated with Flux [dev] from Black Forest Labs on fal.ai" src="/blog/assets/images/beam-372234260535bbf608d61b6c1ab34715.png" width="1024" height="635" class="img_ev3q"></p> <center><small><em><p>Tigris tiger watching a beam from a ground satellite. Image generated with Flux [dev] from Black Forest Labs on fal.ai.</p></em></small></center></div><footer class="row docusaurus-mt-lg"><div class="col col--9"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/object-storage/">object storage</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/s-3/">s3</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/ai/">ai</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/case-study/">case study</a></li></ul></div><div class="col text--right col--3"><a aria-label="Read more about How Beam runs GPUs anywhere" href="/blog/case-study-beam/"><b>Read More</b></a></div></footer></article><article class="margin-bottom--xl" itemprop="blogPost" itemscope="" itemtype="https://schema.org/BlogPosting"><meta itemprop="description" content="Training AI models on Big Data can be challenging due to the need for flexible storage and compute. Tigris, a cloud-agnostic storage layer, enables decoupling of storage from compute, making it easier to manage data and model weights across clouds. Tools like SkyPilot that abstract cloud providers and operating system configuration simplifies the compute layer, allowing for seamless data transfer between clouds using Tigris. "><link itemprop="image" href="https://www.tigrisdata.com/blog/assets/images/ukiyo-e-tiger-d25451fe2654dc67d7feb62ea14b46c9.jpg"><meta itemprop="keywords" content="object storage,blob storage,s3,ai,training,finetuning,lora,cloud,big data"><header><h2 class="title_f1Hy" itemprop="headline"><a itemprop="url" href="/blog/training-any-cloud/">Training with Big Data on Any Cloud</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2024-12-03T00:00:00.000Z" itemprop="datePublished">December 3, 2024</time> · <!-- -->21 min read</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--6 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://xeiaso.net" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo" src="https://avatars.githubusercontent.com/u/529003?v=4" alt="Xe Iaso" itemprop="image"></a><div class="avatar__intro" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><div class="avatar__name"><a href="https://xeiaso.net" target="_blank" rel="noopener noreferrer" itemprop="url"><span itemprop="name">Xe Iaso</span></a></div><small class="avatar__subtitle" itemprop="description">Senior Cloud Whisperer</small></div></div></div></div></header><div class="markdown" itemprop="articleBody"><p>When you get started with finetuning AI models, you typically pull the datasets and models from somewhere like the Hugging Face Hub. This is generally fine, but as your usecase grows and gets more complicated, you're going to run into two big risks:</p> <ul> <li>You're going to depend on the things that are critical to your business being hosted by someone else on a platform that doesn't have a public SLA (Service-Level Agreement, or commitment to uptime with financial penalties when it is violated).</li> <li>Your dataset will grow beyond what you can fit into ram (or even your hard disk), and you'll have to start sharding it into chunks that are smaller than ram.</li> </ul> <p>Most of the stuff you'll find online deals with the "happy path" of training AI models, but the real world is not quite as kind as this happy path is. Your data will be bigger than ram. You will end up needing to make your own copies of datasets and models because they will be taken offline without warning. You will need to be able to move your work between providers because price hikes will happen.</p> <p>The unfortunate part is that this is the place where you're left to figure it out on your own. Let's break down how to do larger scale model training in the real world with a flow that can expand to any dataset, model, or cloud provider with minimal changes required. We're going to show you how to use Tigris to store your datasets and models, and how to use <a href="https://skypilot.readthedocs.io/en/latest/docs/index.html" target="_blank" rel="noopener noreferrer">SkyPilot</a> to abstract away the compute layer so that you can focus on the actual work of training models. This will help you reduce the risk involved with training AI models on custom datasets by importing those datasets and models once, and then always using that copy for training and inference.</p> <p><img decoding="async" loading="lazy" alt="A blue tiger surfs the internet waves, object storage in tow. The image has an ukiyo-e style with flat pastel colors and thick outlines." src="/blog/assets/images/ukiyo-e-tiger-d25451fe2654dc67d7feb62ea14b46c9.jpg" width="1536" height="768" class="img_ev3q"></p> <div style="font-size:0.75rem;text-align:center;padding:2rem;max-width:65ch;margin-left:auto;margin-right:auto"><p>A blue tiger surfs the internet waves, object storage in tow. The image has an ukiyo-e style with flat pastel colors and thick outlines.<!-- --> </p><div style="margin-top:0.5rem"></div> <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Details</summary><div><div class="collapsibleContent_i85q"><p></p><summary style="font-weight:600">Generation details</summary> Generated using <a href="https://civitai.com/models/4468/counterfeit-v30" target="_blank" rel="noopener noreferrer">Counterfeit v3.0</a> using a <a href="https://www.comfy.org/en/" target="_blank" rel="noopener noreferrer">ComfyUI</a> flow stacking several LoRA adapters as well as four rounds of upscaling and denoising. Originally a sketch by Xe Iaso.<p></p></div></div></details></div></div><footer class="row docusaurus-mt-lg"><div class="col col--9"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/object-storage/">object storage</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/ai/">ai</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/training/">training</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/finetuning/">finetuning</a></li></ul></div><div class="col text--right col--3"><a aria-label="Read more about Training with Big Data on Any Cloud" href="/blog/training-any-cloud/"><b>Read More</b></a></div></footer></article><nav class="pagination-nav" aria-label="Blog list page navigation"><a class="pagination-nav__link pagination-nav__link--next" href="/blog/page/2/"><div class="pagination-nav__label">Older Entries</div></a></nav></main></div></div></div><footer class="footer"><div class="container container-fluid"><div class="margin-bottom--sm"><a class="footerLogoLink_BH7S" href="/blog/"><img src="/blog/logo/light.png" alt="Tigris Blog" class="footer__logo themedComponent_mlkZ themedComponent--light_NVdE" height="26px"><img src="/blog/logo/dark.png" alt="Tigris Blog" class="footer__logo themedComponent_mlkZ themedComponent--dark_xIcU" height="26px"></a></div><p class="footer__description">Tigris is a globally distributed S3-compatible object storage service that provides low latency anywhere in the world. Tigris enables developers to quickly and easily store and access any amount of data for a wide range of use cases.</p><div class="footer__row"><div class="footer__data"><div class="footer__cta"><a href="https://console.tigris.dev/" target="_blank" rel="noopener noreferrer">Dashboard</a></div></div><div class="links"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Company</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://www.tigrisdata.com/docs/about/" target="_self" rel="" class="footer__link-item disable-external-icon">About<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a class="footer__link-item" href="/blog/">Blog</a></li></ul></div><div class="col footer__col"><div class="footer__title">Resources</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://www.tigrisdata.com/docs/pricing/" target="_self" rel="" class="disable-external-icon">Pricing<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.tigrisdata.com/docs/legal/service-terms/" target="_self" rel="" class="footer__link-item disable-external-icon">Terms of Service<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.tigrisdata.com/docs/legal/privacy-policy/" target="_self" rel="" class="footer__link-item disable-external-icon">Privacy Policy<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">Developers</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://www.tigrisdata.com/docs/" target="_self" rel="" class="disable-external-icon">Docs<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://status.tigris.dev/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Status<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="mailto:help@tigrisdata.com" target="_blank" rel="noopener noreferrer" class="footer__link-item">Support<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2025 Tigris Data, Inc. All rights reserved.</div></div></div></footer></div> </body> </html>