[{"data":1,"prerenderedAt":502},["ShallowReactive",2],{"docs-user\u002Fproject-azure-setup":3,"navigation":393},{"id":4,"title":5,"body":6,"description":16,"extension":386,"meta":387,"navigation":388,"path":389,"seo":390,"stem":391,"__hash__":392},"docs\u002F1.user\u002Fproject-azure-setup.md","Connecting an Azure Blob Container to a Project",{"type":7,"value":8,"toc":378},"minimark",[9,13,17,22,36,39,64,68,212,215,218,224,227,231,234,246,319,333,375],[10,11,5],"h1",{"id":12},"connecting-an-azure-blob-container-to-a-project",[14,15,16],"p",{},"Projects can be configured to store and serve files from an Azure Blob Storage container. This allows your organisation's data to remain in your own Azure subscription.",[18,19,21],"h2",{"id":20},"prerequisites","Prerequisites",[14,23,24,25,29,30,35],{},"You will need the ",[26,27,28],"strong",{},"Configure File Settings"," permission on the project. See ",[31,32,34],"a",{"href":33},"permissions#file-permissions","Permissions"," for details.",[14,37,38],{},"Before configuring the project, you will need the following from Azure:",[40,41,42,46,49],"ul",{},[43,44,45],"li",{},"An Azure Storage account (general-purpose v2)",[43,47,48],{},"A blob container already created within that storage account",[43,50,51,52,55,56,59,60,63],{},"One of the storage account's ",[26,53,54],{},"access keys"," (Storage account > ",[26,57,58],{},"Security + networking"," > ",[26,61,62],{},"Access keys",")",[18,65,67],{"id":66},"steps","Steps",[69,70,71,78,85,96,206],"ol",{},[43,72,73,74,77],{},"Navigate to your project and open the ",[26,75,76],{},"Settings"," tab.",[43,79,80,81,84],{},"Scroll down to the ",[26,82,83],{},"File Storage Setup"," section.",[43,86,87,88,91,92,95],{},"Set ",[26,89,90],{},"File Storage Source"," to ",[26,93,94],{},"Azure Blob",".",[43,97,98,99],{},"Fill in the fields:",[100,101,102,115],"table",{},[103,104,105],"thead",{},[106,107,108,112],"tr",{},[109,110,111],"th",{},"Field",[109,113,114],{},"Description",[116,117,118,133,146,160,170,192],"tbody",{},[106,119,120,126],{},[121,122,123],"td",{},[26,124,125],{},"Storage Account",[121,127,128,129,63],{},"The name of your storage account (e.g. ",[130,131,132],"code",{},"mycompanydata",[106,134,135,140],{},[121,136,137],{},[26,138,139],{},"Blob Container",[121,141,142,143,63],{},"The container within the account to store files in (e.g. ",[130,144,145],{},"project-data",[106,147,148,153],{},[121,149,150],{},[26,151,152],{},"Key Prefix",[121,154,155,156,159],{},"Optional path prefix for all files in this project (e.g. ",[130,157,158],{},"project-a\u002F","). This allows multiple projects to share a single container by scoping each to a different prefix. Leave empty to use the container root.",[106,161,162,167],{},[121,163,164],{},[26,165,166],{},"Account Key",[121,168,169],{},"An access key for the storage account",[106,171,172,177],{},[121,173,174],{},[26,175,176],{},"Endpoint Suffix",[121,178,179,180,183,184,187,188,191],{},"Optional. Leave empty for the global Azure cloud (",[130,181,182],{},"core.windows.net","). Set this only for sovereign clouds (e.g. ",[130,185,186],{},"core.usgovcloudapi.net",", ",[130,189,190],{},"core.chinacloudapi.cn",").",[106,193,194,199],{},[121,195,196],{},[26,197,198],{},"Direct Storage Access",[121,200,201,202,205],{},"Optional. When enabled, file reads are served directly from Azure instead of streaming through the server (see ",[31,203,198],{"href":204},"#direct-storage-access"," below). Off by default.",[43,207,208,209,95],{},"Click ",[26,210,211],{},"Save",[14,213,214],{},"The project will now use the configured Azure container for file storage and access.",[18,216,198],{"id":217},"direct-storage-access",[14,219,220,221,223],{},"By default the server proxies every file read: it fetches the bytes from Azure and relays them to the client. With ",[26,222,198],{}," enabled, the server instead hands the client a short-lived SAS URL and the client fetches the bytes straight from Azure — reducing server bandwidth and latency, and letting the SDK stream large models without per-request round-trips to the server.",[14,225,226],{},"The trade-off is that the server authorises access when it issues the SAS URL rather than on every byte range, so a SAS URL remains usable until it expires (a few minutes). Leave this off if you require the server to authorise every individual read. Browser downloads with this enabled rely on the CORS configuration below.",[18,228,230],{"id":229},"cors-configuration","CORS Configuration",[14,232,233],{},"When uploading files, the browser uploads directly to Azure using short-lived SAS URLs. For this to work, your storage account must have a CORS (Cross-Origin Resource Sharing) rule that allows requests from the domain where udServer is hosted.",[14,235,236,237,59,239,59,242,245],{},"In the Azure Portal, navigate to your storage account > ",[26,238,76],{},[26,240,241],{},"Resource sharing (CORS)",[26,243,244],{},"Blob service",", and add a rule:",[100,247,248,258],{},[103,249,250],{},[106,251,252,255],{},[109,253,254],{},"Setting",[109,256,257],{},"Value",[116,259,260,272,284,296,307],{},[106,261,262,267],{},[121,263,264],{},[26,265,266],{},"Allowed origins",[121,268,269],{},[130,270,271],{},"https:\u002F\u002Fyour-udserver-domain.com",[106,273,274,279],{},[121,275,276],{},[26,277,278],{},"Allowed methods",[121,280,281],{},[130,282,283],{},"GET, PUT, HEAD, DELETE",[106,285,286,291],{},[121,287,288],{},[26,289,290],{},"Allowed headers",[121,292,293],{},[130,294,295],{},"*",[106,297,298,303],{},[121,299,300],{},[26,301,302],{},"Exposed headers",[121,304,305],{},[130,306,295],{},[106,308,309,314],{},[121,310,311],{},[26,312,313],{},"Max age",[121,315,316],{},[130,317,318],{},"3600",[14,320,321,322,324,325,328,329,332],{},"Replace ",[130,323,271],{}," with the origin your udServer instance is served from. This is typically ",[130,326,327],{},"https:\u002F\u002Fudcloud.nuclideon.com"," or ",[130,330,331],{},"https:\u002F\u002Fau-udcloud.nuclideon.com",". You can list multiple origins if needed.",[100,334,335,344],{},[103,336,337],{},[106,338,339,341],{},[109,340,254],{},[109,342,343],{},"Why it's needed",[116,345,346,366],{},[106,347,348,352],{},[121,349,350],{},[26,351,278],{},[121,353,354,357,358,361,362,365],{},[130,355,356],{},"PUT"," is required for direct block uploads. ",[130,359,360],{},"GET"," and ",[130,363,364],{},"HEAD"," for file downloads and metadata.",[106,367,368,372],{},[121,369,370],{},[26,371,313],{},[121,373,374],{},"Caches the preflight response so the browser doesn't send an OPTIONS request before every chunk.",[14,376,377],{},"Without this configuration, file uploads from the browser will fail with CORS errors.",{"title":379,"searchDepth":380,"depth":380,"links":381},"",2,[382,383,384,385],{"id":20,"depth":380,"text":21},{"id":66,"depth":380,"text":67},{"id":217,"depth":380,"text":198},{"id":229,"depth":380,"text":230},"md",{},true,"\u002Fuser\u002Fproject-azure-setup",{"title":5,"description":16},"1.user\u002Fproject-azure-setup","fiP5OiP07wRFWdzlamaN4r0Ra3y6o5c6r2-IaqJLKxg",[394,398,448,493],{"title":395,"path":396,"stem":397},"udServer Manuals","\u002F","0.index",{"title":399,"path":400,"stem":401,"children":402},"User Guide","\u002Fdocs\u002Fuser","1.user\u002F0.index",[403,407,411,415,419,423,427,430,432,436,440,444],{"title":404,"path":405,"stem":406},"Login","\u002Fdocs\u002Fuser\u002Flogin","1.user\u002F1.login",{"title":408,"path":409,"stem":410},"Account Settings","\u002Fdocs\u002Fuser\u002Faccount-settings","1.user\u002Faccount-settings",{"title":412,"path":413,"stem":414},"Files","\u002Fdocs\u002Fuser\u002Ffiles","1.user\u002Ffiles",{"title":416,"path":417,"stem":418},"Jobs","\u002Fdocs\u002Fuser\u002Fjobs","1.user\u002Fjobs",{"title":420,"path":421,"stem":422},"3rd Party Licenses","\u002Fdocs\u002Fuser\u002Flicenses","1.user\u002Flicenses",{"title":424,"path":425,"stem":426},"Organisations","\u002Fdocs\u002Fuser\u002Forganisations","1.user\u002Forganisations",{"title":34,"path":428,"stem":429},"\u002Fdocs\u002Fuser\u002Fpermissions","1.user\u002Fpermissions",{"title":5,"path":431,"stem":391},"\u002Fdocs\u002Fuser\u002Fproject-azure-setup",{"title":433,"path":434,"stem":435},"Connecting an AWS S3 Bucket to a Project","\u002Fdocs\u002Fuser\u002Fproject-s3-setup","1.user\u002Fproject-s3-setup",{"title":437,"path":438,"stem":439},"Projects","\u002Fdocs\u002Fuser\u002Fprojects","1.user\u002Fprojects",{"title":441,"path":442,"stem":443},"Scenes","\u002Fdocs\u002Fuser\u002Fscenes","1.user\u002Fscenes",{"title":445,"path":446,"stem":447},"Software Downloads","\u002Fdocs\u002Fuser\u002Fsoftware","1.user\u002Fsoftware",{"title":449,"path":450,"stem":451,"children":452},"IT Administrators Guide","\u002Fdocs\u002Fadmin","2.admin\u002F0.index",[453,457,461,465,469,473,477,481,485,489],{"title":454,"path":455,"stem":456},"System Requirements","\u002Fdocs\u002Fadmin\u002Fsystem-requirements","2.admin\u002F1.system-requirements",{"title":458,"path":459,"stem":460},"Publishing Software (Packages)","\u002Fdocs\u002Fadmin\u002Fsoftware-packages","2.admin\u002F10.software-packages",{"title":462,"path":463,"stem":464},"Generic Installation","\u002Fdocs\u002Fadmin\u002Fgettingstarted","2.admin\u002F2.gettingstarted",{"title":466,"path":467,"stem":468},"Setting up on an Amazon EC2 instance","\u002Fdocs\u002Fadmin\u002Famazon-ec2","2.admin\u002F3.amazon-ec2",{"title":470,"path":471,"stem":472},"Configuring OAuth \u002F OIDC Authentication","\u002Fdocs\u002Fadmin\u002Foauth","2.admin\u002F4.oauth",{"title":474,"path":475,"stem":476},"Admin Console","\u002Fdocs\u002Fadmin\u002Fadmin-console","2.admin\u002F5.admin-console",{"title":478,"path":479,"stem":480},"Server Configuration","\u002Fdocs\u002Fadmin\u002Fserver-configuration","2.admin\u002F6.server-configuration",{"title":482,"path":483,"stem":484},"Users & Organisations","\u002Fdocs\u002Fadmin\u002Fusers-and-organisations","2.admin\u002F7.users-and-organisations",{"title":486,"path":487,"stem":488},"Analytics & System Log","\u002Fdocs\u002Fadmin\u002Fanalytics-and-logs","2.admin\u002F8.analytics-and-logs",{"title":490,"path":491,"stem":492},"Webhooks","\u002Fdocs\u002Fadmin\u002Fwebhooks","2.admin\u002F9.webhooks",{"title":494,"path":495,"stem":496,"children":497},"Developers Guide","\u002Fdocs\u002Fdev","3.dev\u002F0.index",[498],{"title":499,"path":500,"stem":501},"udServer API","\u002Fdocs\u002Fdev\u002Fudserverapi","3.dev\u002FudServerAPI",1783233110954]