[{"data":1,"prerenderedAt":772},["ShallowReactive",2],{"page-\u002Fguides\u002Fdeploy":3},{"id":4,"title":5,"body":6,"description":765,"extension":766,"meta":767,"navigation":512,"path":768,"seo":769,"stem":770,"__hash__":771},"content\u002F4.guides\u002F9.deploy.md","Cloud Deployment",{"type":7,"value":8,"toc":750},"minimark",[9,13,18,146,153,157,178,212,226,231,238,290,294,297,303,318,321,326,332,359,362,368,383,386,390,396,399,404,412,416,419,422,450,454,468,473,538,542,548,633,648,652,712,716,746],[10,11,12],"p",{},"Deploy a fully working tileserver-rs instance with sample data in minutes. No configuration needed — sample tile data is automatically downloaded on first start.",[14,15,17],"h2",{"id":16},"one-click-deploy","One-Click Deploy",[19,20,21,37],"table",{},[22,23,24],"thead",{},[25,26,27,31,34],"tr",{},[28,29,30],"th",{},"Platform",[28,32,33],{},"Deploy",[28,35,36],{},"Config File",[38,39,40,68,90,112,129],"tbody",{},[25,41,42,49,62],{},[43,44,45],"td",{},[46,47,48],"strong",{},"Railway",[43,50,51],{},[52,53,57],"a",{"href":54,"rel":55},"https:\u002F\u002Frailway.com\u002Fdeploy\u002F1u-LMi",[56],"nofollow",[58,59],"img",{"alt":60,"src":61},"Deploy on Railway","https:\u002F\u002Frailway.com\u002Fbutton.svg",[43,63,64],{},[65,66,67],"code",{},"railway.toml",[25,69,70,75,85],{},[43,71,72],{},[46,73,74],{},"Render",[43,76,77],{},[52,78,81],{"href":79,"rel":80},"https:\u002F\u002Frender.com\u002Fdeploy?repo=https:\u002F\u002Fgithub.com\u002Fvinayakkulkarni\u002Ftileserver-rs",[56],[58,82],{"alt":83,"src":84},"Deploy on Render","https:\u002F\u002Frender.com\u002Fimages\u002Fdeploy-to-render-button.svg",[43,86,87],{},[65,88,89],{},"render.yaml",[25,91,92,97,107],{},[43,93,94],{},[46,95,96],{},"DigitalOcean",[43,98,99],{},[52,100,103],{"href":101,"rel":102},"https:\u002F\u002Fcloud.digitalocean.com\u002Fapps\u002Fnew?repo=https:\u002F\u002Fgithub.com\u002Fvinayakkulkarni\u002Ftileserver-rs\u002Ftree\u002Fmain",[56],[58,104],{"alt":105,"src":106},"Deploy to DO","https:\u002F\u002Fwww.deploytodo.com\u002Fdo-btn-blue.svg",[43,108,109],{},[65,110,111],{},".do\u002Fdeploy.template.yaml",[25,113,114,119,124],{},[43,115,116],{},[46,117,118],{},"Fly.io",[43,120,121],{},[65,122,123],{},"fly launch --copy-config",[43,125,126],{},[65,127,128],{},"fly.toml",[25,130,131,136,141],{},[43,132,133],{},[46,134,135],{},"Docker",[43,137,138],{},[65,139,140],{},"docker compose up -d",[43,142,143],{},[65,144,145],{},"compose.yml",[10,147,148,149,152],{},"Each platform builds from the included ",[65,150,151],{},"Dockerfile",". The container automatically downloads sample data on first start if no tile files are present.",[14,154,156],{"id":155},"how-sample-data-works","How Sample Data Works",[10,158,159,160,163,164,167,168,171,172,177],{},"When the Docker container starts with an empty ",[65,161,162],{},"\u002Fdata"," directory (no ",[65,165,166],{},".pmtiles"," or ",[65,169,170],{},".mbtiles"," files), the entrypoint script automatically downloads sample data (~15 MB) from the ",[52,173,176],{"href":174,"rel":175},"https:\u002F\u002Fgithub.com\u002Fvinayakkulkarni\u002Ftileserver-rs\u002Freleases",[56],"latest GitHub release",". This includes:",[179,180,181,188,194,200,206],"ul",{},[182,183,184,187],"li",{},[46,185,186],{},"Protomaps sample tiles"," (PMTiles) — world basemap extract",[182,189,190,193],{},[46,191,192],{},"Zurich MBTiles"," — detailed city extract",[182,195,196,199],{},[46,197,198],{},"Noto Sans fonts"," — for label rendering",[182,201,202,205],{},[46,203,204],{},"Protomaps Light style"," — ready-to-use map style",[182,207,208,211],{},[46,209,210],{},"Sample raster data"," — COG test files",[213,214,216],"callout",{"type":215},"info",[10,217,218,219,222,223,225],{},"Sample data is downloaded ",[46,220,221],{},"only"," when no tile files exist in ",[65,224,162],{},". Mount your own data volume to skip the download entirely.",[227,228,230],"h3",{"id":229},"pinning-a-version","Pinning a Version",[10,232,233,234,237],{},"By default, the latest release is downloaded. Pin a specific version with the ",[65,235,236],{},"SAMPLE_DATA_VERSION"," environment variable:",[239,240,245],"pre",{"className":241,"code":242,"language":243,"meta":244,"style":244},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","docker run -d -p 8080:8080 \\\n  -e SAMPLE_DATA_VERSION=v2.13.0 \\\n  ghcr.io\u002Fvinayakkulkarni\u002Ftileserver-rs:latest\n","bash","",[65,246,247,273,284],{"__ignoreMap":244},[248,249,252,256,260,263,266,269],"span",{"class":250,"line":251},"line",1,[248,253,255],{"class":254},"sBMFI","docker",[248,257,259],{"class":258},"sfazB"," run",[248,261,262],{"class":258}," -d",[248,264,265],{"class":258}," -p",[248,267,268],{"class":258}," 8080:8080",[248,270,272],{"class":271},"sTEyZ"," \\\n",[248,274,276,279,282],{"class":250,"line":275},2,[248,277,278],{"class":258},"  -e",[248,280,281],{"class":258}," SAMPLE_DATA_VERSION=v2.13.0",[248,283,272],{"class":271},[248,285,287],{"class":250,"line":286},3,[248,288,289],{"class":258},"  ghcr.io\u002Fvinayakkulkarni\u002Ftileserver-rs:latest\n",[14,291,293],{"id":292},"platform-guides","Platform Guides",[227,295,48],{"id":296},"railway",[10,298,299,300,302],{},"The included ",[65,301,67],{}," configures:",[179,304,305,308,315],{},[182,306,307],{},"Dockerfile-based builds",[182,309,310,311,314],{},"Health check at ",[65,312,313],{},"\u002Fhealth"," (60s timeout)",[182,316,317],{},"Auto-restart on failure",[10,319,320],{},"After clicking the deploy button, Railway builds the image and starts the service. The sample data downloads automatically on first boot.",[10,322,323],{},[46,324,325],{},"Adding your own data:",[10,327,328,329,331],{},"Railway supports persistent volumes. Attach a volume at ",[65,330,162],{}," and upload your tile files:",[239,333,335],{"className":241,"code":334,"language":243,"meta":244,"style":244},"# Install Railway CLI: https:\u002F\u002Fdocs.railway.com\u002Fguides\u002Fcli\nrailway volume create --mount \u002Fdata\n",[65,336,337,343],{"__ignoreMap":244},[248,338,339],{"class":250,"line":251},[248,340,342],{"class":341},"sHwdD","# Install Railway CLI: https:\u002F\u002Fdocs.railway.com\u002Fguides\u002Fcli\n",[248,344,345,347,350,353,356],{"class":250,"line":275},[248,346,296],{"class":254},[248,348,349],{"class":258}," volume",[248,351,352],{"class":258}," create",[248,354,355],{"class":258}," --mount",[248,357,358],{"class":258}," \u002Fdata\n",[227,360,74],{"id":361},"render",[10,363,364,365,367],{},"The ",[65,366,89],{}," blueprint configures a web service with:",[179,369,370,373,377,380],{},[182,371,372],{},"Docker runtime",[182,374,310,375],{},[65,376,313],{},[182,378,379],{},"Starter plan (512 MB RAM)",[182,381,382],{},"Oregon region",[10,384,385],{},"After clicking the deploy button, Render auto-discovers the blueprint and provisions the service.",[10,387,388],{},[46,389,325],{},[10,391,392,393,395],{},"Render supports persistent disks. Add one to your service and mount at ",[65,394,162],{},".",[227,397,96],{"id":398},"digitalocean",[10,400,364,401,403],{},[65,402,111],{}," App Platform spec configures:",[179,405,406,409],{},[182,407,408],{},"Dockerfile-based component",[182,410,411],{},"Auto-deployed from the repository",[10,413,414],{},[46,415,325],{},[10,417,418],{},"Use DigitalOcean Spaces or a mounted volume for persistent tile storage.",[227,420,118],{"id":421},"flyio",[239,423,425],{"className":241,"code":424,"language":243,"meta":244,"style":244},"# Install flyctl: https:\u002F\u002Ffly.io\u002Fdocs\u002Fflyctl\u002Finstall\u002F\nfly launch --copy-config\nfly deploy\n",[65,426,427,432,443],{"__ignoreMap":244},[248,428,429],{"class":250,"line":251},[248,430,431],{"class":341},"# Install flyctl: https:\u002F\u002Ffly.io\u002Fdocs\u002Fflyctl\u002Finstall\u002F\n",[248,433,434,437,440],{"class":250,"line":275},[248,435,436],{"class":254},"fly",[248,438,439],{"class":258}," launch",[248,441,442],{"class":258}," --copy-config\n",[248,444,445,447],{"class":250,"line":286},[248,446,436],{"class":254},[248,448,449],{"class":258}," deploy\n",[10,451,299,452,302],{},[65,453,128],{},[179,455,456,459,462,465],{},[182,457,458],{},"Auto-stop\u002Fstart machines (cost-efficient — scales to zero when idle)",[182,460,461],{},"512 MB RAM, shared CPU",[182,463,464],{},"HTTPS with automatic TLS",[182,466,467],{},"Connection-based concurrency (soft: 200, hard: 250)",[10,469,470],{},[46,471,472],{},"Adding persistent storage:",[239,474,476],{"className":241,"code":475,"language":243,"meta":244,"style":244},"# Create a 10 GB volume in your preferred region\nfly volumes create tile_data --size 10 --region iad\n\n# Update fly.toml to mount the volume\n# [mounts]\n#   source = \"tile_data\"\n#   destination = \"\u002Fdata\"\n",[65,477,478,483,508,514,520,526,532],{"__ignoreMap":244},[248,479,480],{"class":250,"line":251},[248,481,482],{"class":341},"# Create a 10 GB volume in your preferred region\n",[248,484,485,487,490,492,495,498,502,505],{"class":250,"line":275},[248,486,436],{"class":254},[248,488,489],{"class":258}," volumes",[248,491,352],{"class":258},[248,493,494],{"class":258}," tile_data",[248,496,497],{"class":258}," --size",[248,499,501],{"class":500},"sbssI"," 10",[248,503,504],{"class":258}," --region",[248,506,507],{"class":258}," iad\n",[248,509,510],{"class":250,"line":286},[248,511,513],{"emptyLinePlaceholder":512},true,"\n",[248,515,517],{"class":250,"line":516},4,[248,518,519],{"class":341},"# Update fly.toml to mount the volume\n",[248,521,523],{"class":250,"line":522},5,[248,524,525],{"class":341},"# [mounts]\n",[248,527,529],{"class":250,"line":528},6,[248,530,531],{"class":341},"#   source = \"tile_data\"\n",[248,533,535],{"class":250,"line":534},7,[248,536,537],{"class":341},"#   destination = \"\u002Fdata\"\n",[14,539,541],{"id":540},"using-your-own-data","Using Your Own Data",[10,543,544,545,547],{},"All platforms follow the same pattern — mount your tile data at ",[65,546,162],{},":",[239,549,551],{"className":241,"code":550,"language":243,"meta":244,"style":244},"# Docker\ndocker run -d -p 8080:8080 \\\n  -v \u002Fpath\u002Fto\u002Fyour\u002Fdata:\u002Fdata:ro \\\n  ghcr.io\u002Fvinayakkulkarni\u002Ftileserver-rs:latest\n\n# Or with a config file\ndocker run -d -p 8080:8080 \\\n  -v \u002Fpath\u002Fto\u002Fyour\u002Fdata:\u002Fdata:ro \\\n  -v \u002Fpath\u002Fto\u002Fconfig.toml:\u002Fapp\u002Fconfig.toml:ro \\\n  ghcr.io\u002Fvinayakkulkarni\u002Ftileserver-rs:latest\n",[65,552,553,558,572,582,586,590,595,609,618,628],{"__ignoreMap":244},[248,554,555],{"class":250,"line":251},[248,556,557],{"class":341},"# Docker\n",[248,559,560,562,564,566,568,570],{"class":250,"line":275},[248,561,255],{"class":254},[248,563,259],{"class":258},[248,565,262],{"class":258},[248,567,265],{"class":258},[248,569,268],{"class":258},[248,571,272],{"class":271},[248,573,574,577,580],{"class":250,"line":286},[248,575,576],{"class":258},"  -v",[248,578,579],{"class":258}," \u002Fpath\u002Fto\u002Fyour\u002Fdata:\u002Fdata:ro",[248,581,272],{"class":271},[248,583,584],{"class":250,"line":516},[248,585,289],{"class":258},[248,587,588],{"class":250,"line":522},[248,589,513],{"emptyLinePlaceholder":512},[248,591,592],{"class":250,"line":528},[248,593,594],{"class":341},"# Or with a config file\n",[248,596,597,599,601,603,605,607],{"class":250,"line":534},[248,598,255],{"class":254},[248,600,259],{"class":258},[248,602,262],{"class":258},[248,604,265],{"class":258},[248,606,268],{"class":258},[248,608,272],{"class":271},[248,610,612,614,616],{"class":250,"line":611},8,[248,613,576],{"class":258},[248,615,579],{"class":258},[248,617,272],{"class":271},[248,619,621,623,626],{"class":250,"line":620},9,[248,622,576],{"class":258},[248,624,625],{"class":258}," \u002Fpath\u002Fto\u002Fconfig.toml:\u002Fapp\u002Fconfig.toml:ro",[248,627,272],{"class":271},[248,629,631],{"class":250,"line":630},10,[248,632,289],{"class":258},[10,634,635,636,638,639,638,641,644,645,647],{},"The server auto-detects ",[65,637,166],{},", ",[65,640,170],{},[65,642,643],{},"style.json",", fonts, and GeoJSON files from ",[65,646,162],{},". No config file is required for basic setups.",[14,649,651],{"id":650},"environment-variables","Environment Variables",[19,653,654,667],{},[22,655,656],{},[25,657,658,661,664],{},[28,659,660],{},"Variable",[28,662,663],{},"Description",[28,665,666],{},"Default",[38,668,669,683,698],{},[25,670,671,676,679],{},[43,672,673],{},[65,674,675],{},"RUST_LOG",[43,677,678],{},"Log level (error, warn, info, debug)",[43,680,681],{},[65,682,215],{},[25,684,685,690,693],{},[43,686,687],{},[65,688,689],{},"PORT",[43,691,692],{},"Server port",[43,694,695],{},[65,696,697],{},"8080",[25,699,700,704,707],{},[43,701,702],{},[65,703,236],{},[43,705,706],{},"Pin sample data to a specific release tag",[43,708,709],{},[65,710,711],{},"latest",[14,713,715],{"id":714},"next-steps","Next Steps",[179,717,718,725,732,739],{},[182,719,720,724],{},[52,721,723],{"href":722},"\u002Fdeploy\u002Fcost","Hosting Cost"," — Estimate the monthly cost of tileserver-rs on a server against edge storage, AWS, and hosted vendors.",[182,726,727,731],{},[52,728,730],{"href":729},"\u002Fguides\u002Fdocker","Docker Guide"," — Detailed Docker Compose setups with reverse proxies",[182,733,734,738],{},[52,735,737],{"href":736},"\u002Fgetting-started\u002Fconfig","Configuration"," — Full config reference",[182,740,741,745],{},[52,742,744],{"href":743},"\u002Fguides\u002Fauto-detect","Auto-Detect"," — How zero-config source discovery works",[747,748,749],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":244,"searchDepth":275,"depth":275,"links":751},[752,753,756,762,763,764],{"id":16,"depth":275,"text":17},{"id":155,"depth":275,"text":156,"children":754},[755],{"id":229,"depth":286,"text":230},{"id":292,"depth":275,"text":293,"children":757},[758,759,760,761],{"id":296,"depth":286,"text":48},{"id":361,"depth":286,"text":74},{"id":398,"depth":286,"text":96},{"id":421,"depth":286,"text":118},{"id":540,"depth":275,"text":541},{"id":650,"depth":275,"text":651},{"id":714,"depth":275,"text":715},"Deploy tileserver-rs to cloud platforms with one click","md",{},"\u002Fguides\u002Fdeploy",{"title":5,"description":765},"4.guides\u002F9.deploy","U2khf_1NR_rLYrS9dkf7MlC3WsXqPhEdxt5laTRQxLo",1794150612971]