[{"data":1,"prerenderedAt":1104},["ShallowReactive",2],{"navigation":3,"docs-path-index":340,"-docs-deployment-node-server":446,"-docs-deployment-node-server-surround":1099},[4],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":64},"Docs","i-lucide-book-marked","\u002Fdocs","docs",[10,30,65,293,318],{"title":11,"path":12,"stem":13,"children":14,"icon":29},"Getting Started","\u002Fdocs\u002Fgetting-started","docs\u002F1.getting-started\u002F1.index",[15,17,21,25],{"title":16,"path":12,"stem":13},"Introduction",{"title":18,"path":19,"stem":20},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","docs\u002F1.getting-started\u002F2.installation",{"title":22,"path":23,"stem":24},"Examples","\u002Fdocs\u002Fgetting-started\u002Fexamples","docs\u002F1.getting-started\u002F3.examples",{"title":26,"path":27,"stem":28},"Project Generator","\u002Fdocs\u002Fgetting-started\u002Fproject-generator","docs\u002F1.getting-started\u002F4.project-generator","i-lucide-rocket",{"title":31,"icon":32,"path":33,"stem":34,"children":35,"page":64},"Core features","i-lucide-square-function","\u002Fdocs\u002Fcore-features","docs\u002F2.core-features",[36,40,44,48,52,56,60],{"title":37,"path":38,"stem":39},"Configuration","\u002Fdocs\u002Fcore-features\u002Fconfiguration","docs\u002F2.core-features\u002F0.configuration",{"title":41,"path":42,"stem":43},"Dependency Injection","\u002Fdocs\u002Fcore-features\u002Fcontainer","docs\u002F2.core-features\u002F1.container",{"title":45,"path":46,"stem":47},"Controllers","\u002Fdocs\u002Fcore-features\u002Fcontrollers","docs\u002F2.core-features\u002F2.controllers",{"title":49,"path":50,"stem":51},"Middlewares","\u002Fdocs\u002Fcore-features\u002Fmiddlewares","docs\u002F2.core-features\u002F3.middlewares",{"title":53,"path":54,"stem":55},"Validation","\u002Fdocs\u002Fcore-features\u002Fvalidation","docs\u002F2.core-features\u002F4.validation",{"title":57,"path":58,"stem":59},"Introspection","\u002Fdocs\u002Fcore-features\u002Fintrospection","docs\u002F2.core-features\u002F5.introspection",{"title":61,"path":62,"stem":63},"Health Checks","\u002Fdocs\u002Fcore-features\u002Fhealth","docs\u002F2.core-features\u002F6.health",false,{"title":66,"icon":67,"defaultOpen":68,"path":69,"stem":70,"children":71,"page":64},"Modules","i-lucide-boxes",true,"\u002Fdocs\u002Fmodules","docs\u002F3.modules",[72,89,100,116,135,154,177,191,206,214,229,240,255,274,282],{"title":73,"icon":64,"defaultOpen":64,"path":74,"stem":75,"children":76,"page":64},"Auth","\u002Fdocs\u002Fmodules\u002Fauth","docs\u002F3.modules\u002F1.auth",[77,81,85],{"title":78,"path":79,"stem":80},"Overview","\u002Fdocs\u002Fmodules\u002Fauth\u002Foverview","docs\u002F3.modules\u002F1.auth\u002F0.overview",{"title":82,"path":83,"stem":84},"Decorators","\u002Fdocs\u002Fmodules\u002Fauth\u002Fdecorators","docs\u002F3.modules\u002F1.auth\u002F1.decorators",{"title":86,"path":87,"stem":88},"API Reference","\u002Fdocs\u002Fmodules\u002Fauth\u002Fapi","docs\u002F3.modules\u002F1.auth\u002F2.api",{"title":90,"icon":64,"defaultOpen":64,"path":91,"stem":92,"children":93,"page":64},"Devtools","\u002Fdocs\u002Fmodules\u002Fdevtools","docs\u002F3.modules\u002F10.devtools",[94,97],{"title":78,"path":95,"stem":96},"\u002Fdocs\u002Fmodules\u002Fdevtools\u002Foverview","docs\u002F3.modules\u002F10.devtools\u002F0.overview",{"title":37,"path":98,"stem":99},"\u002Fdocs\u002Fmodules\u002Fdevtools\u002Fconfiguration","docs\u002F3.modules\u002F10.devtools\u002F1.configuration",{"title":101,"icon":64,"defaultOpen":64,"path":102,"stem":103,"children":104,"page":64},"Telemetry","\u002Fdocs\u002Fmodules\u002Ftelemetry","docs\u002F3.modules\u002F11.telemetry",[105,108,112],{"title":78,"path":106,"stem":107},"\u002Fdocs\u002Fmodules\u002Ftelemetry\u002Foverview","docs\u002F3.modules\u002F11.telemetry\u002F0.overview",{"title":109,"path":110,"stem":111},"API","\u002Fdocs\u002Fmodules\u002Ftelemetry\u002Fapi","docs\u002F3.modules\u002F11.telemetry\u002F1.api",{"title":113,"path":114,"stem":115},"Instrumentation","\u002Fdocs\u002Fmodules\u002Ftelemetry\u002Finstrumentation","docs\u002F3.modules\u002F11.telemetry\u002F2.instrumentation",{"title":117,"icon":64,"defaultOpen":64,"path":118,"stem":119,"children":120,"page":64},"Queue","\u002Fdocs\u002Fmodules\u002Fqueue","docs\u002F3.modules\u002F12.queue",[121,124,128,132],{"title":78,"path":122,"stem":123},"\u002Fdocs\u002Fmodules\u002Fqueue\u002Foverview","docs\u002F3.modules\u002F12.queue\u002F0.overview",{"title":125,"path":126,"stem":127},"Consumers","\u002Fdocs\u002Fmodules\u002Fqueue\u002Fconsumers","docs\u002F3.modules\u002F12.queue\u002F1.consumers",{"title":129,"path":130,"stem":131},"Strategies","\u002Fdocs\u002Fmodules\u002Fqueue\u002Fstrategies","docs\u002F3.modules\u002F12.queue\u002F2.strategies",{"title":109,"path":133,"stem":134},"\u002Fdocs\u002Fmodules\u002Fqueue\u002Fapi","docs\u002F3.modules\u002F12.queue\u002F3.api",{"title":136,"icon":64,"defaultOpen":64,"path":137,"stem":138,"children":139,"page":64},"Scheduler","\u002Fdocs\u002Fmodules\u002Fscheduler","docs\u002F3.modules\u002F13.scheduler",[140,143,147,151],{"title":78,"path":141,"stem":142},"\u002Fdocs\u002Fmodules\u002Fscheduler\u002Foverview","docs\u002F3.modules\u002F13.scheduler\u002F0.overview",{"title":144,"path":145,"stem":146},"Jobs","\u002Fdocs\u002Fmodules\u002Fscheduler\u002Fjobs","docs\u002F3.modules\u002F13.scheduler\u002F1.jobs",{"title":148,"path":149,"stem":150},"Clustering","\u002Fdocs\u002Fmodules\u002Fscheduler\u002Fclustering","docs\u002F3.modules\u002F13.scheduler\u002F2.clustering",{"title":109,"path":152,"stem":153},"\u002Fdocs\u002Fmodules\u002Fscheduler\u002Fapi","docs\u002F3.modules\u002F13.scheduler\u002F3.api",{"title":155,"icon":64,"defaultOpen":64,"path":156,"stem":157,"children":158,"page":64},"Testing","\u002Fdocs\u002Fmodules\u002Ftesting","docs\u002F3.modules\u002F14.testing",[159,162,166,170,174],{"title":78,"path":160,"stem":161},"\u002Fdocs\u002Fmodules\u002Ftesting\u002Foverview","docs\u002F3.modules\u002F14.testing\u002F0.overview",{"title":163,"path":164,"stem":165},"Requests","\u002Fdocs\u002Fmodules\u002Ftesting\u002Frequests","docs\u002F3.modules\u002F14.testing\u002F1.requests",{"title":167,"path":168,"stem":169},"Dependencies","\u002Fdocs\u002Fmodules\u002Ftesting\u002Fdependencies","docs\u002F3.modules\u002F14.testing\u002F2.dependencies",{"title":171,"path":172,"stem":173},"Extensions","\u002Fdocs\u002Fmodules\u002Ftesting\u002Fextensions","docs\u002F3.modules\u002F14.testing\u002F3.extensions",{"title":109,"path":175,"stem":176},"\u002Fdocs\u002Fmodules\u002Ftesting\u002Fapi","docs\u002F3.modules\u002F14.testing\u002F4.api",{"title":178,"icon":64,"defaultOpen":64,"path":179,"stem":180,"children":181,"page":64},"Client","\u002Fdocs\u002Fmodules\u002Fclient","docs\u002F3.modules\u002F15.client",[182,185,188],{"title":78,"path":183,"stem":184},"\u002Fdocs\u002Fmodules\u002Fclient\u002Foverview","docs\u002F3.modules\u002F15.client\u002F0.overview",{"title":163,"path":186,"stem":187},"\u002Fdocs\u002Fmodules\u002Fclient\u002Frequests","docs\u002F3.modules\u002F15.client\u002F1.requests",{"title":109,"path":189,"stem":190},"\u002Fdocs\u002Fmodules\u002Fclient\u002Fapi","docs\u002F3.modules\u002F15.client\u002F2.api",{"title":192,"icon":64,"defaultOpen":64,"path":193,"stem":194,"children":195,"page":64},"Logger","\u002Fdocs\u002Fmodules\u002Flogger","docs\u002F3.modules\u002F2.logger",[196,199,203],{"title":78,"path":197,"stem":198},"\u002Fdocs\u002Fmodules\u002Flogger\u002Foverview","docs\u002F3.modules\u002F2.logger\u002F0.overview",{"title":200,"path":201,"stem":202},"Drains & Adapters","\u002Fdocs\u002Fmodules\u002Flogger\u002Fdrivers","docs\u002F3.modules\u002F2.logger\u002F1.drivers",{"title":109,"path":204,"stem":205},"\u002Fdocs\u002Fmodules\u002Flogger\u002Fapi","docs\u002F3.modules\u002F2.logger\u002F2.api",{"title":207,"icon":64,"defaultOpen":64,"path":208,"stem":209,"children":210,"page":64},"Serverless","\u002Fdocs\u002Fmodules\u002Fserverless","docs\u002F3.modules\u002F3.serverless",[211],{"title":78,"path":212,"stem":213},"\u002Fdocs\u002Fmodules\u002Fserverless\u002Foverview","docs\u002F3.modules\u002F3.serverless\u002F0.overview",{"title":215,"icon":64,"defaultOpen":64,"path":216,"stem":217,"children":218,"page":64},"Storage","\u002Fdocs\u002Fmodules\u002Fstorage","docs\u002F3.modules\u002F4.storage",[219,222,226],{"title":78,"path":220,"stem":221},"\u002Fdocs\u002Fmodules\u002Fstorage\u002Foverview","docs\u002F3.modules\u002F4.storage\u002F0.overview",{"title":223,"path":224,"stem":225},"Drivers","\u002Fdocs\u002Fmodules\u002Fstorage\u002Fdrivers","docs\u002F3.modules\u002F4.storage\u002F1.drivers",{"title":109,"path":227,"stem":228},"\u002Fdocs\u002Fmodules\u002Fstorage\u002Fapi","docs\u002F3.modules\u002F4.storage\u002F2.api",{"title":230,"icon":64,"defaultOpen":64,"path":231,"stem":232,"children":233,"page":64},"Web Sockets","\u002Fdocs\u002Fmodules\u002Fweb-sockets","docs\u002F3.modules\u002F5.web-sockets",[234,237],{"title":78,"path":235,"stem":236},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002Foverview","docs\u002F3.modules\u002F5.web-sockets\u002F0.overview",{"title":109,"path":238,"stem":239},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002Fapi","docs\u002F3.modules\u002F5.web-sockets\u002F1.api",{"title":241,"icon":64,"defaultOpen":64,"path":242,"stem":243,"children":244,"page":64},"Schema","\u002Fdocs\u002Fmodules\u002Fschema","docs\u002F3.modules\u002F6.schema",[245,248,251],{"title":78,"path":246,"stem":247},"\u002Fdocs\u002Fmodules\u002Fschema\u002Foverview","docs\u002F3.modules\u002F6.schema\u002F0.overview",{"title":82,"path":249,"stem":250},"\u002Fdocs\u002Fmodules\u002Fschema\u002Fdecorators","docs\u002F3.modules\u002F6.schema\u002F1.decorators",{"title":252,"path":253,"stem":254},"Scalar","\u002Fdocs\u002Fmodules\u002Fschema\u002Fscalar","docs\u002F3.modules\u002F6.schema\u002F2.scalar",{"title":256,"icon":64,"defaultOpen":64,"path":257,"stem":258,"children":259,"page":64},"Nitro","\u002Fdocs\u002Fmodules\u002Fnitro","docs\u002F3.modules\u002F7.nitro",[260,263,266,270],{"title":78,"path":261,"stem":262},"\u002Fdocs\u002Fmodules\u002Fnitro\u002Foverview","docs\u002F3.modules\u002F7.nitro\u002F0.overview",{"title":215,"path":264,"stem":265},"\u002Fdocs\u002Fmodules\u002Fnitro\u002Fstorage","docs\u002F3.modules\u002F7.nitro\u002F1.storage",{"title":267,"path":268,"stem":269},"File-Based Routes","\u002Fdocs\u002Fmodules\u002Fnitro\u002Ffile-based-routes","docs\u002F3.modules\u002F7.nitro\u002F2.file-based-routes",{"title":271,"path":272,"stem":273},"Middleware","\u002Fdocs\u002Fmodules\u002Fnitro\u002Fmiddleware","docs\u002F3.modules\u002F7.nitro\u002F3.middleware",{"title":275,"icon":64,"defaultOpen":64,"path":276,"stem":277,"children":278,"page":64},"Vite","\u002Fdocs\u002Fmodules\u002Fvite","docs\u002F3.modules\u002F8.vite",[279],{"title":78,"path":280,"stem":281},"\u002Fdocs\u002Fmodules\u002Fvite\u002Foverview","docs\u002F3.modules\u002F8.vite\u002F0.overview",{"title":283,"icon":64,"defaultOpen":64,"path":284,"stem":285,"children":286,"page":64},"Cache","\u002Fdocs\u002Fmodules\u002Fcache","docs\u002F3.modules\u002F9.cache",[287,290],{"title":78,"path":288,"stem":289},"\u002Fdocs\u002Fmodules\u002Fcache\u002Foverview","docs\u002F3.modules\u002F9.cache\u002F0.overview",{"title":109,"path":291,"stem":292},"\u002Fdocs\u002Fmodules\u002Fcache\u002Fapi","docs\u002F3.modules\u002F9.cache\u002F1.api",{"title":294,"icon":295,"path":296,"stem":297,"children":298,"page":64},"Deployment","i-lucide-cloud-upload","\u002Fdocs\u002Fdeployment","docs\u002F4.deployment",[299,302,306,310,314],{"title":78,"path":300,"stem":301},"\u002Fdocs\u002Fdeployment\u002Foverview","docs\u002F4.deployment\u002F0.overview",{"title":303,"path":304,"stem":305},"Vercel","\u002Fdocs\u002Fdeployment\u002Fvercel","docs\u002F4.deployment\u002F1.vercel",{"title":307,"path":308,"stem":309},"AWS Lambda","\u002Fdocs\u002Fdeployment\u002Faws-lambda","docs\u002F4.deployment\u002F2.aws-lambda",{"title":311,"path":312,"stem":313},"Azure Functions","\u002Fdocs\u002Fdeployment\u002Fazure-functions","docs\u002F4.deployment\u002F3.azure-functions",{"title":315,"path":316,"stem":317},"Node.js Server","\u002Fdocs\u002Fdeployment\u002Fnode-server","docs\u002F4.deployment\u002F4.node-server",{"title":319,"icon":320,"path":321,"stem":322,"children":323,"page":64},"Advanced","i-lucide-brain","\u002Fdocs\u002Fadvanced","docs\u002F99.advanced",[324,328,332,336],{"title":325,"path":326,"stem":327},"Custom Decorator","\u002Fdocs\u002Fadvanced\u002Fcustom-decorator","docs\u002F99.advanced\u002F1.custom-decorator",{"title":329,"path":330,"stem":331},"Plugins","\u002Fdocs\u002Fadvanced\u002Fcustom-plugin","docs\u002F99.advanced\u002F2.custom-plugin",{"title":333,"path":334,"stem":335},"Custom CLI Command","\u002Fdocs\u002Fadvanced\u002Fcustom-cli-command","docs\u002F99.advanced\u002F3.custom-cli-command",{"title":337,"path":338,"stem":339},"Writing a Recipe","\u002Fdocs\u002Fadvanced\u002Fwriting-a-recipe","docs\u002F99.advanced\u002F4.writing-a-recipe",[341,343,345,346,347,348,349,351,352,353,354,355,356,357,358,360,362,363,364,365,367,368,369,371,372,373,374,376,377,378,379,380,382,383,384,385,386,388,389,390,391,392,393,395,396,397,398,400,401,402,403,405,406,408,409,410,411,413,414,415,417,418,419,420,422,423,424,425,426,428,429,431,432,433,435,436,437,438,439,440,442,443,444,445],{"path":342},"\u002Fdocs\u002F.navigation",{"path":344},"\u002Fdocs\u002Fgetting-started\u002F.navigation",{"path":12},{"path":19},{"path":23},{"path":27},{"path":350},"\u002Fdocs\u002Fcore-features\u002F.navigation",{"path":38},{"path":42},{"path":46},{"path":50},{"path":54},{"path":58},{"path":62},{"path":359},"\u002Fdocs\u002Fmodules\u002F.navigation",{"path":361},"\u002Fdocs\u002Fmodules\u002Fauth\u002F.navigation",{"path":79},{"path":83},{"path":87},{"path":366},"\u002Fdocs\u002Fmodules\u002Fdevtools\u002F.navigation",{"path":95},{"path":98},{"path":370},"\u002Fdocs\u002Fmodules\u002Ftelemetry\u002F.navigation",{"path":106},{"path":110},{"path":114},{"path":375},"\u002Fdocs\u002Fmodules\u002Fqueue\u002F.navigation",{"path":122},{"path":126},{"path":130},{"path":133},{"path":381},"\u002Fdocs\u002Fmodules\u002Fscheduler\u002F.navigation",{"path":141},{"path":145},{"path":149},{"path":152},{"path":387},"\u002Fdocs\u002Fmodules\u002Ftesting\u002F.navigation",{"path":160},{"path":164},{"path":168},{"path":172},{"path":175},{"path":394},"\u002Fdocs\u002Fmodules\u002Fclient\u002F.navigation",{"path":183},{"path":186},{"path":189},{"path":399},"\u002Fdocs\u002Fmodules\u002Flogger\u002F.navigation",{"path":197},{"path":201},{"path":204},{"path":404},"\u002Fdocs\u002Fmodules\u002Fserverless\u002F.navigation",{"path":212},{"path":407},"\u002Fdocs\u002Fmodules\u002Fstorage\u002F.navigation",{"path":220},{"path":224},{"path":227},{"path":412},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002F.navigation",{"path":235},{"path":238},{"path":416},"\u002Fdocs\u002Fmodules\u002Fschema\u002F.navigation",{"path":246},{"path":249},{"path":253},{"path":421},"\u002Fdocs\u002Fmodules\u002Fnitro\u002F.navigation",{"path":261},{"path":264},{"path":268},{"path":272},{"path":427},"\u002Fdocs\u002Fmodules\u002Fvite\u002F.navigation",{"path":280},{"path":430},"\u002Fdocs\u002Fmodules\u002Fcache\u002F.navigation",{"path":288},{"path":291},{"path":434},"\u002Fdocs\u002Fdeployment\u002F.navigation",{"path":300},{"path":304},{"path":308},{"path":312},{"path":316},{"path":441},"\u002Fdocs\u002Fadvanced\u002F.navigation",{"path":326},{"path":330},{"path":334},{"path":338},{"id":447,"title":315,"body":448,"description":1093,"extension":1094,"links":1095,"meta":1096,"navigation":68,"path":316,"seo":1097,"stem":317,"__hash__":1098},"docs\u002Fdocs\u002F4.deployment\u002F4.node-server.md",{"type":449,"value":450,"toc":1088},"minimark",[451,460,491,498,631,661,685,690,832,857,860,933,965,984,988,1077,1084],[452,453,454,455,459],"p",{},"On a VPS, a VM or in a container, a Vercube application is a plain Node.js process: build it once and run ",[456,457,458],"code",{},"dist\u002Findex.mjs",".",[461,462,467],"pre",{"className":463,"code":464,"language":465,"meta":466,"style":466},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","vercube build\nnode dist\u002Findex.mjs\n","bash","",[456,468,469,482],{"__ignoreMap":466},[470,471,474,478],"span",{"class":472,"line":473},"line",1,[470,475,477],{"class":476},"sBMFI","vercube",[470,479,481],{"class":480},"sfazB"," build\n",[470,483,485,488],{"class":472,"line":484},2,[470,486,487],{"class":476},"node",[470,489,490],{"class":480}," dist\u002Findex.mjs\n",[452,492,493,494,497],{},"The entry calls ",[456,495,496],{},"app.listen()"," without any guard:",[461,499,504],{"className":500,"code":501,"filename":502,"language":503,"meta":466,"style":466},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { createApp } from '@vercube\u002Fcore';\n\nconst app = await createApp();\n\nawait app.listen();\n\nexport default { fetch: app.fetch.bind(app) };\n","src\u002Findex.ts","ts",[456,505,506,538,543,567,572,590,595],{"__ignoreMap":466},[470,507,508,512,516,520,523,526,529,532,535],{"class":472,"line":473},[470,509,511],{"class":510},"s7zQu","import",[470,513,515],{"class":514},"sMK4o"," {",[470,517,519],{"class":518},"sTEyZ"," createApp",[470,521,522],{"class":514}," }",[470,524,525],{"class":510}," from",[470,527,528],{"class":514}," '",[470,530,531],{"class":480},"@vercube\u002Fcore",[470,533,534],{"class":514},"'",[470,536,537],{"class":514},";\n",[470,539,540],{"class":472,"line":484},[470,541,542],{"emptyLinePlaceholder":68},"\n",[470,544,546,550,553,556,559,562,565],{"class":472,"line":545},3,[470,547,549],{"class":548},"spNyl","const",[470,551,552],{"class":518}," app ",[470,554,555],{"class":514},"=",[470,557,558],{"class":510}," await",[470,560,519],{"class":561},"s2Zo4",[470,563,564],{"class":518},"()",[470,566,537],{"class":514},[470,568,570],{"class":472,"line":569},4,[470,571,542],{"emptyLinePlaceholder":68},[470,573,575,578,581,583,586,588],{"class":472,"line":574},5,[470,576,577],{"class":510},"await",[470,579,580],{"class":518}," app",[470,582,459],{"class":514},[470,584,585],{"class":561},"listen",[470,587,564],{"class":518},[470,589,537],{"class":514},[470,591,593],{"class":472,"line":592},6,[470,594,542],{"emptyLinePlaceholder":68},[470,596,598,601,604,606,610,613,615,617,620,622,625,628],{"class":472,"line":597},7,[470,599,600],{"class":510},"export",[470,602,603],{"class":510}," default",[470,605,515],{"class":514},[470,607,609],{"class":608},"swJcz"," fetch",[470,611,612],{"class":514},":",[470,614,580],{"class":518},[470,616,459],{"class":514},[470,618,619],{"class":518},"fetch",[470,621,459],{"class":514},[470,623,624],{"class":561},"bind",[470,626,627],{"class":518},"(app) ",[470,629,630],{"class":514},"};\n",[452,632,633,635,636,639,640,643,644,646,647,650,651,653,654,656,657,660],{},[456,634,496],{}," binds the port unless ",[456,637,638],{},"VERCUBE_LISTEN=0"," is set. Tools that import the entry only to reach the app, such as ",[456,641,642],{},"vercube scheduler"," and the Vite dev worker, set it themselves. On Vercel, AWS Lambda and Azure Functions listening is turned off too, so the same entry can be imported there: Vercel drives it through the exported ",[456,645,619],{}," (",[648,649,303],"a",{"href":304},"), while Lambda and Azure still need their adapters (",[648,652,307],{"href":308},", ",[648,655,311],{"href":312},"). ",[456,658,659],{},"VERCUBE_LISTEN=1"," forces the server up anywhere.",[662,663,664],"warning",{},[452,665,666,667,669,670,673,674,677,678,680,681,684],{},"Do not guard ",[456,668,496],{}," with ",[456,671,672],{},"if (import.meta.main)",". Process managers such as PM2 import the entry through a wrapper, so ",[456,675,676],{},"import.meta.main"," is false there and the server never starts, without an error. On a Node.js release without ",[456,679,676],{}," the guard is ",[456,682,683],{},"undefined"," and the server never starts either.",[686,687,689],"h2",{"id":688},"pm2","PM2",[461,691,696],{"className":692,"code":693,"filename":694,"language":695,"meta":466,"style":466},"language-js shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","module.exports = {\n  apps: [\n    {\n      name: 'api',\n      script: 'dist\u002Findex.mjs',\n      instances: 'max',\n      exec_mode: 'cluster',\n      env: { NODE_ENV: 'production' },\n    },\n  ],\n};\n","ecosystem.config.cjs","js",[456,697,698,709,719,724,741,756,772,788,813,819,827],{"__ignoreMap":466},[470,699,700,703,706],{"class":472,"line":473},[470,701,702],{"class":514},"module.exports",[470,704,705],{"class":514}," =",[470,707,708],{"class":514}," {\n",[470,710,711,714,716],{"class":472,"line":484},[470,712,713],{"class":608},"  apps",[470,715,612],{"class":514},[470,717,718],{"class":518}," [\n",[470,720,721],{"class":472,"line":545},[470,722,723],{"class":514},"    {\n",[470,725,726,729,731,733,736,738],{"class":472,"line":569},[470,727,728],{"class":608},"      name",[470,730,612],{"class":514},[470,732,528],{"class":514},[470,734,735],{"class":480},"api",[470,737,534],{"class":514},[470,739,740],{"class":514},",\n",[470,742,743,746,748,750,752,754],{"class":472,"line":574},[470,744,745],{"class":608},"      script",[470,747,612],{"class":514},[470,749,528],{"class":514},[470,751,458],{"class":480},[470,753,534],{"class":514},[470,755,740],{"class":514},[470,757,758,761,763,765,768,770],{"class":472,"line":592},[470,759,760],{"class":608},"      instances",[470,762,612],{"class":514},[470,764,528],{"class":514},[470,766,767],{"class":480},"max",[470,769,534],{"class":514},[470,771,740],{"class":514},[470,773,774,777,779,781,784,786],{"class":472,"line":597},[470,775,776],{"class":608},"      exec_mode",[470,778,612],{"class":514},[470,780,528],{"class":514},[470,782,783],{"class":480},"cluster",[470,785,534],{"class":514},[470,787,740],{"class":514},[470,789,791,794,796,798,801,803,805,808,810],{"class":472,"line":790},8,[470,792,793],{"class":608},"      env",[470,795,612],{"class":514},[470,797,515],{"class":514},[470,799,800],{"class":608}," NODE_ENV",[470,802,612],{"class":514},[470,804,528],{"class":514},[470,806,807],{"class":480},"production",[470,809,534],{"class":514},[470,811,812],{"class":514}," },\n",[470,814,816],{"class":472,"line":815},9,[470,817,818],{"class":514},"    },\n",[470,820,822,825],{"class":472,"line":821},10,[470,823,824],{"class":518},"  ]",[470,826,740],{"class":514},[470,828,830],{"class":472,"line":829},11,[470,831,630],{"class":514},[461,833,835],{"className":463,"code":834,"language":465,"meta":466,"style":466},"pm2 start ecosystem.config.cjs\npm2 logs api\n",[456,836,837,847],{"__ignoreMap":466},[470,838,839,841,844],{"class":472,"line":473},[470,840,688],{"class":476},[470,842,843],{"class":480}," start",[470,845,846],{"class":480}," ecosystem.config.cjs\n",[470,848,849,851,854],{"class":472,"line":484},[470,850,688],{"class":476},[470,852,853],{"class":480}," logs",[470,855,856],{"class":480}," api\n",[686,858,859],{"id":859},"systemd",[461,861,866],{"className":862,"code":863,"filename":864,"language":865,"meta":466,"style":466},"language-ini shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[Unit]\nDescription=Vercube API\nAfter=network.target\n\n[Service]\nWorkingDirectory=\u002Fsrv\u002Fapi\nExecStart=\u002Fusr\u002Fbin\u002Fnode dist\u002Findex.mjs\nEnvironment=NODE_ENV=production\nRestart=on-failure\nUser=www-data\n\n[Install]\nWantedBy=multi-user.target\n","\u002Fetc\u002Fsystemd\u002Fsystem\u002Fapi.service","ini",[456,867,868,873,878,883,887,892,897,902,907,912,917,921,927],{"__ignoreMap":466},[470,869,870],{"class":472,"line":473},[470,871,872],{},"[Unit]\n",[470,874,875],{"class":472,"line":484},[470,876,877],{},"Description=Vercube API\n",[470,879,880],{"class":472,"line":545},[470,881,882],{},"After=network.target\n",[470,884,885],{"class":472,"line":569},[470,886,542],{"emptyLinePlaceholder":68},[470,888,889],{"class":472,"line":574},[470,890,891],{},"[Service]\n",[470,893,894],{"class":472,"line":592},[470,895,896],{},"WorkingDirectory=\u002Fsrv\u002Fapi\n",[470,898,899],{"class":472,"line":597},[470,900,901],{},"ExecStart=\u002Fusr\u002Fbin\u002Fnode dist\u002Findex.mjs\n",[470,903,904],{"class":472,"line":790},[470,905,906],{},"Environment=NODE_ENV=production\n",[470,908,909],{"class":472,"line":815},[470,910,911],{},"Restart=on-failure\n",[470,913,914],{"class":472,"line":821},[470,915,916],{},"User=www-data\n",[470,918,919],{"class":472,"line":829},[470,920,542],{"emptyLinePlaceholder":68},[470,922,924],{"class":472,"line":923},12,[470,925,926],{},"[Install]\n",[470,928,930],{"class":472,"line":929},13,[470,931,932],{},"WantedBy=multi-user.target\n",[461,934,936],{"className":463,"code":935,"language":465,"meta":466,"style":466},"systemctl enable --now api\njournalctl -u api -f\n",[456,937,938,951],{"__ignoreMap":466},[470,939,940,943,946,949],{"class":472,"line":473},[470,941,942],{"class":476},"systemctl",[470,944,945],{"class":480}," enable",[470,947,948],{"class":480}," --now",[470,950,856],{"class":480},[470,952,953,956,959,962],{"class":472,"line":484},[470,954,955],{"class":476},"journalctl",[470,957,958],{"class":480}," -u",[470,960,961],{"class":480}," api",[470,963,964],{"class":480}," -f\n",[452,966,967,968,971,972,975,976,979,980,459],{},"Set ",[456,969,970],{},"shutdown.handleSignals"," in your config so ",[456,973,974],{},"systemctl stop"," and ",[456,977,978],{},"pm2 reload"," let requests in flight finish, see ",[648,981,983],{"href":982},"\u002Fdocs\u002Fcore-features\u002Fconfiguration#graceful-shutdown","Graceful Shutdown",[686,985,987],{"id":986},"docker","Docker",[461,989,994],{"className":990,"code":991,"filename":992,"language":993,"meta":466,"style":466},"language-dockerfile shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","FROM node:24-slim AS build\nWORKDIR \u002Fapp\nRUN corepack enable\nCOPY package.json pnpm-lock.yaml .\u002F\nRUN pnpm install --frozen-lockfile\nCOPY . .\nRUN pnpm build\n\nFROM node:24-slim\nWORKDIR \u002Fapp\nENV NODE_ENV=production\nCOPY --from=build \u002Fapp\u002Fpackage.json .\u002F\nCOPY --from=build \u002Fapp\u002Fnode_modules .\u002Fnode_modules\nCOPY --from=build \u002Fapp\u002Fdist .\u002Fdist\nEXPOSE 3000\nCMD [\"node\", \"dist\u002Findex.mjs\"]\n","Dockerfile","dockerfile",[456,995,996,1001,1006,1011,1016,1021,1026,1031,1035,1040,1044,1049,1054,1059,1065,1071],{"__ignoreMap":466},[470,997,998],{"class":472,"line":473},[470,999,1000],{},"FROM node:24-slim AS build\n",[470,1002,1003],{"class":472,"line":484},[470,1004,1005],{},"WORKDIR \u002Fapp\n",[470,1007,1008],{"class":472,"line":545},[470,1009,1010],{},"RUN corepack enable\n",[470,1012,1013],{"class":472,"line":569},[470,1014,1015],{},"COPY package.json pnpm-lock.yaml .\u002F\n",[470,1017,1018],{"class":472,"line":574},[470,1019,1020],{},"RUN pnpm install --frozen-lockfile\n",[470,1022,1023],{"class":472,"line":592},[470,1024,1025],{},"COPY . .\n",[470,1027,1028],{"class":472,"line":597},[470,1029,1030],{},"RUN pnpm build\n",[470,1032,1033],{"class":472,"line":790},[470,1034,542],{"emptyLinePlaceholder":68},[470,1036,1037],{"class":472,"line":815},[470,1038,1039],{},"FROM node:24-slim\n",[470,1041,1042],{"class":472,"line":821},[470,1043,1005],{},[470,1045,1046],{"class":472,"line":829},[470,1047,1048],{},"ENV NODE_ENV=production\n",[470,1050,1051],{"class":472,"line":923},[470,1052,1053],{},"COPY --from=build \u002Fapp\u002Fpackage.json .\u002F\n",[470,1055,1056],{"class":472,"line":929},[470,1057,1058],{},"COPY --from=build \u002Fapp\u002Fnode_modules .\u002Fnode_modules\n",[470,1060,1062],{"class":472,"line":1061},14,[470,1063,1064],{},"COPY --from=build \u002Fapp\u002Fdist .\u002Fdist\n",[470,1066,1068],{"class":472,"line":1067},15,[470,1069,1070],{},"EXPOSE 3000\n",[470,1072,1074],{"class":472,"line":1073},16,[470,1075,1076],{},"CMD [\"node\", \"dist\u002Findex.mjs\"]\n",[452,1078,1079,1080,1083],{},"Bind to all interfaces inside a container with ",[456,1081,1082],{},"server: { host: '0.0.0.0' }",", otherwise the port is only reachable from the container itself.",[1085,1086,1087],"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 .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 .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":466,"searchDepth":473,"depth":484,"links":1089},[1090,1091,1092],{"id":688,"depth":484,"text":689},{"id":859,"depth":484,"text":859},{"id":986,"depth":484,"text":987},"Run a Vercube application on your own server or container with PM2, systemd or Docker.","md",null,{},{"title":315,"description":1093},"2pHvTuyrg-M0k504NJlKkMIry8eURzkHHaw8TV_TBqA",[1100,1102],{"title":311,"path":312,"stem":313,"description":1101,"children":-1},"Deploy your Vercube application to Azure Functions with HTTP triggers",{"title":325,"path":326,"stem":327,"description":1103,"children":-1},"Learn how to create and use custom decorators in Vercube to extend functionality and create reusable patterns",1794396674237]