[{"data":1,"prerenderedAt":1003},["ShallowReactive",2],{"navigation_docs":3,"-guides-deploy-fullstack-app":134,"-guides-deploy-fullstack-app-surround":998},[4,36,61,87,113],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":35},"Getting Started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,15,20,25,30],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-sparkles",{"title":16,"path":17,"stem":18,"icon":19},"Quickstart","\u002Fgetting-started\u002Fquickstart","1.getting-started\u002F2.quickstart","i-lucide-zap",{"title":21,"path":22,"stem":23,"icon":24},"Authentication","\u002Fgetting-started\u002Fauthentication","1.getting-started\u002F3.authentication","i-lucide-key",{"title":26,"path":27,"stem":28,"icon":29},"Rate Limits & Quotas","\u002Fgetting-started\u002Frate-limits-quotas","1.getting-started\u002F4.rate-limits-quotas","i-lucide-gauge",{"title":31,"path":32,"stem":33,"icon":34},"SDKs & Tools","\u002Fgetting-started\u002Fsdks-tools","1.getting-started\u002F5.sdks-tools","i-lucide-box",false,{"title":37,"icon":38,"path":39,"stem":40,"children":41,"page":35},"Cloud Infrastructure","i-lucide-server","\u002Finfrastructure","2.infrastructure",[42,46,51,56],{"title":43,"path":44,"stem":45,"icon":38},"Cloud VPS Compute","\u002Finfrastructure\u002Fvps-compute","2.infrastructure\u002F1.vps-compute",{"title":47,"path":48,"stem":49,"icon":50},"Managed Databases","\u002Finfrastructure\u002Fmanaged-databases","2.infrastructure\u002F2.managed-databases","i-lucide-database",{"title":52,"path":53,"stem":54,"icon":55},"Networking & Cloud Firewall","\u002Finfrastructure\u002Fnetworking-firewall","2.infrastructure\u002F3.networking-firewall","i-lucide-shield",{"title":57,"path":58,"stem":59,"icon":60},"Block Storage & Volumes","\u002Finfrastructure\u002Fblock-storage","2.infrastructure\u002F4.block-storage","i-lucide-hard-drive",{"title":62,"icon":63,"path":64,"stem":65,"children":66,"page":35},"Services & APIs","i-lucide-cpu","\u002Fservices-api","3.services-api",[67,72,77,82],{"title":68,"path":69,"stem":70,"icon":71},"REST API Reference","\u002Fservices-api\u002Fapi-reference","3.services-api\u002F1.api-reference","i-lucide-terminal",{"title":73,"path":74,"stem":75,"icon":76},"URL Shortener API","\u002Fservices-api\u002Furl-shortener","3.services-api\u002F2.url-shortener","i-lucide-link",{"title":78,"path":79,"stem":80,"icon":81},"Temp Mail API","\u002Fservices-api\u002Ftemp-mail","3.services-api\u002F3.temp-mail","i-lucide-mail",{"title":83,"path":84,"stem":85,"icon":86},"Developer Utility APIs","\u002Fservices-api\u002Fdeveloper-utilities","3.services-api\u002F4.developer-utilities","i-lucide-wrench",{"title":88,"icon":89,"path":90,"stem":91,"children":92,"page":35},"Guides & Tutorials","i-lucide-book-open","\u002Fguides","4.guides",[93,98,103,108],{"title":94,"path":95,"stem":96,"icon":97},"Deploy a Full-Stack App with VPS & PostgreSQL","\u002Fguides\u002Fdeploy-fullstack-app","4.guides\u002F1.deploy-fullstack-app","i-lucide-layers",{"title":99,"path":100,"stem":101,"icon":102},"Automated Backups & Webhook Alerts","\u002Fguides\u002Fautomated-backups-webhook","4.guides\u002F2.automated-backups-webhook","i-lucide-bell",{"title":104,"path":105,"stem":106,"icon":107},"E2E Auth Testing with Temp Mail in CI\u002FCD","\u002Fguides\u002Fci-cd-temp-mail-testing","4.guides\u002F3.ci-cd-temp-mail-testing","i-lucide-check-circle-2",{"title":109,"path":110,"stem":111,"icon":112},"Custom Domain & SSL Configuration","\u002Fguides\u002Fcustom-domain-setup","4.guides\u002F4.custom-domain-setup","i-lucide-globe",{"title":114,"icon":115,"path":116,"stem":117,"children":118,"page":35},"Account & Billing","i-lucide-credit-card","\u002Faccount-billing","5.account-billing",[119,124,129],{"title":120,"path":121,"stem":122,"icon":123},"Pricing & Hourly Billing","\u002Faccount-billing\u002Fpricing-billing","5.account-billing\u002F1.pricing-billing","i-lucide-receipt",{"title":125,"path":126,"stem":127,"icon":128},"Team Management & RBAC","\u002Faccount-billing\u002Fteam-rbac","5.account-billing\u002F2.team-rbac","i-lucide-users",{"title":130,"path":131,"stem":132,"icon":133},"Resource Quotas & Service Limits","\u002Faccount-billing\u002Fservice-limits","5.account-billing\u002F3.service-limits","i-lucide-sliders",{"id":135,"title":94,"body":136,"description":989,"extension":990,"links":991,"meta":992,"navigation":993,"path":95,"seo":994,"stem":96,"__hash__":997},"docs\u002F4.guides\u002F1.deploy-fullstack-app.md",{"type":137,"value":138,"toc":983},"minimark",[139,144,157,160,165,201,203,207,659,661,665,668,694,701,724,726,730,931,954,957,976,979],[140,141,143],"h1",{"id":142},"deploy-a-full-stack-app-with-1st-vps-postgresql","Deploy a Full-Stack App with 1st VPS & PostgreSQL",[145,146,147,148,152,153,156],"p",{},"In this tutorial, you will learn how to provision a high-performance ",[149,150,151],"strong",{},"1st Cloud VPS",", attach a ",[149,154,155],{},"1st Managed PostgreSQL"," instance, and deploy a containerized application with automated SSL.",[158,159],"hr",{},[161,162,164],"h2",{"id":163},"architecture-overview","Architecture Overview",[166,167,172],"pre",{"className":168,"code":169,"language":170,"meta":171,"style":171},"language-mermaid shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","graph LR\n  User[User Browser \u002F Client] -->|HTTPS :443| Nginx[Nginx Reverse Proxy]\n  Nginx -->|Port :3000| App[Dockerized Web App on 1st VPS]\n  App -->|Encrypted TLS \u002F VPC| DB[(1st Managed PostgreSQL)]\n","mermaid","",[173,174,175,183,189,195],"code",{"__ignoreMap":171},[176,177,180],"span",{"class":178,"line":179},"line",1,[176,181,182],{},"graph LR\n",[176,184,186],{"class":178,"line":185},2,[176,187,188],{},"  User[User Browser \u002F Client] -->|HTTPS :443| Nginx[Nginx Reverse Proxy]\n",[176,190,192],{"class":178,"line":191},3,[176,193,194],{},"  Nginx -->|Port :3000| App[Dockerized Web App on 1st VPS]\n",[176,196,198],{"class":178,"line":197},4,[176,199,200],{},"  App -->|Encrypted TLS \u002F VPC| DB[(1st Managed PostgreSQL)]\n",[158,202],{},[161,204,206],{"id":205},"step-1-provision-resources-via-api","Step 1: Provision Resources via API",[166,208,213],{"className":209,"code":210,"filename":211,"language":212,"meta":171,"style":171},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# 1. Create a private VPC\nVPC_ID=$(curl -s -X POST https:\u002F\u002Fapi.1st-services.com\u002Fv1\u002Fnetworking\u002Fvpcs \\\n  -H \"Authorization: Bearer $FIRST_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"name\": \"app-vpc\", \"region\": \"us-east-1\"}' | jq -r .data.id)\n\n# 2. Launch Managed PostgreSQL in the VPC\nDB_URI=$(curl -s -X POST https:\u002F\u002Fapi.1st-services.com\u002Fv1\u002Fdatabases \\\n  -H \"Authorization: Bearer $FIRST_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d \"{\\\"name\\\":\\\"app-db\\\",\\\"engine\\\":\\\"postgresql\\\",\\\"version\\\":\\\"16\\\",\\\"plan\\\":\\\"db-standard-2\\\",\\\"vpc_id\\\":\\\"$VPC_ID\\\"}\" | jq -r .data.connection_uri)\n\n# 3. Launch VPS in the same VPC\ncurl -X POST https:\u002F\u002Fapi.1st-services.com\u002Fv1\u002Fvps\u002Finstances \\\n  -H \"Authorization: Bearer $FIRST_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d \"{\n    \\\"name\\\": \\\"app-web-01\\\",\n    \\\"plan\\\": \\\"vps-standard-2\\\",\n    \\\"region\\\": \\\"us-east-1\\\",\n    \\\"image\\\": \\\"ubuntu-24.04-lts\\\",\n    \\\"vpc_id\\\": \\\"$VPC_ID\\\"\n  }\"\n","deploy-infra.sh","bash",[173,214,215,221,251,270,283,313,320,326,347,362,375,488,493,499,513,528,541,551,574,594,615,636,650],{"__ignoreMap":171},[176,216,217],{"class":178,"line":179},[176,218,220],{"class":219},"sHwdD","# 1. Create a private VPC\n",[176,222,223,227,231,235,239,242,245,248],{"class":178,"line":185},[176,224,226],{"class":225},"sTEyZ","VPC_ID",[176,228,230],{"class":229},"sMK4o","=$(",[176,232,234],{"class":233},"sBMFI","curl",[176,236,238],{"class":237},"sfazB"," -s",[176,240,241],{"class":237}," -X",[176,243,244],{"class":237}," POST",[176,246,247],{"class":237}," https:\u002F\u002Fapi.1st-services.com\u002Fv1\u002Fnetworking\u002Fvpcs",[176,249,250],{"class":225}," \\\n",[176,252,253,256,259,262,265,268],{"class":178,"line":191},[176,254,255],{"class":237},"  -H",[176,257,258],{"class":229}," \"",[176,260,261],{"class":237},"Authorization: Bearer ",[176,263,264],{"class":225},"$FIRST_API_KEY",[176,266,267],{"class":229},"\"",[176,269,250],{"class":225},[176,271,272,274,276,279,281],{"class":178,"line":197},[176,273,255],{"class":237},[176,275,258],{"class":229},[176,277,278],{"class":237},"Content-Type: application\u002Fjson",[176,280,267],{"class":229},[176,282,250],{"class":225},[176,284,286,289,292,295,298,301,304,307,310],{"class":178,"line":285},5,[176,287,288],{"class":237},"  -d",[176,290,291],{"class":229}," '",[176,293,294],{"class":237},"{\"name\": \"app-vpc\", \"region\": \"us-east-1\"}",[176,296,297],{"class":229},"'",[176,299,300],{"class":229}," |",[176,302,303],{"class":233}," jq",[176,305,306],{"class":237}," -r",[176,308,309],{"class":237}," .data.id",[176,311,312],{"class":229},")\n",[176,314,316],{"class":178,"line":315},6,[176,317,319],{"emptyLinePlaceholder":318},true,"\n",[176,321,323],{"class":178,"line":322},7,[176,324,325],{"class":219},"# 2. Launch Managed PostgreSQL in the VPC\n",[176,327,329,332,334,336,338,340,342,345],{"class":178,"line":328},8,[176,330,331],{"class":225},"DB_URI",[176,333,230],{"class":229},[176,335,234],{"class":233},[176,337,238],{"class":237},[176,339,241],{"class":237},[176,341,244],{"class":237},[176,343,344],{"class":237}," https:\u002F\u002Fapi.1st-services.com\u002Fv1\u002Fdatabases",[176,346,250],{"class":225},[176,348,350,352,354,356,358,360],{"class":178,"line":349},9,[176,351,255],{"class":237},[176,353,258],{"class":229},[176,355,261],{"class":237},[176,357,264],{"class":225},[176,359,267],{"class":229},[176,361,250],{"class":225},[176,363,365,367,369,371,373],{"class":178,"line":364},10,[176,366,255],{"class":237},[176,368,258],{"class":229},[176,370,278],{"class":237},[176,372,267],{"class":229},[176,374,250],{"class":225},[176,376,378,380,382,385,388,391,393,396,398,401,403,406,408,411,413,415,417,420,422,424,426,429,431,433,435,438,440,442,444,447,449,451,453,456,458,460,462,465,467,469,472,475,477,479,481,483,486],{"class":178,"line":377},11,[176,379,288],{"class":237},[176,381,258],{"class":229},[176,383,384],{"class":237},"{",[176,386,387],{"class":225},"\\\"",[176,389,390],{"class":237},"name",[176,392,387],{"class":225},[176,394,395],{"class":237},":",[176,397,387],{"class":225},[176,399,400],{"class":237},"app-db",[176,402,387],{"class":225},[176,404,405],{"class":237},",",[176,407,387],{"class":225},[176,409,410],{"class":237},"engine",[176,412,387],{"class":225},[176,414,395],{"class":237},[176,416,387],{"class":225},[176,418,419],{"class":237},"postgresql",[176,421,387],{"class":225},[176,423,405],{"class":237},[176,425,387],{"class":225},[176,427,428],{"class":237},"version",[176,430,387],{"class":225},[176,432,395],{"class":237},[176,434,387],{"class":225},[176,436,437],{"class":237},"16",[176,439,387],{"class":225},[176,441,405],{"class":237},[176,443,387],{"class":225},[176,445,446],{"class":237},"plan",[176,448,387],{"class":225},[176,450,395],{"class":237},[176,452,387],{"class":225},[176,454,455],{"class":237},"db-standard-2",[176,457,387],{"class":225},[176,459,405],{"class":237},[176,461,387],{"class":225},[176,463,464],{"class":237},"vpc_id",[176,466,387],{"class":225},[176,468,395],{"class":237},[176,470,471],{"class":225},"\\\"$VPC_ID\\\"",[176,473,474],{"class":237},"}",[176,476,267],{"class":229},[176,478,300],{"class":229},[176,480,303],{"class":233},[176,482,306],{"class":237},[176,484,485],{"class":237}," .data.connection_uri",[176,487,312],{"class":229},[176,489,491],{"class":178,"line":490},12,[176,492,319],{"emptyLinePlaceholder":318},[176,494,496],{"class":178,"line":495},13,[176,497,498],{"class":219},"# 3. Launch VPS in the same VPC\n",[176,500,502,504,506,508,511],{"class":178,"line":501},14,[176,503,234],{"class":233},[176,505,241],{"class":237},[176,507,244],{"class":237},[176,509,510],{"class":237}," https:\u002F\u002Fapi.1st-services.com\u002Fv1\u002Fvps\u002Finstances",[176,512,250],{"class":225},[176,514,516,518,520,522,524,526],{"class":178,"line":515},15,[176,517,255],{"class":237},[176,519,258],{"class":229},[176,521,261],{"class":237},[176,523,264],{"class":225},[176,525,267],{"class":229},[176,527,250],{"class":225},[176,529,531,533,535,537,539],{"class":178,"line":530},16,[176,532,255],{"class":237},[176,534,258],{"class":229},[176,536,278],{"class":237},[176,538,267],{"class":229},[176,540,250],{"class":225},[176,542,544,546,548],{"class":178,"line":543},17,[176,545,288],{"class":237},[176,547,258],{"class":229},[176,549,550],{"class":237},"{\n",[176,552,554,557,559,561,564,566,569,571],{"class":178,"line":553},18,[176,555,556],{"class":225},"    \\\"",[176,558,390],{"class":237},[176,560,387],{"class":225},[176,562,563],{"class":237},": ",[176,565,387],{"class":225},[176,567,568],{"class":237},"app-web-01",[176,570,387],{"class":225},[176,572,573],{"class":237},",\n",[176,575,577,579,581,583,585,587,590,592],{"class":178,"line":576},19,[176,578,556],{"class":225},[176,580,446],{"class":237},[176,582,387],{"class":225},[176,584,563],{"class":237},[176,586,387],{"class":225},[176,588,589],{"class":237},"vps-standard-2",[176,591,387],{"class":225},[176,593,573],{"class":237},[176,595,597,599,602,604,606,608,611,613],{"class":178,"line":596},20,[176,598,556],{"class":225},[176,600,601],{"class":237},"region",[176,603,387],{"class":225},[176,605,563],{"class":237},[176,607,387],{"class":225},[176,609,610],{"class":237},"us-east-1",[176,612,387],{"class":225},[176,614,573],{"class":237},[176,616,618,620,623,625,627,629,632,634],{"class":178,"line":617},21,[176,619,556],{"class":225},[176,621,622],{"class":237},"image",[176,624,387],{"class":225},[176,626,563],{"class":237},[176,628,387],{"class":225},[176,630,631],{"class":237},"ubuntu-24.04-lts",[176,633,387],{"class":225},[176,635,573],{"class":237},[176,637,639,641,643,645,647],{"class":178,"line":638},22,[176,640,556],{"class":225},[176,642,464],{"class":237},[176,644,387],{"class":225},[176,646,563],{"class":237},[176,648,649],{"class":225},"\\\"$VPC_ID\\\"\n",[176,651,653,656],{"class":178,"line":652},23,[176,654,655],{"class":237},"  }",[176,657,658],{"class":229},"\"\n",[158,660],{},[161,662,664],{"id":663},"step-2-configure-application-environment","Step 2: Configure Application Environment",[145,666,667],{},"Connect to your VPS instance via SSH:",[166,669,672],{"className":209,"code":670,"filename":671,"language":212,"meta":171,"style":171},"ssh root@\u003CVPS_IP_ADDRESS>\n","Terminal",[173,673,674],{"__ignoreMap":171},[176,675,676,679,682,685,688,691],{"class":178,"line":179},[176,677,678],{"class":233},"ssh",[176,680,681],{"class":237}," root@",[176,683,684],{"class":229},"\u003C",[176,686,687],{"class":237},"VPS_IP_ADDRES",[176,689,690],{"class":225},"S",[176,692,693],{"class":229},">\n",[145,695,696,697,700],{},"Create your ",[173,698,699],{},".env"," configuration file pointing securely to your 1st Managed PostgreSQL instance:",[166,702,707],{"className":703,"code":704,"filename":705,"language":706,"meta":171,"style":171},"language-env shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","NODE_ENV=production\nPORT=3000\nDATABASE_URL=\"postgresql:\u002F\u002Ffirstadmin:P4ssw0rd!@pg-cluster-9918231.db.1st-services.com:5432\u002Fdefaultdb?sslmode=require\"\n","\u002Fopt\u002Fapp\u002F.env","env",[173,708,709,714,719],{"__ignoreMap":171},[176,710,711],{"class":178,"line":179},[176,712,713],{},"NODE_ENV=production\n",[176,715,716],{"class":178,"line":185},[176,717,718],{},"PORT=3000\n",[176,720,721],{"class":178,"line":191},[176,722,723],{},"DATABASE_URL=\"postgresql:\u002F\u002Ffirstadmin:P4ssw0rd!@pg-cluster-9918231.db.1st-services.com:5432\u002Fdefaultdb?sslmode=require\"\n",[158,725],{},[161,727,729],{"id":728},"step-3-run-with-docker-compose","Step 3: Run with Docker Compose",[166,731,736],{"className":732,"code":733,"filename":734,"language":735,"meta":171,"style":171},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","version: '3.8'\n\nservices:\n  web:\n    image: ghcr.io\u002Fmyorg\u002Fmyapp:latest\n    restart: always\n    env_file: .env\n    ports:\n      - \"127.0.0.1:3000:3000\"\n\n  caddy:\n    image: caddy:2-alpine\n    restart: always\n    ports:\n      - \"80:80\"\n      - \"443:443\"\n    volumes:\n      - .\u002FCaddyfile:\u002Fetc\u002Fcaddy\u002FCaddyfile\n      - caddy_data:\u002Fdata\n      - caddy_config:\u002Fconfig\n\nvolumes:\n  caddy_data:\n  caddy_config:\n","\u002Fopt\u002Fapp\u002Fdocker-compose.yml","yaml",[173,737,738,753,757,765,772,782,792,802,809,821,825,832,841,849,855,866,877,884,891,898,905,909,916,923],{"__ignoreMap":171},[176,739,740,743,745,747,750],{"class":178,"line":179},[176,741,428],{"class":742},"swJcz",[176,744,395],{"class":229},[176,746,291],{"class":229},[176,748,749],{"class":237},"3.8",[176,751,752],{"class":229},"'\n",[176,754,755],{"class":178,"line":185},[176,756,319],{"emptyLinePlaceholder":318},[176,758,759,762],{"class":178,"line":191},[176,760,761],{"class":742},"services",[176,763,764],{"class":229},":\n",[176,766,767,770],{"class":178,"line":197},[176,768,769],{"class":742},"  web",[176,771,764],{"class":229},[176,773,774,777,779],{"class":178,"line":285},[176,775,776],{"class":742},"    image",[176,778,395],{"class":229},[176,780,781],{"class":237}," ghcr.io\u002Fmyorg\u002Fmyapp:latest\n",[176,783,784,787,789],{"class":178,"line":315},[176,785,786],{"class":742},"    restart",[176,788,395],{"class":229},[176,790,791],{"class":237}," always\n",[176,793,794,797,799],{"class":178,"line":322},[176,795,796],{"class":742},"    env_file",[176,798,395],{"class":229},[176,800,801],{"class":237}," .env\n",[176,803,804,807],{"class":178,"line":328},[176,805,806],{"class":742},"    ports",[176,808,764],{"class":229},[176,810,811,814,816,819],{"class":178,"line":349},[176,812,813],{"class":229},"      -",[176,815,258],{"class":229},[176,817,818],{"class":237},"127.0.0.1:3000:3000",[176,820,658],{"class":229},[176,822,823],{"class":178,"line":364},[176,824,319],{"emptyLinePlaceholder":318},[176,826,827,830],{"class":178,"line":377},[176,828,829],{"class":742},"  caddy",[176,831,764],{"class":229},[176,833,834,836,838],{"class":178,"line":490},[176,835,776],{"class":742},[176,837,395],{"class":229},[176,839,840],{"class":237}," caddy:2-alpine\n",[176,842,843,845,847],{"class":178,"line":495},[176,844,786],{"class":742},[176,846,395],{"class":229},[176,848,791],{"class":237},[176,850,851,853],{"class":178,"line":501},[176,852,806],{"class":742},[176,854,764],{"class":229},[176,856,857,859,861,864],{"class":178,"line":515},[176,858,813],{"class":229},[176,860,258],{"class":229},[176,862,863],{"class":237},"80:80",[176,865,658],{"class":229},[176,867,868,870,872,875],{"class":178,"line":530},[176,869,813],{"class":229},[176,871,258],{"class":229},[176,873,874],{"class":237},"443:443",[176,876,658],{"class":229},[176,878,879,882],{"class":178,"line":543},[176,880,881],{"class":742},"    volumes",[176,883,764],{"class":229},[176,885,886,888],{"class":178,"line":553},[176,887,813],{"class":229},[176,889,890],{"class":237}," .\u002FCaddyfile:\u002Fetc\u002Fcaddy\u002FCaddyfile\n",[176,892,893,895],{"class":178,"line":576},[176,894,813],{"class":229},[176,896,897],{"class":237}," caddy_data:\u002Fdata\n",[176,899,900,902],{"class":178,"line":596},[176,901,813],{"class":229},[176,903,904],{"class":237}," caddy_config:\u002Fconfig\n",[176,906,907],{"class":178,"line":617},[176,908,319],{"emptyLinePlaceholder":318},[176,910,911,914],{"class":178,"line":638},[176,912,913],{"class":742},"volumes",[176,915,764],{"class":229},[176,917,918,921],{"class":178,"line":652},[176,919,920],{"class":742},"  caddy_data",[176,922,764],{"class":229},[176,924,926,929],{"class":178,"line":925},24,[176,927,928],{"class":742},"  caddy_config",[176,930,764],{"class":229},[166,932,937],{"className":933,"code":934,"filename":935,"language":936,"meta":171,"style":171},"language-caddy shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","api.yourdomain.com {\n    reverse_proxy web:3000\n}\n","\u002Fopt\u002Fapp\u002FCaddyfile","caddy",[173,938,939,944,949],{"__ignoreMap":171},[176,940,941],{"class":178,"line":179},[176,942,943],{},"api.yourdomain.com {\n",[176,945,946],{"class":178,"line":185},[176,947,948],{},"    reverse_proxy web:3000\n",[176,950,951],{"class":178,"line":191},[176,952,953],{},"}\n",[145,955,956],{},"Start the containers:",[166,958,960],{"className":209,"code":959,"filename":671,"language":212,"meta":171,"style":171},"docker compose up -d\n",[173,961,962],{"__ignoreMap":171},[176,963,964,967,970,973],{"class":178,"line":179},[176,965,966],{"class":233},"docker",[176,968,969],{"class":237}," compose",[176,971,972],{"class":237}," up",[176,974,975],{"class":237}," -d\n",[145,977,978],{},"Your full-stack application is now live, secured with automated TLS certificates, and connected to high-performance managed database infrastructure.",[980,981,982],"style",{},"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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":171,"searchDepth":185,"depth":185,"links":984},[985,986,987,988],{"id":163,"depth":185,"text":164},{"id":205,"depth":185,"text":206},{"id":663,"depth":185,"text":664},{"id":728,"depth":185,"text":729},"End-to-end tutorial on launching a high-performance VPS, configuring Nginx, and connecting to 1st Managed PostgreSQL.","md",null,{},{"icon":97},{"title":995,"description":996},"Deploy a Full-Stack App - 1st Services Guide","Step-by-step tutorial deploying a web application with 1st VPS and Managed PostgreSQL.","WWO1c87GfpFqSSWNk86GVLAl1_P-ogMj5e-PL-BxlW4",[999,1001],{"title":83,"path":84,"stem":85,"description":1000,"icon":86,"children":-1},"High-speed developer micro-APIs for IP geolocation, DNS resolution, and webhook relaying.",{"title":99,"path":100,"stem":101,"description":1002,"icon":102,"children":-1},"Set up scheduled database backups and receive instant status notifications in Slack or Discord.",1787579790775]