Experimental http and tcp uptime monitors with a bounded result history and hourly rollups, off unless APP_MONITORS_ENABLED is set.
Monitors are experimental. The API, CLI and storage may change between releases.
A monitor probes an endpoint on a schedule from the control plane and records the result. This first slice has http and tcp monitors, a result history, and hourly rollups. It does not send alerts, open incidents or change the status page.The feature is off by default. When APP_MONITORS_ENABLED is not true, the /api/v1/monitors routes answer 404 and no scheduler runs.
http: method (GET, HEAD, POST, PUT), optional headers, accepted status codes or ranges (default 200 to 399), an optional contains keyword searched in the first bytes of the body, and a timeout. Redirects are not followed unless asked for, up to a server limit.
tcp: a host and port. The check passes when the connection completes within the timeout.
Header values are stored encrypted with the same secret store as app secrets. They are never returned by the API or the CLI, and results keep only a short failure class such as timeout or status_mismatch, never a body or header value.
Every connection, including redirects, goes through the outbound address guard. Private, loopback and link local addresses are refused unless the control plane has explicitly allowed private outbound targets. A refused target shows as blocked_address and is rejected at create time.
Results are written in batches, with the hourly rollup updated in the same transaction. Raw results are kept for a short window and rollups for much longer. Pruning runs in small batches so it does not hold the database write lock.
GET /api/v1/monitors, POST /api/v1/monitors, DELETE /api/v1/monitors/{id}
GET /api/v1/monitors/{id}/results?window=24h&limit=100 returns recent raw results and hourly rollups.
Reading needs read access and changing needs write access on the monitors resource. Creating and deleting are recorded in the audit log.
Last modified on October 30, 2026
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Levelrail","description":"Self-hosted deployment platform. Push to git, get a running app with TLS, logs, metrics and rollback. One Go binary, no Kubernetes.","colors":{"primary":"#107292","light":"#2FB3DC","dark":"#084F67"},"logo":{"light":"https://mintcdn.com/levelrail/56HjW70mOjUmjIrm/assets/brand/wordmark-light.svg?fit=max\u0026auto=format\u0026n=56HjW70mOjUmjIrm\u0026q=85\u0026s=cbe02b3c3d17b11f9cc5a18551a30782","dark":"https://mintcdn.com/levelrail/56HjW70mOjUmjIrm/assets/brand/wordmark-dark.svg?fit=max\u0026auto=format\u0026n=56HjW70mOjUmjIrm\u0026q=85\u0026s=a4aa78b496c43e0a5edd9dffce778a45","href":"https://levelrail.com"},"favicon":"https://mintcdn.com/levelrail/zPhEnShTGkGFCjPc/public/favicon.svg?fit=max\u0026auto=format\u0026n=zPhEnShTGkGFCjPc\u0026q=85\u0026s=65f3143dd7539d4b1d34090204f05be0","appearance":{"default":"dark","strict":false},"background":{"color":{"light":"#ffffff","dark":"#000000"}},"navbar":{"links":[{"icon":"globe","href":"https://levelrail.com","label":"Website"},{"icon":"clock-rotate-left","href":"/changelog","label":"Changelog"},{"icon":"github","href":"https://github.com/glincker/levelrail","label":"GitHub"}],"primary":{"type":"button","label":"Get started","href":"/getting-started"}},"footer":{"socials":{"github":"https://github.com/glincker/levelrail","x":"https://x.com/thegdsks","website":"https://levelrail.com"}},"search":{"prompt":"Search docs, CLI, API, guides"},"seo":{"metatags":{"og:site_name":"Levelrail Docs","og:type":"website","og:image":"https://docs.levelrail.com/public/og/default.png","og:image:width":"1200","og:image:height":"630","twitter:card":"summary_large_image","twitter:image":"https://docs.levelrail.com/public/og/default.png","twitter:site":"@thegdsks","keywords":"self-hosted PaaS, Coolify alternative, Docker deployment platform, self-hosted deploys, Levelrail"},"indexing":"navigable"},"fonts":{"heading":{"family":"Geist","weight":500},"body":{"family":"Geist"}},"styling":{"codeblocks":"dark","latex":true},"errors":{"404":{"redirect":false,"title":"Page not found","description":"This page moved or never existed. Try the [quickstart](/getting-started), the [all pages index](/all-pages) or search above."}},"contextual":{"options":["copy","view","chatgpt","claude","cursor","mcp"],"display":"header"},"interaction":{"drilldown":true},"metadata":{"timestamp":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"levelrail","hasAudioNarration":false,"actualSubdomain":"levelrail","customDomains":["docs.levelrail.com"],"gitSource":{"type":"github","owner":"glincker","repo":"levelrail","deployBranch":"main","contentDirectory":"docs","isPrivate":false,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6ae3e84f95b46faec5d2ac9b","collectionId":"a9a49c83-01eb-42dd-ac47-f41be8a1fafe","liveDeploymentHistoryId":"6ae3e84f95b46faec5d2ac9b","schemaVersion":"v3"},"entitlements":{},"buildId":"6ae3eb088464996fbe467c5b","clientVersion":"0.0.4021","searchFilterCounts":[{"language":"default","tag":"Self-host gallery","count":370},{"language":"default","tag":"How-to guides","count":192},{"language":"default","tag":"Productivity","count":74},{"language":"default","tag":"Developer Tools","count":56},{"language":"default","tag":"Deploying","count":44},{"language":"default","tag":"Get started","count":38},{"language":"default","tag":"Reference","count":34},{"language":"default","tag":"AI","count":34},{"language":"default","tag":"Appendix","count":31},{"language":"default","tag":"Databases and storage","count":31}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":true},"customCss":[{"filePath":"style.css","content":":root{--lr-live:#2fb3dc;--lr-soft:#58b1ce;--lr-teal:#107292;--lr-mono:ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;--lr-r:12px;--lr-face:#0e0f11;--lr-face-2:#141617;--lr-text:#cfcfd3;--lr-link:#58b1ce;--lr-line:rgba(255, 255, 255, 0.08);--lr-ring:linear-gradient(180deg, rgba(255, 255, 255, 0.18), rgba(255, 255, 255, 0.04) 40%, rgba(255, 255, 255, 0.06));--lr-ring-hot:linear-gradient(180deg, rgba(47, 179, 220, 0.55), rgba(47, 179, 220, 0.12) 45%, rgba(47, 179, 220, 0.2));--lr-sheen:linear-gradient(180deg, rgba(255, 255, 255, 0.035), rgba(255, 255, 255, 0));--lr-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.07), 0 1px 1px rgba(0, 0, 0, 0.5), 0 8px 16px -4px rgba(0, 0, 0, 0.55), 0 24px 48px -12px rgba(0, 0, 0, 0.65);--lr-glow-op:1;--lr-grain:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='220' height='220'%3E%3Cfilter id='n' x='0' y='0' width='100%25' height='100%25'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 9 0 0 0 -4.3'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E\")}html:not(.dark){--lr-face:#ffffff;--lr-face-2:#f6f6f7;--lr-text:#3a3d40;--lr-link:#107292;--lr-line:rgba(14, 15, 17, 0.1);--lr-ring:linear-gradient(180deg, rgba(14, 15, 17, 0.2), rgba(14, 15, 17, 0.08) 40%, rgba(14, 15, 17, 0.1));--lr-ring-hot:linear-gradient(180deg, rgba(16, 114, 146, 0.6), rgba(16, 114, 146, 0.18) 45%, rgba(16, 114, 146, 0.26));--lr-sheen:linear-gradient(180deg, rgba(255, 255, 255, 0.9), rgba(255, 255, 255, 0));--lr-shadow:0 1px 1px rgba(14, 15, 17, 0.06), 0 8px 16px -6px rgba(14, 15, 17, 0.1);--lr-glow-op:0.35}html.dark body{background-color:#000}body{position:relative;font-feature-settings:\"cv11\",\"ss03\";-webkit-font-smoothing:antialiased}body::after,body::before{content:\"\";position:absolute;inset:0 0 auto 0;height:440px;z-index:-1;pointer-events:none;background:radial-gradient(54% 92% at 50% 0,rgba(47,179,220,.42),transparent 72%),radial-gradient(38% 78% at 10% 0,rgba(31,200,176,.3),transparent 72%),radial-gradient(36% 70% at 92% 0,rgba(108,125,255,.3),transparent 72%)}body::before{opacity:calc(.4*var(--lr-glow-op))}body::after{opacity:calc(.9*var(--lr-glow-op));filter:saturate(1.2) brightness(1.25);-webkit-mask-image:var(--lr-grain),linear-gradient(to bottom,#000 0%,transparent 88%);-webkit-mask-size:220px 220px,100% 100%;-webkit-mask-composite:source-in;mask-image:var(--lr-grain),linear-gradient(to bottom,#000 0%,transparent 88%);mask-size:220px 220px,100% 100%;mask-composite:intersect}html{isolation:isolate}#content-area,#content-container{color:var(--lr-text)}#page-title{font-weight:300;letter-spacing:-.03em;line-height:1.08;text-wrap:balance}#content-area h2{font-weight:300;letter-spacing:-.025em}#content-area h3,#content-area h4{font-weight:500;letter-spacing:-.02em}#content-area p,#header p{text-wrap:pretty}#header>div>div:first-child:not(:has(h1)){font-family:var(--lr-mono);font-size:.75rem;letter-spacing:.08em;text-transform:uppercase;color:#8d8d96}#content-area a:not(.card):not([data-component-part]){color:var(--lr-link)}#content-area a[href]:not(.card){text-decoration-color:color-mix(in srgb,var(--lr-link) 40%,transparent)}#content-area a[href]:not(.card):hover{text-decoration-color:currentColor}code,kbd,pre,samp{font-family:var(--lr-mono)!important;font-feature-settings:\"calt\" 0}#content-area :not(pre)>code{background:var(--lr-face-2);border:1px solid var(--lr-line);border-radius:6px;padding:.1em .4em;font-size:.875em;color:inherit}html.dark #content-area :not(pre)>code{color:#e4e4e7}.code-block{border-radius:var(--lr-r);border:1px solid transparent;box-shadow:var(--lr-shadow);background:var(--lr-sheen) padding-box,linear-gradient(#08090a,#08090a) padding-box,var(--lr-ring) border-box}.code-block-background,.code-block>div{border-radius:var(--lr-r);background-color:transparent}#sidebar .sticky.pointer-events-none,.code-block [data-component-part=code-block-root],.code-block pre{background:0 0}.code-block code{font-size:.8125rem;line-height:1.7}.accordion,.accordion-group,.callout,.card{border:1px solid transparent;border-radius:var(--lr-r);box-shadow:var(--lr-shadow);background:var(--lr-sheen) padding-box,linear-gradient(var(--lr-face),var(--lr-face)) padding-box,var(--lr-ring) border-box}.card{transition:box-shadow .2s,transform .2s}.card:hover{transform:translateY(-1px)}html.dark .card:hover{border-color:rgba(47,179,220,.45)}.card [data-component-part=card-title]{font-weight:500;letter-spacing:-.01em}#navbar .nav-tabs-item[data-active=true],.card [data-component-part=card-icon]{color:var(--lr-live)}html:not(.dark) #navbar .nav-tabs-item[data-active=true],html:not(.dark) .card [data-component-part=card-icon]{color:#107292}.accordion{margin-bottom:.75rem}.accordion,.accordion-group{overflow:hidden}.callout{padding:1rem 1.25rem}.callout[class*=border-blue],.callout[class*=border-green],.callout[class*=border-red],.callout[class*=border-sky],.callout[class*=border-yellow]{background:var(--lr-sheen) padding-box,linear-gradient(var(--lr-face),var(--lr-face)) padding-box,var(--lr-ring) border-box}@media (prefers-reduced-motion:reduce){.card{transition:none}.card:hover{transform:none}}#content-area table{border-collapse:separate;border-spacing:0;border:1px solid var(--lr-line);border-radius:var(--lr-r);overflow:hidden;box-shadow:var(--lr-shadow)}#content-area thead th{font-family:var(--lr-mono);font-size:.75rem;font-weight:500;letter-spacing:.06em;text-transform:uppercase;color:#8d8d96;background:var(--lr-face-2)}#content-area tbody td,#content-area thead th{border-bottom:1px solid var(--lr-line)}#content-area tbody tr:last-child td{border-bottom:0}#navbar>div.absolute,#navbar>div>div.absolute{background:color-mix(in srgb,var(--lr-face) 38%,transparent);border-bottom-color:var(--lr-line);backdrop-filter:blur(20px) saturate(1.3);-webkit-backdrop-filter:blur(20px) saturate(1.3)}#navbar .nav-tabs-item[data-active=true]::after,#navbar .nav-tabs-item[data-active=true]>div{background:var(--lr-live)}html:not(.dark) #navbar .nav-tabs-item[data-active=true]::after,html:not(.dark) #navbar .nav-tabs-item[data-active=true]>div{background:#107292}#topbar-cta-button a>span.absolute{border-radius:50px;background:var(--lr-live);border:1px solid rgba(255,255,255,.35);box-shadow:inset 0 1px 0 rgba(255,255,255,.55),inset 0 -2px 0 rgba(0,0,0,.18),0 6px 14px -6px rgba(47,179,220,.45)}#topbar-cta-button a{padding-left:1rem;padding-right:.75rem}#topbar-cta-button a .text-white,#topbar-cta-button a svg{color:#000!important}html:not(.dark) #topbar-cta-button a>span.absolute{background:#06232c;border-color:transparent;box-shadow:0 1px 1px rgba(14,15,17,.3)}html:not(.dark) #topbar-cta-button a .text-white,html:not(.dark) #topbar-cta-button a svg{color:#2fb3dc!important}#search-bar-entry{border-radius:50px;border:1px solid transparent;box-shadow:var(--lr-shadow);background:var(--lr-sheen) padding-box,linear-gradient(var(--lr-face-2),var(--lr-face-2)) padding-box,var(--lr-ring) border-box}#search-bar-entry:hover{background:var(--lr-sheen) padding-box,linear-gradient(var(--lr-face-2),var(--lr-face-2)) padding-box,var(--lr-ring-hot) border-box}#sidebar .sidebar-group-header{font-family:var(--lr-mono);font-size:.6875rem;letter-spacing:.08em;text-transform:uppercase;font-weight:500;color:#8d8d96}#sidebar a[aria-current=page]{border-radius:50px;color:var(--lr-live);background:rgba(47,179,220,.08);box-shadow:inset 0 0 0 1px rgba(47,179,220,.2)}html:not(.dark) #sidebar a[aria-current=page]{color:#084f67;background:rgba(16,114,146,.09);box-shadow:inset 0 0 0 1px rgba(16,114,146,.25)}#sidebar a:not([aria-current=page]):hover{border-radius:50px}#table-of-contents .toc-item[data-active=true],#table-of-contents a[data-active=true]{color:var(--lr-live)}html:not(.dark) #table-of-contents a[data-active=true]{color:#107292}#footer{border-top:1px solid var(--lr-line)}#content-area table td,#content-area table th{padding:.75rem 1rem;vertical-align:top}#content-area table td:first-child{font-weight:500}#navbar .nav-tabs-item[data-active=true] img[src*=\"/assets/icons/\"],#sidebar a[aria-current=page] img[src*=\"/assets/icons/\"]{filter:brightness(0) saturate(100%) invert(58%) sepia(96%) saturate(237%) hue-rotate(148deg) brightness(81%) contrast(149%)}html:not(.dark) #navbar .nav-tabs-item[data-active=true] img[src*=\"/assets/icons/\"],html:not(.dark) #sidebar a[aria-current=page] img[src*=\"/assets/icons/\"]{filter:brightness(0) saturate(100%) invert(28%) sepia(90%) saturate(323%) hue-rotate(148deg) brightness(118%) contrast(123%)}"}],"page":{"pagePath":"monitors","slug":"/monitors","pageMetadata":{"title":"Monitors","description":"Experimental http and tcp uptime monitors with a bounded result history and hourly rollups, off unless APP_MONITORS_ENABLED is set.","og:url":"https://docs.levelrail.com/monitors","href":"/monitors"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Experimental http and tcp uptime monitors with a bounded result history and hourly rollups, off unless APP_MONITORS_ENABLED is set.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Table,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Warning,{children:`Monitors are experimental. The API, CLI and storage may change between releases.`}),`\n`,_jsxs(_components.p,{children:[`A monitor probes an endpoint on a schedule from the control plane and records the result. This first slice has `,_jsx(_components.code,{children:`http`}),` and `,_jsx(_components.code,{children:`tcp`}),` monitors, a result history, and hourly rollups. It does not send alerts, open incidents or change the status page.`]}),`\n`,_jsxs(_components.p,{children:[`The feature is off by default. When `,_jsx(_components.code,{children:`APP_MONITORS_ENABLED`}),` is not true, the `,_jsx(_components.code,{children:`/api/v1/monitors`}),` routes answer 404 and no scheduler runs.`]}),`\n`,_jsx(Heading,{level:`2`,id:`kinds`,children:`Kinds`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`http`}),`: method (`,_jsx(_components.code,{children:`GET`}),`, `,_jsx(_components.code,{children:`HEAD`}),`, `,_jsx(_components.code,{children:`POST`}),`, `,_jsx(_components.code,{children:`PUT`}),`), optional headers, accepted status codes or ranges (default 200 to 399), an optional `,_jsx(_components.code,{children:`contains`}),` keyword searched in the first bytes of the body, and a timeout. Redirects are not followed unless asked for, up to a server limit.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`tcp`}),`: a host and port. The check passes when the connection completes within the timeout.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Header values are stored encrypted with the same secret store as app secrets. They are never returned by the API or the CLI, and results keep only a short failure class such as `,_jsx(_components.code,{children:`timeout`}),` or `,_jsx(_components.code,{children:`status_mismatch`}),`, never a body or header value.`]}),`\n`,_jsx(Heading,{level:`2`,id:`network-safety`,children:`Network safety`}),`\n`,_jsxs(_components.p,{children:[`Every connection, including redirects, goes through the outbound address guard. Private, loopback and link local addresses are refused unless the control plane has explicitly allowed private outbound targets. A refused target shows as `,_jsx(_components.code,{children:`blocked_address`}),` and is rejected at create time.`]}),`\n`,_jsx(Heading,{level:`2`,id:`results`,children:`Results`}),`\n`,_jsx(_components.p,{children:`Results are written in batches, with the hourly rollup updated in the same transaction. Raw results are kept for a short window and rollups for much longer. Pruning runs in small batches so it does not hold the database write lock.`}),`\n`,_jsx(CodeBlock,{numberOfLines:`3`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes dark-plus dark-plus`,style:{backgroundColor:`#0B0C0E`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`3`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`levelrail-cli monitors create --name \"Site\" --kind http --url https://example.com/health`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`levelrail-cli monitors results mon_1a2b3c4d5e6f7a8b --window 6h`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Heading,{level:`2`,id:`settings`,children:`Settings`}),`\n`,_jsxs(_components.p,{children:[`All limits are environment variables on the control plane. Durations use Go syntax such as `,_jsx(_components.code,{children:`30s`}),` or `,_jsx(_components.code,{children:`48h`}),`.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Variable`}),_jsx(_components.th,{children:`Default`}),_jsx(_components.th,{children:`Meaning`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`APP_MONITORS_ENABLED`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`false`})}),_jsx(_components.td,{children:`Turn the feature on`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`APP_MONITOR_WORKERS`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`4`})}),_jsx(_components.td,{children:`Concurrent probes`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`APP_MONITOR_MIN_INTERVAL_HTTP`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`30s`})}),_jsx(_components.td,{children:`Lowest http interval`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`APP_MONITOR_MIN_INTERVAL_TCP`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`30s`})}),_jsx(_components.td,{children:`Lowest tcp interval`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`APP_MONITOR_MAX_TIMEOUT`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`30s`})}),_jsx(_components.td,{children:`Highest per check timeout`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`APP_MONITOR_MAX_COUNT`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`100`})}),_jsx(_components.td,{children:`Monitors per control plane`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`APP_MONITOR_BODY_MAX_BYTES`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`65536`})}),_jsxs(_components.td,{children:[`Body bytes searched for `,_jsx(_components.code,{children:`contains`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`APP_MONITOR_HEADER_MAX_COUNT`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`16`})}),_jsx(_components.td,{children:`Headers per monitor`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`APP_MONITOR_HEADER_MAX_BYTES`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`4096`})}),_jsx(_components.td,{children:`Bytes per header value`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`APP_MONITOR_MAX_REDIRECTS`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`5`})}),_jsx(_components.td,{children:`Redirect hops when following`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`APP_MONITOR_FLUSH_INTERVAL`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`5s`})}),_jsx(_components.td,{children:`How often results are written`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`APP_MONITOR_BUFFER_MAX`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`10000`})}),_jsx(_components.td,{children:`Results held in memory, oldest dropped first`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`APP_MONITOR_RAW_RETENTION`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`48h`})}),_jsx(_components.td,{children:`Raw result retention`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`APP_MONITOR_HOUR_RETENTION`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`9600h`})}),_jsx(_components.td,{children:`Hourly rollup retention`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`APP_MONITOR_PRUNE_INTERVAL`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`10m`})}),_jsx(_components.td,{children:`How often pruning runs`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`APP_MONITOR_PRUNE_BATCH`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`1000`})}),_jsx(_components.td,{children:`Rows deleted per pruning step`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`APP_MONITOR_JITTER_PERCENT`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`10`})}),_jsx(_components.td,{children:`Start spread as a share of the interval`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`APP_MONITOR_TICK_INTERVAL`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`1s`})}),_jsx(_components.td,{children:`Scheduler resolution`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`APP_MONITOR_RESULTS_MAX_LIMIT`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`1000`})}),_jsx(_components.td,{children:`Most raw results one request returns`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`api`,children:`API`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`GET /api/v1/monitors`}),`, `,_jsx(_components.code,{children:`POST /api/v1/monitors`}),`, `,_jsx(_components.code,{children:`DELETE /api/v1/monitors/{id}`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`GET /api/v1/monitors/{id}/results?window=24h\u0026limit=100`}),` returns recent raw results and hourly rollups.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Reading needs read access and changing needs write access on the `,_jsx(_components.code,{children:`monitors`}),` resource. Creating and deleting are recorded in the audit log.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":"dark","config":{},"pageMetadata":{"title":"Monitors","description":"Experimental http and tcp uptime monitors with a bounded result history and hourly rollups, off unless APP_MONITORS_ENABLED is set.","og:url":"https://docs.levelrail.com/monitors","href":"/monitors"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Kinds","slug":"kinds","depth":2,"children":[]},{"title":"Network safety","slug":"network-safety","depth":2,"children":[]},{"title":"Results","slug":"results","depth":2,"children":[]},{"title":"Settings","slug":"settings","depth":2,"children":[]},{"title":"API","slug":"api","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/levelrail/34332f0f5f6180ce/public/deploy.js"],"subdomain":"levelrail","siteName":"Levelrail","title":"Monitors - Levelrail","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-30T00:44:52.801Z","gitLastModified":"2026-10-30T00:51:30.000Z","originalFileLocation":"monitors.md"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"dark\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Experimental http and tcp uptime monitors with a bounded result history and hourly rollups, off unless APP_MONITORS_ENABLED is set.\">\u003cmeta data-mint-head name=\"keywords\" content=\"self-hosted PaaS, Coolify alternative, Docker deployment platform, self-hosted deploys, Levelrail\">\u003cmeta data-mint-head name=\"application-name\" content=\"Levelrail\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/levelrail/sfnZeja47AHfK8h4/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/levelrail/sfnZeja47AHfK8h4/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/levelrail/sfnZeja47AHfK8h4/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/levelrail/sfnZeja47AHfK8h4/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/levelrail/sfnZeja47AHfK8h4/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/levelrail/sfnZeja47AHfK8h4/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/levelrail/sfnZeja47AHfK8h4/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/levelrail/sfnZeja47AHfK8h4/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/levelrail/sfnZeja47AHfK8h4/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Monitors - Levelrail\">\u003cmeta data-mint-head property=\"og:description\" content=\"Experimental http and tcp uptime monitors with a bounded result history and hourly rollups, off unless APP_MONITORS_ENABLED is set.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Levelrail Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.levelrail.com/monitors\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://docs.levelrail.com/public/og/default.png\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Monitors - Levelrail\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Experimental http and tcp uptime monitors with a bounded result history and hourly rollups, off unless APP_MONITORS_ENABLED is set.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://docs.levelrail.com/public/og/default.png\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/levelrail/sfnZeja47AHfK8h4/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Levelrail\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#107292\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.levelrail.com/monitors\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/monitors.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.levelrail.com/#organization\",\"name\":\"Levelrail\",\"url\":\"https://docs.levelrail.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/levelrail/56HjW70mOjUmjIrm/assets/brand/wordmark-light.svg?fit=max\u0026auto=format\u0026n=56HjW70mOjUmjIrm\u0026q=85\u0026s=cbe02b3c3d17b11f9cc5a18551a30782\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.levelrail.com#website\",\"name\":\"Levelrail\",\"url\":\"https://docs.levelrail.com\",\"publisher\":{\"@id\":\"https://docs.levelrail.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.levelrail.com/monitors#webpage\",\"url\":\"https://docs.levelrail.com/monitors\",\"name\":\"Monitors\",\"description\":\"Experimental http and tcp uptime monitors with a bounded result history and hourly rollups, off unless APP_MONITORS_ENABLED is set.\",\"dateModified\":\"2026-10-30T00:51:30.000Z\",\"isPartOf\":{\"@id\":\"https://docs.levelrail.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.levelrail.com/monitors#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.levelrail.com/monitors#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Scale and operations\",\"item\":\"https://docs.levelrail.com/managing-apps-at-scale\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Monitors\",\"item\":\"https://docs.levelrail.com/monitors\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.levelrail.com/monitors#article\",\"headline\":\"Monitors\",\"name\":\"Monitors\",\"description\":\"Experimental http and tcp uptime monitors with a bounded result history and hourly rollups, off unless APP_MONITORS_ENABLED is set.\",\"url\":\"https://docs.levelrail.com/monitors\",\"mainEntityOfPage\":{\"@id\":\"https://docs.levelrail.com/monitors#webpage\"},\"image\":\"https://docs.levelrail.com/public/og/default.png\",\"dateModified\":\"2026-10-30T00:51:30.000Z\",\"publisher\":{\"@id\":\"https://docs.levelrail.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.levelrail.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Levelrail\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Levelrail","nav":{"global":null,"tabs":[{"tab":"Get started","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/rocket-launch.svg","pages":[{"title":"Get started","href":""}]},{"tab":"How-to guides","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/book-open.svg","groups":[{"group":"Essentials","pages":[{"title":"Troubleshooting","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/lifebuoy.svg","sidebarTitle":"Troubleshooting","href":"/troubleshooting"},{"title":"Doctor","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/lifebuoy.svg","sidebarTitle":"Doctor","href":"/doctor"},{"title":"Email notifications","href":"/email-notifications"},{"title":"Email templates and messages","href":"/email-templates"},{"title":"Alert inbox","href":"/alert-inbox"},{"title":"Event webhooks","href":"/event-webhooks"},{"title":"Attention center","href":"/attention-center"}]},{"group":"Deploying","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/cloud-arrow-up.svg","pages":[{"title":"Deploying and managing apps","sidebarTitle":"Deploying apps","href":"/deploying-apps"},{"title":"Deploy from your computer","sidebarTitle":"Deploy from CLI","href":"/deploy-from-cli"},{"title":"Drop deploy for static sites","sidebarTitle":"Drop deploy","href":"/drop-deploy"},{"title":"Compose apps","href":"/compose-apps"},{"title":"UDP published ports","href":"/udp-ports"},{"title":"New app wizard","href":"/new-app-wizard"},{"title":"Importing apps","href":"/importing-apps"},{"title":"Static pages","sidebarTitle":"Pages","href":"/pages"},{"title":"Static site routing rules","sidebarTitle":"Static routing","href":"/static-routing"},{"title":"Deploy safety","href":"/deploy-safety"},{"title":"Deploy failures","href":"/deploy-failures"},{"title":"Deploying through git host outages","href":"/git-host-outages"},{"title":"Deploy trace","href":"/deploy-trace"},{"title":"Deploy event timeline","href":"/deploy-event-timeline"},{"title":"Build performance","href":"/build-performance"},{"title":null,"href":"/build-center"},{"title":"Scheduled deploys","href":"/scheduled-deploys"},{"title":"Pull request comment commands","href":"/pr-comment-commands"},{"title":"Scheduled jobs","href":"/scheduled-jobs"},{"title":"Scheduled and background functions","href":"/scheduled-functions"},{"title":"Image auto-update","href":"/image-auto-update"},{"title":"Build hooks","href":"/build-hooks"},{"title":"Sleep when idle","href":"/sleep-when-idle"},{"title":"Functions","href":"/functions"},{"title":"Canary deploys","href":"/canary-deploys"},{"title":"Split testing","href":"/split-testing"},{"title":"Deployments page","href":"/deployments-page"},{"title":"Images","href":"/images"},{"title":"Deploy previews","href":"/deploy-previews"},{"title":"Framework presets","href":"/frameworks"},{"title":"Deploy URLs","href":"/deploy-urls"},{"title":"Deploy links and badge","href":"/deploy-link"},{"title":"Deploy timeline","href":"/deploy-timeline"},{"title":"Preview environments per pull request","sidebarTitle":"Preview environments","href":"/previews"},{"title":"Chat-interactive deploy approvals","sidebarTitle":"Chat approvals","href":"/chat-deploy-approvals"},{"title":"Supply chain visibility","href":"/supply-chain"},{"title":"Secret scanning","href":"/secret-scanning"},{"title":"Deploy status badge","href":"/deploy-status-badge"},{"title":"Dashboard screenshots","href":"/screenshots"},{"title":"Running Levelrail in Docker","href":"/docker"},{"title":"Zero-downtime deploys with Docker: readiness-gated cutover and rollback","href":"/zero-downtime-deploys"},{"title":"Rollout control","href":"/rollout-control"},{"title":"Preview environments per pull request on your own servers","href":"/preview-environments"},{"title":"Deploy contexts: env and build settings per kind of deploy","href":"/deploy-contexts"}]},{"group":"Networking and multi-node","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/globe-hemisphere-west.svg","pages":[{"title":"Domains and ingress","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/globe-hemisphere-west.svg","sidebarTitle":"Add a domain and HTTPS","href":"/domains-and-ingress"},{"title":"Standalone domains","href":"/standalone-domains"},{"title":"DNS zones and records","href":"/dns"},{"title":"Diagnose a domain","href":"/domain-diagnosis"},{"title":"Domain traffic controls","href":"/domain-traffic-controls"},{"title":"Ingress abuse defense","href":"/abuse-defense"},{"title":"CDN and caching","href":"/cdn-and-caching"},{"title":"Forms","tag":"Beta","href":"/forms"},{"title":"Firewall","href":"/firewall"},{"title":"Verifying real ACME issuance against a live domain","href":"/acme-verification-runbook"},{"title":"Multi-node: adding and managing nodes","tag":"Beta","href":"/multi-node"},{"title":"Multi-node quickstart","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/hard-drives.svg","tag":"Beta","sidebarTitle":"Add a second server","href":"/multi-node-quickstart"},{"title":"Add a node anywhere","tag":"Beta","sidebarTitle":"Add a node anywhere","href":"/add-node-anywhere"},{"title":"Resource-aware placement","tag":"Beta","href":"/resource-aware-placement"},{"title":"Autoscaling","tag":"Beta","href":"/autoscaling"},{"title":"Node provisioning","href":"/node-provisioning"},{"title":"Multi-cloud provisioning quickstart","href":"/multi-cloud-provisioning"},{"title":"Network topology view","href":"/network-topology"},{"title":"Project topology graph","href":"/service-topology-graph"},{"title":"Canvas","href":"/canvas"},{"title":"Build node routing","href":"/build-node-routing"}]},{"group":"Databases and storage","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/database.svg","pages":[{"title":"Managing databases","href":"/managing-databases"},{"title":null,"href":"/postgres-pooler"},{"title":"Database upgrades","href":"/database-upgrades"},{"title":"Database version catalog","href":"/database-version-catalog"},{"title":"External databases","href":"/external-databases"},{"title":"Connecting apps to databases","href":"/connecting-apps-to-databases"},{"title":"Backup targets, registry credentials, and app volume backups","sidebarTitle":"Backups and storage","href":"/backups-and-storage"},{"title":"Backup copies","href":"/backup-copies"},{"title":"Volume files","href":"/volume-files"},{"title":"Prove your backups work","href":"/prove-your-backups-work"},{"title":"Object storage","href":"/object-storage"},{"title":"Network shares","href":"/network-shares"},{"title":"Log explorer","href":"/log-explorer"},{"title":"Custom dashboards","href":"/custom-dashboards"},{"title":"Tracing","href":"/tracing"},{"title":"Error tracking","href":"/error-tracking"},{"title":"Loki-compatible log API","href":"/loki-api"},{"title":"Log pipelines","href":"/log-pipelines"},{"title":"Log volume budgets","href":"/log-budgets"},{"title":"Data export","href":"/data-export"},{"title":"Traffic export","href":"/traffic-export"},{"title":"Audit event schema","href":"/audit-event-schema"},{"title":"Control plane backup and restore","sidebarTitle":"Control plane backup","href":"/control-plane-backup"},{"title":"Whole-server recovery","href":"/whole-server-recovery"},{"title":"Archives","href":"/archives"},{"title":"Disaster recovery","href":"/disaster-recovery"},{"title":"Upgrade safely","href":"/upgrade-safely"},{"title":"Database access and network","href":"/database-access"},{"title":"Private networks and allow rules","href":"/private-networks"},{"title":"Database explorer and fleet overview","href":"/database-explorer"},{"title":"Database viewer","href":"/database-viewer"}]},{"group":"CI/CD and automation","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/git-branch.svg","pages":[{"title":"Deploying from GitHub Actions","href":"/github-actions"},{"title":"Use any CI","href":"/use-any-ci"},{"title":"Pipelines","href":"/pipelines"},{"title":"Pipelines: OIDC federation","href":"/pipelines-oidc"},{"title":"Git integrations","href":"/git-integrations"},{"title":"Git reliability","href":"/git-reliability"},{"title":"Deploy with git push","href":"/git-push-deploy"},{"title":"Import a repository","sidebarTitle":"Import a repo","href":"/import-a-repo"},{"title":"Monorepos","href":"/monorepos"}]},{"group":"Security and access","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/shield-check.svg","pages":[{"title":"Sign-in engine","href":"/auth-engine"},{"title":"Host firewall","href":"/host-firewall"},{"title":"Exposure audit","href":"/exposure-audit"},{"title":"Security center","href":"/security-center"},{"title":"Compliance evidence","href":"/compliance-evidence"},{"title":"Emergency access","href":"/emergency-access"},{"title":"Master key rotation","href":"/master-key-rotation"},{"title":"Secret rotation policies","href":"/secret-rotation"},{"title":"Your account","href":"/account"},{"title":"Access control","href":"/access-control"},{"title":"Labels and namespaces","href":"/labels"},{"title":"Teams and roles","href":"/teams-and-roles"},{"title":"Team and project quotas","href":"/team-and-project-quotas"},{"title":"Environments","href":"/environments"},{"title":"Promotions and release notes","href":"/promotions-and-releases"},{"title":"Identity and access: users, roles, and IAM policies","href":"/identity-and-access"},{"title":"SAML single sign-on","href":"/sso-saml"},{"title":"OAuth and OIDC single sign-on","href":"/sso-oidc"},{"title":"SCIM provisioning","href":"/scim"},{"title":"Session policy","href":"/session-policy"},{"title":"Projects, organizations, and environments","href":"/projects-and-organizations"}]},{"group":"Scale and operations","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/chart-line-up.svg","pages":[{"title":"Managing apps at scale","href":"/managing-apps-at-scale"},{"title":"Tags","href":"/tags"},{"title":"Resource console","href":"/resource-console"},{"title":"Command palette","href":"/command-palette"},{"title":"Cost estimate","href":"/cost-estimate"},{"title":"Usage and cost","href":"/usage-and-cost"},{"title":"Cost explorer and budgets","href":"/cost-explorer"},{"title":"Spend caps","href":"/spend-caps"},{"title":"Integrations","href":"/integrations"},{"title":"Cloud integrations","href":"/cloud-integrations"},{"title":"Rolling back the control plane","href":"/rollback"},{"title":"Pre-deploy database snapshots","href":"/predeploy-snapshot"},{"title":"Resilience: what survives a control plane crash","href":"/resilience"},{"title":"Resilience, in short","href":"/resilience-summary"},{"title":"Chaos test coverage","href":"/chaos-coverage"},{"title":"Observability: metrics, logs, and alerts","href":"/observability"},{"title":"Traffic observability: rate, errors and duration","href":"/traffic-observability"},{"title":"Public status page","description":"An opt-in public status page with operator-chosen components, 90 day uptime bars, incidents, maintenance announcements and an RSS feed.","href":"/status-page"},{"title":"Monitors","href":"/monitors"},{"title":"Scheduled maintenance","description":"Announce planned downtime ahead of time with a dashboard banner, a status page entry and a channel notice, and optionally hold automatic deploys for the window.","href":"/scheduled-maintenance"},{"title":"Deploy policies","href":"/deploy-policies"},{"title":"What's new panel","href":"/whats-new-panel"}]},{"group":"AI and agents","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/sparkle.svg","pages":[{"title":"Working with AI agents","href":"/agents"},{"title":"AI control","href":"/ai-control"}]},{"group":"Templates and catalog","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/squares-four.svg","pages":[{"title":"Service template catalog","tag":"Beta","href":"/templates-and-registry"},{"title":"Private registries","href":"/private-registries"},{"title":"Template catalog","href":"/template-catalog"},{"title":"Deploy button","href":"/deploy-button"},{"title":"Template status","href":"/templates-status"},{"title":"Starter kit templates","href":"/templates"}]},{"group":"Migrate","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/arrows-left-right.svg","pages":[{"title":"Migrate to Levelrail","sidebarTitle":"Migration overview","href":"/migrate-to-levelrail"},{"title":"Migration wizard","sidebarTitle":"Migration wizard","href":"/migration-wizard"},{"title":"Migrate from Coolify","sidebarTitle":"From Coolify","href":"/migrate-from-coolify"},{"title":"Coolify exit gap report","sidebarTitle":"Coolify exit gaps","href":"/coolify-exit-gap-report"},{"title":"Migrate from Dokploy","sidebarTitle":"From Dokploy","href":"/migrate-from-dokploy"},{"title":"Migrate from CapRover","sidebarTitle":"From CapRover","href":"/migrate-from-caprover"},{"title":"Migrate from Dokku","sidebarTitle":"From Dokku","href":"/migrate-from-dokku"},{"title":"Migrate from Docker Compose","sidebarTitle":"From Docker Compose","href":"/migrate-from-docker-compose"},{"title":"Migration reference","sidebarTitle":"Reference","href":"/migration-reference"},{"title":"Migrating from Coolify, Dokploy, or CapRover","sidebarTitle":"Moved: migration guides","href":"/migrating-from-coolify-dokploy-and-caprover"},{"title":"Migration agent threat model","sidebarTitle":"Migration agent threat model","href":"/migration-agent-threat-model"},{"title":"Migrate on the same server","href":"/migrate-same-server"},{"title":"Migrate over SSH","href":"/migrate-over-ssh"},{"title":"Migrating a Next.js app from Vercel","href":"/migrating-from-vercel"},{"title":"Migrating a static site from Netlify","href":"/migrating-from-netlify"},{"title":"Migrating a service from Cloud Run","href":"/migrating-from-cloud-run"}]},{"group":"Beta and experimental","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/flask.svg","pages":[{"title":"AI assistant integration: levelrail-mcp","tag":"Beta","href":"/ai-assistant"},{"title":"MCP tools, token budget and write mode","tag":"Beta","href":"/mcp"},{"title":"MCP recipes","tag":"Beta","href":"/mcp-recipes"},{"title":"In-app AI assistant chat","tag":"Experimental","href":"/ai-assistant-chat"},{"title":"AI models","tag":"Experimental","href":"/ai-models"},{"title":"Load balancing across replicas","tag":"Experimental","href":"/load-balancing"},{"title":"Platform as code","tag":"Experimental","href":"/platform-as-code"},{"title":"Stacks and GitOps","tag":"Experimental","href":"/stacks"},{"title":"Resource advisor (beta)","tag":"Beta","href":"/resource-advisor"},{"title":"CLI console (beta)","tag":"Beta","href":"/cli-console"},{"title":"Feature flags","href":"/feature-flags"},{"title":"Log archive","tag":"Beta","href":"/log-archive"},{"title":"Automatic cleanup","tag":"Beta","href":"/janitor"},{"title":"Cleanup center","tag":"Beta","href":"/cleanup-center"},{"title":"Unified search","tag":"Beta","href":"/search"}]}]},{"tab":"Reference","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/code.svg","pages":[{"title":"Reference","href":"/app-spec-reference"}]},{"tab":"Concepts","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/lightbulb.svg","pages":[{"title":"Concepts","href":"/product-tour"}]},{"tab":"Self-host gallery","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/squares-four.svg","pages":[{"title":"Self-host gallery","href":"/self-host"}]},{"tab":"Appendix","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/books.svg","pages":[{"title":"Appendix","href":"/roadmap"}]}]},"title":"Monitors - Levelrail","buildId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","deploymentId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","dynamics":[],"chunks":[]}