This guide explains how to install the OpenOps docker-compose release on a local machine. Note that these settings are for testing purposes only and not for a production environment.Before following the instructions, make sure that your machine meets the system requirements for OpenOps.
Run the following command in your terminal to install, update, configure and run OpenOps:
curl -fsS https://openops.sh/install | sh
This script supports macOS, Ubuntu and Windows (via WSL2 Ubuntu).If you can’t use the autoinstall script, follow the manual installation steps for your operating system below.
Open the .env file in the OpenOps installation folder. Change the values of the following variables that represent credentials. Do it now, as you won’t be able to change these values after the initial deployment:
OPS_OPENOPS_ADMIN_EMAIL: the email of your OpenOps installation’s root admin account.
OPS_OPENOPS_ADMIN_PASSWORD: the password of your OpenOps installation’s root admin account.
OPS_POSTGRES_USERNAME: the username of the Postgres database that OpenOps uses.
OPS_POSTGRES_PASSWORD: the password of the Postgres database that OpenOps uses.
OPS_ANALYTICS_ADMIN_PASSWORD: the password of the OpenOps Analytics admin account (the username is hardcoded to admin).
Pull the images and run docker compose:
COMPOSE_PARALLEL_LIMIT=4 docker compose pulldocker compose up -d
If you face a rate limit while downloading, run the command again.
You can now access the application by navigating to http://localhost.
This procedure has been tested on Ubuntu Server 24.04.
During the Ubuntu Server installation, select Docker to be added to the installation. If you need to install Docker later, follow the instructions here.
Log in to your server and run the following commands to create a folder and download the OpenOps release files:
# create and change directorymkdir -p openops && cd openops# download the release filecurl -OL https://github.com/openops-cloud/openops/releases/download/0.7.1/openops-dc-0.7.1.zip# refresh package listssudo apt update# install unzipsudo apt install unzip# decompress release fileunzip openops-dc-0.7.1.zip# copy the defaults to env without overwriting existing filescp --update=none .env.defaults .env
Identify your own IP address:
# find IP addressip -o -4 addr show | awk '{print $2, $4}'
The output should look something like this:
lo 127.0.0.1/8 # loopback network interface - not hereenp1s0 192.168.1.50/24 # this looks more like it. We want this inet IP address without the subnet mask: 192.168.1.50docker0 172.17.0.1/16 # docker network interface - not here
In this case, the IP address is 192.168.1.50.
Open the .env file in the OpenOps installation folder. Change the values of the following variables that represent credentials. Do it now, as you won’t be able to change these values after the initial deployment:
OPS_OPENOPS_ADMIN_EMAIL: the email of your OpenOps installation’s root admin account.
OPS_OPENOPS_ADMIN_PASSWORD: the password of your OpenOps installation’s root admin account.
OPS_POSTGRES_USERNAME: the username of the Postgres database that OpenOps uses.
OPS_POSTGRES_PASSWORD: the password of the Postgres database that OpenOps uses.
OPS_ANALYTICS_ADMIN_PASSWORD: the password of the OpenOps Analytics admin account (the username is hardcoded to admin).
In the .env file, find the OPS_PUBLIC_URL variable and replace its value, http://localhost, with the IP address that you’ve previously identified. In our example, the IP address would be http://192.168.1.50.
Pull the images and run docker compose:
# download the docker volumes and imagesCOMPOSE_PARALLEL_LIMIT=4 sudo docker compose pull# launch the applicationsudo docker compose up -d
If you face a rate limit while downloading, run the command again.
Open the .env file in the OpenOps installation folder. Change the values of the following variables that represent credentials. Do it now, as you won’t be able to change these values after the initial deployment:
OPS_OPENOPS_ADMIN_EMAIL: the email of your OpenOps installation’s root admin account.
OPS_OPENOPS_ADMIN_PASSWORD: the password of your OpenOps installation’s root admin account.
OPS_POSTGRES_USERNAME: the username of the Postgres database that OpenOps uses.
OPS_POSTGRES_PASSWORD: the password of the Postgres database that OpenOps uses.
OPS_ANALYTICS_ADMIN_PASSWORD: the password of the OpenOps Analytics admin account (the username is hardcoded to admin).
Run docker compose:
$env:COMPOSE_PARALLEL_LIMIT = "4"docker compose pulldocker compose up -d
If you face a rate limit while downloading, run the command again.
By default, OpenOps does not allow workflows to call internal network addresses such as 127.0.0.1 or 192.168.0.0. This affects HTTP and SMTP actions, as well as webhook triggers. Host validation protects users from creating workflows that could accidentally or maliciously access internal services, scan networks, or escalate privileges.You may need to disable this check in certain circumstances, such as in non-production deployments or when workflows intentionally interact with internal-only infrastructure.To disable host validation, open the .env file in your installation folder and set the OPS_ENABLE_HOST_VALIDATION environment variable to false.After making any changes to the .env file, restart the OpenOps containers:
sudo docker compose downsudo docker compose up -d
Disabling this check removes an important safety guard and may allow workflows to access internal infrastructure. Use caution and avoid disabling it in production.
By default, OpenOps allows SMTP connections on ports 25, 465, 587, and 2525. Administrators can customize which SMTP ports are available by setting the OPS_SMTP_ALLOWED_PORTS environment variable in the .env file.To configure allowed SMTP ports, open the .env file in your installation folder and set the OPS_SMTP_ALLOWED_PORTS variable to a comma-separated list of port numbers:
OPS_SMTP_ALLOWED_PORTS=25,465,587,2525
Port numbers must be valid TCP ports in the range 1-65535. At least one valid port must be configured. Invalid port numbers will be filtered out.
After making any changes to the .env file, restart the OpenOps containers:
Using Azure CLI in workflows: running with local credentials
It is possible to share your local session with the platform for local applications.
To do this, you need to set two environment variables in the .env file under the installation folder:
OPS_ENABLE_HOST_SESSION=true: enables sharing of the host session with the platform container.
HOST_AZURE_CONFIG_DIR="~/.azure": defines the path to the host machine’s Azure configuration folder that will be shared with the platform container.
Using Google Cloud CLI in workflows: running with local credentials
It is possible to share your local Google Cloud CLI session with the platform for local applications.
To do this, you need to set two environment variables in the .env file under the installation folder:
OPS_ENABLE_HOST_SESSION=true: enables sharing of the host session with the platform container.
HOST_CLOUDSDK_CONFIG="~/.config/gcloud": defines the path to the host machine’s Google Cloud configuration folder that will be shared with the platform container.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"OpenOps Documentation","colors":{"primary":"#0D9373","light":"#07C983","dark":"#0D9373"},"logo":{"light":"https://mintcdn.com/openops-ecb4f397/CTuKJka9LYs8t3gj/images/logo/light.svg?fit=max\u0026auto=format\u0026n=CTuKJka9LYs8t3gj\u0026q=85\u0026s=6f0acbe2a8f81e6384ad3fb1aa82d2c2","dark":"https://mintcdn.com/openops-ecb4f397/lOEfgkmNa1x4H54T/images/logo/dark.png?fit=max\u0026auto=format\u0026n=lOEfgkmNa1x4H54T\u0026q=85\u0026s=31fc53e91f53b9a208b8108236fccd78"},"favicon":"https://mintcdn.com/openops-ecb4f397/lOEfgkmNa1x4H54T/images/favicon.png?fit=max\u0026auto=format\u0026n=lOEfgkmNa1x4H54T\u0026q=85\u0026s=ef7f107237d8c2beab136b5e3e617623","navbar":{"links":[{"href":"https://slack.openops.com","label":"Community"}],"primary":{"type":"button","label":"Get OpenOps","href":"https://www.openops.com"}},"footer":{"socials":{"github":"https://github.openops.com","linkedin":"https://www.linkedin.com/company/openops","slack":"https://slack.openops.com"}},"seo":{"metatags":{"og:image":"/images/openops-opengraph.svg"}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"openops-ecb4f397","hasAudioNarration":false,"actualSubdomain":"openops-ecb4f397","customDomains":["docs.openops.com"],"gitSource":{"type":"github","owner":"openops-cloud","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ad717660bc561fb74f62fd2","collectionId":"41733f77-21ec-4753-849e-edabc64c94c7","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ad717660bc561fb74f62fd2"},"feedback":{"thumbs":true,"edits":true,"issues":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ad717660bc561fb74f62fd2","clientVersion":"0.0.4045","searchFilterCounts":[{"language":"default","tag":"Workflow Management","count":11},{"language":"default","tag":"Integrations","count":10},{"language":"default","tag":"Getting Started with OpenOps","count":8},{"language":"default","tag":"Paid Features","count":6},{"language":"default","tag":"Contributing to OpenOps","count":5},{"language":"default","tag":"Cloud Access","count":4},{"language":"default","tag":"Cookbook","count":4},{"language":"default","tag":"Deploying OpenOps","count":4},{"language":"default","tag":"AI Assistance","count":3},{"language":"default","tag":"Reporting and Analytics","count":3}]},"assistantConfig":{},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"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":"full-page-search","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":"turbopuffer-dual-write","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},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"getting-started/deployment/local","slug":"/getting-started/deployment/local","pageMetadata":{"title":"Local Deployment","description":"Deploy OpenOps on your local machine","icon":"laptop-code","href":"/getting-started/deployment/local"},"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: \"Deploy OpenOps on your local machine\"\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={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Expandable,Heading,Note,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Expandable)_missingMdxReference(`Expandable`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`This guide explains how to install the OpenOps docker-compose release on a local machine. Note that these settings are for testing purposes only and not for a production environment.`}),`\n`,_jsxs(_components.p,{children:[`Before following the instructions, make sure that your machine meets the `,_jsx(_components.a,{href:`/getting-started/system-requirements`,children:`system requirements`}),` for OpenOps.`]}),`\n`,_jsx(Heading,{level:`2`,id:`installing-openops`,children:`Installing OpenOps`}),`\n`,_jsx(_components.p,{children:`Run the following command in your terminal to install, update, configure and run OpenOps:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -fsS`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` https://openops.sh/install`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` |`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:` sh`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`This script supports macOS, Ubuntu and Windows (via WSL2 Ubuntu).`}),`\n`,_jsx(_components.p,{children:`If you can’t use the autoinstall script, follow the manual installation steps for your operating system below.`}),`\n`,_jsxs(Expandable,{title:`Installing manually on macOS`,children:[_jsx(Heading,{level:`3`,id:`on-macos`,children:`On macOS`}),_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Install Docker Desktop by following `,_jsx(_components.a,{href:`https://docs.docker.com/desktop/setup/install/mac-install/`,children:`these instructions`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Open a new terminal window and run the following command to create a folder and download the OpenOps release files:`,`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`mkdir`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -p`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` openops`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` \u0026\u0026 `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`cd`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` openops`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` \u0026\u0026 `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:`\\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -OL`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` https://github.com/openops-cloud/openops/releases/download/0.7.1/openops-dc-0.7.1.zip`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` \u0026\u0026 `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:`\\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`unzip`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` openops-dc-0.7.1.zip`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` \u0026\u0026 `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`cp`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -n`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` .env.defaults`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` .env`})]}),`\n`]})})}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`Open the `,_jsx(_components.code,{children:`.env`}),` file in the OpenOps installation folder. Change the values of the following variables that represent credentials. Do it now, as you won’t be able to change these values after the initial deployment:`,`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`OPS_OPENOPS_ADMIN_EMAIL`}),`: the email of your OpenOps installation’s root admin account.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`OPS_OPENOPS_ADMIN_PASSWORD`}),`: the password of your OpenOps installation’s root admin account.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`OPS_POSTGRES_USERNAME`}),`: the username of the Postgres database that OpenOps uses.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`OPS_POSTGRES_PASSWORD`}),`: the password of the Postgres database that OpenOps uses.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`OPS_ANALYTICS_ADMIN_PASSWORD`}),`: the password of the `,_jsx(_components.a,{href:`/reporting-analytics/data-visualization/`,children:`OpenOps Analytics`}),` admin account (the username is hardcoded to `,_jsx(_components.code,{children:`admin`}),`).`]}),`\n`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`Pull the images and run `,_jsx(_components.code,{children:`docker compose`}),`:`,`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`COMPOSE_PARALLEL_LIMIT`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`4`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:` docker`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` compose`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` pull`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`docker`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` compose`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` up`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -d`})]}),`\n`]})})}),`\n`,`If you face a rate limit while downloading, run the command again.`]}),`\n`]}),_jsxs(_components.p,{children:[`You can now access the application by navigating to `,_jsx(_components.a,{href:`http://localhost`,children:`http://localhost`}),`.`]})]}),`\n`,_jsxs(Expandable,{title:`Installing manually on Ubuntu Server`,children:[_jsx(Heading,{level:`3`,id:`on-ubuntu-server`,children:`On Ubuntu Server`}),_jsx(Note,{children:`This procedure has been tested on Ubuntu Server 24.04.`}),_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`During the Ubuntu Server installation, select Docker to be added to the installation. If you need to install Docker later, follow the instructions `,_jsx(_components.a,{href:`https://docs.docker.com/engine/install/ubuntu/`,children:`here`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Log in to your server and run the following commands to create a folder and download the OpenOps release files:`,`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`12`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`12`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# create and change directory`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`mkdir`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -p`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` openops`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` \u0026\u0026 `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`cd`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` openops`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# download the release file`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -OL`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` https://github.com/openops-cloud/openops/releases/download/0.7.1/openops-dc-0.7.1.zip`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# refresh package lists`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`sudo`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` apt`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` update`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# install unzip`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`sudo`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` apt`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` install`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` unzip`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# decompress release file`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`unzip`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` openops-dc-0.7.1.zip`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# copy the defaults to env without overwriting existing files`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`cp`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --update=none`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` .env.defaults`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` .env`})]}),`\n`]})})}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`Identify your own IP address:`,`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# find IP address`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`ip`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -o`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -4`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` addr`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` show`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` |`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:` awk`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '{print $2, $4}'`})]}),`\n`]})})}),`\n`,`The output should look something like this:`,`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`lo`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 127.0.0.1/8`}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # loopback network interface - not here`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`enp1s0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 192.168.1.50/24`}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # this looks more like it. We want this inet IP address without the subnet mask: 192.168.1.50`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`docker0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 172.17.0.1/16`}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # docker network interface - not here`})]}),`\n`]})})}),`\n`,`In this case, the IP address is `,_jsx(_components.code,{children:`192.168.1.50`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Open the `,_jsx(_components.code,{children:`.env`}),` file in the OpenOps installation folder. Change the values of the following variables that represent credentials. Do it now, as you won’t be able to change these values after the initial deployment:`,`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`OPS_OPENOPS_ADMIN_EMAIL`}),`: the email of your OpenOps installation’s root admin account.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`OPS_OPENOPS_ADMIN_PASSWORD`}),`: the password of your OpenOps installation’s root admin account.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`OPS_POSTGRES_USERNAME`}),`: the username of the Postgres database that OpenOps uses.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`OPS_POSTGRES_PASSWORD`}),`: the password of the Postgres database that OpenOps uses.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`OPS_ANALYTICS_ADMIN_PASSWORD`}),`: the password of the `,_jsx(_components.a,{href:`/reporting-analytics/data-visualization/`,children:`OpenOps Analytics`}),` admin account (the username is hardcoded to `,_jsx(_components.code,{children:`admin`}),`).`]}),`\n`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`In the `,_jsx(_components.code,{children:`.env`}),` file, find the `,_jsx(_components.code,{children:`OPS_PUBLIC_URL`}),` variable and replace its value, `,_jsx(_components.code,{children:`http://localhost`}),`, with the IP address that you’ve previously identified. In our example, the IP address would be `,_jsx(_components.code,{children:`http://192.168.1.50`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Pull the images and run `,_jsx(_components.code,{children:`docker compose`}),`:`,`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`4`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# download the docker volumes and images`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`COMPOSE_PARALLEL_LIMIT`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`4`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:` sudo`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` docker`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` compose`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` pull`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# launch the application`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`sudo`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` docker`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` compose`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` up`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -d`})]}),`\n`]})})}),`\n`,`If you face a rate limit while downloading, run the command again.`]}),`\n`]})]}),`\n`,_jsxs(Expandable,{title:`Installing manually on Windows`,children:[_jsx(Heading,{level:`3`,id:`on-windows-with-powershell`,children:`On Windows (with PowerShell)`}),_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Install Docker Desktop by following `,_jsx(_components.a,{href:`https://docs.docker.com/desktop/setup/install/windows-install/`,children:`these instructions`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Add a new folder for OpenOps in your PowerShell console:`,`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`powershell`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`powershell`,children:_jsxs(_components.code,{language:`powershell`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`New-Item`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` -`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`ItemType Directory `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Force `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Path openops`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`Set-Location`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` openops`})]}),`\n`]})})}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`Download the OpenOps release files:`,`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`5`,language:`powershell`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`powershell`,children:_jsxs(_components.code,{language:`powershell`,numberOfLines:`5`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`Invoke-WebRequest`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` -`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Uri `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"https://github.com/openops-cloud/openops/releases/download/0.7.1/openops-dc-0.7.1.zip\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`Expand-Archive`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` -`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Path `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"openops-dc-0.7.1.zip\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` -`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`DestinationPath .`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`-Not`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`Test-Path`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \".env\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)) {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` Copy-Item`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \".env.defaults\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \".env\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`Open the `,_jsx(_components.code,{children:`.env`}),` file in the OpenOps installation folder. Change the values of the following variables that represent credentials. Do it now, as you won’t be able to change these values after the initial deployment:`,`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`OPS_OPENOPS_ADMIN_EMAIL`}),`: the email of your OpenOps installation’s root admin account.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`OPS_OPENOPS_ADMIN_PASSWORD`}),`: the password of your OpenOps installation’s root admin account.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`OPS_POSTGRES_USERNAME`}),`: the username of the Postgres database that OpenOps uses.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`OPS_POSTGRES_PASSWORD`}),`: the password of the Postgres database that OpenOps uses.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`OPS_ANALYTICS_ADMIN_PASSWORD`}),`: the password of the `,_jsx(_components.a,{href:`/reporting-analytics/data-visualization/`,children:`OpenOps Analytics`}),` admin account (the username is hardcoded to `,_jsx(_components.code,{children:`admin`}),`).`]}),`\n`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`Run `,_jsx(_components.code,{children:`docker compose`}),`:`,`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`powershell`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`powershell`,children:_jsxs(_components.code,{language:`powershell`,numberOfLines:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#9CDCFE`},children:`env:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`COMPOSE_PARALLEL_LIMIT`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"4\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`docker compose pull`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`docker compose up `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`d`})]}),`\n`]})})}),`\n`,`If you face a rate limit while downloading, run the command again.`]}),`\n`]})]}),`\n`,_jsx(Heading,{level:`2`,id:`updating-openops-to-a-newer-version`,children:`Updating OpenOps to a newer version`}),`\n`,_jsxs(_components.p,{children:[`See `,_jsx(_components.a,{href:`/getting-started/updating-openops`,children:`Updating OpenOps`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`cloud-templates`,children:`Cloud templates`}),`\n`,_jsx(_components.p,{children:`On localhost, cloud templates may not be able to load when using the Safari browser.`}),`\n`,_jsx(Heading,{level:`2`,id:`configuring-slack-approvals`,children:`Configuring Slack approvals`}),`\n`,_jsxs(_components.p,{children:[`If you would like to run a workflow that uses Slack approvals in a local installation, you should set the following variable in your `,_jsx(_components.code,{children:`.env`}),` file:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`OPS_SLACK_ENABLE_INTERACTIONS`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`false`})]}),`\n`]})})}),`\n`,_jsx(Note,{children:`This will open a new tab in your default browser when you approve or reject an action. You can safely close the tab after the action is completed.`}),`\n`,_jsxs(_components.p,{children:[`After updating your `,_jsx(_components.code,{children:`.env`}),` file, restart the containers:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`sudo`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` docker`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` compose`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` down`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` \u0026\u0026 `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`docker`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` compose`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` up`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -d`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`disabling-host-validation`,children:`Disabling host validation`}),`\n`,_jsxs(_components.p,{children:[`By default, OpenOps does not allow workflows to call internal network addresses such as `,_jsx(_components.code,{children:`127.0.0.1`}),` or `,_jsx(_components.code,{children:`192.168.0.0`}),`. This affects HTTP and SMTP actions, as well as webhook triggers. Host validation protects users from creating workflows that could accidentally or maliciously access internal services, scan networks, or escalate privileges.`]}),`\n`,_jsx(_components.p,{children:`You may need to disable this check in certain circumstances, such as in non-production deployments or when workflows intentionally interact with internal-only infrastructure.`}),`\n`,_jsxs(_components.p,{children:[`To disable host validation, open the `,_jsx(_components.code,{children:`.env`}),` file in your installation folder and set the `,_jsx(_components.code,{children:`OPS_ENABLE_HOST_VALIDATION`}),` environment variable to `,_jsx(_components.code,{children:`false`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`After making any changes to the `,_jsx(_components.code,{children:`.env`}),` file, restart the OpenOps containers:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`sudo`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` docker`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` compose`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` down`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`sudo`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` docker`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` compose`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` up`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -d`})]}),`\n`]})})}),`\n`,_jsx(Warning,{children:`Disabling this check removes an important safety guard and may allow workflows to access internal infrastructure. Use caution and avoid disabling it in production.`}),`\n`,_jsx(Heading,{level:`2`,id:`configuring-allowed-smtp-ports`,children:`Configuring allowed SMTP ports`}),`\n`,_jsxs(_components.p,{children:[`By default, OpenOps allows SMTP connections on ports 25, 465, 587, and 2525. Administrators can customize which SMTP ports are available by setting the `,_jsx(_components.code,{children:`OPS_SMTP_ALLOWED_PORTS`}),` environment variable in the `,_jsx(_components.code,{children:`.env`}),` file.`]}),`\n`,_jsxs(_components.p,{children:[`To configure allowed SMTP ports, open the `,_jsx(_components.code,{children:`.env`}),` file in your installation folder and set the `,_jsx(_components.code,{children:`OPS_SMTP_ALLOWED_PORTS`}),` variable to a comma-separated list of port numbers:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`OPS_SMTP_ALLOWED_PORTS`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`25,465,587,2525`})]}),`\n`]})})}),`\n`,_jsx(Note,{children:`Port numbers must be valid TCP ports in the range 1-65535. At least one valid port must be configured. Invalid port numbers will be filtered out.`}),`\n`,_jsxs(_components.p,{children:[`After making any changes to the `,_jsx(_components.code,{children:`.env`}),` file, restart the OpenOps containers:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`sudo`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` docker`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` compose`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` down`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`sudo`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` docker`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` compose`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` up`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -d`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`using-azure-cli-in-workflows-running-with-local-credentials`,children:`Using Azure CLI in workflows: running with local credentials`}),`\n`,_jsxs(_components.p,{children:[`It is possible to share your local session with the platform for local applications.\nTo do this, you need to set two environment variables in the `,_jsx(_components.code,{children:`.env`}),` file under the installation folder:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`OPS_ENABLE_HOST_SESSION=true`}),`: enables sharing of the host session with the platform container.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`HOST_AZURE_CONFIG_DIR=\"~/.azure\"`}),`: defines the path to the host machine’s Azure configuration folder that will be shared with the platform container.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`using-google-cloud-cli-in-workflows-running-with-local-credentials`,children:`Using Google Cloud CLI in workflows: running with local credentials`}),`\n`,_jsxs(_components.p,{children:[`It is possible to share your local Google Cloud CLI session with the platform for local applications.\nTo do this, you need to set two environment variables in the `,_jsx(_components.code,{children:`.env`}),` file under the installation folder:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`OPS_ENABLE_HOST_SESSION=true`}),`: enables sharing of the host session with the platform container.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`HOST_CLOUDSDK_CONFIG=\"~/.config/gcloud\"`}),`: defines the path to the host machine’s Google Cloud configuration folder that will be shared with the platform container.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`support`,children:`Support`}),`\n`,_jsxs(_components.p,{children:[`Feel free to join our `,_jsx(_components.a,{href:`https://slack.openops.com`,children:`Slack community`}),` if you have any questions or need help with your installation.`]})]})}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":{"config":{},"pageMetadata":{"title":"Local Deployment","description":"Deploy OpenOps on your local machine","icon":"laptop-code","href":"/getting-started/deployment/local"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Installing OpenOps","slug":"installing-openops","depth":2,"children":[]},{"title":"Updating OpenOps to a newer version","slug":"updating-openops-to-a-newer-version","depth":2,"children":[]},{"title":"Cloud templates","slug":"cloud-templates","depth":2,"children":[]},{"title":"Configuring Slack approvals","slug":"configuring-slack-approvals","depth":2,"children":[]},{"title":"Disabling host validation","slug":"disabling-host-validation","depth":2,"children":[]},{"title":"Configuring allowed SMTP ports","slug":"configuring-allowed-smtp-ports","depth":2,"children":[]},{"title":"Using Azure CLI in workflows: running with local credentials","slug":"using-azure-cli-in-workflows-running-with-local-credentials","depth":2,"children":[]},{"title":"Using Google Cloud CLI in workflows: running with local credentials","slug":"using-google-cloud-cli-in-workflows-running-with-local-credentials","depth":2,"children":[]},{"title":"Support","slug":"support","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"openops-ecb4f397","siteName":"OpenOps Documentation","title":"Local Deployment - OpenOps Documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-24T15:46:34.568Z","originalFileLocation":"getting-started/deployment/local.mdx"},"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=\"system\"}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=\"Deploy OpenOps on your local machine\">\u003cmeta data-mint-head name=\"application-name\" content=\"OpenOps Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/openops-ecb4f397/fdnTEMq5m7s8_-yI/_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/openops-ecb4f397/fdnTEMq5m7s8_-yI/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/openops-ecb4f397/fdnTEMq5m7s8_-yI/_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/openops-ecb4f397/fdnTEMq5m7s8_-yI/_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/openops-ecb4f397/fdnTEMq5m7s8_-yI/_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/openops-ecb4f397/fdnTEMq5m7s8_-yI/_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/openops-ecb4f397/fdnTEMq5m7s8_-yI/_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/openops-ecb4f397/fdnTEMq5m7s8_-yI/_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/openops-ecb4f397/fdnTEMq5m7s8_-yI/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Local Deployment - OpenOps Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Deploy OpenOps on your local machine\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"OpenOps Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.openops.com/getting-started/deployment/local\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://openops-ecb4f397.mintlify.app/images/openops-opengraph.svg\">\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=\"Local Deployment - OpenOps Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Deploy OpenOps on your local machine\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://openops-ecb4f397.mintlify.app/images/openops-opengraph.svg\">\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/openops-ecb4f397/fdnTEMq5m7s8_-yI/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"OpenOps Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0D9373\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.openops.com/getting-started/deployment/local\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/getting-started/deployment/local.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.openops.com/#organization\",\"name\":\"OpenOps Documentation\",\"url\":\"https://docs.openops.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/openops-ecb4f397/CTuKJka9LYs8t3gj/images/logo/light.svg?fit=max\u0026auto=format\u0026n=CTuKJka9LYs8t3gj\u0026q=85\u0026s=6f0acbe2a8f81e6384ad3fb1aa82d2c2\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.openops.com#website\",\"name\":\"OpenOps Documentation\",\"url\":\"https://docs.openops.com\",\"publisher\":{\"@id\":\"https://docs.openops.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.openops.com/getting-started/deployment/local#webpage\",\"url\":\"https://docs.openops.com/getting-started/deployment/local\",\"name\":\"Local Deployment\",\"description\":\"Deploy OpenOps on your local machine\",\"dateModified\":\"2026-09-24T15:46:34.568Z\",\"isPartOf\":{\"@id\":\"https://docs.openops.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.openops.com/getting-started/deployment/local#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.openops.com/getting-started/deployment/local#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Getting Started with OpenOps\",\"item\":\"https://docs.openops.com/getting-started/quick-start-guide\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Local Deployment\",\"item\":\"https://docs.openops.com/getting-started/deployment/local\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.openops.com/getting-started/deployment/local#article\",\"headline\":\"Local Deployment\",\"name\":\"Local Deployment\",\"description\":\"Deploy OpenOps on your local machine\",\"url\":\"https://docs.openops.com/getting-started/deployment/local\",\"mainEntityOfPage\":{\"@id\":\"https://docs.openops.com/getting-started/deployment/local#webpage\"},\"image\":\"https://docs.openops.com/images/openops-opengraph.svg\",\"dateModified\":\"2026-09-24T15:46:34.568Z\",\"publisher\":{\"@id\":\"https://docs.openops.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.openops.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"OpenOps Documentation\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"OpenOps Documentation","nav":{"global":null,"groups":[{"group":"Introduction to OpenOps","pages":[{"title":"OpenOps Overview","icon":"compass","href":"/introduction/overview"},{"title":"Features and Benefits","icon":"star","href":"/introduction/features-and-benefits"}]},{"group":"Getting Started with OpenOps","pages":[{"title":"Quick Start Guide","icon":"rocket","href":"/getting-started/quick-start-guide"},{"title":"System Requirements","description":"Hardware and software requirements for deploying OpenOps on-premises","icon":"server","href":"/getting-started/system-requirements"},{"group":"Deploying OpenOps","pages":[{"title":"Local Deployment","icon":"laptop-code","href":"/getting-started/deployment/local"},{"title":"AWS EC2 Deployment","description":"How to deploy OpenOps on an AWS EC2 instance","icon":"aws","href":"/getting-started/deployment/aws-ec2"},{"title":"Azure VM Deployment","icon":"microsoft","href":"/getting-started/deployment/azure-vm"},{"title":"GCP Compute Engine Deployment","icon":"google","href":"/getting-started/deployment/gcp-vm"}]},{"title":"Updating OpenOps","icon":"rotate","href":"/getting-started/updating-openops"},{"title":"User Management","icon":"users-gear","href":"/getting-started/user-management"}]},{"group":"Workflow Management","pages":[{"title":"Workflow Templates","icon":"puzzle-piece","href":"/workflow-management/workflow-templates"},{"title":"Building Workflows","icon":"diagram-project","href":"/workflow-management/building-workflows"},{"title":"Exporting and Importing Workflows","icon":"upload","href":"/workflow-management/import-export"},{"title":"Actions","icon":"bolt","href":"/workflow-management/actions"},{"title":"Scheduling","icon":"calendar","href":"/workflow-management/scheduling"},{"title":"Webhook responses","icon":"reply","href":"/workflow-management/webhook-responses"},{"title":"Passing Data","icon":"arrow-right-arrow-left","href":"/workflow-management/passing-data"},{"title":"Conditional Branching","icon":"code-branch","href":"/workflow-management/conditional-branching"},{"title":"Human-in-the-Loop","icon":"user-check","href":"/workflow-management/human-in-the-loop"},{"title":"Workflow Version History","icon":"timeline","href":"/workflow-management/workflow-version-history-lifecycle"},{"title":"Investigating Workflow Runs","icon":"magnifying-glass","href":"/workflow-management/investigate-workflow-run"}]},{"group":"Cloud Access","pages":[{"title":"Supported Cloud Providers","icon":"cloud","href":"/cloud-access/supported-cloud-providers"},{"title":"Access Levels and Permissions","icon":"lock","iconType":"solid","href":"/cloud-access/access-levels-permissions"},{"title":"AWS IAM Role Creation","icon":"aws","href":"/cloud-access/aws-cf-role-stack"},{"title":"Azure RBAC Custom Roles","icon":"microsoft","href":"/cloud-access/azure-rbac"}]},{"group":"AI Assistance","pages":[{"title":"AI Assistance","icon":"robot","href":"/ai-assistance/overview"},{"title":"LLM Connections","icon":"rectangle-list","href":"/ai-assistance/llm-connections"},{"title":"MCP Server","icon":"plug","href":"/ai-assistance/mcp-server"}]},{"group":"Reporting and Analytics","pages":[{"title":"Tables","icon":"table","href":"/reporting-analytics/tables"},{"title":"Analytics","icon":"chart-line","href":"/reporting-analytics/analytics"},{"title":"Connecting OpenOps to External Analytics Tools","icon":"chart-area","href":"/reporting-analytics/connecting-to-external-tools"}]},{"group":"Paid Features","pages":[{"title":"SSO Authentication","icon":"user","href":"/paid/sso-authentication"},{"title":"Organization Template Catalog","icon":"grid","href":"/paid/organization-template-catalog"},{"title":"Customer Workspaces","icon":"folders","href":"/paid/customer-workspaces"},{"title":"OpenOps Slack App","icon":"robot","href":"/paid/slack-app"},{"title":"Subagents","icon":"sparkles","href":"/paid/subagents"},{"title":"Role-Based Access Control","icon":"shield-halved","href":"/paid/role-based-access-control"}]},{"group":"Integrations","pages":[{"title":"Archera","icon":"file-contract","href":"/integrations/archera"},{"title":"Cloudability","icon":"sprout","href":"/integrations/cloudability"},{"title":"CloudFix","icon":"wrench","href":"/integrations/cloudfix"},{"title":"CloudHealth","icon":"heart-pulse","href":"/integrations/cloudhealth"},{"title":"CloudZero","icon":"chart-pie","href":"/integrations/cloudzero"},{"title":"Finout","icon":"tags","href":"/integrations/finout"},{"title":"Flexera","icon":"pencil-ruler","href":"/integrations/flexera"},{"title":"Ternary","icon":"magnifying-glass-chart","href":"/integrations/ternary"},{"title":"Umbrella","icon":"umbrella","href":"/integrations/umbrella"},{"title":"Vantage","icon":"chart-line","href":"/integrations/vantage"}]},{"group":"Cookbook","pages":[{"title":"Iterating Over Multiple AWS Accounts","icon":"repeat","href":"/cookbook/iterate-over-multiple-aws-accounts"},{"title":"Iterating Over Multiple Google Cloud Projects","icon":"shuffle","href":"/cookbook/iterate-over-multiple-gcp-projects"},{"title":"Iterating Over Multiple Azure Subscriptions","icon":"list","href":"/cookbook/iterate-over-multiple-azure-subscriptions"},{"title":"Designing Workflows with FinOps Platforms","icon":"diagram-project","href":"/cookbook/designing-workflows-with-finops-platforms"}]},{"group":"Contributing to OpenOps","pages":[{"title":"Overview","icon":"code","href":"/contributing/index"},{"title":"Development Environment","icon":"terminal","href":"/contributing/development-environment"},{"title":"Creating a Minimal Block","icon":"cube","href":"/contributing/creating-a-minimal-block"},{"title":"Contributing an Integration","icon":"puzzle","href":"/contributing/contributing-an-integration"},{"title":"Authentication","icon":"shield","href":"/contributing/authentication"}]}]},"basePath":"","title":"Local Deployment - OpenOps Documentation","buildId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","deploymentId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","dynamics":[],"chunks":[]}