diff --git a/404.html b/404.html index 23a159620..5988ef3da 100644 --- a/404.html +++ b/404.html @@ -14,8 +14,8 @@ - - + +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

diff --git a/assets/images/rabbitmq-0-enable-rabbitmq-41fe464d5087649f78f676b568bc284d.png b/assets/images/rabbitmq-0-enable-rabbitmq-41fe464d5087649f78f676b568bc284d.png new file mode 100644 index 000000000..a090074cf Binary files /dev/null and b/assets/images/rabbitmq-0-enable-rabbitmq-41fe464d5087649f78f676b568bc284d.png differ diff --git a/assets/images/rabbitmq-1-click-workload-80714dc960e250ad522bad870cfb3f0a.png b/assets/images/rabbitmq-1-click-workload-80714dc960e250ad522bad870cfb3f0a.png new file mode 100644 index 000000000..3b005423d Binary files /dev/null and b/assets/images/rabbitmq-1-click-workload-80714dc960e250ad522bad870cfb3f0a.png differ diff --git a/assets/images/rabbitmq-10-queues-c7282e26180c8b45ad0feff6f3f371c4.png b/assets/images/rabbitmq-10-queues-c7282e26180c8b45ad0feff6f3f371c4.png new file mode 100644 index 000000000..633af969d Binary files /dev/null and b/assets/images/rabbitmq-10-queues-c7282e26180c8b45ad0feff6f3f371c4.png differ diff --git a/assets/images/rabbitmq-11-policies-7b9fd478e92bcfae01acec2631c8f014.png b/assets/images/rabbitmq-11-policies-7b9fd478e92bcfae01acec2631c8f014.png new file mode 100644 index 000000000..83d0cfe50 Binary files /dev/null and b/assets/images/rabbitmq-11-policies-7b9fd478e92bcfae01acec2631c8f014.png differ diff --git a/assets/images/rabbitmq-2-add-name-b1d02de65d838bcfba89fba525a26c66.png b/assets/images/rabbitmq-2-add-name-b1d02de65d838bcfba89fba525a26c66.png new file mode 100644 index 000000000..6cd81bc3f Binary files /dev/null and b/assets/images/rabbitmq-2-add-name-b1d02de65d838bcfba89fba525a26c66.png differ diff --git a/assets/images/rabbitmq-3-add-queues-and-policies-50d05b131a2233305b0f823cadac520c.png b/assets/images/rabbitmq-3-add-queues-and-policies-50d05b131a2233305b0f823cadac520c.png new file mode 100644 index 000000000..9713d2739 Binary files /dev/null and b/assets/images/rabbitmq-3-add-queues-and-policies-50d05b131a2233305b0f823cadac520c.png differ diff --git a/assets/images/rabbitmq-4-check-status-cfe771d487ed7a5c525958cb5c4c12d0.png b/assets/images/rabbitmq-4-check-status-cfe771d487ed7a5c525958cb5c4c12d0.png new file mode 100644 index 000000000..431e2532e Binary files /dev/null and b/assets/images/rabbitmq-4-check-status-cfe771d487ed7a5c525958cb5c4c12d0.png differ diff --git a/assets/images/rabbitmq-5-check-argocd-status-3b82c45792c65008c36d7831ff13f318.png b/assets/images/rabbitmq-5-check-argocd-status-3b82c45792c65008c36d7831ff13f318.png new file mode 100644 index 000000000..0d4c94b84 Binary files /dev/null and b/assets/images/rabbitmq-5-check-argocd-status-3b82c45792c65008c36d7831ff13f318.png differ diff --git a/assets/images/rabbitmq-6-user-credentials-e21d1f14b2081e44510671e2a59e1246.png b/assets/images/rabbitmq-6-user-credentials-e21d1f14b2081e44510671e2a59e1246.png new file mode 100644 index 000000000..ac777f054 Binary files /dev/null and b/assets/images/rabbitmq-6-user-credentials-e21d1f14b2081e44510671e2a59e1246.png differ diff --git a/assets/images/rabbitmq-8-logging-in-4c9c20d1499ca0bcc942ba7d863a0ed3.png b/assets/images/rabbitmq-8-logging-in-4c9c20d1499ca0bcc942ba7d863a0ed3.png new file mode 100644 index 000000000..023335365 Binary files /dev/null and b/assets/images/rabbitmq-8-logging-in-4c9c20d1499ca0bcc942ba7d863a0ed3.png differ diff --git a/assets/images/rabbitmq-9-management-ui-0eb14163f450f423a0e19145512cad3e.png b/assets/images/rabbitmq-9-management-ui-0eb14163f450f423a0e19145512cad3e.png new file mode 100644 index 000000000..b14290ec4 Binary files /dev/null and b/assets/images/rabbitmq-9-management-ui-0eb14163f450f423a0e19145512cad3e.png differ diff --git a/assets/js/042c512d.ad1ef314.js b/assets/js/042c512d.ad1ef314.js deleted file mode 100644 index 8300c6f7d..000000000 --- a/assets/js/042c512d.ad1ef314.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[2018],{9242:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>a,contentTitle:()=>n,default:()=>d,frontMatter:()=>l,metadata:()=>o,toc:()=>u});var s=i(5893),r=i(1151);const l={slug:"multi-cluster",title:"Multi-cluster observability",sidebar_label:"Multi-cluster observability"},n=void 0,o={id:"use-cases/multi-cluster",title:"Multi-cluster observability",description:"Introduction",source:"@site/product/use-cases/multi-cluster.md",sourceDirName:"use-cases",slug:"/use-cases/multi-cluster",permalink:"/product/use-cases/multi-cluster",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/edit/main/product/use-cases/multi-cluster.md",tags:[],version:"current",lastUpdatedBy:"jeho",lastUpdatedAt:1709649459,formattedLastUpdatedAt:"Mar 5, 2024",frontMatter:{slug:"multi-cluster",title:"Multi-cluster observability",sidebar_label:"Multi-cluster observability"}},a={},u=[{value:"Introduction",id:"introduction",level:2},{value:"Multi-cluster observability with Otomi",id:"multi-cluster-observability-with-otomi",level:2}];function c(e){const t={h2:"h2",img:"img",li:"li",ol:"ol",p:"p",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"introduction",children:"Introduction"}),"\n",(0,s.jsx)(t.p,{children:"Using multiple Kubernetes clusters can have advantages based on your requirements. Some of the benefits of running multiple Kubernetes clusters are:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"High availability: When one cluster fails, the other cluster(s) can take the load. Losing one cluster when your applications are appropriately spread across several other clusters is much better than losing a single cluster with everything on it"}),"\n",(0,s.jsx)(t.li,{children:"Better end user experience: Splitting workloads can improve performance and reduce latency by providing users with a geographically close environment"}),"\n",(0,s.jsx)(t.li,{children:"Separate development and production clusters to reduce the risk of being served beta or non-production code versions"}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"But from a technical perspective, managing multiple Kubernetes clusters is more complex than managing a single cluster. For effective multi-cluster management, a \u201csingle pane of glass\u201d with centralized real-time monitoring, time series comparisons across and within clusters and high availability is essential for teams operating with multiple clusters and multiple providers."}),"\n",(0,s.jsx)(t.h2,{id:"multi-cluster-observability-with-otomi",children:"Multi-cluster observability with Otomi"}),"\n",(0,s.jsx)(t.p,{children:"The following image shows a multi-cluster observability setup using Otomi:"}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"multi-cluster",src:i(1195).Z+"",width:"1556",height:"1226"})}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsx)(t.li,{children:"Aggregation of metrics from workload clusters for Prometheus high availability and single pane of glass"}),"\n",(0,s.jsx)(t.li,{children:"Multi-cluster log aggregation"}),"\n",(0,s.jsx)(t.li,{children:"Preconfigured multi-cluster dashboards"}),"\n",(0,s.jsx)(t.li,{children:"Multi-cluster alerting"}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"This multi-cluster setup can be expanded with:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Running Harbor on the management cluster to provide image and chart registries for the workload clusters"}),"\n",(0,s.jsx)(t.li,{children:"Replicate workload cluster Git repositories to the management cluster Git repository"}),"\n",(0,s.jsx)(t.li,{children:"Deploy multiple application clusters based on a single cluster profile"}),"\n"]})]})}function d(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},1195:(e,t,i)=>{i.d(t,{Z:()=>s});const s=i.p+"assets/images/multi-cluster-dd1d21f51c8f0d0623e575b53e84568d.png"},1151:(e,t,i)=>{i.d(t,{Z:()=>o,a:()=>n});var s=i(7294);const r={},l=s.createContext(r);function n(e){const t=s.useContext(l);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:n(e.components),s.createElement(l.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/042c512d.cae9aab3.js b/assets/js/042c512d.cae9aab3.js new file mode 100644 index 000000000..5cb42ace1 --- /dev/null +++ b/assets/js/042c512d.cae9aab3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[2018],{9242:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>a,contentTitle:()=>n,default:()=>d,frontMatter:()=>l,metadata:()=>o,toc:()=>u});var s=i(5893),r=i(1151);const l={slug:"multi-cluster",title:"Multi-cluster observability",sidebar_label:"Multi-cluster observability"},n=void 0,o={id:"use-cases/multi-cluster",title:"Multi-cluster observability",description:"Introduction",source:"@site/product/use-cases/multi-cluster.md",sourceDirName:"use-cases",slug:"/use-cases/multi-cluster",permalink:"/product/use-cases/multi-cluster",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/edit/main/product/use-cases/multi-cluster.md",tags:[],version:"current",lastUpdatedBy:"ElderMatt",lastUpdatedAt:1710142611,formattedLastUpdatedAt:"Mar 11, 2024",frontMatter:{slug:"multi-cluster",title:"Multi-cluster observability",sidebar_label:"Multi-cluster observability"}},a={},u=[{value:"Introduction",id:"introduction",level:2},{value:"Multi-cluster observability with Otomi",id:"multi-cluster-observability-with-otomi",level:2}];function c(e){const t={h2:"h2",img:"img",li:"li",ol:"ol",p:"p",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"introduction",children:"Introduction"}),"\n",(0,s.jsx)(t.p,{children:"Using multiple Kubernetes clusters can have advantages based on your requirements. Some of the benefits of running multiple Kubernetes clusters are:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"High availability: When one cluster fails, the other cluster(s) can take the load. Losing one cluster when your applications are appropriately spread across several other clusters is much better than losing a single cluster with everything on it"}),"\n",(0,s.jsx)(t.li,{children:"Better end user experience: Splitting workloads can improve performance and reduce latency by providing users with a geographically close environment"}),"\n",(0,s.jsx)(t.li,{children:"Separate development and production clusters to reduce the risk of being served beta or non-production code versions"}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"But from a technical perspective, managing multiple Kubernetes clusters is more complex than managing a single cluster. For effective multi-cluster management, a \u201csingle pane of glass\u201d with centralized real-time monitoring, time series comparisons across and within clusters and high availability is essential for teams operating with multiple clusters and multiple providers."}),"\n",(0,s.jsx)(t.h2,{id:"multi-cluster-observability-with-otomi",children:"Multi-cluster observability with Otomi"}),"\n",(0,s.jsx)(t.p,{children:"The following image shows a multi-cluster observability setup using Otomi:"}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"multi-cluster",src:i(1195).Z+"",width:"1556",height:"1226"})}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsx)(t.li,{children:"Aggregation of metrics from workload clusters for Prometheus high availability and single pane of glass"}),"\n",(0,s.jsx)(t.li,{children:"Multi-cluster log aggregation"}),"\n",(0,s.jsx)(t.li,{children:"Preconfigured multi-cluster dashboards"}),"\n",(0,s.jsx)(t.li,{children:"Multi-cluster alerting"}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"This multi-cluster setup can be expanded with:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Running Harbor on the management cluster to provide image and chart registries for the workload clusters"}),"\n",(0,s.jsx)(t.li,{children:"Replicate workload cluster Git repositories to the management cluster Git repository"}),"\n",(0,s.jsx)(t.li,{children:"Deploy multiple application clusters based on a single cluster profile"}),"\n"]})]})}function d(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},1195:(e,t,i)=>{i.d(t,{Z:()=>s});const s=i.p+"assets/images/multi-cluster-dd1d21f51c8f0d0623e575b53e84568d.png"},1151:(e,t,i)=>{i.d(t,{Z:()=>o,a:()=>n});var s=i(7294);const r={},l=s.createContext(r);function n(e){const t=s.useContext(l);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:n(e.components),s.createElement(l.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0c3fdeeb.2c1d6401.js b/assets/js/0c3fdeeb.2c1d6401.js deleted file mode 100644 index 673ee546e..000000000 --- a/assets/js/0c3fdeeb.2c1d6401.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[6096],{1573:(e,s,o)=>{o.r(s),o.d(s,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>t,metadata:()=>r,toc:()=>a});var i=o(5893),n=o(1151);const t={slug:"overview",title:"Overview",sidebar_label:"Overview"},l=void 0,r={id:"for-ops/console/overview",title:"Overview",description:"Otomi Console",source:"@site/docs/for-ops/console/overview.md",sourceDirName:"for-ops/console",slug:"/for-ops/console/overview",permalink:"/docs/for-ops/console/overview",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/tree/main/docs/for-ops/console/overview.md",tags:[],version:"current",frontMatter:{slug:"overview",title:"Overview",sidebar_label:"Overview"},sidebar:"mainSidebar",previous:{title:"Canary Deployments",permalink:"/docs/get-started/labs/lab-28"},next:{title:"Dashboard",permalink:"/docs/for-ops/console/dashboard"}},c={},a=[{value:"Otomi Console",id:"otomi-console",level:2},{value:"Platform section",id:"platform-section",level:3},{value:"Team section",id:"team-section",level:3},{value:"Cluster section",id:"cluster-section",level:3}];function d(e){const s={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",ul:"ul",...(0,n.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.h2,{id:"otomi-console",children:"Otomi Console"}),"\n",(0,i.jsx)(s.p,{children:"Otomi Console is the web UI of Otomi and offers access to all integrated apps and self-service tasks."}),"\n",(0,i.jsxs)(s.p,{children:['Otomi Console has a topbar showing a cluster and team selector, the logged-in user and a dark/light-mode. The team selector allows to switch to your desired context. Otomi Console also has a menu on the left. This menu shows the sections "Platform", "Team ',(0,i.jsx)(s.code,{children:"$name"}),'" and "Cluster".']}),"\n",(0,i.jsx)(s.h3,{id:"platform-section",children:"Platform section"}),"\n",(0,i.jsx)(s.p,{children:"The Platform section in the left menu provides access to:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Dashboard"}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/for-ops/console/apps",children:"Apps"}),": All active and inactive apps. Activate apps by dragging them to the active apps section"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/for-ops/console/shortcuts",children:"Shortcuts"}),": A list off all shortcuts created on this platform"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/for-ops/console/clusters",children:"Clusters"}),": A list of all known Kubernetes clusters running Otomi"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/for-ops/console/policies",children:"Policies"}),": A list of all available security policies and their configuration for this platform"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/for-ops/console/teams",children:"Teams"}),": A list of all Teams using this platform"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/for-ops/console/builds",children:"Builds"}),": A list of all builds created on this platform"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/for-ops/console/secrets",children:"Secrets"}),": A list of all secrets created on this platform"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/for-ops/console/workloads",children:"Workloads"}),": A list of all workloads running on this platform"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/for-ops/console/services",children:"Services"}),": A list of all services running on this platform"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/for-ops/console/settings/alerts",children:"Settings"}),": Specific configuration of the platform"]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"team-section",children:"Team section"}),"\n",(0,i.jsxs)(s.p,{children:["The Team ",(0,i.jsx)(s.code,{children:"$name"})," section gives access to:"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/for-devs/console/apps",children:"Apps"}),": All the apps available to the team on this platform"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/for-devs/console/shortcuts",children:"Shortcuts"}),": All shortcuts available to the team on this platform"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/for-devs/console/builds",children:"Builds"}),": A list of all builds created by the team"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/for-devs/console/secrets",children:"Secrets"}),": A list of all secrets created by the team"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/for-devs/console/workloads",children:"Workloads"}),": A list of all team workloads"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/for-devs/console/services",children:"Services"}),": A list of all team services"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/for-devs/console/settings",children:"Settings"}),": Specific team configuration options"]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"cluster-section",children:"Cluster section"}),"\n",(0,i.jsx)(s.p,{children:"The Cluster section shows:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Cluster information such as name, cloud, region, k8s version, otomi version, etc"}),"\n",(0,i.jsxs)(s.li,{children:['A "Download KUBECFG" link to download a KUBECONFIG file that gives access to the namespace of the team selected. Admins can download one with ',(0,i.jsx)(s.code,{children:"cluster-admin"})," permissions (giving access to all namespaces) by setting the team selector to '-'. You can use it like ",(0,i.jsx)(s.code,{children:"export KUBECONFIG=$file_location"})," or by merging it with another KUBECONFIG file like ",(0,i.jsx)(s.code,{children:".kube/config"}),"."]}),"\n",(0,i.jsx)(s.li,{children:'When Otomi uses an automatic generated CA or Let\'s Encrypt staging certificates, a "Download CA" link is provided.'}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:["Please visit the official Kubernetes ",(0,i.jsx)(s.a,{href:"https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/",children:"documentation about managing kube contexts"}),"."]})]})}function h(e={}){const{wrapper:s}={...(0,n.a)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},1151:(e,s,o)=>{o.d(s,{Z:()=>r,a:()=>l});var i=o(7294);const n={},t=i.createContext(n);function l(e){const s=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function r(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:l(e.components),i.createElement(t.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0c3fdeeb.a79a6814.js b/assets/js/0c3fdeeb.a79a6814.js new file mode 100644 index 000000000..50e0b6cdc --- /dev/null +++ b/assets/js/0c3fdeeb.a79a6814.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[6096],{1573:(e,s,o)=>{o.r(s),o.d(s,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>t,metadata:()=>r,toc:()=>a});var i=o(5893),n=o(1151);const t={slug:"overview",title:"Overview",sidebar_label:"Overview"},l=void 0,r={id:"for-ops/console/overview",title:"Overview",description:"Otomi Console",source:"@site/docs/for-ops/console/overview.md",sourceDirName:"for-ops/console",slug:"/for-ops/console/overview",permalink:"/docs/for-ops/console/overview",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/tree/main/docs/for-ops/console/overview.md",tags:[],version:"current",frontMatter:{slug:"overview",title:"Overview",sidebar_label:"Overview"},sidebar:"mainSidebar",previous:{title:"Create RabbitMQ cluster",permalink:"/docs/get-started/labs/lab-33"},next:{title:"Dashboard",permalink:"/docs/for-ops/console/dashboard"}},c={},a=[{value:"Otomi Console",id:"otomi-console",level:2},{value:"Platform section",id:"platform-section",level:3},{value:"Team section",id:"team-section",level:3},{value:"Cluster section",id:"cluster-section",level:3}];function d(e){const s={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",ul:"ul",...(0,n.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.h2,{id:"otomi-console",children:"Otomi Console"}),"\n",(0,i.jsx)(s.p,{children:"Otomi Console is the web UI of Otomi and offers access to all integrated apps and self-service tasks."}),"\n",(0,i.jsxs)(s.p,{children:['Otomi Console has a topbar showing a cluster and team selector, the logged-in user and a dark/light-mode. The team selector allows to switch to your desired context. Otomi Console also has a menu on the left. This menu shows the sections "Platform", "Team ',(0,i.jsx)(s.code,{children:"$name"}),'" and "Cluster".']}),"\n",(0,i.jsx)(s.h3,{id:"platform-section",children:"Platform section"}),"\n",(0,i.jsx)(s.p,{children:"The Platform section in the left menu provides access to:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Dashboard"}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/for-ops/console/apps",children:"Apps"}),": All active and inactive apps. Activate apps by dragging them to the active apps section"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/for-ops/console/shortcuts",children:"Shortcuts"}),": A list off all shortcuts created on this platform"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/for-ops/console/clusters",children:"Clusters"}),": A list of all known Kubernetes clusters running Otomi"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/for-ops/console/policies",children:"Policies"}),": A list of all available security policies and their configuration for this platform"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/for-ops/console/teams",children:"Teams"}),": A list of all Teams using this platform"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/for-ops/console/builds",children:"Builds"}),": A list of all builds created on this platform"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/for-ops/console/secrets",children:"Secrets"}),": A list of all secrets created on this platform"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/for-ops/console/workloads",children:"Workloads"}),": A list of all workloads running on this platform"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/for-ops/console/services",children:"Services"}),": A list of all services running on this platform"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/for-ops/console/settings/alerts",children:"Settings"}),": Specific configuration of the platform"]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"team-section",children:"Team section"}),"\n",(0,i.jsxs)(s.p,{children:["The Team ",(0,i.jsx)(s.code,{children:"$name"})," section gives access to:"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/for-devs/console/apps",children:"Apps"}),": All the apps available to the team on this platform"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/for-devs/console/shortcuts",children:"Shortcuts"}),": All shortcuts available to the team on this platform"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/for-devs/console/builds",children:"Builds"}),": A list of all builds created by the team"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/for-devs/console/secrets",children:"Secrets"}),": A list of all secrets created by the team"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/for-devs/console/workloads",children:"Workloads"}),": A list of all team workloads"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/for-devs/console/services",children:"Services"}),": A list of all team services"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/for-devs/console/settings",children:"Settings"}),": Specific team configuration options"]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"cluster-section",children:"Cluster section"}),"\n",(0,i.jsx)(s.p,{children:"The Cluster section shows:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Cluster information such as name, cloud, region, k8s version, otomi version, etc"}),"\n",(0,i.jsxs)(s.li,{children:['A "Download KUBECFG" link to download a KUBECONFIG file that gives access to the namespace of the team selected. Admins can download one with ',(0,i.jsx)(s.code,{children:"cluster-admin"})," permissions (giving access to all namespaces) by setting the team selector to '-'. You can use it like ",(0,i.jsx)(s.code,{children:"export KUBECONFIG=$file_location"})," or by merging it with another KUBECONFIG file like ",(0,i.jsx)(s.code,{children:".kube/config"}),"."]}),"\n",(0,i.jsx)(s.li,{children:'When Otomi uses an automatic generated CA or Let\'s Encrypt staging certificates, a "Download CA" link is provided.'}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:["Please visit the official Kubernetes ",(0,i.jsx)(s.a,{href:"https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/",children:"documentation about managing kube contexts"}),"."]})]})}function h(e={}){const{wrapper:s}={...(0,n.a)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},1151:(e,s,o)=>{o.d(s,{Z:()=>r,a:()=>l});var i=o(7294);const n={},t=i.createContext(n);function l(e){const s=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function r(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:l(e.components),i.createElement(t.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/21fbcd7c.11a68e54.js b/assets/js/21fbcd7c.11a68e54.js new file mode 100644 index 000000000..37b8955c1 --- /dev/null +++ b/assets/js/21fbcd7c.11a68e54.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[3563],{7032:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>c,toc:()=>a});var i=n(5893),s=n(1151);const r={slug:"architecture",title:"Otomi Projects",sidebar_label:"Otomi Projects"},l=void 0,c={id:"architecture",title:"Otomi Projects",description:"Otomi consists out of the following projects:",source:"@site/product/architecture.md",sourceDirName:".",slug:"/architecture",permalink:"/product/architecture",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/edit/main/product/architecture.md",tags:[],version:"current",lastUpdatedBy:"ElderMatt",lastUpdatedAt:1710142611,formattedLastUpdatedAt:"Mar 11, 2024",frontMatter:{slug:"architecture",title:"Otomi Projects",sidebar_label:"Otomi Projects"},sidebar:"mainSidebar",previous:{title:"Why Otomi",permalink:"/product/introduction"},next:{title:"Roadmap",permalink:"/product/roadmap"}},o={},a=[{value:"Otomi Core",id:"otomi-core",level:2},{value:"Integrated K8s applications",id:"integrated-k8s-applications",level:3},{value:"Catagories",id:"catagories",level:3},{value:"Advanced ingress architecture as its core",id:"advanced-ingress-architecture-as-its-core",level:3},{value:"Otomi Tasks",id:"otomi-tasks",level:2},{value:"Otomi Clients",id:"otomi-clients",level:2},{value:"Otomi API",id:"otomi-api",level:2},{value:"Otomi Console",id:"otomi-console",level:2}];function d(e){const t={a:"a",admonition:"admonition",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:"Otomi consists out of the following projects:"}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Project"}),(0,i.jsx)(t.th,{children:"open source"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.a,{href:"https://github.com/redkubes/otomi-core",children:"otomi-core"})}),(0,i.jsx)(t.td,{children:"Yes"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.a,{href:"https://github.com/redkubes/otomi-tasks",children:"otomi-tasks"})}),(0,i.jsx)(t.td,{children:"Yes"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.a,{href:"https://github.com/redkubes/otomi-clients",children:"otomi-clients"})}),(0,i.jsx)(t.td,{children:"Yes"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.a,{href:"https://github.com/redkubes/otomi-console",children:"otomi-console"})}),(0,i.jsx)(t.td,{children:"No"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.a,{href:"https://github.com/redkubes/otomi-api",children:"otomi-api"})}),(0,i.jsx)(t.td,{children:"No"})]})]})]}),"\n",(0,i.jsx)(t.h2,{id:"otomi-core",children:"Otomi Core"}),"\n",(0,i.jsx)(t.p,{children:"Otomi Core contains all the integrated applications and is made available (per release) as a container image."}),"\n",(0,i.jsx)(t.p,{children:"Otomi Core also contains the source code for Otomi CLI. Otomi CLI can be used for advanced initial configuration (bootstrapping), deployment, sync, push, template validation, and much more."}),"\n",(0,i.jsx)(t.h3,{id:"integrated-k8s-applications",children:"Integrated K8s applications"}),"\n",(0,i.jsx)(t.p,{children:"Otomi Core is the heart of Otomi and contains a suite of the following integrated Kubernetes applications:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/istio/istio",children:"Istio"}),": The service mesh framework with end-to-end transit encryption"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/keycloak/keycloak",children:"Keycloak"}),": Identity and access management for modern applications and services"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/cert-manager/cert-manager",children:"Cert Manager"})," - Bring your own wildcard certificate or request one from Let's Encrypt"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/kubernetes/ingress-nginx",children:"Nginx Ingress Controller"}),": Ingress controller for Kubernetes"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/kubernetes-sigs/external-dns",children:"External DNS"}),": Synchronize exposed ingresses with DNS providers"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/harness/drone",children:"Drone"}),": Continuous integration platform built on Docker"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/go-gitea/gitea",children:"Gitea"}),": Self-hosted Git service"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/vmware-tanzu/velero",children:"Velero"}),": Back up and restore your Kubernetes cluster resources and persistent volumes"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/argoproj/argo-cd",children:"Argo CD"}),": Declarative continuous deployment"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/knative/serving",children:"Knative"}),": Deploy and manage serverless workloads"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/GoogleContainerTools/kaniko",children:"Kaniko"}),": Build container images from a Dockerfile"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/prometheus/prometheus",children:"Prometheus"}),": Collecting container application metrics"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/grafana/grafana",children:"Grafana"}),": Visualize metrics, logs, and traces from multiple sources"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/grafana/loki",children:"Grafana Loki"}),": Collecting container application logs"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/goharbor/harbor",children:"Harbor"}),": Container image registry with role-based access control, image scanning, and image signing"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/hashicorp/vault",children:"HashiCorp Vault"}),": Manage Secrets and Protect Sensitive Data"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/open-policy-agent/gatekeeper",children:"OPA/Gatekeeper"}),": Policy-based control for cloud-native environments"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/jaegertracing/jaeger",children:"Jaeger"}),": End-to-end distributed tracing and monitor for complex distributed systems"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/kiali/kiali",children:"Kiali"}),": Observe Istio service mesh relations and connections"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/minio/minio",children:"Minio"}),": High performance Object Storage compatible with Amazon S3 cloud storage service"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/aquasecurity/trivy-operator",children:"Trivy"}),": Kubernetes-native security toolkit"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/thanos-io/thanos",children:"Thanos"}),": HA Prometheus setup with long term storage capabilities"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/falcosecurity/falco",children:"Falco"}),": Cloud Native Runtime Security"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/opencost/opencost",children:"Opencost"}),": Cost monitoring for Kubernetes"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/tektoncd/pipeline",children:"Tekton Pipeline"}),": K8s-style resources for declaring CI/CD pipelines"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/tektoncd/triggers",children:"Tekton Triggers"}),": Trigger pipelines from event payloads"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/tektoncd/dashboard",children:"Tekton dashboard"}),": Web-based UI for Tekton Pipelines and Tekton Triggers"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/paketo-buildpacks",children:"Paketo build packs"}),": Cloud Native Buildpack implementations for popular programming language ecosystems"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/cloudnative-pg/cloudnative-pg",children:"Cloudnative-pg"}),": Open source operator designed to manage PostgreSQL workloads"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/grafana/tempo",children:"Grafana Tempo"}),": High-scale distributed tracing backend"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/open-telemetry/opentelemetry-operator",children:"OpenTelemetry"}),": Instrument, generate, collect, and export telemetry data to help you analyze your software\u2019s performance and behavior"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/bitnami-labs/sealed-secrets",children:"Sealed Secrets"}),": Encrypt your Secret into a SealedSecret, which is safe to store - even inside a public repository."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/rabbitmq/cluster-operator",children:"RabbitMQ"}),": Kubernetes operator to deploy and manage RabbitMQ clusters."]}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"catagories",children:"Catagories"}),"\n",(0,i.jsx)(t.p,{children:"Otomi contains four catagories of integrated K8s applications:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Core applications: applications that are activated by default"}),"\n",(0,i.jsx)(t.li,{children:"Shared applications: applications that are shared between teams. Shared applications are user-, and role-aware or not (user is anonymous)"}),"\n",(0,i.jsx)(t.li,{children:"Team applications: applications with a dedicated instance per team"}),"\n",(0,i.jsx)(t.li,{children:"Optional applications: applications that are optional and can be activated by the platform admin"}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"The following table shows all integrated applications:"}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{style:{textAlign:"left"},children:"Application"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Core"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Shared"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Team"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"User/role-aware"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Optional"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"Istio"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"Ingress NGINX Controller"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"Knative"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:(0,i.jsx)(t.a,{href:"/docs/apps/keycloak",children:"KeyCloak"})}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"Prometheus Server"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"Prometheus kube state metrics"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"Alertmanager"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"Grafana/Loki"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:(0,i.jsx)(t.a,{href:"/docs/apps/gatekeeper",children:"Gatekeeper Operator"})}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:(0,i.jsx)(t.a,{href:"/docs/apps/vault",children:"Hashicorp Vault"})}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:(0,i.jsx)(t.a,{href:"/docs/apps/harbor",children:"Harbor"})}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:(0,i.jsx)(t.a,{href:"/docs/apps/drone",children:"Drone"})}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"Gitea"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"Httpbin"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"Jeager"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"Kiali"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"Velero"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"Minio"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"Opencost"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"Tekton Pipeline"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"Trivy Operator"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"Cloudnative-pg"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}})]})]})]}),"\n",(0,i.jsx)(t.h3,{id:"advanced-ingress-architecture-as-its-core",children:"Advanced ingress architecture as its core"}),"\n",(0,i.jsx)(t.p,{children:"Otomi by default installs and configures an advanced ingress architecture. Ingress for a service can be configured using Otomi Services. The following figure shows the ingress and SSO architecture."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"img/ingress-overview",src:n(2701).Z+"",width:"1149",height:"828"})}),"\n",(0,i.jsx)(t.p,{children:"The ingress & SSO architecture overview explained:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"(optional) an external gateway is used for termination of external traffic (e.g. an Azure Application Gateway or an AWS Application Load Balancer)."}),"\n",(0,i.jsx)(t.li,{children:"2 Ingress NGINX controllers are deployed, one for public access and one for authenticated access."}),"\n",(0,i.jsx)(t.li,{children:"Authenticated (SSO) access is handled by an oauth2 proxy and KeyCloak. The user logs in using the Otomi custom KeyCloak login page."}),"\n",(0,i.jsx)(t.li,{children:"KeyCloak is configured with an external IDP (optional) or uses local accounts. After authentication, KeyCloak provides a normalized JWT token. The JWT token is used by integrated core applications (providing user and role information) and team services configured with SSO"}),"\n",(0,i.jsx)(t.li,{children:"4 Istio (ingress) gateways are provisioned:"}),"\n"]}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsx)(t.li,{children:"a public gateway for routing public (non authenticated traffic to a service)"}),"\n",(0,i.jsx)(t.li,{children:"an authentication gateway to route authenticated traffic to a service"}),"\n",(0,i.jsx)(t.li,{children:"a local gateway (for local cluster routing)"}),"\n",(0,i.jsx)(t.li,{children:"a Knative gateway to route traffic to Knative services"}),"\n"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"For each service a Istio virtual service is configured."}),"\n",(0,i.jsx)(t.li,{children:"One egress gateway is provisioned for all egress traffic (network policies allow all egress traffic)."}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"otomi-tasks",children:"Otomi Tasks"}),"\n",(0,i.jsx)(t.p,{children:"Otomi Tasks contains a set of Kubernetes jobs and teh Otomi Operator. The jobs and Operator ensure that the configuration of applications integrated in Otomi are always equal to the desired-state configuration (see Otomi Values). An example: If a team is created via Otomi Console (in combination with Otomi API), Otomi Tasks ensures that a project is created for the new team in Harbor, the access to the project in Harbor is configured, a robot account (that can be used to push images to the project registry) is created and that a pull secret is created in the namespace of the team."}),"\n",(0,i.jsx)(t.p,{children:"Otomi Tasks is currently used to configure the following applications:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"KeyCloak"}),"\n",(0,i.jsx)(t.li,{children:"Harbor"}),"\n",(0,i.jsx)(t.li,{children:"Gitea"}),"\n",(0,i.jsx)(t.li,{children:"Drone"}),"\n",(0,i.jsx)(t.li,{children:"Otomi (copy-certs and wait-for)"}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"otomi-clients",children:"Otomi Clients"}),"\n",(0,i.jsx)(t.p,{children:"A factory to build and publish openapi clients used in the redkubes/otomi-tasks repo."}),"\n",(0,i.jsx)(t.p,{children:"Otomi Clients is currently used to generate openapi clients for the following applications:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"KeyCloak"}),"\n",(0,i.jsx)(t.li,{children:"Harbor"}),"\n",(0,i.jsx)(t.li,{children:"Gitea"}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"otomi-api",children:"Otomi API"}),"\n",(0,i.jsx)(t.p,{children:"Otomi API allows for a controlled change of all Otomi Values, based on a configuration scheme and is the brain of Otomi. Otomi API runs as a container on each cluster running."}),"\n",(0,i.jsx)(t.admonition,{type:"info",children:(0,i.jsxs)(t.p,{children:["Otomi API is not open source. When installing Otomi, a FREE Community Edition version is installed. Contact ",(0,i.jsx)(t.a,{href:"https://redkubes.com/",children:"Red Kubes"})," for details on support and pricing for a full featured version."]})}),"\n",(0,i.jsx)(t.h2,{id:"otomi-console",children:"Otomi Console"}),"\n",(0,i.jsx)(t.p,{children:"Otomi Console is the User Interface of Otomi. Otomi Console communicates with Otomi API for reading and changing Otomi Values configuration. Otomi Console also offers (via the Otomi Apps option) shortcuts to the UI of the various integrated applications."}),"\n",(0,i.jsx)(t.admonition,{type:"info",children:(0,i.jsxs)(t.p,{children:["Otomi Console is not open source. When installing Otomi, a FREE Community Edition version is installed. Contact ",(0,i.jsx)(t.a,{href:"https://redkubes.com/",children:"Red Kubes"})," for details on support and pricing for a full featured version."]})})]})}function h(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},2701:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/ingress-overview-419bc5e7be19dafdebd9a8ec6b04a3b1.svg"},1151:(e,t,n)=>{n.d(t,{Z:()=>c,a:()=>l});var i=n(7294);const s={},r=i.createContext(s);function l(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/21fbcd7c.b3d08931.js b/assets/js/21fbcd7c.b3d08931.js deleted file mode 100644 index 4c946538e..000000000 --- a/assets/js/21fbcd7c.b3d08931.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[3563],{7032:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>c,toc:()=>a});var i=n(5893),s=n(1151);const r={slug:"architecture",title:"Otomi Projects",sidebar_label:"Otomi Projects"},l=void 0,c={id:"architecture",title:"Otomi Projects",description:"Otomi consists out of the following projects:",source:"@site/product/architecture.md",sourceDirName:".",slug:"/architecture",permalink:"/product/architecture",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/edit/main/product/architecture.md",tags:[],version:"current",lastUpdatedBy:"jeho",lastUpdatedAt:1709649459,formattedLastUpdatedAt:"Mar 5, 2024",frontMatter:{slug:"architecture",title:"Otomi Projects",sidebar_label:"Otomi Projects"},sidebar:"mainSidebar",previous:{title:"Why Otomi",permalink:"/product/introduction"},next:{title:"Roadmap",permalink:"/product/roadmap"}},o={},a=[{value:"Otomi Core",id:"otomi-core",level:2},{value:"Integrated K8s applications",id:"integrated-k8s-applications",level:3},{value:"Catagories",id:"catagories",level:3},{value:"Advanced ingress architecture as its core",id:"advanced-ingress-architecture-as-its-core",level:3},{value:"Otomi Tasks",id:"otomi-tasks",level:2},{value:"Otomi Clients",id:"otomi-clients",level:2},{value:"Otomi API",id:"otomi-api",level:2},{value:"Otomi Console",id:"otomi-console",level:2}];function d(e){const t={a:"a",admonition:"admonition",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:"Otomi consists out of the following projects:"}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Project"}),(0,i.jsx)(t.th,{children:"open source"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.a,{href:"https://github.com/redkubes/otomi-core",children:"otomi-core"})}),(0,i.jsx)(t.td,{children:"Yes"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.a,{href:"https://github.com/redkubes/otomi-tasks",children:"otomi-tasks"})}),(0,i.jsx)(t.td,{children:"Yes"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.a,{href:"https://github.com/redkubes/otomi-clients",children:"otomi-clients"})}),(0,i.jsx)(t.td,{children:"Yes"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.a,{href:"https://github.com/redkubes/otomi-console",children:"otomi-console"})}),(0,i.jsx)(t.td,{children:"No"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.a,{href:"https://github.com/redkubes/otomi-api",children:"otomi-api"})}),(0,i.jsx)(t.td,{children:"No"})]})]})]}),"\n",(0,i.jsx)(t.h2,{id:"otomi-core",children:"Otomi Core"}),"\n",(0,i.jsx)(t.p,{children:"Otomi Core contains all the integrated applications and is made available (per release) as a container image."}),"\n",(0,i.jsx)(t.p,{children:"Otomi Core also contains the source code for Otomi CLI. Otomi CLI can be used for advanced initial configuration (bootstrapping), deployment, sync, push, template validation, and much more."}),"\n",(0,i.jsx)(t.h3,{id:"integrated-k8s-applications",children:"Integrated K8s applications"}),"\n",(0,i.jsx)(t.p,{children:"Otomi Core is the heart of Otomi and contains a suite of the following integrated Kubernetes applications:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/istio/istio",children:"Istio"}),": The service mesh framework with end-to-end transit encryption"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/keycloak/keycloak",children:"Keycloak"}),": Identity and access management for modern applications and services"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/cert-manager/cert-manager",children:"Cert Manager"})," - Bring your own wildcard certificate or request one from Let's Encrypt"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/kubernetes/ingress-nginx",children:"Nginx Ingress Controller"}),": Ingress controller for Kubernetes"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/kubernetes-sigs/external-dns",children:"External DNS"}),": Synchronize exposed ingresses with DNS providers"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/harness/drone",children:"Drone"}),": Continuous integration platform built on Docker"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/go-gitea/gitea",children:"Gitea"}),": Self-hosted Git service"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/vmware-tanzu/velero",children:"Velero"}),": Back up and restore your Kubernetes cluster resources and persistent volumes"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/argoproj/argo-cd",children:"Argo CD"}),": Declarative continuous deployment"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/knative/serving",children:"Knative"}),": Deploy and manage serverless workloads"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/GoogleContainerTools/kaniko",children:"Kaniko"}),": Build container images from a Dockerfile"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/prometheus/prometheus",children:"Prometheus"}),": Collecting container application metrics"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/grafana/grafana",children:"Grafana"}),": Visualize metrics, logs, and traces from multiple sources"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/grafana/loki",children:"Grafana Loki"}),": Collecting container application logs"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/goharbor/harbor",children:"Harbor"}),": Container image registry with role-based access control, image scanning, and image signing"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/hashicorp/vault",children:"HashiCorp Vault"}),": Manage Secrets and Protect Sensitive Data"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/open-policy-agent/gatekeeper",children:"OPA/Gatekeeper"}),": Policy-based control for cloud-native environments"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/jaegertracing/jaeger",children:"Jaeger"}),": End-to-end distributed tracing and monitor for complex distributed systems"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/kiali/kiali",children:"Kiali"}),": Observe Istio service mesh relations and connections"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/minio/minio",children:"Minio"}),": High performance Object Storage compatible with Amazon S3 cloud storage service"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/aquasecurity/trivy-operator",children:"Trivy"}),": Kubernetes-native security toolkit"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/thanos-io/thanos",children:"Thanos"}),": HA Prometheus setup with long term storage capabilities"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/falcosecurity/falco",children:"Falco"}),": Cloud Native Runtime Security"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/opencost/opencost",children:"Opencost"}),": Cost monitoring for Kubernetes"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/tektoncd/pipeline",children:"Tekton Pipeline"}),": K8s-style resources for declaring CI/CD pipelines"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/tektoncd/triggers",children:"Tekton Triggers"}),": Trigger pipelines from event payloads"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/tektoncd/dashboard",children:"Tekton dashboard"}),": Web-based UI for Tekton Pipelines and Tekton Triggers"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/paketo-buildpacks",children:"Paketo build packs"}),": Cloud Native Buildpack implementations for popular programming language ecosystems"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/cloudnative-pg/cloudnative-pg",children:"Cloudnative-pg"}),": Open source operator designed to manage PostgreSQL workloads"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/grafana/tempo",children:"Grafana Tempo"}),": High-scale distributed tracing backend"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/open-telemetry/opentelemetry-operator",children:"OpenTelemetry"}),": Instrument, generate, collect, and export telemetry data to help you analyze your software\u2019s performance and behavior"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/bitnami-labs/sealed-secrets",children:"Sealed Secrets"}),": Encrypt your Secret into a SealedSecret, which is safe to store - even inside a public repository."]}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"catagories",children:"Catagories"}),"\n",(0,i.jsx)(t.p,{children:"Otomi contains four catagories of integrated K8s applications:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Core applications: applications that are activated by default"}),"\n",(0,i.jsx)(t.li,{children:"Shared applications: applications that are shared between teams. Shared applications are user-, and role-aware or not (user is anonymous)"}),"\n",(0,i.jsx)(t.li,{children:"Team applications: applications with a dedicated instance per team"}),"\n",(0,i.jsx)(t.li,{children:"Optional applications: applications that are optional and can be activated by the platform admin"}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"The following table shows all integrated applications:"}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{style:{textAlign:"left"},children:"Application"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Core"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Shared"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Team"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"User/role-aware"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Optional"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"Istio"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"Ingress NGINX Controller"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"Knative"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:(0,i.jsx)(t.a,{href:"/docs/apps/keycloak",children:"KeyCloak"})}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"Prometheus Server"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"Prometheus kube state metrics"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"Alertmanager"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"Grafana/Loki"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:(0,i.jsx)(t.a,{href:"/docs/apps/gatekeeper",children:"Gatekeeper Operator"})}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:(0,i.jsx)(t.a,{href:"/docs/apps/vault",children:"Hashicorp Vault"})}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:(0,i.jsx)(t.a,{href:"/docs/apps/harbor",children:"Harbor"})}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:(0,i.jsx)(t.a,{href:"/docs/apps/drone",children:"Drone"})}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"Gitea"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"Httpbin"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"Jeager"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"Kiali"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"Velero"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"Minio"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"Opencost"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"Tekton Pipeline"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"Trivy Operator"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"Cloudnative-pg"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"X"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}})]})]})]}),"\n",(0,i.jsx)(t.h3,{id:"advanced-ingress-architecture-as-its-core",children:"Advanced ingress architecture as its core"}),"\n",(0,i.jsx)(t.p,{children:"Otomi by default installs and configures an advanced ingress architecture. Ingress for a service can be configured using Otomi Services. The following figure shows the ingress and SSO architecture."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"img/ingress-overview",src:n(2701).Z+"",width:"1149",height:"828"})}),"\n",(0,i.jsx)(t.p,{children:"The ingress & SSO architecture overview explained:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"(optional) an external gateway is used for termination of external traffic (e.g. an Azure Application Gateway or an AWS Application Load Balancer)."}),"\n",(0,i.jsx)(t.li,{children:"2 Ingress NGINX controllers are deployed, one for public access and one for authenticated access."}),"\n",(0,i.jsx)(t.li,{children:"Authenticated (SSO) access is handled by an oauth2 proxy and KeyCloak. The user logs in using the Otomi custom KeyCloak login page."}),"\n",(0,i.jsx)(t.li,{children:"KeyCloak is configured with an external IDP (optional) or uses local accounts. After authentication, KeyCloak provides a normalized JWT token. The JWT token is used by integrated core applications (providing user and role information) and team services configured with SSO"}),"\n",(0,i.jsx)(t.li,{children:"4 Istio (ingress) gateways are provisioned:"}),"\n"]}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsx)(t.li,{children:"a public gateway for routing public (non authenticated traffic to a service)"}),"\n",(0,i.jsx)(t.li,{children:"an authentication gateway to route authenticated traffic to a service"}),"\n",(0,i.jsx)(t.li,{children:"a local gateway (for local cluster routing)"}),"\n",(0,i.jsx)(t.li,{children:"a Knative gateway to route traffic to Knative services"}),"\n"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"For each service a Istio virtual service is configured."}),"\n",(0,i.jsx)(t.li,{children:"One egress gateway is provisioned for all egress traffic (network policies allow all egress traffic)."}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"otomi-tasks",children:"Otomi Tasks"}),"\n",(0,i.jsx)(t.p,{children:"Otomi Tasks contains a set of Kubernetes jobs and teh Otomi Operator. The jobs and Operator ensure that the configuration of applications integrated in Otomi are always equal to the desired-state configuration (see Otomi Values). An example: If a team is created via Otomi Console (in combination with Otomi API), Otomi Tasks ensures that a project is created for the new team in Harbor, the access to the project in Harbor is configured, a robot account (that can be used to push images to the project registry) is created and that a pull secret is created in the namespace of the team."}),"\n",(0,i.jsx)(t.p,{children:"Otomi Tasks is currently used to configure the following applications:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"KeyCloak"}),"\n",(0,i.jsx)(t.li,{children:"Harbor"}),"\n",(0,i.jsx)(t.li,{children:"Gitea"}),"\n",(0,i.jsx)(t.li,{children:"Drone"}),"\n",(0,i.jsx)(t.li,{children:"Otomi (copy-certs and wait-for)"}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"otomi-clients",children:"Otomi Clients"}),"\n",(0,i.jsx)(t.p,{children:"A factory to build and publish openapi clients used in the redkubes/otomi-tasks repo."}),"\n",(0,i.jsx)(t.p,{children:"Otomi Clients is currently used to generate openapi clients for the following applications:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"KeyCloak"}),"\n",(0,i.jsx)(t.li,{children:"Harbor"}),"\n",(0,i.jsx)(t.li,{children:"Gitea"}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"otomi-api",children:"Otomi API"}),"\n",(0,i.jsx)(t.p,{children:"Otomi API allows for a controlled change of all Otomi Values, based on a configuration scheme and is the brain of Otomi. Otomi API runs as a container on each cluster running."}),"\n",(0,i.jsx)(t.admonition,{type:"info",children:(0,i.jsxs)(t.p,{children:["Otomi API is not open source. When installing Otomi, a FREE Community Edition version is installed. Contact ",(0,i.jsx)(t.a,{href:"https://redkubes.com/",children:"Red Kubes"})," for details on support and pricing for a full featured version."]})}),"\n",(0,i.jsx)(t.h2,{id:"otomi-console",children:"Otomi Console"}),"\n",(0,i.jsx)(t.p,{children:"Otomi Console is the User Interface of Otomi. Otomi Console communicates with Otomi API for reading and changing Otomi Values configuration. Otomi Console also offers (via the Otomi Apps option) shortcuts to the UI of the various integrated applications."}),"\n",(0,i.jsx)(t.admonition,{type:"info",children:(0,i.jsxs)(t.p,{children:["Otomi Console is not open source. When installing Otomi, a FREE Community Edition version is installed. Contact ",(0,i.jsx)(t.a,{href:"https://redkubes.com/",children:"Red Kubes"})," for details on support and pricing for a full featured version."]})})]})}function h(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},2701:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/ingress-overview-419bc5e7be19dafdebd9a8ec6b04a3b1.svg"},1151:(e,t,n)=>{n.d(t,{Z:()=>c,a:()=>l});var i=n(7294);const s={},r=i.createContext(s);function l(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2d9c895d.0d2bf2ef.js b/assets/js/2d9c895d.0d2bf2ef.js new file mode 100644 index 000000000..c60c026d9 --- /dev/null +++ b/assets/js/2d9c895d.0d2bf2ef.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[5022],{9776:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var s=r(5893),n=r(1151);const o={slug:"overview",title:"Use cases overview",sidebar_label:"Overview"},i=void 0,a={id:"use-cases/overview",title:"Use cases overview",description:"Introduction",source:"@site/product/use-cases/overview.md",sourceDirName:"use-cases",slug:"/use-cases/overview",permalink:"/product/use-cases/overview",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/edit/main/product/use-cases/overview.md",tags:[],version:"current",lastUpdatedBy:"ElderMatt",lastUpdatedAt:1710142611,formattedLastUpdatedAt:"Mar 11, 2024",frontMatter:{slug:"overview",title:"Use cases overview",sidebar_label:"Overview"},sidebar:"mainSidebar",previous:{title:"FAQ",permalink:"/product/faq"},next:{title:"Adoption Framework",permalink:"/product/use-cases/adoption-framework"}},d={},c=[{value:"Introduction",id:"introduction",level:2},{value:"Adoption framework for Kubernetes",id:"adoption-framework-for-kubernetes",level:3},{value:"Multi-tenancy",id:"multi-tenancy",level:3},{value:"Serverless",id:"serverless",level:3},{value:"CD/CD",id:"cdcd",level:3}];function l(e){const t={a:"a",h2:"h2",h3:"h3",hr:"hr",p:"p",strong:"strong",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"introduction",children:"Introduction"}),"\n",(0,s.jsx)(t.p,{children:"Otomi adds developer- and operations-centric tools, automation and self-service on top of Kubernetes. It contains a complete suite of pre-configured tools and guardrails to run containerized applications securely on any Kubernetes cluster in any cloud. In this section we'll dive a little deeper into some of the use cases Otomi supports."}),"\n",(0,s.jsx)(t.hr,{}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Make sure everything is ready to get started"})}),"\n",(0,s.jsx)(t.h3,{id:"adoption-framework-for-kubernetes",children:(0,s.jsx)(t.a,{href:"/product/use-cases/adoption-framework",children:"Adoption framework for Kubernetes"})}),"\n",(0,s.jsx)(t.p,{children:"Use Otomi as an adoption framework to support migration to Kubernetes in an efficient and streamlined way."}),"\n",(0,s.jsx)(t.h3,{id:"multi-tenancy",children:(0,s.jsx)(t.a,{href:"/product/use-cases/multi-tenancy",children:"Multi-tenancy"})}),"\n",(0,s.jsx)(t.p,{children:"Share a Kubernetes cluster and all the integrated tools with multiple tenants."}),"\n",(0,s.jsx)(t.h3,{id:"serverless",children:(0,s.jsx)(t.a,{href:"/product/use-cases/serverless",children:"Serverless"})}),"\n",(0,s.jsx)(t.p,{children:"A landing zone for serverless applications."}),"\n",(0,s.jsx)(t.h3,{id:"cdcd",children:(0,s.jsx)(t.a,{href:"/product/use-cases/ci-cd",children:"CD/CD"})}),"\n",(0,s.jsx)(t.p,{children:"Setup CI and CD capabilities."}),"\n",(0,s.jsx)(t.hr,{})]})}function u(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},1151:(e,t,r)=>{r.d(t,{Z:()=>a,a:()=>i});var s=r(7294);const n={},o=s.createContext(n);function i(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2d9c895d.3dd2cca0.js b/assets/js/2d9c895d.3dd2cca0.js deleted file mode 100644 index 2e5ef1794..000000000 --- a/assets/js/2d9c895d.3dd2cca0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[5022],{9776:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var s=r(5893),n=r(1151);const o={slug:"overview",title:"Use cases overview",sidebar_label:"Overview"},i=void 0,a={id:"use-cases/overview",title:"Use cases overview",description:"Introduction",source:"@site/product/use-cases/overview.md",sourceDirName:"use-cases",slug:"/use-cases/overview",permalink:"/product/use-cases/overview",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/edit/main/product/use-cases/overview.md",tags:[],version:"current",lastUpdatedBy:"jeho",lastUpdatedAt:1709649459,formattedLastUpdatedAt:"Mar 5, 2024",frontMatter:{slug:"overview",title:"Use cases overview",sidebar_label:"Overview"},sidebar:"mainSidebar",previous:{title:"FAQ",permalink:"/product/faq"},next:{title:"Adoption Framework",permalink:"/product/use-cases/adoption-framework"}},d={},c=[{value:"Introduction",id:"introduction",level:2},{value:"Adoption framework for Kubernetes",id:"adoption-framework-for-kubernetes",level:3},{value:"Multi-tenancy",id:"multi-tenancy",level:3},{value:"Serverless",id:"serverless",level:3},{value:"CD/CD",id:"cdcd",level:3}];function l(e){const t={a:"a",h2:"h2",h3:"h3",hr:"hr",p:"p",strong:"strong",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"introduction",children:"Introduction"}),"\n",(0,s.jsx)(t.p,{children:"Otomi adds developer- and operations-centric tools, automation and self-service on top of Kubernetes. It contains a complete suite of pre-configured tools and guardrails to run containerized applications securely on any Kubernetes cluster in any cloud. In this section we'll dive a little deeper into some of the use cases Otomi supports."}),"\n",(0,s.jsx)(t.hr,{}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Make sure everything is ready to get started"})}),"\n",(0,s.jsx)(t.h3,{id:"adoption-framework-for-kubernetes",children:(0,s.jsx)(t.a,{href:"/product/use-cases/adoption-framework",children:"Adoption framework for Kubernetes"})}),"\n",(0,s.jsx)(t.p,{children:"Use Otomi as an adoption framework to support migration to Kubernetes in an efficient and streamlined way."}),"\n",(0,s.jsx)(t.h3,{id:"multi-tenancy",children:(0,s.jsx)(t.a,{href:"/product/use-cases/multi-tenancy",children:"Multi-tenancy"})}),"\n",(0,s.jsx)(t.p,{children:"Share a Kubernetes cluster and all the integrated tools with multiple tenants."}),"\n",(0,s.jsx)(t.h3,{id:"serverless",children:(0,s.jsx)(t.a,{href:"/product/use-cases/serverless",children:"Serverless"})}),"\n",(0,s.jsx)(t.p,{children:"A landing zone for serverless applications."}),"\n",(0,s.jsx)(t.h3,{id:"cdcd",children:(0,s.jsx)(t.a,{href:"/product/use-cases/ci-cd",children:"CD/CD"})}),"\n",(0,s.jsx)(t.p,{children:"Setup CI and CD capabilities."}),"\n",(0,s.jsx)(t.hr,{})]})}function u(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},1151:(e,t,r)=>{r.d(t,{Z:()=>a,a:()=>i});var s=r(7294);const n={},o=s.createContext(n);function i(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3d235714.02a2b236.js b/assets/js/3d235714.02a2b236.js new file mode 100644 index 000000000..49b6414e9 --- /dev/null +++ b/assets/js/3d235714.02a2b236.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[2117],{2510:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>u,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var i=t(5893),o=t(1151);const a={slug:"adoption-framework",title:"Otomi as adoption framework for Kubernetes",sidebar_label:"Adoption Framework"},r=void 0,s={id:"use-cases/adoption-framework",title:"Otomi as adoption framework for Kubernetes",description:"What is an adoption framework for Kubernetes?",source:"@site/product/use-cases/adoption-framework.md",sourceDirName:"use-cases",slug:"/use-cases/adoption-framework",permalink:"/product/use-cases/adoption-framework",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/edit/main/product/use-cases/adoption-framework.md",tags:[],version:"current",lastUpdatedBy:"ElderMatt",lastUpdatedAt:1710142611,formattedLastUpdatedAt:"Mar 11, 2024",frontMatter:{slug:"adoption-framework",title:"Otomi as adoption framework for Kubernetes",sidebar_label:"Adoption Framework"},sidebar:"mainSidebar",previous:{title:"Overview",permalink:"/product/use-cases/overview"},next:{title:"Multi-tenancy",permalink:"/product/use-cases/multi-tenancy"}},d={},l=[{value:"What is an adoption framework for Kubernetes?",id:"what-is-an-adoption-framework-for-kubernetes",level:2},{value:"Why use an adoption framework like Otomi for Kubernetes",id:"why-use-an-adoption-framework-like-otomi-for-kubernetes",level:2},{value:"What are the capabilities of an adoption framework for Kubernetes?",id:"what-are-the-capabilities-of-an-adoption-framework-for-kubernetes",level:2}];function c(e){const n={h2:"h2",img:"img",li:"li",ol:"ol",p:"p",...(0,o.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"what-is-an-adoption-framework-for-kubernetes",children:"What is an adoption framework for Kubernetes?"}),"\n",(0,i.jsx)(n.p,{children:"A Kubernetes adoption framework can be used to support migration to Kubernetes in an efficient and streamlined way. The benefit of a Kubernetes adoption framework is that a number of required capabilities and configurations are established initially, which determine how containerized applications are going to be deployed, secured and operated. A Kubernetes adoption framework provides all the required controls following best practices in the areas of security, compliance, observability, CD, networking and self-service. All based on Infrastructure as Code."}),"\n",(0,i.jsx)(n.p,{children:"A Kubernetes adoption framework is implemented differently for each organization. Each company has different requirements, has to meet different compliance requirements, and uses different cloud infrastructures. Creating a multi-/hybrid cloud Kubernetes landing zone requires a significant investment. Otomi can be used as a Kubernetes adoption framework to create a landing zone for containerized applications on any Kubernetes cluster in any cloud and can be tailored based on organization specific requirements."}),"\n",(0,i.jsx)(n.h2,{id:"why-use-an-adoption-framework-like-otomi-for-kubernetes",children:"Why use an adoption framework like Otomi for Kubernetes"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Compliant With Security Regulations\nGiven that established parameters apply, developers operate within well-defined boundaries. This means that companies do not risk of running containerized workloads that differ from their compliance policy. Similarly, the IT manager is less concerned about compliance as it is embedded in the foundation of the IT infrastructure."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Speed \u200b\u200bAnd Scalability\nAs mentioned above, a migration to Kubernetes can happen more quickly with the help of an adoption framework. Preparation time is significantly reduced. Creating a compliant landigzone for Kubernetes can take up to 12 months (or even more) of work (if you have the required knowledge onboard). This time can be cut down to days with the use of Otomi, resulting in considerable cost savings as well as a shorter time-to-market for new applications and more efficiently DevOps processes. Another key feature inherent in Otomi as an adoption framework is scalability, as it is easy to expand to new environments. It allows the development of standard profiles easily for new Kubernetes clusters in any cloud."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Security And Compliance\nThanks to guardrails, compliance is an integral part of Otomi, meaning developers and engineers can safely operate containerized workloads on Kubernetes and in observance of compliance regulations. What\u2019s more, organizations don\u2019t spend that much time implementing complex configurations with the risk of technical debt. This especially applies to the operational phase. But it doesn\u2019t stop with a one-off setting of the environment. It is also about keeping all environments up to date in an ongoing and consistent way."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"A Better Understanding Of Costs\nOrganizations quickly lose control of their engineering expenses because they don\u2019t have a clear overview of the technologies being used and their costs. Otomi reduces unexpected and unnecessary expenses."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Standardized For Multi-Tenancy\nIn a multi-tenant architecture, standardizing tenancy allows you to enforce policies to a group of users. It helps you set up different security profiles and provide access to shared tools with users having specific privileges."}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"what-are-the-capabilities-of-an-adoption-framework-for-kubernetes",children:"What are the capabilities of an adoption framework for Kubernetes?"}),"\n",(0,i.jsx)(n.p,{children:"The following picture shows all the required capabilities for a Kubernetes adoption framework, which are all incorporated into Otomi:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"capabilities",src:t(7089).Z+"",width:"1788",height:"2326"})})]})}function u(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},7089:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/capabilities-aad63fbe048136bfcc184af026171b32.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>r});var i=t(7294);const o={},a=i.createContext(o);function r(e){const n=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),i.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3d235714.7a59040f.js b/assets/js/3d235714.7a59040f.js deleted file mode 100644 index bcc31ee0e..000000000 --- a/assets/js/3d235714.7a59040f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[2117],{2510:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>u,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var i=t(5893),o=t(1151);const a={slug:"adoption-framework",title:"Otomi as adoption framework for Kubernetes",sidebar_label:"Adoption Framework"},r=void 0,s={id:"use-cases/adoption-framework",title:"Otomi as adoption framework for Kubernetes",description:"What is an adoption framework for Kubernetes?",source:"@site/product/use-cases/adoption-framework.md",sourceDirName:"use-cases",slug:"/use-cases/adoption-framework",permalink:"/product/use-cases/adoption-framework",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/edit/main/product/use-cases/adoption-framework.md",tags:[],version:"current",lastUpdatedBy:"jeho",lastUpdatedAt:1709649459,formattedLastUpdatedAt:"Mar 5, 2024",frontMatter:{slug:"adoption-framework",title:"Otomi as adoption framework for Kubernetes",sidebar_label:"Adoption Framework"},sidebar:"mainSidebar",previous:{title:"Overview",permalink:"/product/use-cases/overview"},next:{title:"Multi-tenancy",permalink:"/product/use-cases/multi-tenancy"}},d={},l=[{value:"What is an adoption framework for Kubernetes?",id:"what-is-an-adoption-framework-for-kubernetes",level:2},{value:"Why use an adoption framework like Otomi for Kubernetes",id:"why-use-an-adoption-framework-like-otomi-for-kubernetes",level:2},{value:"What are the capabilities of an adoption framework for Kubernetes?",id:"what-are-the-capabilities-of-an-adoption-framework-for-kubernetes",level:2}];function c(e){const n={h2:"h2",img:"img",li:"li",ol:"ol",p:"p",...(0,o.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"what-is-an-adoption-framework-for-kubernetes",children:"What is an adoption framework for Kubernetes?"}),"\n",(0,i.jsx)(n.p,{children:"A Kubernetes adoption framework can be used to support migration to Kubernetes in an efficient and streamlined way. The benefit of a Kubernetes adoption framework is that a number of required capabilities and configurations are established initially, which determine how containerized applications are going to be deployed, secured and operated. A Kubernetes adoption framework provides all the required controls following best practices in the areas of security, compliance, observability, CD, networking and self-service. All based on Infrastructure as Code."}),"\n",(0,i.jsx)(n.p,{children:"A Kubernetes adoption framework is implemented differently for each organization. Each company has different requirements, has to meet different compliance requirements, and uses different cloud infrastructures. Creating a multi-/hybrid cloud Kubernetes landing zone requires a significant investment. Otomi can be used as a Kubernetes adoption framework to create a landing zone for containerized applications on any Kubernetes cluster in any cloud and can be tailored based on organization specific requirements."}),"\n",(0,i.jsx)(n.h2,{id:"why-use-an-adoption-framework-like-otomi-for-kubernetes",children:"Why use an adoption framework like Otomi for Kubernetes"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Compliant With Security Regulations\nGiven that established parameters apply, developers operate within well-defined boundaries. This means that companies do not risk of running containerized workloads that differ from their compliance policy. Similarly, the IT manager is less concerned about compliance as it is embedded in the foundation of the IT infrastructure."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Speed \u200b\u200bAnd Scalability\nAs mentioned above, a migration to Kubernetes can happen more quickly with the help of an adoption framework. Preparation time is significantly reduced. Creating a compliant landigzone for Kubernetes can take up to 12 months (or even more) of work (if you have the required knowledge onboard). This time can be cut down to days with the use of Otomi, resulting in considerable cost savings as well as a shorter time-to-market for new applications and more efficiently DevOps processes. Another key feature inherent in Otomi as an adoption framework is scalability, as it is easy to expand to new environments. It allows the development of standard profiles easily for new Kubernetes clusters in any cloud."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Security And Compliance\nThanks to guardrails, compliance is an integral part of Otomi, meaning developers and engineers can safely operate containerized workloads on Kubernetes and in observance of compliance regulations. What\u2019s more, organizations don\u2019t spend that much time implementing complex configurations with the risk of technical debt. This especially applies to the operational phase. But it doesn\u2019t stop with a one-off setting of the environment. It is also about keeping all environments up to date in an ongoing and consistent way."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"A Better Understanding Of Costs\nOrganizations quickly lose control of their engineering expenses because they don\u2019t have a clear overview of the technologies being used and their costs. Otomi reduces unexpected and unnecessary expenses."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Standardized For Multi-Tenancy\nIn a multi-tenant architecture, standardizing tenancy allows you to enforce policies to a group of users. It helps you set up different security profiles and provide access to shared tools with users having specific privileges."}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"what-are-the-capabilities-of-an-adoption-framework-for-kubernetes",children:"What are the capabilities of an adoption framework for Kubernetes?"}),"\n",(0,i.jsx)(n.p,{children:"The following picture shows all the required capabilities for a Kubernetes adoption framework, which are all incorporated into Otomi:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"capabilities",src:t(7089).Z+"",width:"1788",height:"2326"})})]})}function u(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},7089:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/capabilities-aad63fbe048136bfcc184af026171b32.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>r});var i=t(7294);const o={},a=i.createContext(o);function r(e){const n=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),i.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4f01d7c7.48a1d76c.js b/assets/js/4f01d7c7.48a1d76c.js new file mode 100644 index 000000000..6399c75b2 --- /dev/null +++ b/assets/js/4f01d7c7.48a1d76c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[7015],{9855:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>c,frontMatter:()=>a,metadata:()=>r,toc:()=>d});var o=n(5893),i=n(1151);const a={slug:"introduction",title:"Why Otomi",sidebar_label:"Why Otomi"},s=void 0,r={id:"introduction",title:"Why Otomi",description:"The vision",source:"@site/product/introduction.md",sourceDirName:".",slug:"/introduction",permalink:"/product/introduction",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/edit/main/product/introduction.md",tags:[],version:"current",lastUpdatedBy:"ElderMatt",lastUpdatedAt:1710142611,formattedLastUpdatedAt:"Mar 11, 2024",frontMatter:{slug:"introduction",title:"Why Otomi",sidebar_label:"Why Otomi"},sidebar:"mainSidebar",next:{title:"Otomi Projects",permalink:"/product/architecture"}},l={},d=[{value:"The vision",id:"the-vision",level:2},{value:"What is Otomi?",id:"what-is-otomi",level:2},{value:"What is the difference between an IDP and a PaaS?",id:"what-is-the-difference-between-an-idp-and-a-paas",level:3},{value:"When to build an IDP or use a PaaS?",id:"when-to-build-an-idp-or-use-a-paas",level:3},{value:"Otomi for developers",id:"otomi-for-developers",level:2},{value:"Removing the complexity",id:"removing-the-complexity",level:3},{value:"All the tools you need",id:"all-the-tools-you-need",level:3},{value:"Best practices",id:"best-practices",level:3},{value:"Self-Serving",id:"self-serving",level:3},{value:"Otomi for Platform Teams",id:"otomi-for-platform-teams",level:2},{value:"Avoid Cloud Lock-In",id:"avoid-cloud-lock-in",level:3},{value:"Make Developers Self Serving",id:"make-developers-self-serving",level:3},{value:"Lower The Operational Burden",id:"lower-the-operational-burden",level:3},{value:"Prevent Kubernetes Cluster Sprawl",id:"prevent-kubernetes-cluster-sprawl",level:3}];function u(e){const t={a:"a",h2:"h2",h3:"h3",p:"p",...(0,i.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h2,{id:"the-vision",children:"The vision"}),"\n",(0,o.jsx)(t.p,{children:"Kubernetes has been called The Operating System of the Cloud. In our opinion, Kubernetes is only the Kernel of the Operating System of the Cloud. The Operating System (or Kubernetes-based Platform) is something you'll need to build yourself. And this is what organizations are now doing when using Kubernetes. All reinventing the wheel."}),"\n",(0,o.jsx)(t.p,{children:"Building a Kubernetes-based platform requires a huge investment and requires skilled engineers. But why would you invest in building and maintaining a custom platform? Why can't you just install everyting you need to turn Kubernetes into a full platform, just like you can download a Linux distribution?"}),"\n",(0,o.jsx)(t.p,{children:"This is what we indended when we created Otomi. Any infrastructure, any K8s, one install, all the tools you need in an integrated and automated way, easy self-service and everything as code."}),"\n",(0,o.jsx)(t.h2,{id:"what-is-otomi",children:"What is Otomi?"}),"\n",(0,o.jsxs)(t.p,{children:["Otomi is a self-hosted PaaS and adds developer- and operations-centric tools, automation and self-service on top of Kubernetes offering a multi and hybrid platform experience out-of-the-box. Otomi is placed in the CNCF landscape under the ",(0,o.jsx)(t.a,{href:"https://landscape.cncf.io/guide#platform--paas-container-service",children:"PaaS/Container Service"})," section. Otomi attempts to connect many of the technologies found in the CNCF landscape in a way to provide direct value. No more re-inventing the wheel when building and maintaining your own Kubernetes based platform or bespoke stack."]}),"\n",(0,o.jsx)(t.h3,{id:"what-is-the-difference-between-an-idp-and-a-paas",children:"What is the difference between an IDP and a PaaS?"}),"\n",(0,o.jsx)(t.p,{children:"An Internal Developer Platform (IDP) consists of many different technologies, glued together to lowers cognitive load on developers without abstracting away context and underlying technologies. An IDP is always custom built."}),"\n",(0,o.jsx)(t.p,{children:"A PaaS for Kubernetes also lowers cognitive load on developers, but abstracts away most of the underlying technologies. Unlike an IDP, a PaaS can be used almost instantly, just like downloading and using your favourite Linux Distribution. Organizations that use a PaaS instead of building an IDP can enjoy lower upfront costs and huge time savings."}),"\n",(0,o.jsx)(t.h3,{id:"when-to-build-an-idp-or-use-a-paas",children:"When to build an IDP or use a PaaS?"}),"\n",(0,o.jsx)(t.p,{children:"Because building an IDP requires a large upfront investment, it\u2019s mostly suitable for large enterprises. For smaller organizations a PaaS can sometimes be far more efficient than building a custom IDP in-house."}),"\n",(0,o.jsx)(t.h2,{id:"otomi-for-developers",children:"Otomi for developers"}),"\n",(0,o.jsx)(t.p,{children:"Otomi let's developers focus on their application, not on writing Kubernetes manifests! Kubernetes is great for running containers, but it's complex. Wouldn't it be awesome if you didn't need to worry about understanding Kubernetes objects and writing YAML manifests?"}),"\n",(0,o.jsx)(t.p,{children:"This is how Otomi helps developers:"}),"\n",(0,o.jsx)(t.h3,{id:"removing-the-complexity",children:"Removing the complexity"}),"\n",(0,o.jsx)(t.p,{children:"As a Developer, you want to focus on your code and don\u2019t be bothered with Kubernetes internals. With Otomi, you can deploy your apps on Kubernetes without needing to understand or learn Kubernetes. Just build your image, push it to a registry in Otomi and use the Web Console to deploy your app in just a couple of minutes. Otomi makes Kubernetes easy!"}),"\n",(0,o.jsx)(t.h3,{id:"all-the-tools-you-need",children:"All the tools you need"}),"\n",(0,o.jsx)(t.p,{children:"Otomi provides developers with all the tools they need. After deploying your app you can directly see all the container logs, metrics, status, policy violations and vulnerabilities. Next to access to al kinds of dashboards, you will also get access to Harbor, Tekton and Argo CD."}),"\n",(0,o.jsx)(t.h3,{id:"best-practices",children:"Best practices"}),"\n",(0,o.jsx)(t.p,{children:"Otomi offers you the ability to immediately start deploying applications on Kubernetes and configure public exposure. This will give you a jump start to get apps running on Kubernetes. But in time you will probably learn more about Kubernetes and start trying out things yourself. Otomi does not force you to use the Web Console. You can just as easily download the KubeConfig for your team and create and deploy manifests yourself. But Otomi will always force you to adhere to the configured safeguards and best practices."}),"\n",(0,o.jsx)(t.h3,{id:"self-serving",children:"Self-Serving"}),"\n",(0,o.jsx)(t.p,{children:"As a developer, you don\u2019t like to go to the Ops team asking for help. Otomi provides full developer self-service. Developers can spin up new virtual environments, download pull secrets, create Kubernetes secrets, build images from source code, deploy workloads and configure public exposure. And all of these features are accessible through just one Web Console. Now you can deliver code completely autonomously."}),"\n",(0,o.jsx)(t.h2,{id:"otomi-for-platform-teams",children:"Otomi for Platform Teams"}),"\n",(0,o.jsx)(t.p,{children:"If you can\u2019t scale beyond a handful of teams you're going to lose speed. Speed is everything to bring new products and applications to market. No one wants to slow down developers. Empower developers, ensure quality, compliance, and governance, avoid lock-in, and lower the operational burden. These are some of the challenges platform teams have to deal with and where Otomi can help out."}),"\n",(0,o.jsx)(t.h3,{id:"avoid-cloud-lock-in",children:"Avoid Cloud Lock-In"}),"\n",(0,o.jsx)(t.p,{children:"Are you worried that you can\u2019t adopt cloud-native technology without becoming completely reliant on one cloud provider? One way that organizations outsource management for Kubernetes is to use one of the cloud provider\u2019s Kubernetes versions in conjunction with a variety of cloud provider native services. This is often faster than using vanilla Kubernetes and managing integrations and infrastructure in-house, but it also completely locks the organization into the cloud provider and often becomes very expensive."}),"\n",(0,o.jsx)(t.p,{children:"This approach also takes away the flexibility to change cloud providers in the future while increasing the financial risks. With Otomi, you don\u2019t have to lock yourself into any cloud provider or risk rapidly increasing cloud service bills in order to get the fastest possible platform to deploy containerized applications."}),"\n",(0,o.jsx)(t.h3,{id:"make-developers-self-serving",children:"Make Developers Self Serving"}),"\n",(0,o.jsx)(t.p,{children:"Free developers from worrying about the underlying platform setup while still enforcing standards and best practices so they can focus on delivering code. With Otomi, developers can be fully self-serving. They can spin up new namespaces, get access to all the tools they need, build images from source code, create secrets, deploy workloads, configure public exposure, add service monitors, and much more. And all of these features are accessible through just one web UI."}),"\n",(0,o.jsx)(t.p,{children:"Platform administrators have access to all the platform applications. Team administrators can create team spaces for development teams and team members can create multiple namespaces within their team space(s)."}),"\n",(0,o.jsx)(t.h3,{id:"lower-the-operational-burden",children:"Lower The Operational Burden"}),"\n",(0,o.jsx)(t.p,{children:"Choosing the DIY platform engineering approach can be time-consuming and complex. On average, Platform teams need at least 6 months to build an initial setup. And the ongoing maintenance and hardening afterwards can become an operational nightmare. Otomi helps Platform teams to lower the operational burden by taking over the application management of everything running on top of Kubernetes, including the lifecycle management of all the integrated K8s applications."}),"\n",(0,o.jsx)(t.p,{children:"This enables platform teams to focus on another very important aspect: Kubernetes cluster infrastructure management and cloud security. Now you have time to focus on other important aspects instead of building a custom (internal) developer platform solution."}),"\n",(0,o.jsx)(t.h3,{id:"prevent-kubernetes-cluster-sprawl",children:"Prevent Kubernetes Cluster Sprawl"}),"\n",(0,o.jsx)(t.p,{children:"As companies look to further harness the power of cloud-native, they are adopting container technologies at rapid speed, increasing the number of clusters and workloads. As the number of Kubernetes clusters grows, this is creating increased work for Platform teams. When it comes to patching security vulnerabilities or upgrading clusters, teams are doing five times the amount of work."}),"\n",(0,o.jsx)(t.p,{children:"With Otomi you can support (soft) multi-tenancy, allowing multiple development teams to work independently of each other on the same cluster, while sharing all the tools. Now you only have to deploy a single dev or staging cluster to support multiple development teams. This prevents you from Kubernetes cluster sprawl."})]})}function c(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>r,a:()=>s});var o=n(7294);const i={},a=o.createContext(i);function s(e){const t=o.useContext(a);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),o.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4f01d7c7.d2efe7fd.js b/assets/js/4f01d7c7.d2efe7fd.js deleted file mode 100644 index bb464993d..000000000 --- a/assets/js/4f01d7c7.d2efe7fd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[7015],{9855:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>c,frontMatter:()=>a,metadata:()=>r,toc:()=>d});var o=n(5893),i=n(1151);const a={slug:"introduction",title:"Why Otomi",sidebar_label:"Why Otomi"},s=void 0,r={id:"introduction",title:"Why Otomi",description:"The vision",source:"@site/product/introduction.md",sourceDirName:".",slug:"/introduction",permalink:"/product/introduction",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/edit/main/product/introduction.md",tags:[],version:"current",lastUpdatedBy:"jeho",lastUpdatedAt:1709649459,formattedLastUpdatedAt:"Mar 5, 2024",frontMatter:{slug:"introduction",title:"Why Otomi",sidebar_label:"Why Otomi"},sidebar:"mainSidebar",next:{title:"Otomi Projects",permalink:"/product/architecture"}},l={},d=[{value:"The vision",id:"the-vision",level:2},{value:"What is Otomi?",id:"what-is-otomi",level:2},{value:"What is the difference between an IDP and a PaaS?",id:"what-is-the-difference-between-an-idp-and-a-paas",level:3},{value:"When to build an IDP or use a PaaS?",id:"when-to-build-an-idp-or-use-a-paas",level:3},{value:"Otomi for developers",id:"otomi-for-developers",level:2},{value:"Removing the complexity",id:"removing-the-complexity",level:3},{value:"All the tools you need",id:"all-the-tools-you-need",level:3},{value:"Best practices",id:"best-practices",level:3},{value:"Self-Serving",id:"self-serving",level:3},{value:"Otomi for Platform Teams",id:"otomi-for-platform-teams",level:2},{value:"Avoid Cloud Lock-In",id:"avoid-cloud-lock-in",level:3},{value:"Make Developers Self Serving",id:"make-developers-self-serving",level:3},{value:"Lower The Operational Burden",id:"lower-the-operational-burden",level:3},{value:"Prevent Kubernetes Cluster Sprawl",id:"prevent-kubernetes-cluster-sprawl",level:3}];function u(e){const t={a:"a",h2:"h2",h3:"h3",p:"p",...(0,i.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h2,{id:"the-vision",children:"The vision"}),"\n",(0,o.jsx)(t.p,{children:"Kubernetes has been called The Operating System of the Cloud. In our opinion, Kubernetes is only the Kernel of the Operating System of the Cloud. The Operating System (or Kubernetes-based Platform) is something you'll need to build yourself. And this is what organizations are now doing when using Kubernetes. All reinventing the wheel."}),"\n",(0,o.jsx)(t.p,{children:"Building a Kubernetes-based platform requires a huge investment and requires skilled engineers. But why would you invest in building and maintaining a custom platform? Why can't you just install everyting you need to turn Kubernetes into a full platform, just like you can download a Linux distribution?"}),"\n",(0,o.jsx)(t.p,{children:"This is what we indended when we created Otomi. Any infrastructure, any K8s, one install, all the tools you need in an integrated and automated way, easy self-service and everything as code."}),"\n",(0,o.jsx)(t.h2,{id:"what-is-otomi",children:"What is Otomi?"}),"\n",(0,o.jsxs)(t.p,{children:["Otomi is a self-hosted PaaS and adds developer- and operations-centric tools, automation and self-service on top of Kubernetes offering a multi and hybrid platform experience out-of-the-box. Otomi is placed in the CNCF landscape under the ",(0,o.jsx)(t.a,{href:"https://landscape.cncf.io/guide#platform--paas-container-service",children:"PaaS/Container Service"})," section. Otomi attempts to connect many of the technologies found in the CNCF landscape in a way to provide direct value. No more re-inventing the wheel when building and maintaining your own Kubernetes based platform or bespoke stack."]}),"\n",(0,o.jsx)(t.h3,{id:"what-is-the-difference-between-an-idp-and-a-paas",children:"What is the difference between an IDP and a PaaS?"}),"\n",(0,o.jsx)(t.p,{children:"An Internal Developer Platform (IDP) consists of many different technologies, glued together to lowers cognitive load on developers without abstracting away context and underlying technologies. An IDP is always custom built."}),"\n",(0,o.jsx)(t.p,{children:"A PaaS for Kubernetes also lowers cognitive load on developers, but abstracts away most of the underlying technologies. Unlike an IDP, a PaaS can be used almost instantly, just like downloading and using your favourite Linux Distribution. Organizations that use a PaaS instead of building an IDP can enjoy lower upfront costs and huge time savings."}),"\n",(0,o.jsx)(t.h3,{id:"when-to-build-an-idp-or-use-a-paas",children:"When to build an IDP or use a PaaS?"}),"\n",(0,o.jsx)(t.p,{children:"Because building an IDP requires a large upfront investment, it\u2019s mostly suitable for large enterprises. For smaller organizations a PaaS can sometimes be far more efficient than building a custom IDP in-house."}),"\n",(0,o.jsx)(t.h2,{id:"otomi-for-developers",children:"Otomi for developers"}),"\n",(0,o.jsx)(t.p,{children:"Otomi let's developers focus on their application, not on writing Kubernetes manifests! Kubernetes is great for running containers, but it's complex. Wouldn't it be awesome if you didn't need to worry about understanding Kubernetes objects and writing YAML manifests?"}),"\n",(0,o.jsx)(t.p,{children:"This is how Otomi helps developers:"}),"\n",(0,o.jsx)(t.h3,{id:"removing-the-complexity",children:"Removing the complexity"}),"\n",(0,o.jsx)(t.p,{children:"As a Developer, you want to focus on your code and don\u2019t be bothered with Kubernetes internals. With Otomi, you can deploy your apps on Kubernetes without needing to understand or learn Kubernetes. Just build your image, push it to a registry in Otomi and use the Web Console to deploy your app in just a couple of minutes. Otomi makes Kubernetes easy!"}),"\n",(0,o.jsx)(t.h3,{id:"all-the-tools-you-need",children:"All the tools you need"}),"\n",(0,o.jsx)(t.p,{children:"Otomi provides developers with all the tools they need. After deploying your app you can directly see all the container logs, metrics, status, policy violations and vulnerabilities. Next to access to al kinds of dashboards, you will also get access to Harbor, Tekton and Argo CD."}),"\n",(0,o.jsx)(t.h3,{id:"best-practices",children:"Best practices"}),"\n",(0,o.jsx)(t.p,{children:"Otomi offers you the ability to immediately start deploying applications on Kubernetes and configure public exposure. This will give you a jump start to get apps running on Kubernetes. But in time you will probably learn more about Kubernetes and start trying out things yourself. Otomi does not force you to use the Web Console. You can just as easily download the KubeConfig for your team and create and deploy manifests yourself. But Otomi will always force you to adhere to the configured safeguards and best practices."}),"\n",(0,o.jsx)(t.h3,{id:"self-serving",children:"Self-Serving"}),"\n",(0,o.jsx)(t.p,{children:"As a developer, you don\u2019t like to go to the Ops team asking for help. Otomi provides full developer self-service. Developers can spin up new virtual environments, download pull secrets, create Kubernetes secrets, build images from source code, deploy workloads and configure public exposure. And all of these features are accessible through just one Web Console. Now you can deliver code completely autonomously."}),"\n",(0,o.jsx)(t.h2,{id:"otomi-for-platform-teams",children:"Otomi for Platform Teams"}),"\n",(0,o.jsx)(t.p,{children:"If you can\u2019t scale beyond a handful of teams you're going to lose speed. Speed is everything to bring new products and applications to market. No one wants to slow down developers. Empower developers, ensure quality, compliance, and governance, avoid lock-in, and lower the operational burden. These are some of the challenges platform teams have to deal with and where Otomi can help out."}),"\n",(0,o.jsx)(t.h3,{id:"avoid-cloud-lock-in",children:"Avoid Cloud Lock-In"}),"\n",(0,o.jsx)(t.p,{children:"Are you worried that you can\u2019t adopt cloud-native technology without becoming completely reliant on one cloud provider? One way that organizations outsource management for Kubernetes is to use one of the cloud provider\u2019s Kubernetes versions in conjunction with a variety of cloud provider native services. This is often faster than using vanilla Kubernetes and managing integrations and infrastructure in-house, but it also completely locks the organization into the cloud provider and often becomes very expensive."}),"\n",(0,o.jsx)(t.p,{children:"This approach also takes away the flexibility to change cloud providers in the future while increasing the financial risks. With Otomi, you don\u2019t have to lock yourself into any cloud provider or risk rapidly increasing cloud service bills in order to get the fastest possible platform to deploy containerized applications."}),"\n",(0,o.jsx)(t.h3,{id:"make-developers-self-serving",children:"Make Developers Self Serving"}),"\n",(0,o.jsx)(t.p,{children:"Free developers from worrying about the underlying platform setup while still enforcing standards and best practices so they can focus on delivering code. With Otomi, developers can be fully self-serving. They can spin up new namespaces, get access to all the tools they need, build images from source code, create secrets, deploy workloads, configure public exposure, add service monitors, and much more. And all of these features are accessible through just one web UI."}),"\n",(0,o.jsx)(t.p,{children:"Platform administrators have access to all the platform applications. Team administrators can create team spaces for development teams and team members can create multiple namespaces within their team space(s)."}),"\n",(0,o.jsx)(t.h3,{id:"lower-the-operational-burden",children:"Lower The Operational Burden"}),"\n",(0,o.jsx)(t.p,{children:"Choosing the DIY platform engineering approach can be time-consuming and complex. On average, Platform teams need at least 6 months to build an initial setup. And the ongoing maintenance and hardening afterwards can become an operational nightmare. Otomi helps Platform teams to lower the operational burden by taking over the application management of everything running on top of Kubernetes, including the lifecycle management of all the integrated K8s applications."}),"\n",(0,o.jsx)(t.p,{children:"This enables platform teams to focus on another very important aspect: Kubernetes cluster infrastructure management and cloud security. Now you have time to focus on other important aspects instead of building a custom (internal) developer platform solution."}),"\n",(0,o.jsx)(t.h3,{id:"prevent-kubernetes-cluster-sprawl",children:"Prevent Kubernetes Cluster Sprawl"}),"\n",(0,o.jsx)(t.p,{children:"As companies look to further harness the power of cloud-native, they are adopting container technologies at rapid speed, increasing the number of clusters and workloads. As the number of Kubernetes clusters grows, this is creating increased work for Platform teams. When it comes to patching security vulnerabilities or upgrading clusters, teams are doing five times the amount of work."}),"\n",(0,o.jsx)(t.p,{children:"With Otomi you can support (soft) multi-tenancy, allowing multiple development teams to work independently of each other on the same cluster, while sharing all the tools. Now you only have to deploy a single dev or staging cluster to support multiple development teams. This prevents you from Kubernetes cluster sprawl."})]})}function c(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>r,a:()=>s});var o=n(7294);const i={},a=o.createContext(i);function s(e){const t=o.useContext(a);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),o.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5db37859.659feafa.js b/assets/js/5db37859.659feafa.js deleted file mode 100644 index 8ff5e8c96..000000000 --- a/assets/js/5db37859.659feafa.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[344],{1577:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>r,toc:()=>d});var n=o(5893),i=o(1151);const s={title:"Contribution Expectations",slug:"expectations",sidebar_label:"Expectations"},a=void 0,r={id:"expectations",title:"Contribution Expectations",description:"Otomi is a community project.",source:"@site/community/expectations.md",sourceDirName:".",slug:"/expectations",permalink:"/community/expectations",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/edit/main/community/expectations.md",tags:[],version:"current",lastUpdatedBy:"jeho",lastUpdatedAt:1709649459,formattedLastUpdatedAt:"Mar 5, 2024",frontMatter:{title:"Contribution Expectations",slug:"expectations",sidebar_label:"Expectations"},sidebar:"mainSidebar",previous:{title:"Code of Conduct",permalink:"/community/code-of-conduct"}},c={},d=[{value:"Code review",id:"code-review",level:2},{value:"Expectations of reviewers",id:"expectations-of-reviewers",level:2},{value:"Review comments",id:"review-comments",level:3},{value:"Review latency",id:"review-latency",level:3},{value:"Thank you",id:"thank-you",level:2}];function l(e){const t={a:"a",em:"em",h2:"h2",h3:"h3",p:"p",...(0,i.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:"Otomi is a community project.\nConsequently, it is wholly dependent on its community to provide a productive, friendly and collaborative environment."}),"\n",(0,n.jsx)(t.p,{children:"The first and foremost goal of the Otomi community is to develop a stack of configurable k8s applications that work in tandem, in order to give k8s users control over their distributed applications."}),"\n",(0,n.jsx)(t.p,{children:"We therefore describe the expectations for members of the Otomi community.\nThis document is intended to be a living one that evolves as the community evolves via the same PR and code review process that shapes the rest of the project.\nIt currently covers the expectations of conduct that govern all members of the community as well as the expectations around code review that govern all active contributors to Otomi."}),"\n",(0,n.jsx)(t.h2,{id:"code-review",children:"Code review"}),"\n",(0,n.jsx)(t.p,{children:"As a community we believe in the value of code review for all contributions.\nCode review increases both the quality and readability of our codebase, which\nin turn produces high quality software."}),"\n",(0,n.jsx)(t.p,{children:"Consequently, as a community we expect that all active participants in the community will also be active reviewers."}),"\n",(0,n.jsx)(t.h2,{id:"expectations-of-reviewers",children:"Expectations of reviewers"}),"\n",(0,n.jsx)(t.h3,{id:"review-comments",children:"Review comments"}),"\n",(0,n.jsxs)(t.p,{children:["Because reviewers are often the first points of contact between new members of the community and can significantly impact the first impression of the Otomi community, reviewers are especially important in shaping the Otomi community. Reviewers are highly encouraged to not only abide by the ",(0,n.jsx)(t.a,{href:"/community/code-of-conduct",children:"code of conduct"})," but are strongly encouraged to go above and beyond the code of conduct to promote a collaborative, respectful Otomi community."]}),"\n",(0,n.jsx)(t.h3,{id:"review-latency",children:"Review latency"}),"\n",(0,n.jsxs)(t.p,{children:["Reviewers are expected to respond in a timely fashion to PRs that are assigned to them. Reviewers are expected to respond to an ",(0,n.jsx)(t.em,{children:"active"})," PRs with reasonable latency, and if reviewers fail to respond, those PRs may be assigned to other reviewers."]}),"\n",(0,n.jsx)(t.h2,{id:"thank-you",children:"Thank you"}),"\n",(0,n.jsx)(t.p,{children:"We want to thank everyone who contributes their time and effort to making Otomi both a successful endeavour as well as a successful community. The strength of our software lies in the combined strengths of each individual community member. Thanks!"})]})}function u(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},1151:(e,t,o)=>{o.d(t,{Z:()=>r,a:()=>a});var n=o(7294);const i={},s=n.createContext(i);function a(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5db37859.97db1139.js b/assets/js/5db37859.97db1139.js new file mode 100644 index 000000000..738cd3eab --- /dev/null +++ b/assets/js/5db37859.97db1139.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[344],{1577:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>r,toc:()=>d});var n=o(5893),i=o(1151);const s={title:"Contribution Expectations",slug:"expectations",sidebar_label:"Expectations"},a=void 0,r={id:"expectations",title:"Contribution Expectations",description:"Otomi is a community project.",source:"@site/community/expectations.md",sourceDirName:".",slug:"/expectations",permalink:"/community/expectations",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/edit/main/community/expectations.md",tags:[],version:"current",lastUpdatedBy:"ElderMatt",lastUpdatedAt:1710142611,formattedLastUpdatedAt:"Mar 11, 2024",frontMatter:{title:"Contribution Expectations",slug:"expectations",sidebar_label:"Expectations"},sidebar:"mainSidebar",previous:{title:"Code of Conduct",permalink:"/community/code-of-conduct"}},c={},d=[{value:"Code review",id:"code-review",level:2},{value:"Expectations of reviewers",id:"expectations-of-reviewers",level:2},{value:"Review comments",id:"review-comments",level:3},{value:"Review latency",id:"review-latency",level:3},{value:"Thank you",id:"thank-you",level:2}];function l(e){const t={a:"a",em:"em",h2:"h2",h3:"h3",p:"p",...(0,i.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:"Otomi is a community project.\nConsequently, it is wholly dependent on its community to provide a productive, friendly and collaborative environment."}),"\n",(0,n.jsx)(t.p,{children:"The first and foremost goal of the Otomi community is to develop a stack of configurable k8s applications that work in tandem, in order to give k8s users control over their distributed applications."}),"\n",(0,n.jsx)(t.p,{children:"We therefore describe the expectations for members of the Otomi community.\nThis document is intended to be a living one that evolves as the community evolves via the same PR and code review process that shapes the rest of the project.\nIt currently covers the expectations of conduct that govern all members of the community as well as the expectations around code review that govern all active contributors to Otomi."}),"\n",(0,n.jsx)(t.h2,{id:"code-review",children:"Code review"}),"\n",(0,n.jsx)(t.p,{children:"As a community we believe in the value of code review for all contributions.\nCode review increases both the quality and readability of our codebase, which\nin turn produces high quality software."}),"\n",(0,n.jsx)(t.p,{children:"Consequently, as a community we expect that all active participants in the community will also be active reviewers."}),"\n",(0,n.jsx)(t.h2,{id:"expectations-of-reviewers",children:"Expectations of reviewers"}),"\n",(0,n.jsx)(t.h3,{id:"review-comments",children:"Review comments"}),"\n",(0,n.jsxs)(t.p,{children:["Because reviewers are often the first points of contact between new members of the community and can significantly impact the first impression of the Otomi community, reviewers are especially important in shaping the Otomi community. Reviewers are highly encouraged to not only abide by the ",(0,n.jsx)(t.a,{href:"/community/code-of-conduct",children:"code of conduct"})," but are strongly encouraged to go above and beyond the code of conduct to promote a collaborative, respectful Otomi community."]}),"\n",(0,n.jsx)(t.h3,{id:"review-latency",children:"Review latency"}),"\n",(0,n.jsxs)(t.p,{children:["Reviewers are expected to respond in a timely fashion to PRs that are assigned to them. Reviewers are expected to respond to an ",(0,n.jsx)(t.em,{children:"active"})," PRs with reasonable latency, and if reviewers fail to respond, those PRs may be assigned to other reviewers."]}),"\n",(0,n.jsx)(t.h2,{id:"thank-you",children:"Thank you"}),"\n",(0,n.jsx)(t.p,{children:"We want to thank everyone who contributes their time and effort to making Otomi both a successful endeavour as well as a successful community. The strength of our software lies in the combined strengths of each individual community member. Thanks!"})]})}function u(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},1151:(e,t,o)=>{o.d(t,{Z:()=>r,a:()=>a});var n=o(7294);const i={},s=n.createContext(i);function a(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/70b0dc77.6934e474.js b/assets/js/70b0dc77.6934e474.js new file mode 100644 index 000000000..7f2d2bd59 --- /dev/null +++ b/assets/js/70b0dc77.6934e474.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[2515],{9677:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>c,frontMatter:()=>o,metadata:()=>a,toc:()=>d});var n=s(5893),i=s(1151);const o={slug:"edge",title:"Otomi at the edge",sidebar_label:"Edge"},r=void 0,a={id:"use-cases/edge",title:"Otomi at the edge",description:"Introduction",source:"@site/product/use-cases/edge.md",sourceDirName:"use-cases",slug:"/use-cases/edge",permalink:"/product/use-cases/edge",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/edit/main/product/use-cases/edge.md",tags:[],version:"current",lastUpdatedBy:"ElderMatt",lastUpdatedAt:1710142611,formattedLastUpdatedAt:"Mar 11, 2024",frontMatter:{slug:"edge",title:"Otomi at the edge",sidebar_label:"Edge"}},l={},d=[{value:"Introduction",id:"introduction",level:2},{value:"How Otomi supports edge computing using Kubernetes",id:"how-otomi-supports-edge-computing-using-kubernetes",level:2}];function u(e){const t={a:"a",h2:"h2",img:"img",li:"li",p:"p",ul:"ul",...(0,i.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h2,{id:"introduction",children:"Introduction"}),"\n",(0,n.jsx)(t.p,{children:"Edge computing is an approach where you run applications as close as possible to its data sources or end users. One of the benefits is improved response times."}),"\n",(0,n.jsx)(t.p,{children:"However, managing edge applications using Kubernetes comes with challenges, like:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Deploy and update applications consistently accross multiple clusters"}),"\n",(0,n.jsx)(t.li,{children:"Manage the run-time specifications for the applications like ingress, certificates, DNS, network policies, etc."}),"\n",(0,n.jsx)(t.li,{children:"Lifecycle management of all supporting tools"}),"\n",(0,n.jsx)(t.li,{children:"Using managed Kubernetes services in different clouds/infrastructures"}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"how-otomi-supports-edge-computing-using-kubernetes",children:"How Otomi supports edge computing using Kubernetes"}),"\n",(0,n.jsx)(t.p,{children:"One of the benefits of Otomi is that everything managed by Otomi can be specified in a single values file. This enables you to not only define the applications workloads that need to be running on the cluster, but also all the required tools and configuration to support and secure the workloads."}),"\n",(0,n.jsx)(t.p,{children:"Let's explain this with an example:"}),"\n",(0,n.jsx)(t.p,{children:"Suppose you have 2 application workloads that you would like to run on multiple Kubernetes clusters in multiple geographic regions, using different public cloud providers (AWS, Azure, GCP) and different Kubernetes versions (1.22 and 1.23). Next to the 2 workloads, you also would like to use Istio for mTLS, cert-manager for certificates, ingress/egress network policies for isolation and HTTP response headers. Because you can not afford using L7 load balancers with WAF features in the different clouds, you would like to implement Nginx ingress with Modsecurity and OWASP filtering. The following picture shows the desired situation:"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"edge",src:s(2300).Z+"",width:"1496",height:"1398"})}),"\n",(0,n.jsxs)(t.p,{children:["Read ",(0,n.jsx)(t.a,{href:"/docs/for-ops/how-to/core-only",children:"this"})," how-to to learn more about installing Otomi at the edge."]})]})}function c(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},2300:(e,t,s)=>{s.d(t,{Z:()=>n});const n=s.p+"assets/images/edge-173d01e1fe3f7ac45484237e916968e3.png"},1151:(e,t,s)=>{s.d(t,{Z:()=>a,a:()=>r});var n=s(7294);const i={},o=n.createContext(i);function r(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/70b0dc77.bd4b2127.js b/assets/js/70b0dc77.bd4b2127.js deleted file mode 100644 index cdd06c01c..000000000 --- a/assets/js/70b0dc77.bd4b2127.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[2515],{9677:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>c,frontMatter:()=>o,metadata:()=>a,toc:()=>u});var n=s(5893),i=s(1151);const o={slug:"edge",title:"Otomi at the edge",sidebar_label:"Edge"},r=void 0,a={id:"use-cases/edge",title:"Otomi at the edge",description:"Introduction",source:"@site/product/use-cases/edge.md",sourceDirName:"use-cases",slug:"/use-cases/edge",permalink:"/product/use-cases/edge",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/edit/main/product/use-cases/edge.md",tags:[],version:"current",lastUpdatedBy:"jeho",lastUpdatedAt:1709649459,formattedLastUpdatedAt:"Mar 5, 2024",frontMatter:{slug:"edge",title:"Otomi at the edge",sidebar_label:"Edge"}},l={},u=[{value:"Introduction",id:"introduction",level:2},{value:"How Otomi supports edge computing using Kubernetes",id:"how-otomi-supports-edge-computing-using-kubernetes",level:2}];function d(e){const t={a:"a",h2:"h2",img:"img",li:"li",p:"p",ul:"ul",...(0,i.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h2,{id:"introduction",children:"Introduction"}),"\n",(0,n.jsx)(t.p,{children:"Edge computing is an approach where you run applications as close as possible to its data sources or end users. One of the benefits is improved response times."}),"\n",(0,n.jsx)(t.p,{children:"However, managing edge applications using Kubernetes comes with challenges, like:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Deploy and update applications consistently accross multiple clusters"}),"\n",(0,n.jsx)(t.li,{children:"Manage the run-time specifications for the applications like ingress, certificates, DNS, network policies, etc."}),"\n",(0,n.jsx)(t.li,{children:"Lifecycle management of all supporting tools"}),"\n",(0,n.jsx)(t.li,{children:"Using managed Kubernetes services in different clouds/infrastructures"}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"how-otomi-supports-edge-computing-using-kubernetes",children:"How Otomi supports edge computing using Kubernetes"}),"\n",(0,n.jsx)(t.p,{children:"One of the benefits of Otomi is that everything managed by Otomi can be specified in a single values file. This enables you to not only define the applications workloads that need to be running on the cluster, but also all the required tools and configuration to support and secure the workloads."}),"\n",(0,n.jsx)(t.p,{children:"Let's explain this with an example:"}),"\n",(0,n.jsx)(t.p,{children:"Suppose you have 2 application workloads that you would like to run on multiple Kubernetes clusters in multiple geographic regions, using different public cloud providers (AWS, Azure, GCP) and different Kubernetes versions (1.22 and 1.23). Next to the 2 workloads, you also would like to use Istio for mTLS, cert-manager for certificates, ingress/egress network policies for isolation and HTTP response headers. Because you can not afford using L7 load balancers with WAF features in the different clouds, you would like to implement Nginx ingress with Modsecurity and OWASP filtering. The following picture shows the desired situation:"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"edge",src:s(2300).Z+"",width:"1496",height:"1398"})}),"\n",(0,n.jsxs)(t.p,{children:["Read ",(0,n.jsx)(t.a,{href:"/docs/for-ops/how-to/core-only",children:"this"})," how-to to learn more about installing Otomi at the edge."]})]})}function c(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},2300:(e,t,s)=>{s.d(t,{Z:()=>n});const n=s.p+"assets/images/edge-173d01e1fe3f7ac45484237e916968e3.png"},1151:(e,t,s)=>{s.d(t,{Z:()=>a,a:()=>r});var n=s(7294);const i={},o=n.createContext(i);function r(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/73148982.16544f70.js b/assets/js/73148982.16544f70.js new file mode 100644 index 000000000..246406344 --- /dev/null +++ b/assets/js/73148982.16544f70.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[1409],{3380:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var n=i(5893),o=i(1151);const r={slug:"v1",title:"END USER LICENSE AGREEMENT",sidebar_label:"EULA"},s="OTOMI CONSOLE & API END USER LICENSE AGREEMENT",a={id:"eula/v1",title:"END USER LICENSE AGREEMENT",description:"This EULA is applicable to the usage of Otomi Console and Otomi API.",source:"@site/product/eula/v1.md",sourceDirName:"eula",slug:"/eula/v1",permalink:"/product/eula/v1",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/edit/main/product/eula/v1.md",tags:[],version:"current",lastUpdatedBy:"ElderMatt",lastUpdatedAt:1710142611,formattedLastUpdatedAt:"Mar 11, 2024",frontMatter:{slug:"v1",title:"END USER LICENSE AGREEMENT",sidebar_label:"EULA"},sidebar:"mainSidebar",previous:{title:"Serverless",permalink:"/product/use-cases/serverless"}},l={},d=[{value:"1. The Mechanics of the Agreement",id:"1-the-mechanics-of-the-agreement",level:2},{value:"2. License",id:"2-license",level:2},{value:"3. Term",id:"3-term",level:2},{value:"4. Fees and Payment",id:"4-fees-and-payment",level:2},{value:"5. Termination",id:"5-termination",level:2},{value:"6. Representations and Warranties",id:"6-representations-and-warranties",level:2},{value:"7. Confidentiality",id:"7-confidentiality",level:2},{value:"8. End User Information, Feedback, Reservation of Rights, & Review",id:"8-end-user-information-feedback-reservation-of-rights--review",level:2},{value:"9. Review",id:"9-review",level:2},{value:"10. Limitations",id:"10--limitations",level:2},{value:"11. Governing Law and Claims.",id:"11--governing-law-and-claims",level:2},{value:"12. Miscellaneous",id:"12--miscellaneous",level:2},{value:"13. Definitions",id:"13--definitions",level:2}];function c(e){const t={a:"a",h1:"h1",h2:"h2",hr:"hr",li:"li",ol:"ol",p:"p",...(0,o.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:"This EULA is applicable to the usage of Otomi Console and Otomi API."}),"\n",(0,n.jsx)(t.h1,{id:"otomi-console--api-end-user-license-agreement",children:"OTOMI CONSOLE & API END USER LICENSE AGREEMENT"}),"\n",(0,n.jsx)(t.hr,{}),"\n",(0,n.jsx)(t.p,{children:"PLEASE READ THIS AGREEMENT CAREFULLY BEFORE USING SOFTWARE FROM RED KUBES B.V.. (\u201cRED KUBES\u201d). BY USING RED KUBES SOFTWARE, USER SIGNIFIES ITS ASSENT TO AND ACCEPTANCE OF THIS AGREEMENT AND ACKNOWLEDGES IT HAS READ AND UNDERSTANDS THIS AGREEMENT. IF USER DOES NOT ACCEPT THE TERMS OF THIS AGREEMENT, THEN IT MUST NOT USE RED KUBES SOFTWARE.\nThis Red Kubes End User Agreement is between the User and Red Kubes and addresses relevant considerations that apply to Red Kubes Products, open source software, and our subscription business model."}),"\n",(0,n.jsx)(t.h2,{id:"1-the-mechanics-of-the-agreement",children:"1. The Mechanics of the Agreement"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"Ordering. The Agreement applies to Red Kubes Products for which you acquire the right to access or use, including Subscriptions, access to Red Kubes Online Properties and other Red Kubes offerings."}),"\n",(0,n.jsx)(t.li,{children:"Structure. The Agreement consists of two components: (1) the General Terms and (2) the Product Appendices applicable to Your Products. Certain terms are defined in the General Terms or in the Definitions section at the end of the General Terms."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"2-license",children:"2. License"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"Software License. Subject to your ongoing compliance with all the terms and conditions of this Agreement, Red Kubes hereby grants you a non-exclusive, non-sublicensable, non-transferrable, worldwide, revocable license to download and use the Software, specifically the Community Edition, for your own internal business operation only."}),"\n",(0,n.jsx)(t.li,{children:"License Restrictions. You will not: (a) copy or use the Software in any manner except as expressly permitted in this Agreement; (b) reverse engineer, disassemble, or decompile the Software (except to the extent such restrictions are prohibited by law); (c) alter, modify, enhance or prepare any derivative work from or of the Software; (d) alter or remove any proprietary notices in the Software; or (e) export the Software in violation any export laws or regulations. If you do not comply with the license terms or the foregoing restrictions, Red Kubes may terminate or suspend your license to the Software until you come into compliance with such terms and restrictions.\nThe Software may contain disabling codes that prevent use of the Software outside of the authorized scope and may contain functionality such that the Software reports to Red Kubes certain general metric information about your use of the Software."}),"\n",(0,n.jsx)(t.li,{children:"Third Party Components and Third Party Software. The Software may include third party software components provided under separate license terms (\u201cThird Party Components\u201d), including open source software from the Otomi Project. Nothing in this Agreement limits your rights to obtain and use the Third Party Components under the separate license terms that are applicable to each Third Party Component. However the Software is made available to you only pursuant to this Agreement. In addition, Red Kubes may in its sole discretion, make available other third party software (\u201cThird Party Software\u201d) embedded in, or otherwise provided with, the Software. Third Party Software is expressly excluded from the defined term \u201cSoftware\u201d as used throughout this Agreement. Your use of the Third Party Software is subject to the applicable third party license terms as set forth here, and such Third Party Software is not licensed to you under the terms of this Agreement. If you do not agree to abide by the applicable license terms for the Third Party Software, then you may not access or use the Software or the Third Party Software. You are solely and exclusively responsible for determining if you are permitted to use the Third Party Software and you should address any questions in this regard directly to the relevant Third Party Software licensor."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"3-term",children:"3. Term"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"Agreement Term. The Agreement begins on the Effective Date and continues until it is terminated as set forth below."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"4-fees-and-payment",children:"4. Fees and Payment"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"The Software is made available to you under this Agreement free of charge."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"5-termination",children:"5. Termination"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"Termination. This Agreement will remain in effect until terminated. You may terminate this Agreement at any time, for any reason or no reason, by ceasing all use of the Software and deleting all copies in your possession or control. Red Kubes may terminate this Agreement at any time, for any reason or no reason, upon notice by any method, including without limitation a post to the web page from which you downloaded the Software or an email sent to an email address you provided when you downloaded the Software."}),"\n",(0,n.jsx)(t.li,{children:"Effect of Termination; Survival. The termination of this Agreement will not terminate or suspend other provisions of the Agreement."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"6-representations-and-warranties",children:"6. Representations and Warranties"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"Red Kubes represents and warrants that (a) it has the authority to enter into this Agreement, and (b) to its knowledge, the Software does not, at the time of delivery to you, include malicious mechanisms or code for the purpose of damaging or corrupting the Software.. User represents and warrants that (a) it has the authority to enter into this Agreement, and (b) its use of Red Kubes Products will comply with all applicable laws, and it will not use the Red Kubes Products for any illegal activity."}),"\n",(0,n.jsx)(t.li,{children:"To the maximum extent permitted by applicable law and except as expressly provided in section 6.1, the Red Kubes Products are provided \u2018 as is\u2019 and without any representations or warranties express or implied, and Red Kubes disclaims all such representations and warranties, including the implied warranties of merchantability, non-infringement, and fitness for a particular purpose, and any warranties implied by the course of dealing of usage of trade. Red Kubes and its suppliers do not represent or warrant that the Red Kubes Products will be uninterrupted, secure, error free, accurate or complete or comply with regulatory requirements, or that Red Kubes will correct all errors. In the event of a breach of the warranties set forts in section 6.1., your exclusive remedy, and Red Kubes\u2019 entire liability, will be the re-performance of re-delivery of the deficient Red Kubes Product, or if Red Kubes cannot substantially correct a breach in a commercially reasonable manner, termination of the relevant Red Kubes Product. ."}),"\n",(0,n.jsx)(t.li,{children:"The Red Kubes Products have not been tested in all situations under which they may be used. Red Kubes will not be liable for the results obtained through use of the Red Kubes Products and you are solely responsible for determining appropriate uses for the Red Kubes Products and for all results of such use. In particular, Red Kubes Products are not specifically designed, manufactured or intended for use in (a) the design, planning, construction, maintenance, control, or direct operation of nuclear facilities, (b) aircraft control, navigation, or communication systems (c) weapons systems, (d) direct life support systems (e) or other similar hazardous environments."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"7-confidentiality",children:"7. Confidentiality"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"Recipient (a) may not disclose Confidential Information of a Discloser to any third party unless Discloser approves the disclosure in writing or the disclosure is otherwise permitted under this Section 7; (b) will use the same degree of care to protect Confidential Information of Discloser as it uses to protect its own confidential information of a similar nature, but in no event less than reasonable care; and (c) may disclose Confidential Information of the Discloser only to its employees, Affiliates, agents and contractors with a need to know, and to its auditors and legal counsel, in each case, who are under a written obligation (or other professional obligation) to keep such information confidential using standards of confidentiality no less restrictive than those required by this Section 7. These obligations will continue for a period of two (2) years following initial disclosure of the particular Confidential Information. A Recipient may disclose Confidential Information if it is required to do so by applicable law, regulation or court order but, where legally permissible, will provide advance notice to the Discloser to enable the Discloser to seek a protective order or other similar protection if feasible. \u201cRecipient\u201d is the party receiving Confidential Information under this Agreement. \u201cDiscloser\u201d is a party disclosing Confidential Information under this Agreement"}),"\n",(0,n.jsxs)(t.li,{children:["Information is not Confidential Information, if: (a) the information is or becomes publicly available other than as a result of the Recipient\u2019s breach of this Agreement, (b) the Recipient, at the time of disclosure, knows or possesses the information without obligation of confidentiality or thereafter obtains the information from a third party not under an obligation of confidentiality; (c) the Recipient independently develops the information without use of the Discloser\u2019s Confidential Information, (d) the information is generally known or easily developed by someone with ordinary skills in the business of the Recipient, or (e) the information is licensed under an Open Source License (as defined by the Open Source Initiative (",(0,n.jsx)(t.a,{href:"https://opensource.org/",children:"https://opensource.org/"}),")).\n7.3 Confidential Information that is disclosed prior to termination of this Agreement will remain subject to this Agreement for the period set forth above. Upon written request of the Discloser, the Recipient will promptly return or destroy all Confidential Information, except for Confidential Information stored in routine back-up media not accessible during the ordinary course of business."]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"8-end-user-information-feedback-reservation-of-rights--review",children:"8. End User Information, Feedback, Reservation of Rights, & Review"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"End User Information. If you provide End User Information in connection with your use of or access to Red Kubes Products, you agree that, subject to Section 7, Red Kubes, its Affiliates, and Suppliers may use such End User Information in connection with providing the Red Kubes Products. You agree that your provision (and Red Kubes\u2019 use) of End User Information under this Agreement does not require any additional consents or licenses, will be in compliance with applicable law, and will not violate any intellectual property, proprietary, privacy, or other right of any third party. As between Red Kubes and you, you retain all other rights in and to End User Information."}),"\n",(0,n.jsx)(t.li,{children:"Feedback. You may be asked to voluntarily provide Red Kubes with Feedback in connection with Red Kubes Products, but have no obligation to do so. If you choose to do so, Red Kubes may use Feedback for any purpose, including incorporating the Feedback into, or using the Feedback to develop and improve Red Kubes Products and other Red Kubes offerings without attribution or compensation. You grant Red Kubes a perpetual and irrevocable license to use all Feedback for any purpose. You agree to provide Feedback to Red Kubes only in compliance with applicable laws and you represent that you have the authority to provide the Feedback and that Feedback will not include proprietary information of a third party."}),"\n",(0,n.jsx)(t.li,{children:"Reservation of Rights. Red Kubes grants to you only those rights expressly granted in\nthe Agreement with respect to the Red Kubes Products and reserves all other rights in and to the Red Kubes Products (including all intellectual property rights). Red Kubes may collect and use for any purpose aggregate anonymous benchmark data about your use of the Red Kubes Products. Nothing in this Agreement will limit Red Kubes from providing software, materials, or services for itself or other clients, irrespective of the possible similarity of such software, materials or services to those that might be delivered to you. The terms of Section 7 will not prohibit or restrict either party's right to develop, use or market products or services similar to or competitive with the other party; provided, however, that neither party is relieved of its obligations under this Agreement."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"9-review",children:"9. Review"}),"\n",(0,n.jsx)(t.p,{children:"While this Agreement is in effect and for one year thereafter, Red Kubes or its designee, acting in accordance with Section 7, may inspect your facilities and records to verify your compliance with this Agreement. You agree to (a) respond promptly to requests for information, documents and/or records, (b) grant appropriate access for on-site visits in order to verify your compliance, and (c) reasonably cooperate in connection with any such verification. Red Kubes will provide at least ten (10) days prior written notice for any on-site visits, and will conduct onsite visits during regular business hours in a manner that reasonably minimizes interference with your business. If Red Kubes notifies you of any noncompliance, then you will resolve the non-compliance within fifteen (15) days from the date of notice."}),"\n",(0,n.jsx)(t.h2,{id:"10--limitations",children:"10. Limitations"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"Disclaimer of damages. To the maximum extent permitted by applicable law, neither party, not its Affiliates, will be liable for any incidental, consequential, special, indirect, exemplary or punitive damages, of for any damages for lost or damaged data, lost profits, lost savings of business or service interruption, even if such party was advised of the possibility of such damages, and regardless of the failure of essential purpose of any limited remedy."}),"\n",(0,n.jsx)(t.li,{children:"Limitations of liability. To the maximum extent permitted by applicable law, Red Kubes\u2019 and its Affiliates\u2019 total and aggregate liability with respect to any claim relating to or arising out of this Agreement will not exceed ten euros with respect to the particular Red Kubes Product given rise to liability under the most applicable ordering document during the twelve (12) months immediately preceding the first event giving rise to such claim. This limitation applies regardless of the nature of the claim, whether contract, tort (including negligence), statute or other legal theory."}),"\n",(0,n.jsx)(t.li,{children:"No exclusion or limitation of liability. Notwithstanding any other provision of this Agreement and / or any offer, Red Kubes does not exclude or limit liability for (a) personal injury or death to the extent that such injury or death results from the negligence or willful default of Red Kubes, its agents, Affiliates, or subcontractors; (b) any fraudulent misrepresentation upon which the claiming party can be shown to have relied; or (c) any other liability which is not permissible at law to exclude or limit."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"11--governing-law-and-claims",children:"11. Governing Law and Claims."}),"\n",(0,n.jsx)(t.p,{children:"The Agreement, and any claim, controversy or dispute related to the Agreement, are governed by and construed in accordance with the Dutch law without giving effect to any conflicts of laws provisions. To the extent permissible, the United Nations Convention on Contracts for the International Sale of Goods will not apply, even if adopted as part of the Dutch law. Any claim, suit, action or proceeding arising out of or relating to this Agreement or its subject matter will be brought exclusively in the courts of the Netherlands and each party irrevocably submits to the exclusive jurisdiction and venue. No claim or action, regardless of form, arising out of this Agreement may be brought by either party more than one (1) year after the party first became aware, or reasonably should have been aware, of the basis for the claim."}),"\n",(0,n.jsx)(t.h2,{id:"12--miscellaneous",children:"12. Miscellaneous"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:["Notices. Notices must be in English, in writing, and will be deemed given upon receipt, after being sent using a method that provides for positive confirmation of delivery to the address(es) or email address provided by you, including through an automated receipt or by electronic log. Any notice from you to Red Kubes must include a copy sent to: Red Kubes\u2019 email address ",(0,n.jsx)(t.a,{href:"mailto:info@redkubes.com",children:"info@redkubes.com"}),"."]}),"\n",(0,n.jsx)(t.li,{children:"Assignment. Either party may upon written notice: (a) assign this Agreement to an Affiliate if the Affiliate is able to satisfy the assigning party\u2019s obligations under the Agreement and the assignment will not affect the non-assigning party\u2019s obligations under the Agreement; and (b) assign this Agreement to a successor or acquirer pursuant to a merger or sale of all or substantially all of such party\u2019s assets. Any other assignment will be deemed void and ineffective without the prior written consent of the other party. Subject to the foregoing, this Agreement will be binding upon and will insure to the benefit of the parties and their respective successors and permitted assigns."}),"\n",(0,n.jsx)(t.li,{children:"Waiver. A waiver by a party under this Agreement is only valid if in writing and signed by an authorized representative of such party. A delay or failure of a party to exercise any rights under this Agreement will not constitute or be deemed a waiver or forfeiture of such rights."}),"\n",(0,n.jsx)(t.li,{children:"Independent Contractors. The parties are independent contractors and nothing in this Agreement creates an employment, partnership or agency relationship between the parties or any Affiliate. Each party is solely responsible for supervision, control and payment of its personnel."}),"\n",(0,n.jsx)(t.li,{children:"Third Party Beneficiaries. This Agreement is binding on the parties to this Agreement and, other than as expressly provided in the Agreement, nothing in this Agreement grants any other person or entity any right, benefit or remedy."}),"\n",(0,n.jsx)(t.li,{children:"Force Majeure. Neither party is responsible for nonperformance or delay in performance of its obligations due to causes beyond its reasonable control."}),"\n",(0,n.jsx)(t.li,{children:"Complete Agreement and Order of Precedence. The Agreement represents the complete agreement between the parties with respect to its subject matter and supersedes all prior and contemporaneous agreements and proposals, whether written or oral, with respect to such subject matter. Any terms contained in any other documentation that you deliver to Red Kubes, are void and will not become part of the Agreement or otherwise bind the parties. If there is a conflict between the General Terms and the Product Appendices, the General Terms will control unless otherwise expressly provided in the Product Appendices."}),"\n",(0,n.jsx)(t.li,{children:"Counterparts. This Agreement may be executed in counterparts, each of which will be deemed an original and all of which will constitute one and the same document. The parties may exchange signature pages by email or electronic signature process and such signatures will be effective to bind the parties to the Agreement."}),"\n",(0,n.jsx)(t.li,{children:"Severable. If any provision of this Agreement is held by a court of competent jurisdiction to be invalid or unenforceable, the remaining provisions of this Agreement will remain in effect to the greatest extent permitted by law."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"13--definitions",children:"13. Definitions"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"\u201cAffiliate\u201d means an entity that owns or controls, is owned or controlled by, or is under common control or ownership with a party, where \u201ccontrol\u201d is the possession, direct or indirect, of the power to direct or cause the direction of the management and policies of an entity, whether through ownership of voting securities, by contract or otherwise."}),"\n",(0,n.jsx)(t.li,{children:"\u201cBusiness Partner\u201d means a cloud provider, distributor, reseller, OEM or other third party authorized to resell or distribute Red Kubes Products."}),"\n",(0,n.jsx)(t.li,{children:"\u201cBusiness Partner order\u201d means an order for a Red Kubes Product placed through a Business Partner."}),"\n",(0,n.jsx)(t.li,{children:"\u201cEnd User\u201d or \u201cyou\u201d means the person or entity acquiring the right to use or access the Red Kubes Products and which is a party to this Agreement."}),"\n",(0,n.jsx)(t.li,{children:"\u201cEnd User Information\u201d means any data, information, software or other materials that you provide to Red Kubes under the Agreement."}),"\n",(0,n.jsx)(t.li,{children:"\u201cConfidential Information\u201d means information disclosed by the Discloser to the Recipient during the term of the Agreement that (i) is marked confidential; (ii) if disclosed orally, is clearly described as confidential at the time of disclosure and is subsequently set forth in writing, marked confidential, and sent to the Recipient within thirty (30) days following the oral disclosure; or (iii) is of a nature that the Recipient knows is confidential to the Discloser or should reasonably be expected to know is confidential."}),"\n",(0,n.jsx)(t.li,{children:"\u201cEffective Date\u201d means earliest of (a) the date of the last signature on this Agreement, (b) your online acceptance of the Agreement, and (c) when you first receive access to a Red Kubes Product."}),"\n",(0,n.jsx)(t.li,{children:"\u201cFeedback\u201d means any ideas, suggestions, proposals or other feedback you may provide regarding Red Kubes Products."}),"\n",(0,n.jsx)(t.li,{children:"\u201cGeneral Terms\u201d means the terms contained in Sections 1 \u2013 13 of this document."}),"\n",(0,n.jsx)(t.li,{children:"\u201cProduct Appendices\u201d means (a) the Red Kubes Product Appendices that are incorporated into an applicable statement of work."}),"\n",(0,n.jsx)(t.li,{children:"\u201cRed Kubes Products\u201d means Software, Services, Subscriptions and other Red Kubes branded offerings made available by Red Kubes."}),"\n",(0,n.jsx)(t.li,{children:"\u201cSoftware\u201d means Red Kubes branded software that is included in Red Kubes Product offerings."}),"\n",(0,n.jsx)(t.li,{children:"\u201cSubscription\u201d means a time bound Red Kubes Services offering, other than Professional Services."}),"\n",(0,n.jsx)(t.li,{children:"\u201cSupplier\u201d means a third party that provides service(s) to Red Kubes in order for Red Kubes to offer Services to its customers and/or Business Partners."}),"\n",(0,n.jsx)(t.li,{children:"\u201cYour Products\u201d means the Red Kubes Products that you have purchased, licensed, or otherwise acquired the right to access or use."}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},1151:(e,t,i)=>{i.d(t,{Z:()=>a,a:()=>s});var n=i(7294);const o={},r=n.createContext(o);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/73148982.afae4f1e.js b/assets/js/73148982.afae4f1e.js deleted file mode 100644 index 516843600..000000000 --- a/assets/js/73148982.afae4f1e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[1409],{3380:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var n=i(5893),o=i(1151);const r={slug:"v1",title:"END USER LICENSE AGREEMENT",sidebar_label:"EULA"},s="OTOMI CONSOLE & API END USER LICENSE AGREEMENT",a={id:"eula/v1",title:"END USER LICENSE AGREEMENT",description:"This EULA is applicable to the usage of Otomi Console and Otomi API.",source:"@site/product/eula/v1.md",sourceDirName:"eula",slug:"/eula/v1",permalink:"/product/eula/v1",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/edit/main/product/eula/v1.md",tags:[],version:"current",lastUpdatedBy:"jeho",lastUpdatedAt:1709649459,formattedLastUpdatedAt:"Mar 5, 2024",frontMatter:{slug:"v1",title:"END USER LICENSE AGREEMENT",sidebar_label:"EULA"},sidebar:"mainSidebar",previous:{title:"Serverless",permalink:"/product/use-cases/serverless"}},l={},d=[{value:"1. The Mechanics of the Agreement",id:"1-the-mechanics-of-the-agreement",level:2},{value:"2. License",id:"2-license",level:2},{value:"3. Term",id:"3-term",level:2},{value:"4. Fees and Payment",id:"4-fees-and-payment",level:2},{value:"5. Termination",id:"5-termination",level:2},{value:"6. Representations and Warranties",id:"6-representations-and-warranties",level:2},{value:"7. Confidentiality",id:"7-confidentiality",level:2},{value:"8. End User Information, Feedback, Reservation of Rights, & Review",id:"8-end-user-information-feedback-reservation-of-rights--review",level:2},{value:"9. Review",id:"9-review",level:2},{value:"10. Limitations",id:"10--limitations",level:2},{value:"11. Governing Law and Claims.",id:"11--governing-law-and-claims",level:2},{value:"12. Miscellaneous",id:"12--miscellaneous",level:2},{value:"13. Definitions",id:"13--definitions",level:2}];function c(e){const t={a:"a",h1:"h1",h2:"h2",hr:"hr",li:"li",ol:"ol",p:"p",...(0,o.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:"This EULA is applicable to the usage of Otomi Console and Otomi API."}),"\n",(0,n.jsx)(t.h1,{id:"otomi-console--api-end-user-license-agreement",children:"OTOMI CONSOLE & API END USER LICENSE AGREEMENT"}),"\n",(0,n.jsx)(t.hr,{}),"\n",(0,n.jsx)(t.p,{children:"PLEASE READ THIS AGREEMENT CAREFULLY BEFORE USING SOFTWARE FROM RED KUBES B.V.. (\u201cRED KUBES\u201d). BY USING RED KUBES SOFTWARE, USER SIGNIFIES ITS ASSENT TO AND ACCEPTANCE OF THIS AGREEMENT AND ACKNOWLEDGES IT HAS READ AND UNDERSTANDS THIS AGREEMENT. IF USER DOES NOT ACCEPT THE TERMS OF THIS AGREEMENT, THEN IT MUST NOT USE RED KUBES SOFTWARE.\nThis Red Kubes End User Agreement is between the User and Red Kubes and addresses relevant considerations that apply to Red Kubes Products, open source software, and our subscription business model."}),"\n",(0,n.jsx)(t.h2,{id:"1-the-mechanics-of-the-agreement",children:"1. The Mechanics of the Agreement"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"Ordering. The Agreement applies to Red Kubes Products for which you acquire the right to access or use, including Subscriptions, access to Red Kubes Online Properties and other Red Kubes offerings."}),"\n",(0,n.jsx)(t.li,{children:"Structure. The Agreement consists of two components: (1) the General Terms and (2) the Product Appendices applicable to Your Products. Certain terms are defined in the General Terms or in the Definitions section at the end of the General Terms."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"2-license",children:"2. License"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"Software License. Subject to your ongoing compliance with all the terms and conditions of this Agreement, Red Kubes hereby grants you a non-exclusive, non-sublicensable, non-transferrable, worldwide, revocable license to download and use the Software, specifically the Community Edition, for your own internal business operation only."}),"\n",(0,n.jsx)(t.li,{children:"License Restrictions. You will not: (a) copy or use the Software in any manner except as expressly permitted in this Agreement; (b) reverse engineer, disassemble, or decompile the Software (except to the extent such restrictions are prohibited by law); (c) alter, modify, enhance or prepare any derivative work from or of the Software; (d) alter or remove any proprietary notices in the Software; or (e) export the Software in violation any export laws or regulations. If you do not comply with the license terms or the foregoing restrictions, Red Kubes may terminate or suspend your license to the Software until you come into compliance with such terms and restrictions.\nThe Software may contain disabling codes that prevent use of the Software outside of the authorized scope and may contain functionality such that the Software reports to Red Kubes certain general metric information about your use of the Software."}),"\n",(0,n.jsx)(t.li,{children:"Third Party Components and Third Party Software. The Software may include third party software components provided under separate license terms (\u201cThird Party Components\u201d), including open source software from the Otomi Project. Nothing in this Agreement limits your rights to obtain and use the Third Party Components under the separate license terms that are applicable to each Third Party Component. However the Software is made available to you only pursuant to this Agreement. In addition, Red Kubes may in its sole discretion, make available other third party software (\u201cThird Party Software\u201d) embedded in, or otherwise provided with, the Software. Third Party Software is expressly excluded from the defined term \u201cSoftware\u201d as used throughout this Agreement. Your use of the Third Party Software is subject to the applicable third party license terms as set forth here, and such Third Party Software is not licensed to you under the terms of this Agreement. If you do not agree to abide by the applicable license terms for the Third Party Software, then you may not access or use the Software or the Third Party Software. You are solely and exclusively responsible for determining if you are permitted to use the Third Party Software and you should address any questions in this regard directly to the relevant Third Party Software licensor."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"3-term",children:"3. Term"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"Agreement Term. The Agreement begins on the Effective Date and continues until it is terminated as set forth below."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"4-fees-and-payment",children:"4. Fees and Payment"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"The Software is made available to you under this Agreement free of charge."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"5-termination",children:"5. Termination"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"Termination. This Agreement will remain in effect until terminated. You may terminate this Agreement at any time, for any reason or no reason, by ceasing all use of the Software and deleting all copies in your possession or control. Red Kubes may terminate this Agreement at any time, for any reason or no reason, upon notice by any method, including without limitation a post to the web page from which you downloaded the Software or an email sent to an email address you provided when you downloaded the Software."}),"\n",(0,n.jsx)(t.li,{children:"Effect of Termination; Survival. The termination of this Agreement will not terminate or suspend other provisions of the Agreement."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"6-representations-and-warranties",children:"6. Representations and Warranties"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"Red Kubes represents and warrants that (a) it has the authority to enter into this Agreement, and (b) to its knowledge, the Software does not, at the time of delivery to you, include malicious mechanisms or code for the purpose of damaging or corrupting the Software.. User represents and warrants that (a) it has the authority to enter into this Agreement, and (b) its use of Red Kubes Products will comply with all applicable laws, and it will not use the Red Kubes Products for any illegal activity."}),"\n",(0,n.jsx)(t.li,{children:"To the maximum extent permitted by applicable law and except as expressly provided in section 6.1, the Red Kubes Products are provided \u2018 as is\u2019 and without any representations or warranties express or implied, and Red Kubes disclaims all such representations and warranties, including the implied warranties of merchantability, non-infringement, and fitness for a particular purpose, and any warranties implied by the course of dealing of usage of trade. Red Kubes and its suppliers do not represent or warrant that the Red Kubes Products will be uninterrupted, secure, error free, accurate or complete or comply with regulatory requirements, or that Red Kubes will correct all errors. In the event of a breach of the warranties set forts in section 6.1., your exclusive remedy, and Red Kubes\u2019 entire liability, will be the re-performance of re-delivery of the deficient Red Kubes Product, or if Red Kubes cannot substantially correct a breach in a commercially reasonable manner, termination of the relevant Red Kubes Product. ."}),"\n",(0,n.jsx)(t.li,{children:"The Red Kubes Products have not been tested in all situations under which they may be used. Red Kubes will not be liable for the results obtained through use of the Red Kubes Products and you are solely responsible for determining appropriate uses for the Red Kubes Products and for all results of such use. In particular, Red Kubes Products are not specifically designed, manufactured or intended for use in (a) the design, planning, construction, maintenance, control, or direct operation of nuclear facilities, (b) aircraft control, navigation, or communication systems (c) weapons systems, (d) direct life support systems (e) or other similar hazardous environments."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"7-confidentiality",children:"7. Confidentiality"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"Recipient (a) may not disclose Confidential Information of a Discloser to any third party unless Discloser approves the disclosure in writing or the disclosure is otherwise permitted under this Section 7; (b) will use the same degree of care to protect Confidential Information of Discloser as it uses to protect its own confidential information of a similar nature, but in no event less than reasonable care; and (c) may disclose Confidential Information of the Discloser only to its employees, Affiliates, agents and contractors with a need to know, and to its auditors and legal counsel, in each case, who are under a written obligation (or other professional obligation) to keep such information confidential using standards of confidentiality no less restrictive than those required by this Section 7. These obligations will continue for a period of two (2) years following initial disclosure of the particular Confidential Information. A Recipient may disclose Confidential Information if it is required to do so by applicable law, regulation or court order but, where legally permissible, will provide advance notice to the Discloser to enable the Discloser to seek a protective order or other similar protection if feasible. \u201cRecipient\u201d is the party receiving Confidential Information under this Agreement. \u201cDiscloser\u201d is a party disclosing Confidential Information under this Agreement"}),"\n",(0,n.jsxs)(t.li,{children:["Information is not Confidential Information, if: (a) the information is or becomes publicly available other than as a result of the Recipient\u2019s breach of this Agreement, (b) the Recipient, at the time of disclosure, knows or possesses the information without obligation of confidentiality or thereafter obtains the information from a third party not under an obligation of confidentiality; (c) the Recipient independently develops the information without use of the Discloser\u2019s Confidential Information, (d) the information is generally known or easily developed by someone with ordinary skills in the business of the Recipient, or (e) the information is licensed under an Open Source License (as defined by the Open Source Initiative (",(0,n.jsx)(t.a,{href:"https://opensource.org/",children:"https://opensource.org/"}),")).\n7.3 Confidential Information that is disclosed prior to termination of this Agreement will remain subject to this Agreement for the period set forth above. Upon written request of the Discloser, the Recipient will promptly return or destroy all Confidential Information, except for Confidential Information stored in routine back-up media not accessible during the ordinary course of business."]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"8-end-user-information-feedback-reservation-of-rights--review",children:"8. End User Information, Feedback, Reservation of Rights, & Review"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"End User Information. If you provide End User Information in connection with your use of or access to Red Kubes Products, you agree that, subject to Section 7, Red Kubes, its Affiliates, and Suppliers may use such End User Information in connection with providing the Red Kubes Products. You agree that your provision (and Red Kubes\u2019 use) of End User Information under this Agreement does not require any additional consents or licenses, will be in compliance with applicable law, and will not violate any intellectual property, proprietary, privacy, or other right of any third party. As between Red Kubes and you, you retain all other rights in and to End User Information."}),"\n",(0,n.jsx)(t.li,{children:"Feedback. You may be asked to voluntarily provide Red Kubes with Feedback in connection with Red Kubes Products, but have no obligation to do so. If you choose to do so, Red Kubes may use Feedback for any purpose, including incorporating the Feedback into, or using the Feedback to develop and improve Red Kubes Products and other Red Kubes offerings without attribution or compensation. You grant Red Kubes a perpetual and irrevocable license to use all Feedback for any purpose. You agree to provide Feedback to Red Kubes only in compliance with applicable laws and you represent that you have the authority to provide the Feedback and that Feedback will not include proprietary information of a third party."}),"\n",(0,n.jsx)(t.li,{children:"Reservation of Rights. Red Kubes grants to you only those rights expressly granted in\nthe Agreement with respect to the Red Kubes Products and reserves all other rights in and to the Red Kubes Products (including all intellectual property rights). Red Kubes may collect and use for any purpose aggregate anonymous benchmark data about your use of the Red Kubes Products. Nothing in this Agreement will limit Red Kubes from providing software, materials, or services for itself or other clients, irrespective of the possible similarity of such software, materials or services to those that might be delivered to you. The terms of Section 7 will not prohibit or restrict either party's right to develop, use or market products or services similar to or competitive with the other party; provided, however, that neither party is relieved of its obligations under this Agreement."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"9-review",children:"9. Review"}),"\n",(0,n.jsx)(t.p,{children:"While this Agreement is in effect and for one year thereafter, Red Kubes or its designee, acting in accordance with Section 7, may inspect your facilities and records to verify your compliance with this Agreement. You agree to (a) respond promptly to requests for information, documents and/or records, (b) grant appropriate access for on-site visits in order to verify your compliance, and (c) reasonably cooperate in connection with any such verification. Red Kubes will provide at least ten (10) days prior written notice for any on-site visits, and will conduct onsite visits during regular business hours in a manner that reasonably minimizes interference with your business. If Red Kubes notifies you of any noncompliance, then you will resolve the non-compliance within fifteen (15) days from the date of notice."}),"\n",(0,n.jsx)(t.h2,{id:"10--limitations",children:"10. Limitations"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"Disclaimer of damages. To the maximum extent permitted by applicable law, neither party, not its Affiliates, will be liable for any incidental, consequential, special, indirect, exemplary or punitive damages, of for any damages for lost or damaged data, lost profits, lost savings of business or service interruption, even if such party was advised of the possibility of such damages, and regardless of the failure of essential purpose of any limited remedy."}),"\n",(0,n.jsx)(t.li,{children:"Limitations of liability. To the maximum extent permitted by applicable law, Red Kubes\u2019 and its Affiliates\u2019 total and aggregate liability with respect to any claim relating to or arising out of this Agreement will not exceed ten euros with respect to the particular Red Kubes Product given rise to liability under the most applicable ordering document during the twelve (12) months immediately preceding the first event giving rise to such claim. This limitation applies regardless of the nature of the claim, whether contract, tort (including negligence), statute or other legal theory."}),"\n",(0,n.jsx)(t.li,{children:"No exclusion or limitation of liability. Notwithstanding any other provision of this Agreement and / or any offer, Red Kubes does not exclude or limit liability for (a) personal injury or death to the extent that such injury or death results from the negligence or willful default of Red Kubes, its agents, Affiliates, or subcontractors; (b) any fraudulent misrepresentation upon which the claiming party can be shown to have relied; or (c) any other liability which is not permissible at law to exclude or limit."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"11--governing-law-and-claims",children:"11. Governing Law and Claims."}),"\n",(0,n.jsx)(t.p,{children:"The Agreement, and any claim, controversy or dispute related to the Agreement, are governed by and construed in accordance with the Dutch law without giving effect to any conflicts of laws provisions. To the extent permissible, the United Nations Convention on Contracts for the International Sale of Goods will not apply, even if adopted as part of the Dutch law. Any claim, suit, action or proceeding arising out of or relating to this Agreement or its subject matter will be brought exclusively in the courts of the Netherlands and each party irrevocably submits to the exclusive jurisdiction and venue. No claim or action, regardless of form, arising out of this Agreement may be brought by either party more than one (1) year after the party first became aware, or reasonably should have been aware, of the basis for the claim."}),"\n",(0,n.jsx)(t.h2,{id:"12--miscellaneous",children:"12. Miscellaneous"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:["Notices. Notices must be in English, in writing, and will be deemed given upon receipt, after being sent using a method that provides for positive confirmation of delivery to the address(es) or email address provided by you, including through an automated receipt or by electronic log. Any notice from you to Red Kubes must include a copy sent to: Red Kubes\u2019 email address ",(0,n.jsx)(t.a,{href:"mailto:info@redkubes.com",children:"info@redkubes.com"}),"."]}),"\n",(0,n.jsx)(t.li,{children:"Assignment. Either party may upon written notice: (a) assign this Agreement to an Affiliate if the Affiliate is able to satisfy the assigning party\u2019s obligations under the Agreement and the assignment will not affect the non-assigning party\u2019s obligations under the Agreement; and (b) assign this Agreement to a successor or acquirer pursuant to a merger or sale of all or substantially all of such party\u2019s assets. Any other assignment will be deemed void and ineffective without the prior written consent of the other party. Subject to the foregoing, this Agreement will be binding upon and will insure to the benefit of the parties and their respective successors and permitted assigns."}),"\n",(0,n.jsx)(t.li,{children:"Waiver. A waiver by a party under this Agreement is only valid if in writing and signed by an authorized representative of such party. A delay or failure of a party to exercise any rights under this Agreement will not constitute or be deemed a waiver or forfeiture of such rights."}),"\n",(0,n.jsx)(t.li,{children:"Independent Contractors. The parties are independent contractors and nothing in this Agreement creates an employment, partnership or agency relationship between the parties or any Affiliate. Each party is solely responsible for supervision, control and payment of its personnel."}),"\n",(0,n.jsx)(t.li,{children:"Third Party Beneficiaries. This Agreement is binding on the parties to this Agreement and, other than as expressly provided in the Agreement, nothing in this Agreement grants any other person or entity any right, benefit or remedy."}),"\n",(0,n.jsx)(t.li,{children:"Force Majeure. Neither party is responsible for nonperformance or delay in performance of its obligations due to causes beyond its reasonable control."}),"\n",(0,n.jsx)(t.li,{children:"Complete Agreement and Order of Precedence. The Agreement represents the complete agreement between the parties with respect to its subject matter and supersedes all prior and contemporaneous agreements and proposals, whether written or oral, with respect to such subject matter. Any terms contained in any other documentation that you deliver to Red Kubes, are void and will not become part of the Agreement or otherwise bind the parties. If there is a conflict between the General Terms and the Product Appendices, the General Terms will control unless otherwise expressly provided in the Product Appendices."}),"\n",(0,n.jsx)(t.li,{children:"Counterparts. This Agreement may be executed in counterparts, each of which will be deemed an original and all of which will constitute one and the same document. The parties may exchange signature pages by email or electronic signature process and such signatures will be effective to bind the parties to the Agreement."}),"\n",(0,n.jsx)(t.li,{children:"Severable. If any provision of this Agreement is held by a court of competent jurisdiction to be invalid or unenforceable, the remaining provisions of this Agreement will remain in effect to the greatest extent permitted by law."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"13--definitions",children:"13. Definitions"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"\u201cAffiliate\u201d means an entity that owns or controls, is owned or controlled by, or is under common control or ownership with a party, where \u201ccontrol\u201d is the possession, direct or indirect, of the power to direct or cause the direction of the management and policies of an entity, whether through ownership of voting securities, by contract or otherwise."}),"\n",(0,n.jsx)(t.li,{children:"\u201cBusiness Partner\u201d means a cloud provider, distributor, reseller, OEM or other third party authorized to resell or distribute Red Kubes Products."}),"\n",(0,n.jsx)(t.li,{children:"\u201cBusiness Partner order\u201d means an order for a Red Kubes Product placed through a Business Partner."}),"\n",(0,n.jsx)(t.li,{children:"\u201cEnd User\u201d or \u201cyou\u201d means the person or entity acquiring the right to use or access the Red Kubes Products and which is a party to this Agreement."}),"\n",(0,n.jsx)(t.li,{children:"\u201cEnd User Information\u201d means any data, information, software or other materials that you provide to Red Kubes under the Agreement."}),"\n",(0,n.jsx)(t.li,{children:"\u201cConfidential Information\u201d means information disclosed by the Discloser to the Recipient during the term of the Agreement that (i) is marked confidential; (ii) if disclosed orally, is clearly described as confidential at the time of disclosure and is subsequently set forth in writing, marked confidential, and sent to the Recipient within thirty (30) days following the oral disclosure; or (iii) is of a nature that the Recipient knows is confidential to the Discloser or should reasonably be expected to know is confidential."}),"\n",(0,n.jsx)(t.li,{children:"\u201cEffective Date\u201d means earliest of (a) the date of the last signature on this Agreement, (b) your online acceptance of the Agreement, and (c) when you first receive access to a Red Kubes Product."}),"\n",(0,n.jsx)(t.li,{children:"\u201cFeedback\u201d means any ideas, suggestions, proposals or other feedback you may provide regarding Red Kubes Products."}),"\n",(0,n.jsx)(t.li,{children:"\u201cGeneral Terms\u201d means the terms contained in Sections 1 \u2013 13 of this document."}),"\n",(0,n.jsx)(t.li,{children:"\u201cProduct Appendices\u201d means (a) the Red Kubes Product Appendices that are incorporated into an applicable statement of work."}),"\n",(0,n.jsx)(t.li,{children:"\u201cRed Kubes Products\u201d means Software, Services, Subscriptions and other Red Kubes branded offerings made available by Red Kubes."}),"\n",(0,n.jsx)(t.li,{children:"\u201cSoftware\u201d means Red Kubes branded software that is included in Red Kubes Product offerings."}),"\n",(0,n.jsx)(t.li,{children:"\u201cSubscription\u201d means a time bound Red Kubes Services offering, other than Professional Services."}),"\n",(0,n.jsx)(t.li,{children:"\u201cSupplier\u201d means a third party that provides service(s) to Red Kubes in order for Red Kubes to offer Services to its customers and/or Business Partners."}),"\n",(0,n.jsx)(t.li,{children:"\u201cYour Products\u201d means the Red Kubes Products that you have purchased, licensed, or otherwise acquired the right to access or use."}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},1151:(e,t,i)=>{i.d(t,{Z:()=>a,a:()=>s});var n=i(7294);const o={},r=n.createContext(o);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9184e37b.6fbd0533.js b/assets/js/9184e37b.6fbd0533.js new file mode 100644 index 000000000..73d8dcfa0 --- /dev/null +++ b/assets/js/9184e37b.6fbd0533.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[6535],{7667:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>b,frontMatter:()=>s,metadata:()=>o,toc:()=>d});var a=r(5893),n=r(1151);const s={slug:"rabbitmq",title:"RabbitMQ",sidebar_label:"RabbitMQ"},i=void 0,o={id:"apps/rabbitmq",title:"RabbitMQ",description:"Kubernetes operator to deploy and manage RabbitMQ clusters.",source:"@site/docs/apps/rabbitmq.md",sourceDirName:"apps",slug:"/apps/rabbitmq",permalink:"/docs/apps/rabbitmq",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/tree/main/docs/apps/rabbitmq.md",tags:[],version:"current",frontMatter:{slug:"rabbitmq",title:"RabbitMQ",sidebar_label:"RabbitMQ"},sidebar:"mainSidebar",previous:{title:"Prometheus",permalink:"/docs/apps/prometheus"},next:{title:"Sealed Secrets",permalink:"/docs/apps/sealed-secrets"}},c={},d=[{value:"Overview",id:"overview",level:2}];function l(e){const t={a:"a",code:"code",h2:"h2",p:"p",...(0,n.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.p,{children:"Kubernetes operator to deploy and manage RabbitMQ clusters."}),"\n",(0,a.jsx)(t.h2,{id:"overview",children:"Overview"}),"\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.a,{href:"https://github.com/rabbitmq/cluster-operator",children:"RabbitMQ"})," is a controller and custom resource definition (CRD) designed for the lifecycle (creation, upgrade, graceful shutdown) of a RabbitMQ cluster."]}),"\n",(0,a.jsx)(t.p,{children:"RabbitMQ is an open-source message-broker software that originally implemented the Advanced Message Queuing Protocol and has since been extended with a plug-in architecture to support Streaming Text Oriented Messaging Protocol, MQ Telemetry Transport, and other protocols."}),"\n",(0,a.jsxs)(t.p,{children:["RabbitMQ can be activated and used in tandem with the ",(0,a.jsx)(t.code,{children:"Workload Category"})," to create a RabbitMQ Cluster with ",(0,a.jsx)(t.code,{children:"Queues"})," and ",(0,a.jsx)(t.code,{children:"Policies"}),"."]})]})}function b(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(l,{...e})}):l(e)}},1151:(e,t,r)=>{r.d(t,{Z:()=>o,a:()=>i});var a=r(7294);const n={},s=a.createContext(n);function i(e){const t=a.useContext(s);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),a.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.f3d3de48.js b/assets/js/935f2afb.f3d3de48.js deleted file mode 100644 index 6110f7a22..000000000 --- a/assets/js/935f2afb.f3d3de48.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"mainSidebar":[{"type":"category","label":"Getting Started","items":[{"type":"link","label":"Overview","href":"/docs/get-started/overview","docId":"get-started/overview","unlisted":false},{"type":"link","label":"Promotions","href":"/docs/get-started/promotions","docId":"get-started/promo","unlisted":false},{"type":"link","label":"Prerequisites","href":"/docs/get-started/prerequisites","docId":"get-started/prerequisites","unlisted":false},{"type":"category","label":"Installation","items":[{"type":"link","label":"Overview","href":"/docs/get-started/installation/overview","docId":"get-started/installation/overview","unlisted":false},{"type":"link","label":"AWS","href":"/docs/get-started/installation/aws","docId":"get-started/installation/aws","unlisted":false},{"type":"link","label":"Azure","href":"/docs/get-started/installation/azure","docId":"get-started/installation/azure","unlisted":false},{"type":"link","label":"Civo","href":"/docs/get-started/installation/civo","docId":"get-started/installation/civo","unlisted":false},{"type":"link","label":"Custom","href":"/docs/get-started/installation/custom","docId":"get-started/installation/custom","unlisted":false},{"type":"link","label":"Digital Ocean","href":"/docs/get-started/installation/digitalocean","docId":"get-started/installation/digitalocean","unlisted":false},{"type":"link","label":"Google Cloud Platform","href":"/docs/get-started/installation/gcp","docId":"get-started/installation/gcp","unlisted":false},{"type":"link","label":"Linode","href":"/docs/get-started/installation/linode","docId":"get-started/installation/linode","unlisted":false},{"type":"link","label":"Scaleway","href":"/docs/get-started/installation/scaleway","docId":"get-started/installation/scaleway","unlisted":false},{"type":"link","label":"Vultr","href":"/docs/get-started/installation/vultr","docId":"get-started/installation/vultr","unlisted":false},{"type":"link","label":"Helm","href":"/docs/get-started/installation/helm","docId":"get-started/installation/helm","unlisted":false},{"type":"link","label":"Known Issues","href":"/docs/get-started/installation/known-issues","docId":"get-started/installation/known-issues","unlisted":false},{"type":"link","label":"OIDC","href":"/docs/get-started/installation/oidc","docId":"get-started/installation/oidc","unlisted":false},{"type":"link","label":"KMS","href":"/docs/get-started/installation/kms","docId":"get-started/installation/kms","unlisted":false},{"type":"link","label":"EntryPoint","href":"/docs/get-started/installation/entrypoint","docId":"get-started/installation/entrypoint","unlisted":false},{"type":"link","label":"BYO Wild Card Cert","href":"/docs/get-started/installation/byo-wildcard-cert","docId":"get-started/installation/byo-wildcard","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Activation","href":"/docs/get-started/activation","docId":"get-started/activation","unlisted":false},{"type":"category","label":"Otomi labs","items":[{"type":"link","label":"Labs Overview","href":"/docs/get-started/labs/overview","docId":"get-started/labs/overview","unlisted":false},{"type":"link","label":"Prerequisites","href":"/docs/get-started/labs/lab-1","docId":"get-started/labs/lab-1","unlisted":false},{"type":"link","label":"Create GIT repos","href":"/docs/get-started/labs/lab-3","docId":"get-started/labs/lab-3","unlisted":false},{"type":"link","label":"Build images","href":"/docs/get-started/labs/lab-6","docId":"get-started/labs/lab-6","unlisted":false},{"type":"link","label":"Trigger builds","href":"/docs/get-started/labs/lab-26","docId":"get-started/labs/lab-26","unlisted":false},{"type":"link","label":"Create secrets","href":"/docs/get-started/labs/lab-8","docId":"get-started/labs/lab-8","unlisted":false},{"type":"link","label":"Using Argo CD","href":"/docs/get-started/labs/deploy-workloads-argo-cd-otomi-kubernetes","docId":"get-started/labs/lab-10","unlisted":false},{"type":"link","label":"Explore the Catalog","href":"/docs/get-started/labs/lab-29","docId":"get-started/labs/lab-29","unlisted":false},{"type":"link","label":"Create workloads","href":"/docs/get-started/labs/lab-13","docId":"get-started/labs/lab-13","unlisted":false},{"type":"link","label":"Expose services","href":"/docs/get-started/labs/lab-18","docId":"get-started/labs/lab-18","unlisted":false},{"type":"link","label":"Configure auto image updater","href":"/docs/get-started/labs/lab-11","docId":"get-started/labs/lab-11","unlisted":false},{"type":"link","label":"Create projects","href":"/docs/get-started/labs/lab-32","docId":"get-started/labs/lab-32","unlisted":false},{"type":"link","label":"Create a database","href":"/docs/get-started/labs/lab-24","docId":"get-started/labs/lab-24","unlisted":false},{"type":"link","label":"Check policy compliance","href":"/docs/get-started/labs/lab-15","docId":"get-started/labs/lab-15","unlisted":false},{"type":"link","label":"Scan images","href":"/docs/get-started/labs/lab-7","docId":"get-started/labs/lab-7","unlisted":false},{"type":"link","label":"Scan containers","href":"/docs/get-started/labs/lab-17","docId":"get-started/labs/lab-17","unlisted":false},{"type":"link","label":"View container logs","href":"/docs/get-started/labs/lab-20","docId":"get-started/labs/lab-20","unlisted":false},{"type":"link","label":"View container metrics","href":"/docs/get-started/labs/lab-21","docId":"get-started/labs/lab-21","unlisted":false},{"type":"link","label":"Using custom metrics","href":"/docs/get-started/labs/lab-22","docId":"get-started/labs/lab-22","unlisted":false},{"type":"link","label":"Create custom dashboards","href":"/docs/get-started/labs/lab-30","docId":"get-started/labs/lab-30","unlisted":false},{"type":"link","label":"Create custom rules","href":"/docs/get-started/labs/lab-31","docId":"get-started/labs/lab-31","unlisted":false},{"type":"link","label":"Monitor services","href":"/docs/get-started/labs/lab-23","docId":"get-started/labs/lab-23","unlisted":false},{"type":"link","label":"Configure network policies","href":"/docs/get-started/labs/lab-19","docId":"get-started/labs/lab-19","unlisted":false},{"type":"link","label":"Use OpenTelemery","href":"/docs/get-started/labs/lab-27","docId":"get-started/labs/lab-27","unlisted":false},{"type":"link","label":"Canary Deployments","href":"/docs/get-started/labs/lab-28","docId":"get-started/labs/lab-28","unlisted":false}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"For Platform Admins","items":[{"type":"category","label":"Otomi Console","items":[{"type":"link","label":"Overview","href":"/docs/for-ops/console/overview","docId":"for-ops/console/overview","unlisted":false},{"type":"link","label":"Dashboard","href":"/docs/for-ops/console/dashboard","docId":"for-ops/console/dashboard","unlisted":false},{"type":"link","label":"Apps","href":"/docs/for-ops/console/apps","docId":"for-ops/console/apps","unlisted":false},{"type":"link","label":"Shortcuts","href":"/docs/for-ops/console/shortcuts","docId":"for-ops/console/shortcuts","unlisted":false},{"type":"link","label":"Policies","href":"/docs/for-ops/console/policies","docId":"for-ops/console/policies","unlisted":false},{"type":"link","label":"Teams","href":"/docs/for-ops/console/teams","docId":"for-ops/console/teams","unlisted":false},{"type":"link","label":"Projects","href":"/docs/for-ops/console/projects","docId":"for-ops/console/projects","unlisted":false},{"type":"link","label":"Builds","href":"/docs/for-ops/console/builds","docId":"for-ops/console/builds","unlisted":false},{"type":"link","label":"Secrets","href":"/docs/for-ops/console/secrets","docId":"for-ops/console/secrets","unlisted":false},{"type":"link","label":"Workloads","href":"/docs/for-ops/console/workloads","docId":"for-ops/console/workloads","unlisted":false},{"type":"link","label":"Services","href":"/docs/for-ops/console/services","docId":"for-ops/console/services","unlisted":false},{"type":"link","label":"Backups","href":"/docs/for-ops/console/backups","docId":"for-ops/console/backups","unlisted":false},{"type":"link","label":"Shell","href":"/docs/for-ops/console/shell","docId":"for-ops/console/shell","unlisted":false},{"type":"category","label":"Settings","items":[{"type":"link","label":"Cluster","href":"/docs/for-ops/console/settings/cluster","docId":"for-ops/console/settings/cluster","unlisted":false},{"type":"link","label":"Otomi","href":"/docs/for-ops/console/settings/otomi","docId":"for-ops/console/settings/otomi","unlisted":false},{"type":"link","label":"Key Management","href":"/docs/for-ops/console/settings/key-management","docId":"for-ops/console/settings/key-management","unlisted":false},{"type":"link","label":"Alerts","href":"/docs/for-ops/console/settings/alerts","docId":"for-ops/console/settings/alerts","unlisted":false},{"type":"link","label":"Co-monitoring","href":"/docs/for-ops/console/settings/co-monitoring","docId":"for-ops/console/settings/co-monitoring","unlisted":false},{"type":"link","label":"Azure","href":"/docs/for-ops/console/settings/azure","docId":"for-ops/console/settings/azure","unlisted":false},{"type":"link","label":"DNS","href":"/docs/for-ops/console/settings/dns","docId":"for-ops/console/settings/dns","unlisted":false},{"type":"link","label":"Ingress","href":"/docs/for-ops/console/settings/ingress","docId":"for-ops/console/settings/ingress","unlisted":false},{"type":"link","label":"OIDC","href":"/docs/for-ops/console/settings/oidc","docId":"for-ops/console/settings/oidc","unlisted":false},{"type":"link","label":"SMTP","href":"/docs/for-ops/console/settings/smtp","docId":"for-ops/console/settings/smtp","unlisted":false},{"type":"link","label":"Backup","href":"/docs/for-ops/console/settings/backup","docId":"for-ops/console/settings/backup","unlisted":false}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"How To","items":[{"type":"link","label":"Overview","href":"/docs/for-ops/how-to/overview","docId":"for-ops/how-to/overview","unlisted":false},{"type":"link","label":"Manage the Catalog","href":"/docs/for-ops/how-to/dev-catalog","docId":"for-ops/how-to/use-catalog","unlisted":false},{"type":"link","label":"Manage Ingress Controllers","href":"/docs/for-ops/how-to/ingress-classes","docId":"for-ops/how-to/ingress-classes","unlisted":false},{"type":"link","label":"Use Team Admin","href":"/docs/for-ops/how-to/use-team-admin","docId":"for-ops/how-to/use-team-admin","unlisted":false},{"type":"link","label":"Use Core only","href":"/docs/for-ops/how-to/core-only","docId":"for-ops/how-to/core-only","unlisted":false},{"type":"link","label":"Clone Otomi","href":"/docs/for-ops/how-to/otomi","docId":"for-ops/how-to/clone-otomi","unlisted":false},{"type":"link","label":"Backups","href":"/docs/for-ops/how-to/backups","docId":"for-ops/how-to/backups","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Otomi CLI","items":[{"type":"link","label":"Installation","href":"/docs/for-ops/cli/installation","docId":"for-ops/cli/installation","unlisted":false},{"type":"link","label":"Using Otomi CLI","href":"/docs/for-ops/cli/deploying","docId":"for-ops/cli/deploying","unlisted":false},{"type":"link","label":"Known issues","href":"/docs/for-ops/cli/known-issues","docId":"for-ops/cli/known-issues","unlisted":false},{"type":"category","label":"CLI Commands","items":[{"type":"link","label":"otomi apply","href":"/docs/for-ops/cli/apply","docId":"for-ops/cli/apply","unlisted":false},{"type":"link","label":"otomi bash","href":"/docs/for-ops/cli/bash","docId":"for-ops/cli/bash","unlisted":false},{"type":"link","label":"otomi bootstrap","href":"/docs/for-ops/cli/bootstrap","docId":"for-ops/cli/bootstrap","unlisted":false},{"type":"link","label":"otomi check-policies","href":"/docs/for-ops/cli/check-policies","docId":"for-ops/cli/check-policies","unlisted":false},{"type":"link","label":"otomi commit","href":"/docs/for-ops/cli/commit","docId":"for-ops/cli/commit","unlisted":false},{"type":"link","label":"otomi decrypt","href":"/docs/for-ops/cli/decrypt","docId":"for-ops/cli/decrypt","unlisted":false},{"type":"link","label":"otomi destroy","href":"/docs/for-ops/cli/destroy","docId":"for-ops/cli/destroy","unlisted":false},{"type":"link","label":"otomi diff","href":"/docs/for-ops/cli/diff","docId":"for-ops/cli/diff","unlisted":false},{"type":"link","label":"otomi encrypt","href":"/docs/for-ops/cli/encrypt","docId":"for-ops/cli/encrypt","unlisted":false},{"type":"link","label":"otomi lint","href":"/docs/for-ops/cli/lint","docId":"for-ops/cli/lint","unlisted":false},{"type":"link","label":"otomi pull","href":"/docs/for-ops/cli/pull","docId":"for-ops/cli/pull","unlisted":false},{"type":"link","label":"otomi rotate-keys","href":"/docs/for-ops/cli/rotate-keys","docId":"for-ops/cli/rotate-keys","unlisted":false},{"type":"link","label":"otomi status","href":"/docs/for-ops/cli/status","docId":"for-ops/cli/status","unlisted":false},{"type":"link","label":"otomi sync","href":"/docs/for-ops/cli/sync","docId":"for-ops/cli/sync","unlisted":false},{"type":"link","label":"otomi template","href":"/docs/for-ops/cli/template","docId":"for-ops/cli/template","unlisted":false},{"type":"link","label":"otomi test","href":"/docs/for-ops/cli/test","docId":"for-ops/cli/test","unlisted":false},{"type":"link","label":"otomi validate-templates","href":"/docs/for-ops/cli/validate-templates","docId":"for-ops/cli/validate-templates","unlisted":false},{"type":"link","label":"otomi validate-values","href":"/docs/for-ops/cli/validate-values","docId":"for-ops/cli/validate-values","unlisted":false},{"type":"link","label":"otomi values","href":"/docs/for-ops/cli/values","docId":"for-ops/cli/values","unlisted":false},{"type":"link","label":"otomi x","href":"/docs/for-ops/cli/x","docId":"for-ops/cli/x","unlisted":false}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"SRE","items":[{"type":"link","label":"Overview","href":"/docs/for-ops/sre/overview","docId":"for-ops/sre/overview","unlisted":false},{"type":"link","label":"Daily Routine","href":"/docs/for-ops/sre/daily","docId":"for-ops/sre/daily","unlisted":false},{"type":"link","label":"Upgrades","href":"/docs/for-ops/sre/upgrades","docId":"for-ops/sre/upgrades","unlisted":false},{"type":"link","label":"Troubleshooting","href":"/docs/for-ops/sre/troubleshooting","docId":"for-ops/sre/troubleshooting","unlisted":false}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"For DevOps Teams","items":[{"type":"category","label":"Otomi Console","items":[{"type":"link","label":"Dashboard","href":"/docs/for-devs/console/dashboard","docId":"for-devs/console/dashboard","unlisted":false},{"type":"link","label":"Apps","href":"/docs/for-devs/console/apps","docId":"for-devs/console/apps","unlisted":false},{"type":"link","label":"Otomi Catalog","href":"/docs/for-devs/console/catalog","docId":"for-devs/console/catalog","unlisted":false},{"type":"link","label":"Shortcuts","href":"/docs/for-devs/console/shortcuts","docId":"for-devs/console/shortcuts","unlisted":false},{"type":"link","label":"Projects","href":"/docs/for-devs/console/projects","docId":"for-devs/console/projects","unlisted":false},{"type":"link","label":"Builds","href":"/docs/for-devs/console/builds","docId":"for-devs/console/builds","unlisted":false},{"type":"link","label":"Workloads","href":"/docs/for-devs/console/workloads","docId":"for-devs/console/workloads","unlisted":false},{"type":"link","label":"Services","href":"/docs/for-devs/console/services","docId":"for-devs/console/services","unlisted":false},{"type":"link","label":"Secrets","href":"/docs/for-devs/console/secrets","docId":"for-devs/console/secrets","unlisted":false},{"type":"link","label":"Shell","href":"/docs/for-devs/console/shell","docId":"for-devs/console/shell","unlisted":false},{"type":"link","label":"Deploy Changes","href":"/docs/for-devs/console/deploy-changes","docId":"for-devs/console/deploy-changes","unlisted":false},{"type":"link","label":"Settings","href":"/docs/for-devs/console/settings","docId":"for-devs/console/settings","unlisted":false}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"Otomi Applications","items":[{"type":"link","label":"Alertmanager","href":"/docs/apps/alertmanager","docId":"apps/alertmanager","unlisted":false},{"type":"link","label":"Argo CD","href":"/docs/apps/argocd","docId":"apps/argocd","unlisted":false},{"type":"link","label":"Cert-Manager","href":"/docs/apps/certmanager","docId":"apps/certmanager","unlisted":false},{"type":"link","label":"Cloudnative Postgresql","href":"/docs/apps/cloudnativepg","docId":"apps/cloudnativepg","unlisted":false},{"type":"link","label":"Drone","href":"/docs/apps/drone","docId":"apps/drone","unlisted":false},{"type":"link","label":"ExternalDNS","href":"/docs/apps/external-dns","docId":"apps/external-dns","unlisted":false},{"type":"link","label":"Gatekeeper","href":"/docs/apps/gatekeeper","docId":"apps/gatekeeper","unlisted":false},{"type":"link","label":"Gitea","href":"/docs/apps/gitea","docId":"apps/gitea","unlisted":false},{"type":"link","label":"Grafana","href":"/docs/apps/grafana","docId":"apps/grafana","unlisted":false},{"type":"link","label":"Harbor","href":"/docs/apps/harbor","docId":"apps/harbor","unlisted":false},{"type":"link","label":"Ingress-nginx","href":"/docs/apps/ingress-nginx","docId":"apps/ingress-nginx","unlisted":false},{"type":"link","label":"Istio","href":"/docs/apps/istio","docId":"apps/istio","unlisted":false},{"type":"link","label":"Jaeger","href":"/docs/apps/jaeger","docId":"apps/jaeger","unlisted":false},{"type":"link","label":"Keycloak","href":"/docs/apps/keycloak","docId":"apps/keycloak","unlisted":false},{"type":"link","label":"Knative","href":"/docs/apps/knative","docId":"apps/knative","unlisted":false},{"type":"link","label":"Loki","href":"/docs/apps/loki","docId":"apps/loki","unlisted":false},{"type":"link","label":"Minio","href":"/docs/apps/minio","docId":"apps/minio","unlisted":false},{"type":"link","label":"Open Telemetry Operator","href":"/docs/apps/otel","docId":"apps/otel","unlisted":false},{"type":"link","label":"Prometheus","href":"/docs/apps/prometheus","docId":"apps/prometheus","unlisted":false},{"type":"link","label":"Sealed Secrets","href":"/docs/apps/sealed-secrets","docId":"apps/sealedsecrets","unlisted":false},{"type":"link","label":"Thanos","href":"/docs/apps/thanos","docId":"apps/thanos","unlisted":false},{"type":"link","label":"Trivy Operator","href":"/docs/apps/trivy","docId":"apps/trivy","unlisted":false},{"type":"link","label":"Tekton","href":"/docs/apps/tekton","docId":"apps/tekton","unlisted":false},{"type":"link","label":"Hashicorp Vault","href":"/docs/apps/vault","docId":"apps/vault","unlisted":false},{"type":"link","label":"Velero","href":"/docs/apps/velero","docId":"apps/velero","unlisted":false}],"collapsed":true,"collapsible":true}]},"docs":{"apps/alertmanager":{"id":"apps/alertmanager","title":"Alertmanager","description":"Alertmanager handles alerts sent by client applications such as the Prometheus server. It takes care of de-duplicating, grouping, and routing them to the correct receiver integration such as email, Slack, MS Teams, or OpsGenie. It also takes care of silencing and inhibition of alerts.","sidebar":"mainSidebar"},"apps/argocd":{"id":"apps/argocd","title":"Argo CD","description":"Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes. Argo CD is configured by Otomi to use the SSO provided by keycloak, and maps otomi groups to Argo CD roles. The otomi-admin role is made super admin within Argo CD. The team-admin role has access to Argo CD and is admin of all team projects. Members of team roles are only allowed to administer their own projects. All Teams will automatically get access to a Git repo, and Argo CD is configured to listen to this repo. All a team has to do is to fill their repo with intended state, commit, and automation takes care of the rest.","sidebar":"mainSidebar"},"apps/certmanager":{"id":"apps/certmanager","title":"CertManager","description":"Cert-Manager is used by Otomi to automatically create and rotate wildcard TLS certificates for service endpoints. You may bring your own CA, or let Otomi create one for you. If you bring your own trusted wildcard certificate, then cert-manager will not manage this certificate.","sidebar":"mainSidebar"},"apps/cloudnativepg":{"id":"apps/cloudnativepg","title":"Cloudnative Postgresql","description":"CloudNativePG is used by Otomi to provide Postgresql database for Otomi applications like Harbor and Keycloak. In the values you can configure a storageprovider to store backups in (external) object storage. The backups can be enabled in the settings.","sidebar":"mainSidebar"},"apps/drone":{"id":"apps/drone","title":"Drone","description":"Drone has been deprecated. We advise to use Tekton if you would need to create custom CI/CD pipelines","sidebar":"mainSidebar"},"apps/external-dns":{"id":"apps/external-dns","title":"External-DNS","description":"External-dns is required to make public service domains accessible by registering them with Otomi\'s front loadbalancer CNAME or IP address. When it is not enabled (default) Otomi will instead rely on nip.io to create host names for all services.","sidebar":"mainSidebar"},"apps/falco":{"id":"apps/falco","title":"Falco","description":"Falco can be used for thread detection. Before activating Falco, please first check which Driver to use. If you know which driver should be selected, activate Falco, go to the Values, select the Driver and submit changes. No Deploy Changes"},"apps/gatekeeper":{"id":"apps/gatekeeper","title":"Gatekeeper","description":"Otomi offers Kubernetes security best practices through security constraints defined as OPA policies and enforced by Gatekeeper.","sidebar":"mainSidebar"},"apps/gitea":{"id":"apps/gitea","title":"Gitea","description":"Gitea is a community managed lightweight code hosting solution written in Go. Because Otomi uses Tekton to deploy changes to the values repo, it needs a git hosting solution. When no source control is configured, Otomi will deploy Gitea for Tekton to target as a git repo. Gitea may be used for other purposes, and is especially useful in combination with Tekton as a CI/CD solution. Just like Otomi uses it.","sidebar":"mainSidebar"},"apps/grafana":{"id":"apps/grafana","title":"Grafana","description":"Otomi uses Grafana to visualize Prometheus metrics and Loki logs. Team members are automatically given Editor role, while admins are also given Admin role. It is possible to make configuration changes directly in Grafana, but only to non-conflicting settings. Data sources are preconfigured and must not be edited as changes will be lost when Grafana is redeployed.","sidebar":"mainSidebar"},"apps/harbor":{"id":"apps/harbor","title":"Harbor","description":"Harbor is an open-source registry that secures artifacts with policies and role-based access control, ensures images are scanned and free from vulnerabilities, and signs images as trusted. As a CNCF graduated project, Harbor delivers compliance, performance, and interoperability to help you consistently and securely manage artifacts across cloud-native compute platforms like Kubernetes. (source//goharbor.io/)","sidebar":"mainSidebar"},"apps/ingress-nginx":{"id":"apps/ingress-nginx","title":"NGINX Ingress","description":"Ingress NGINX is the default ingress controller in Otomi and part of the core setup (this means it is not possible use another controller within Otomi).","sidebar":"mainSidebar"},"apps/istio":{"id":"apps/istio","title":"Istio","description":"Since Otomi has security best practices built in, it is designed for intrusion.","sidebar":"mainSidebar"},"apps/jaeger":{"id":"apps/jaeger","title":"Jaeger","description":"Jaeger can be activated by Otomi to gain tracing insights on its network traffic. It runs in anonymous mode and each authenticated user is given the same authorization, allowing them to see everything. In the future this may be limited according to scope such as role and teams.","sidebar":"mainSidebar"},"apps/keycloak":{"id":"apps/keycloak","title":"Keycloak","description":"The SSO login page for Otomi is served by Keycloak. It is used as an identity broker or provider for all Otomi integrated applications. Keycloak is configured with mappers that normalize incoming identities from an IDP to have predictable claims format to be used by Otomi applications.","sidebar":"mainSidebar"},"apps/kiali":{"id":"apps/kiali","title":"Kiali","description":"Kiali can be activated in Otomi to gain observability insights on its network traffic. It runs in anonymous mode and each authenticated user is given the same authorization, allowing them to see everything. In the future this may be limited according to scope such as role and teams."},"apps/knative":{"id":"apps/knative","title":"Knative","description":"Knative can be activated in Otomi to deliver Container-as-a-Service (CaaS) functionality with scale-to-zero possibility. It can be compared to Functions-as-a-service (FaaS) but is container oriented, and takes only one manifest to configure an autoscaling service based on a container image of choice. Otomi uses Istio Virtual Services under the hood to route traffic coming in for a public domain to its backing Knative Service, allowing to set a custom domain.","sidebar":"mainSidebar"},"apps/loki":{"id":"apps/loki","title":"Loki","description":"Loki aggregates all the container logs from the platform and stores them in a storage endpoint of choice (defaults to PVC). When Otomi is installed in multi-tenancy mode (see here) it will split logs from team namespaces and make them available only to team members. Otomi provides shortcuts to selections of logs based on interest. Otomi splits logs per team, installs a dedicated Grafana instance per team and configures authentication for Grafana to allow access for team members only.","sidebar":"mainSidebar"},"apps/minio":{"id":"apps/minio","title":"Minio","description":"Minio can be enabled to provice an in-cluster S3 compatible Object Store service. Minio is by default provisioned to be used by:","sidebar":"mainSidebar"},"apps/otel":{"id":"apps/otel","title":"Open Telemetry Operator","description":"OpenTelemetry Operator is used to create an OTEL Collector to receive telemetry data from Istio and Nginx Ingress (and applications configured with Instrumentation) and export this data to the Tempo backend. Grafana can then be used to see traces.","sidebar":"mainSidebar"},"apps/prometheus":{"id":"apps/prometheus","title":"Prometheus","description":"Prometheus aggregates all the metrics from the platform and stores them in a storage endpoint of choice (defaults to PVC).","sidebar":"mainSidebar"},"apps/sealedsecrets":{"id":"apps/sealedsecrets","title":"Sealed Secrets","description":"Encrypt your Secret into a SealedSecret, which is safe to store - even inside a public repository.","sidebar":"mainSidebar"},"apps/tekton":{"id":"apps/tekton","title":"Tekton","description":"Tekton is used in Otomi for the Builds self-service. When a Build is created, Otomi generates the Tekton Pipeline and Pipelinerun resources. There are 2 types op pipelines:","sidebar":"mainSidebar"},"apps/thanos":{"id":"apps/thanos","title":"Thanos","description":"Thanos can be enabled for multi-cluster metrics retention using an off-site object storage service.","sidebar":"mainSidebar"},"apps/trivy":{"id":"apps/trivy","title":"Trivy Operator","description":"Trivy can be enabled to scan all running containers in all team namespaces. When enabled, the team\'s Grafana instance will be configured to provide a dashboard for teams to see all vulnerabilities within their applications.","sidebar":"mainSidebar"},"apps/vault":{"id":"apps/vault","title":"Hashicorp Vault","description":"Hashicorp Vault is being deprecated. The Otomi Secrets feature is soon going to be based on SealedSecrets.","sidebar":"mainSidebar"},"apps/velero":{"id":"apps/velero","title":"Velero","description":"Velero can be activated for creating backups of PVC\'s and Kubernetes resources.","sidebar":"mainSidebar"},"for-ciso/overview":{"id":"for-ciso/overview","title":"Overview","description":"ISO 27001 controls checklist"},"for-devs/console/apps":{"id":"for-devs/console/apps","title":"Team Apps","description":"The team apps are shared apps on the platform available for teams to use. Click on the app to open the app, or click on the configuration icon to go to the app details:","sidebar":"mainSidebar"},"for-devs/console/builds":{"id":"for-devs/console/builds","title":"Team Builds","description":"A Build in Otomi is a self-service feature for building OCI compliant images based on application source code.","sidebar":"mainSidebar"},"for-devs/console/catalog":{"id":"for-devs/console/catalog","title":"Otomi Catalog","description":"The Catalog is a library of curated Helm charts to create Kubernetes resources. By default the Catalog contains a set of Helm charts provided by Otomi to get started quickly, but they can also be modified depending on your requirements or be removed from the Catalog.","sidebar":"mainSidebar"},"for-devs/console/dashboard":{"id":"for-devs/console/dashboard","title":"Team Dashboard","description":"The team dashboard gives a global overview of information most relevant to the team.","sidebar":"mainSidebar"},"for-devs/console/deploy-changes":{"id":"for-devs/console/deploy-changes","title":"Deploy changes","description":"When a form (build, workload, service, backup, secret) is submitted, Otomi will prepare a commit in the Otomi Values Git repository. When the commit is prepared, the Deploy Changes button in the top of the left menu will become active. To commit your changes, click on the Deploy Changes button.","sidebar":"mainSidebar"},"for-devs/console/projects":{"id":"for-devs/console/projects","title":"Team Projects","description":"A Project in Otomi is a collection of a Build, a Workload and a Service in ONE form.","sidebar":"mainSidebar"},"for-devs/console/secrets":{"id":"for-devs/console/secrets","title":"Team Secrets","description":"Any secret that is created here should have it\'s counterpart in Vault by the same name. Otomi will create kubernetes secrets from those Vault secrets. These can then be used in Otomi Services and Otomi Workloads, as injected env vars, or as file mounts.","sidebar":"mainSidebar"},"for-devs/console/services":{"id":"for-devs/console/services","title":"Team Services","description":"A service in Otomi is a self-service feature for:","sidebar":"mainSidebar"},"for-devs/console/settings":{"id":"for-devs/console/settings","title":"Team Settings","description":"Based on self-service options allowed by the platfrom administrator, team members can change the settings of their team.","sidebar":"mainSidebar"},"for-devs/console/shell":{"id":"for-devs/console/shell","title":"Shell (TTY Console)","description":"The Shell feature allows to start a web based shell in Console with Kube API access. When starting a shell, a dedicated shell instance will be started for the user. The shell includes the following tools:","sidebar":"mainSidebar"},"for-devs/console/shortcuts":{"id":"for-devs/console/shortcuts","title":"Team Shortcuts","description":"The Shortcuts section shows all shortcuts created and available for the team.","sidebar":"mainSidebar"},"for-devs/console/workloads":{"id":"for-devs/console/workloads","title":"Team Workloads","description":"A Workload in Otomi is a self-service feature for creating Kubernetes resources using Helm charts from the Otomi Developer Catalog.","sidebar":"mainSidebar"},"for-ops/cli/apply":{"id":"for-ops/cli/apply","title":"otomi apply","description":"otomi apply [options]","sidebar":"mainSidebar"},"for-ops/cli/bash":{"id":"for-ops/cli/bash","title":"otomi bash","description":"otomi bash","sidebar":"mainSidebar"},"for-ops/cli/bootstrap":{"id":"for-ops/cli/bootstrap","title":"otomi bootstrap","description":"otomi bootstrap [options]","sidebar":"mainSidebar"},"for-ops/cli/check-policies":{"id":"for-ops/cli/check-policies","title":"check-policies","description":"otomi check-policies [options]","sidebar":"mainSidebar"},"for-ops/cli/commit":{"id":"for-ops/cli/commit","title":"otomi commit","description":"otomi commit [options]","sidebar":"mainSidebar"},"for-ops/cli/decrypt":{"id":"for-ops/cli/decrypt","title":"otomi decrypt","description":"otomi decrypt [options]","sidebar":"mainSidebar"},"for-ops/cli/deploying":{"id":"for-ops/cli/deploying","title":"Using Otomi CLI","description":"1. Initialize a values repo","sidebar":"mainSidebar"},"for-ops/cli/destroy":{"id":"for-ops/cli/destroy","title":"otomi destroy","description":"otomi destroy [options]","sidebar":"mainSidebar"},"for-ops/cli/diff":{"id":"for-ops/cli/diff","title":"otomi diff","description":"otomi diff [options]","sidebar":"mainSidebar"},"for-ops/cli/encrypt":{"id":"for-ops/cli/encrypt","title":"otomi encrypt","description":"otomi encrypt [files...] [options]","sidebar":"mainSidebar"},"for-ops/cli/installation":{"id":"for-ops/cli/installation","title":"Installing and using Otomi CLI","description":"Prerequisites","sidebar":"mainSidebar"},"for-ops/cli/known-issues":{"id":"for-ops/cli/known-issues","title":"Known Issues","description":"The otomi (diff|apply|sync|template) commands are delegated to helmfile, which in turn delegates the deployment work to helm. Sometimes it is not clear wether the issue is from Helm or Helmfile, so we will address them together in this section.","sidebar":"mainSidebar"},"for-ops/cli/lint":{"id":"for-ops/cli/lint","title":"otomi lint","description":"otomi lint [options]","sidebar":"mainSidebar"},"for-ops/cli/pull":{"id":"for-ops/cli/pull","title":"otomi pull","description":"otomi pull [options]","sidebar":"mainSidebar"},"for-ops/cli/rotate-keys":{"id":"for-ops/cli/rotate-keys","title":"otomi rotate-keys","description":"otomi rotate-keys [options]","sidebar":"mainSidebar"},"for-ops/cli/status":{"id":"for-ops/cli/status","title":"otomi status","description":"otomi status [options]","sidebar":"mainSidebar"},"for-ops/cli/sync":{"id":"for-ops/cli/sync","title":"otomi sync","description":"otomi sync [options]","sidebar":"mainSidebar"},"for-ops/cli/template":{"id":"for-ops/cli/template","title":"otomi template","description":"otomi template [options]","sidebar":"mainSidebar"},"for-ops/cli/test":{"id":"for-ops/cli/test","title":"otomi test","description":"otomi test [options]","sidebar":"mainSidebar"},"for-ops/cli/validate-templates":{"id":"for-ops/cli/validate-templates","title":"otomi validate-templates","description":"otomi validate-templates [options]","sidebar":"mainSidebar"},"for-ops/cli/validate-values":{"id":"for-ops/cli/validate-values","title":"otomi validate-values","description":"otomi validate-values [options]","sidebar":"mainSidebar"},"for-ops/cli/values":{"id":"for-ops/cli/values","title":"otomi values","description":"otomi values [options]","sidebar":"mainSidebar"},"for-ops/cli/x":{"id":"for-ops/cli/x","title":"otomi x","description":"otomi x","sidebar":"mainSidebar"},"for-ops/console/apps":{"id":"for-ops/console/apps","title":"Platform - Apps","description":"The apps section lists all apps available.","sidebar":"mainSidebar"},"for-ops/console/backups":{"id":"for-ops/console/backups","title":"Platform - Backups","description":"To enable this feature, first make sure Velero is activated.","sidebar":"mainSidebar"},"for-ops/console/builds":{"id":"for-ops/console/builds","title":"Platform - Builds","description":"To enable this feature, first make sure Harbor and Tekton are activated. To be able to push images to Harbor, Otomi needs to be configured with a DNS and trusted certificates (Lets encrypt with production certificates).","sidebar":"mainSidebar"},"for-ops/console/clusters":{"id":"for-ops/console/clusters","title":"Platform - Clusters","description":"All known Otomi clusters are listed here. Clusters can be sorted based on:"},"for-ops/console/dashboard":{"id":"for-ops/console/dashboard","title":"Platform Dashboard","description":"The platform dashboard gives a global overview of information most relevant to the team. In the top bar, select the View: platform.","sidebar":"mainSidebar"},"for-ops/console/deploy-changes":{"id":"for-ops/console/deploy-changes","title":"Deploy changes","description":"When a change has been made, by pressing Submit, the Deploy Changes button will light up to deploy the changes you have made in the console. This will create a commit of the changes to the values repository in Gitea and trigger the Drone pipeline run."},"for-ops/console/overview":{"id":"for-ops/console/overview","title":"Overview","description":"Otomi Console","sidebar":"mainSidebar"},"for-ops/console/policies":{"id":"for-ops/console/policies","title":"Platform - Policies","description":"To enable this feature, first make sure OPA/Gatekeeper is activated.","sidebar":"mainSidebar"},"for-ops/console/projects":{"id":"for-ops/console/projects","title":"Projects","description":"A Project in Otomi is a collection of a Build, a Workload and a Service in ONE form. When a user creates a project, the name of the project will be used for all created tasks (build, workload, service).","sidebar":"mainSidebar"},"for-ops/console/secrets":{"id":"for-ops/console/secrets","title":"Platform - Secrets","description":"To enable this feature, first make sure Hashicorp Vault is activated.","sidebar":"mainSidebar"},"for-ops/console/services":{"id":"for-ops/console/services","title":"Platform - Services","description":"All known Services on the platform are listed here. Services can be sorted based on:","sidebar":"mainSidebar"},"for-ops/console/settings/alerts":{"id":"for-ops/console/settings/alerts","title":"Platform settings","description":"Alerts","sidebar":"mainSidebar"},"for-ops/console/settings/azure":{"id":"for-ops/console/settings/azure","title":"Platform settings","description":"Azure","sidebar":"mainSidebar"},"for-ops/console/settings/backup":{"id":"for-ops/console/settings/backup","title":"Platform settings","description":"Backup","sidebar":"mainSidebar"},"for-ops/console/settings/cluster":{"id":"for-ops/console/settings/cluster","title":"Platform settings","description":"Cluster","sidebar":"mainSidebar"},"for-ops/console/settings/co-monitoring":{"id":"for-ops/console/settings/co-monitoring","title":"Platform settings","description":"Co-Monitoring","sidebar":"mainSidebar"},"for-ops/console/settings/dns":{"id":"for-ops/console/settings/dns","title":"Platform settings","description":"DNS","sidebar":"mainSidebar"},"for-ops/console/settings/ingress":{"id":"for-ops/console/settings/ingress","title":"Platform settings","description":"Ingress","sidebar":"mainSidebar"},"for-ops/console/settings/key-management":{"id":"for-ops/console/settings/key-management","title":"Platform settings","description":"Key management","sidebar":"mainSidebar"},"for-ops/console/settings/oidc":{"id":"for-ops/console/settings/oidc","title":"Platform settings","description":"OIDC","sidebar":"mainSidebar"},"for-ops/console/settings/otomi":{"id":"for-ops/console/settings/otomi","title":"Platform settings","description":"Otomi","sidebar":"mainSidebar"},"for-ops/console/settings/smtp":{"id":"for-ops/console/settings/smtp","title":"Platform settings","description":"SMTP","sidebar":"mainSidebar"},"for-ops/console/shell":{"id":"for-ops/console/shell","title":"Shell","description":"The Shell feature allows to start a web based shell in Otomi Console with Kube API access. When starting a shell, a dedicated shell instance will be started for the user. The shell includes the following tools:","sidebar":"mainSidebar"},"for-ops/console/shortcuts":{"id":"for-ops/console/shortcuts","title":"Platform - Shortcuts","description":"The Shortcuts section shows all shortcuts created and available on the platform for users with the otomi-admin role.","sidebar":"mainSidebar"},"for-ops/console/teams":{"id":"for-ops/console/teams","title":"Platform - Teams","description":"- Teams are tenants on the platform to support Development/DevOps teams, projects or even DTAP","sidebar":"mainSidebar"},"for-ops/console/workloads":{"id":"for-ops/console/workloads","title":"Platform - Workloads","description":"To enable this feature, first make sure Argo CD is activated.","sidebar":"mainSidebar"},"for-ops/how-to/backups":{"id":"for-ops/how-to/backups","title":"Create/Restore backups","description":"When Velero is activated on the platform level, platform admins can create backups of Persistent Volumes (PVs) in Team namespaces using Otomi Console. When creating backups using Otomi Console, a Velero schedule resource is created that will create the backup at a specified time, defined by a Cron expression.","sidebar":"mainSidebar"},"for-ops/how-to/clone-otomi":{"id":"for-ops/how-to/clone-otomi","title":"Clone Otomi Instance","description":"It may happen that you need to move Otomi to another Kubernetes cluster. Because Otomi is a GitOps driven platfrom, you can export existing values that can then be used to install a new Otomi instance.","sidebar":"mainSidebar"},"for-ops/how-to/core-only":{"id":"for-ops/how-to/core-only","title":"Use Otomi Core only","description":"Otomi by default installs Gitea, Drone, Otomi API and Otomi Console. Otomi Console is the self-service UI and uses Otomi API to generate validated configuration code. This configuration code is then committed to Gitea (in the values repository), which will trigger teh pre-configured Drone pipeline to apply the changes.","sidebar":"mainSidebar"},"for-ops/how-to/ingress-classes":{"id":"for-ops/how-to/ingress-classes","title":"Manage Ingress Controllers","description":"When Otomi is installed, exposure (ingress) for all services (included exposure for platform services) is handeled by the default platform ingress class using a public (cloud) load balancer. Otomi offers the option to use multiple ingress classes. Each class get a dedicated ingress controller. In case of security requirements, where platform services are not allowed to be exposed publicly, the default platform class can be configured to use a private load balancer instead of a public one. Additional (public) ingress classes can be created to expose team (application) services.","sidebar":"mainSidebar"},"for-ops/how-to/overview":{"id":"for-ops/how-to/overview","title":"How to\'s for Ops","description":"How to\'s for Ops / Platform administrators","sidebar":"mainSidebar"},"for-ops/how-to/switch-to-dns":{"id":"for-ops/how-to/switch-to-dns","title":"Switch to use DNS","description":"When Otomi is installed with minimal values, a custom CA is generated and Otomi uses nip.io for host names. It is possible to switch from nip.io to using a DNS zone after installing Otomi initially without DNS. To switch from nip.io to a DNS zone, follow the instructions as described below."},"for-ops/how-to/use-catalog":{"id":"for-ops/how-to/use-catalog","title":"Managing the Catalog","description":"Otomi offers a Catalog to Teams on the platform to offer them golden path templates (Helm charts). This is how it works:","sidebar":"mainSidebar"},"for-ops/how-to/use-team-admin":{"id":"for-ops/how-to/use-team-admin","title":"Use team-admin","description":"When Otomi is installed, by default a team called team-admin is created. The Admin Team is no regular team. This team for instance has no apps. Instead the admin needs to use the platform apps to see logs and metrics of workloads deployed in the team-admin namespace.","sidebar":"mainSidebar"},"for-ops/sre/daily":{"id":"for-ops/sre/daily","title":"SRE Daily Routine","description":"As an SRE you would like to keep your daily tasks to a minimum and be automatically informed on issues. Otomi offers the following tooling to automate this:","sidebar":"mainSidebar"},"for-ops/sre/overview":{"id":"for-ops/sre/overview","title":"SRE Overview","description":"Otomi is a set of functions built on top of a suite of pre-configured and integrated open source applications. Instead of selecting, configuring, and integrating all the parts that are needed to securely manage containerized applications in multi- and hybrid environments, Otomi offers all required parts in a single package. Otomi can be seen as any other Kubernetes application or add-on, with the difference that Otomi is pre-configured and offers a higher abstraction of configuration for all the integrated solutions. All integrated applications can however be used freely, meaning that a user can benefit from the pre-configuration to start using the offered applications.","sidebar":"mainSidebar"},"for-ops/sre/troubleshooting":{"id":"for-ops/sre/troubleshooting","title":"SRE Troubleshooting Checklist","description":"Pods not starting","sidebar":"mainSidebar"},"for-ops/sre/upgrades":{"id":"for-ops/sre/upgrades","title":"Upgrades","description":"Introduction","sidebar":"mainSidebar"},"get-started/activation":{"id":"get-started/activation","title":"Activation steps","description":"Follow the steps below to activate Otomi after initial installation.","sidebar":"mainSidebar"},"get-started/installation/aws":{"id":"get-started/installation/aws","title":"AWS","description":"Prerequisites","sidebar":"mainSidebar"},"get-started/installation/azure":{"id":"get-started/installation/azure","title":"Azure","description":"Prerequisites","sidebar":"mainSidebar"},"get-started/installation/byo-wildcard":{"id":"get-started/installation/byo-wildcard","title":"BYO Wild card Certificate","description":"When installing Otomi with DNS, there are 3 issuers you can use:","sidebar":"mainSidebar"},"get-started/installation/civo":{"id":"get-started/installation/civo","title":"Civo","description":"Otomi can also be installed using the Civo marketplace. When Otomi is installed using the Civo marketplace, Otomi is installed without DNS! To see the full potential of Otomi, install Otomi with DNS as described here.","sidebar":"mainSidebar"},"get-started/installation/custom":{"id":"get-started/installation/custom","title":"Custom","description":"To install Otomi on any other cloud or infrastructure platform, use the custom provider in Otomi. Make sure your infrastructure adheres to the following pre-requisites:","sidebar":"mainSidebar"},"get-started/installation/digitalocean":{"id":"get-started/installation/digitalocean","title":"Digital Ocean","description":"Otomi can be installed as a 1-click-app on DigitalOcean marketplace. You can find the install instructions here.","sidebar":"mainSidebar"},"get-started/installation/entrypoint":{"id":"get-started/installation/entrypoint","title":"Install Otomi with entrypoint","description":"In some cases, the Kubernetes cluster will de deployed in a private setup where public access is only possible using an external gateway or firewall.","sidebar":"mainSidebar"},"get-started/installation/gcp":{"id":"get-started/installation/gcp","title":"Google Cloud Platform","description":"Prerequisites","sidebar":"mainSidebar"},"get-started/installation/helm":{"id":"get-started/installation/helm","title":"Helm","description":"Add the Otomi repository","sidebar":"mainSidebar"},"get-started/installation/kms":{"id":"get-started/installation/kms","title":"Use KMS to manage keys for encryption","description":"If you would like the secrets in the values repository to be encrypted, you will have to setup an account with your Key Management Service (KMS) provider. It is needed by sops, the tool used for encryption.","sidebar":"mainSidebar"},"get-started/installation/known-issues":{"id":"get-started/installation/known-issues","title":"Known Installation Issues","description":"Metrics server does not start with untrusted Kube API certificates","sidebar":"mainSidebar"},"get-started/installation/linode":{"id":"get-started/installation/linode","title":"Linode","description":"Install Otomi on Linode Kubernetes Engine (LKE) with Linode DNS","sidebar":"mainSidebar"},"get-started/installation/minikube":{"id":"get-started/installation/minikube","title":"Minikube","description":"Otomi does NOT support ARM architecture and therefor can not be installed on Apple MacBook with Apple M1 chipset"},"get-started/installation/oidc":{"id":"get-started/installation/oidc","title":"Azure AD for OIDC","description":"The authentication of brokered identities through Azure AD requires a service principal with certain Azure AD API permissions. An app registration needs to be created with the following API permissions:","sidebar":"mainSidebar"},"get-started/installation/overview":{"id":"get-started/installation/overview","title":"Installation","description":"How to install Otomi on various cloud and infrastructure platforms","sidebar":"mainSidebar"},"get-started/installation/scaleway":{"id":"get-started/installation/scaleway","title":"Scaleway","description":"Prerequisites","sidebar":"mainSidebar"},"get-started/installation/vultr":{"id":"get-started/installation/vultr","title":"Vultr","description":"Prerequisites","sidebar":"mainSidebar"},"get-started/labs/lab-1":{"id":"get-started/labs/lab-1","title":"Prerequisites for getting started","description":"Welcome to Otomi! If you would like to explore Otomi, this getting started guide is for you.","sidebar":"mainSidebar"},"get-started/labs/lab-10":{"id":"get-started/labs/lab-10","title":"Using Argo CD","description":"Learn how to deploy your applications on Kubernetes using Argo CD with this comprehensive guide. Discover how to manage resources effectively using Git and streamline your deployment process.","sidebar":"mainSidebar"},"get-started/labs/lab-11":{"id":"get-started/labs/lab-11","title":"Configure auto image updater","description":"When using the Workload feature in Otomi to deploy Helm charts from the Developer Catalog, then you can also use the Auto image updater feature to to automatically update the container images of Kubernetes workloads.","sidebar":"mainSidebar"},"get-started/labs/lab-12":{"id":"get-started/labs/lab-12","title":"Deploy a BYO Helm chart","description":"Otomi offers a self-service feature to create 3 types of workloads:"},"get-started/labs/lab-13":{"id":"get-started/labs/lab-13","title":"Deploy workloads using Otomi","description":"In the previous lab we deployed a workload using Argo CD with a BYO manifest and we explored the Catalog. In this lab we\'ll create a workload (a Kubernetes Deployment) using the Catalog and the Workload feature.","sidebar":"mainSidebar"},"get-started/labs/lab-14":{"id":"get-started/labs/lab-14","title":"Deploy serverless workloads","description":"Prerequisite: For this lab, Argo CD needs to be activated."},"get-started/labs/lab-15":{"id":"get-started/labs/lab-15","title":"Check policy compliance","description":"Prerequisite: For this lab, Gatekeeper needs to be activated.","sidebar":"mainSidebar"},"get-started/labs/lab-16":{"id":"get-started/labs/lab-16","title":"Check for threads","description":"Prerequisite: For this lab, Falco needs to be activated."},"get-started/labs/lab-17":{"id":"get-started/labs/lab-17","title":"Scan your running containers for vulnerabilities","description":"Trivy need to be activated for this lab.","sidebar":"mainSidebar"},"get-started/labs/lab-18":{"id":"get-started/labs/lab-18","title":"Publicly expose workloads","description":"When you have deployed your application using the Workloads feature, you will probably like to expose it publicly. In this lab we\'ll create a Service in Otomi to expose your application publicly. When you create a Service, Otomi will create the Istio virtual service and configure ingress for your application.","sidebar":"mainSidebar"},"get-started/labs/lab-19":{"id":"get-started/labs/lab-19","title":"Configuring network policies","description":"In some cases you want to explicitly allow access to your application. This can be done by creating network policies. Otomi supports 2 types of network policies:","sidebar":"mainSidebar"},"get-started/labs/lab-2":{"id":"get-started/labs/lab-2","title":"Access Otomi Console and download the KUBECFG","description":"When you have received the URL of the web UI of Otomi Platform and have a username/password with access permissions, then it\'s time to sign-in"},"get-started/labs/lab-20":{"id":"get-started/labs/lab-20","title":"View container logs","description":"Loki, Minio, Prometheus and Grafana need to be activated for this lab.","sidebar":"mainSidebar"},"get-started/labs/lab-21":{"id":"get-started/labs/lab-21","title":"View container metrics","description":"Prometheus and Grafana for the Team need to be activated for this lab.","sidebar":"mainSidebar"},"get-started/labs/lab-22":{"id":"get-started/labs/lab-22","title":"Using custom metrics","description":"What are custom metrics","sidebar":"mainSidebar"},"get-started/labs/lab-23":{"id":"get-started/labs/lab-23","title":"Monitoring service availability","description":"When your application is deployed, you would of course like to get an alert when you application (service) is not available anymore. To automatically monitor you applications for availability, Otomi automatically configures a prope to monitor your service.","sidebar":"mainSidebar"},"get-started/labs/lab-24":{"id":"get-started/labs/lab-24","title":"Create a PostgreSQL database","description":"Otomi by default installs the Cloudnative POstgreSQL database operator. Teams can use the operator and the postgresql quick start to create their own PostgreSQL databases.","sidebar":"mainSidebar"},"get-started/labs/lab-25":{"id":"get-started/labs/lab-25","title":"Monitor PostgreSQL databases","description":"If you previously created a database, you\'ll noticed that we did not let the operator create a PodMonitor. The reason of this, is that the PodMonitor requires specific lables to be picked-up by the team\'s own Prometheus. In this lab we\'ll create a custom PodMonitor and create a dashboard in the team\'s own Grafana."},"get-started/labs/lab-26":{"id":"get-started/labs/lab-26","title":"Trigger builds","description":"In the previous lab we created a build in Otomi using the blue repo in Gitea. In this lab we\'ll create a build for the green repo and trigger the build based on a webhook.","sidebar":"mainSidebar"},"get-started/labs/lab-27":{"id":"get-started/labs/lab-27","title":"OpenTelemetry","description":"In order to make a system observable, it must be instrumented. Language specific implementation of OpenTelemetry provides a way to instrument your application without touching your source code. In this lab we\'re going to instrument a Java application.","sidebar":"mainSidebar"},"get-started/labs/lab-28":{"id":"get-started/labs/lab-28","title":"Canary deployments","description":"In this lab we are going to create a canary deployment. The idea behind canary deployment (or rollout) is to introduce a new version of a service by first testing it using a small percentage of user traffic, and then if all goes well the percentage while simultaneously phasing out the old version.","sidebar":"mainSidebar"},"get-started/labs/lab-29":{"id":"get-started/labs/lab-29","title":"Explore the Catalog","description":"In this lab we are going to explore the Catalog in Otomi. The Catalog is a library of curated Helm charts to create Kubernetes resources. By default the Catalog contains a set of Helm charts provided by Otomi to get started quickly, but they can also be modified depending on your requirements or be removed from the Catalog. The contents of the Catalog and the RBAC configuration (which Team can use which Helm chart) are managed by the platform administrator. Contact the platform administrator if you would like to add your own charts to use within your Team.","sidebar":"mainSidebar"},"get-started/labs/lab-3":{"id":"get-started/labs/lab-3","title":"Create a private Git repo","description":"As a developer you\'ll need a Git repository for your code. Most organizations will probably have a central code repository like Gitlab, or use Github. But if you don\'t, Otomi has you covered. Otomi includes a complete self-hosted Git solution called Gitea.","sidebar":"mainSidebar"},"get-started/labs/lab-30":{"id":"get-started/labs/lab-30","title":"Create custom dashboards","description":"In the lab Using custom metrics we created a Workload with a ServiceMonitor so the Team\'s Prometheus can scrape our custom metrics. In this lab we are going to create a custom Grafana dashboard and add the dashboard to a Configmap so the Team\'s Grafana will automatically load the dashboard.","sidebar":"mainSidebar"},"get-started/labs/lab-31":{"id":"get-started/labs/lab-31","title":"Create custom rules","description":"Now we are exporting metrics, these metrics can also be used to generate alerts. To generate alerts, we first need to create a Prometheus Rule:","sidebar":"mainSidebar"},"get-started/labs/lab-32":{"id":"get-started/labs/lab-32","title":"Create projects","description":"A Project in Otomi is a collection of a Build, a Workload and a Service. The benefit of using Projects is that you can create a Build, a Workload and a Service in one run. Projects are ideal for developers to run multiple code branches next to each other and automatically update the deployment based on a push. In this lab we are going to create a Project and see how everything now comes together is one simple form.","sidebar":"mainSidebar"},"get-started/labs/lab-4":{"id":"get-started/labs/lab-4","title":"Create a CI pipeline","description":"Kubernetes is a container orchestrator, so we need to create container images that we can deploy. Next to providing a Git service. Otomi also has a complete CI solution called Drone integrated. You can use Drone to create and run CI pipelines to build images and push them to your private image registry (Harbor)."},"get-started/labs/lab-5":{"id":"get-started/labs/lab-5","title":"Push your container images","description":"For this lab, Harbor needs to be activated and the cluster needs to be configured with trusted certificates (like Let\'s Encrypt using production certificate)."},"get-started/labs/lab-6":{"id":"get-started/labs/lab-6","title":"Build images from application source","description":"Harbor needs to be activated for this lab.","sidebar":"mainSidebar"},"get-started/labs/lab-7":{"id":"get-started/labs/lab-7","title":"Scan your images for vulnerabilities","description":"Prerequisites","sidebar":"mainSidebar"},"get-started/labs/lab-8":{"id":"get-started/labs/lab-8","title":"Create secrets","description":"Hashicorp Vault needs to be activated for this lab.","sidebar":"mainSidebar"},"get-started/labs/lab-9":{"id":"get-started/labs/lab-9","title":"Deploy your application","description":"Now that you have access to the team namespace and have pushed your image to Harbor, you can now deploy your application."},"get-started/labs/overview":{"id":"get-started/labs/overview","title":"Labs Overview","description":"Welcome to Otomi! If you are going to use Otomi or like to learn Kubernetes, these labs are for you. Step by step we\'ll guide you in how to build, deploy, secure and observe containerized applications on Kubernetes. The labs cover the most common activities performed by developer- and/or DevOps teams when using Kubernetes with Otomi.","sidebar":"mainSidebar"},"get-started/overview":{"id":"get-started/overview","title":"Overview","description":"How to get started with Otomi","sidebar":"mainSidebar"},"get-started/prerequisites":{"id":"get-started/prerequisites","title":"Prerequisites","description":"Client binaries","sidebar":"mainSidebar"},"get-started/promo":{"id":"get-started/promo","title":"Promotions","description":"This is your chance to win an Amazon Gift Card!","sidebar":"mainSidebar"},"tutorials/overview":{"id":"tutorials/overview","title":"Tutorial Overview","description":"This section contains tutorials for more advanced installation scenario\'s."},"tutorials/tutorial-1":{"id":"tutorials/tutorial-1","title":"Installing Otomi","description":"To go through the tutorials, you first need to install Otomi on a running Kubernetes cluster."},"tutorials/tutorial-10":{"id":"tutorials/tutorial-10","title":"Creating a micro service architecture","description":"In this tutorial we are going to deploy multiple services from different teams and expose them using a shared domain, but each on their own path. We will use on-the-fly Knative services for speed and simplicity."},"tutorials/tutorial-2":{"id":"tutorials/tutorial-2","title":"Creating teams","description":"In this tutorial, we are going to create a Team in Otomi. Teams in Otomi serve the following purpose:"},"tutorials/tutorial-3":{"id":"tutorials/tutorial-3","title":"Activating tools","description":"Core Apps"},"tutorials/tutorial-4":{"id":"tutorials/tutorial-4","title":"Build, tag and push an image to Harbor","description":"When Otomi is installed without using Let\'s Encrypt production certificates, make sure you download the CA.crt, add it to your Keychain and restarted Docker."},"tutorials/tutorial-5":{"id":"tutorials/tutorial-5","title":"Create a Workload","description":"In his tutorial, we are going to create a Workload in Otomi."},"tutorials/tutorial-6":{"id":"tutorials/tutorial-6","title":"Create a Service","description":"In his tutorial, we are going to create a Service in Otomi to publicly expose the ClusterIP service of the Workload we deployed in the previous tutorial."},"tutorials/tutorial-7":{"id":"tutorials/tutorial-7","title":"Using Knative","description":"In this lab, we are going to:"},"tutorials/tutorial-8":{"id":"tutorials/tutorial-8","title":"Using secrets","description":"In his tutorial, you are going to:"},"tutorials/tutorial-9":{"id":"tutorials/tutorial-9","title":"Configuring network policies","description":"In this tutorial we are going to deploy a multi tier web application, called guestbook, register the 3 K8s services in Otomi and configure public access to the frontend service. Next, we will turn on the Network policies option for the team."},"tutorials/tutorial-create-byo-ksvc":{"id":"tutorials/tutorial-create-byo-ksvc","title":"Create a Knative service","description":"In this tutorial, you are going to deploy the image you build, tagged and pushed to harbor in the previous tutorial by creating a Knative service."},"tutorials/tutorial-create-byo-svc":{"id":"tutorials/tutorial-create-byo-svc","title":"Create a Kubernetes service","description":"In this tutorial, we are going to deploy the image we pushed to harbor in the previous tutorial, by creating a Kubernetes Deployment and Service."},"tutorials/tutorial-create-otomi-ksvc":{"id":"tutorials/tutorial-create-otomi-ksvc","title":"Create and expose a Knative service with Otomi","description":"In his tutorial, we are going to create a Knative service with Otomi Console and publicly expose it."},"tutorials/tutorial-use-secrets":{"id":"tutorials/tutorial-use-secrets","title":"Use secrets in Kubernetes","description":"In his tutorial, you are going to use the secret created in Hashicorp Vault and added to Kubernetes using the Otomi Secrets feature in a Kubernetes deployment."}}}')}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.f7526456.js b/assets/js/935f2afb.f7526456.js new file mode 100644 index 000000000..dc7e97161 --- /dev/null +++ b/assets/js/935f2afb.f7526456.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"mainSidebar":[{"type":"category","label":"Getting Started","items":[{"type":"link","label":"Overview","href":"/docs/get-started/overview","docId":"get-started/overview","unlisted":false},{"type":"link","label":"Promotions","href":"/docs/get-started/promotions","docId":"get-started/promo","unlisted":false},{"type":"link","label":"Prerequisites","href":"/docs/get-started/prerequisites","docId":"get-started/prerequisites","unlisted":false},{"type":"category","label":"Installation","items":[{"type":"link","label":"Overview","href":"/docs/get-started/installation/overview","docId":"get-started/installation/overview","unlisted":false},{"type":"link","label":"AWS","href":"/docs/get-started/installation/aws","docId":"get-started/installation/aws","unlisted":false},{"type":"link","label":"Azure","href":"/docs/get-started/installation/azure","docId":"get-started/installation/azure","unlisted":false},{"type":"link","label":"Civo","href":"/docs/get-started/installation/civo","docId":"get-started/installation/civo","unlisted":false},{"type":"link","label":"Custom","href":"/docs/get-started/installation/custom","docId":"get-started/installation/custom","unlisted":false},{"type":"link","label":"Digital Ocean","href":"/docs/get-started/installation/digitalocean","docId":"get-started/installation/digitalocean","unlisted":false},{"type":"link","label":"Google Cloud Platform","href":"/docs/get-started/installation/gcp","docId":"get-started/installation/gcp","unlisted":false},{"type":"link","label":"Linode","href":"/docs/get-started/installation/linode","docId":"get-started/installation/linode","unlisted":false},{"type":"link","label":"Scaleway","href":"/docs/get-started/installation/scaleway","docId":"get-started/installation/scaleway","unlisted":false},{"type":"link","label":"Vultr","href":"/docs/get-started/installation/vultr","docId":"get-started/installation/vultr","unlisted":false},{"type":"link","label":"Helm","href":"/docs/get-started/installation/helm","docId":"get-started/installation/helm","unlisted":false},{"type":"link","label":"Known Issues","href":"/docs/get-started/installation/known-issues","docId":"get-started/installation/known-issues","unlisted":false},{"type":"link","label":"OIDC","href":"/docs/get-started/installation/oidc","docId":"get-started/installation/oidc","unlisted":false},{"type":"link","label":"KMS","href":"/docs/get-started/installation/kms","docId":"get-started/installation/kms","unlisted":false},{"type":"link","label":"EntryPoint","href":"/docs/get-started/installation/entrypoint","docId":"get-started/installation/entrypoint","unlisted":false},{"type":"link","label":"BYO Wild Card Cert","href":"/docs/get-started/installation/byo-wildcard-cert","docId":"get-started/installation/byo-wildcard","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Activation","href":"/docs/get-started/activation","docId":"get-started/activation","unlisted":false},{"type":"category","label":"Otomi labs","items":[{"type":"link","label":"Labs Overview","href":"/docs/get-started/labs/overview","docId":"get-started/labs/overview","unlisted":false},{"type":"link","label":"Prerequisites","href":"/docs/get-started/labs/lab-1","docId":"get-started/labs/lab-1","unlisted":false},{"type":"link","label":"Create GIT repos","href":"/docs/get-started/labs/lab-3","docId":"get-started/labs/lab-3","unlisted":false},{"type":"link","label":"Build images","href":"/docs/get-started/labs/lab-6","docId":"get-started/labs/lab-6","unlisted":false},{"type":"link","label":"Trigger builds","href":"/docs/get-started/labs/lab-26","docId":"get-started/labs/lab-26","unlisted":false},{"type":"link","label":"Create secrets","href":"/docs/get-started/labs/lab-8","docId":"get-started/labs/lab-8","unlisted":false},{"type":"link","label":"Using Argo CD","href":"/docs/get-started/labs/deploy-workloads-argo-cd-otomi-kubernetes","docId":"get-started/labs/lab-10","unlisted":false},{"type":"link","label":"Explore the Catalog","href":"/docs/get-started/labs/lab-29","docId":"get-started/labs/lab-29","unlisted":false},{"type":"link","label":"Create workloads","href":"/docs/get-started/labs/lab-13","docId":"get-started/labs/lab-13","unlisted":false},{"type":"link","label":"Expose services","href":"/docs/get-started/labs/lab-18","docId":"get-started/labs/lab-18","unlisted":false},{"type":"link","label":"Configure auto image updater","href":"/docs/get-started/labs/lab-11","docId":"get-started/labs/lab-11","unlisted":false},{"type":"link","label":"Create projects","href":"/docs/get-started/labs/lab-32","docId":"get-started/labs/lab-32","unlisted":false},{"type":"link","label":"Create a database","href":"/docs/get-started/labs/lab-24","docId":"get-started/labs/lab-24","unlisted":false},{"type":"link","label":"Check policy compliance","href":"/docs/get-started/labs/lab-15","docId":"get-started/labs/lab-15","unlisted":false},{"type":"link","label":"Scan images","href":"/docs/get-started/labs/lab-7","docId":"get-started/labs/lab-7","unlisted":false},{"type":"link","label":"Scan containers","href":"/docs/get-started/labs/lab-17","docId":"get-started/labs/lab-17","unlisted":false},{"type":"link","label":"View container logs","href":"/docs/get-started/labs/lab-20","docId":"get-started/labs/lab-20","unlisted":false},{"type":"link","label":"View container metrics","href":"/docs/get-started/labs/lab-21","docId":"get-started/labs/lab-21","unlisted":false},{"type":"link","label":"Using custom metrics","href":"/docs/get-started/labs/lab-22","docId":"get-started/labs/lab-22","unlisted":false},{"type":"link","label":"Create custom dashboards","href":"/docs/get-started/labs/lab-30","docId":"get-started/labs/lab-30","unlisted":false},{"type":"link","label":"Create custom rules","href":"/docs/get-started/labs/lab-31","docId":"get-started/labs/lab-31","unlisted":false},{"type":"link","label":"Monitor services","href":"/docs/get-started/labs/lab-23","docId":"get-started/labs/lab-23","unlisted":false},{"type":"link","label":"Configure network policies","href":"/docs/get-started/labs/lab-19","docId":"get-started/labs/lab-19","unlisted":false},{"type":"link","label":"Use OpenTelemery","href":"/docs/get-started/labs/lab-27","docId":"get-started/labs/lab-27","unlisted":false},{"type":"link","label":"Canary Deployments","href":"/docs/get-started/labs/lab-28","docId":"get-started/labs/lab-28","unlisted":false},{"type":"link","label":"Create RabbitMQ cluster","href":"/docs/get-started/labs/lab-33","docId":"get-started/labs/lab-33","unlisted":false}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"For Platform Admins","items":[{"type":"category","label":"Otomi Console","items":[{"type":"link","label":"Overview","href":"/docs/for-ops/console/overview","docId":"for-ops/console/overview","unlisted":false},{"type":"link","label":"Dashboard","href":"/docs/for-ops/console/dashboard","docId":"for-ops/console/dashboard","unlisted":false},{"type":"link","label":"Apps","href":"/docs/for-ops/console/apps","docId":"for-ops/console/apps","unlisted":false},{"type":"link","label":"Shortcuts","href":"/docs/for-ops/console/shortcuts","docId":"for-ops/console/shortcuts","unlisted":false},{"type":"link","label":"Policies","href":"/docs/for-ops/console/policies","docId":"for-ops/console/policies","unlisted":false},{"type":"link","label":"Teams","href":"/docs/for-ops/console/teams","docId":"for-ops/console/teams","unlisted":false},{"type":"link","label":"Projects","href":"/docs/for-ops/console/projects","docId":"for-ops/console/projects","unlisted":false},{"type":"link","label":"Builds","href":"/docs/for-ops/console/builds","docId":"for-ops/console/builds","unlisted":false},{"type":"link","label":"Secrets","href":"/docs/for-ops/console/secrets","docId":"for-ops/console/secrets","unlisted":false},{"type":"link","label":"Workloads","href":"/docs/for-ops/console/workloads","docId":"for-ops/console/workloads","unlisted":false},{"type":"link","label":"Services","href":"/docs/for-ops/console/services","docId":"for-ops/console/services","unlisted":false},{"type":"link","label":"Backups","href":"/docs/for-ops/console/backups","docId":"for-ops/console/backups","unlisted":false},{"type":"link","label":"Shell","href":"/docs/for-ops/console/shell","docId":"for-ops/console/shell","unlisted":false},{"type":"category","label":"Settings","items":[{"type":"link","label":"Cluster","href":"/docs/for-ops/console/settings/cluster","docId":"for-ops/console/settings/cluster","unlisted":false},{"type":"link","label":"Otomi","href":"/docs/for-ops/console/settings/otomi","docId":"for-ops/console/settings/otomi","unlisted":false},{"type":"link","label":"Key Management","href":"/docs/for-ops/console/settings/key-management","docId":"for-ops/console/settings/key-management","unlisted":false},{"type":"link","label":"Alerts","href":"/docs/for-ops/console/settings/alerts","docId":"for-ops/console/settings/alerts","unlisted":false},{"type":"link","label":"Co-monitoring","href":"/docs/for-ops/console/settings/co-monitoring","docId":"for-ops/console/settings/co-monitoring","unlisted":false},{"type":"link","label":"Azure","href":"/docs/for-ops/console/settings/azure","docId":"for-ops/console/settings/azure","unlisted":false},{"type":"link","label":"DNS","href":"/docs/for-ops/console/settings/dns","docId":"for-ops/console/settings/dns","unlisted":false},{"type":"link","label":"Ingress","href":"/docs/for-ops/console/settings/ingress","docId":"for-ops/console/settings/ingress","unlisted":false},{"type":"link","label":"OIDC","href":"/docs/for-ops/console/settings/oidc","docId":"for-ops/console/settings/oidc","unlisted":false},{"type":"link","label":"SMTP","href":"/docs/for-ops/console/settings/smtp","docId":"for-ops/console/settings/smtp","unlisted":false},{"type":"link","label":"Backup","href":"/docs/for-ops/console/settings/backup","docId":"for-ops/console/settings/backup","unlisted":false}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"How To","items":[{"type":"link","label":"Overview","href":"/docs/for-ops/how-to/overview","docId":"for-ops/how-to/overview","unlisted":false},{"type":"link","label":"Manage the Catalog","href":"/docs/for-ops/how-to/dev-catalog","docId":"for-ops/how-to/use-catalog","unlisted":false},{"type":"link","label":"Manage Ingress Controllers","href":"/docs/for-ops/how-to/ingress-classes","docId":"for-ops/how-to/ingress-classes","unlisted":false},{"type":"link","label":"Use Team Admin","href":"/docs/for-ops/how-to/use-team-admin","docId":"for-ops/how-to/use-team-admin","unlisted":false},{"type":"link","label":"Use Core only","href":"/docs/for-ops/how-to/core-only","docId":"for-ops/how-to/core-only","unlisted":false},{"type":"link","label":"Clone Otomi","href":"/docs/for-ops/how-to/otomi","docId":"for-ops/how-to/clone-otomi","unlisted":false},{"type":"link","label":"Backups","href":"/docs/for-ops/how-to/backups","docId":"for-ops/how-to/backups","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Otomi CLI","items":[{"type":"link","label":"Installation","href":"/docs/for-ops/cli/installation","docId":"for-ops/cli/installation","unlisted":false},{"type":"link","label":"Using Otomi CLI","href":"/docs/for-ops/cli/deploying","docId":"for-ops/cli/deploying","unlisted":false},{"type":"link","label":"Known issues","href":"/docs/for-ops/cli/known-issues","docId":"for-ops/cli/known-issues","unlisted":false},{"type":"category","label":"CLI Commands","items":[{"type":"link","label":"otomi apply","href":"/docs/for-ops/cli/apply","docId":"for-ops/cli/apply","unlisted":false},{"type":"link","label":"otomi bash","href":"/docs/for-ops/cli/bash","docId":"for-ops/cli/bash","unlisted":false},{"type":"link","label":"otomi bootstrap","href":"/docs/for-ops/cli/bootstrap","docId":"for-ops/cli/bootstrap","unlisted":false},{"type":"link","label":"otomi check-policies","href":"/docs/for-ops/cli/check-policies","docId":"for-ops/cli/check-policies","unlisted":false},{"type":"link","label":"otomi commit","href":"/docs/for-ops/cli/commit","docId":"for-ops/cli/commit","unlisted":false},{"type":"link","label":"otomi decrypt","href":"/docs/for-ops/cli/decrypt","docId":"for-ops/cli/decrypt","unlisted":false},{"type":"link","label":"otomi destroy","href":"/docs/for-ops/cli/destroy","docId":"for-ops/cli/destroy","unlisted":false},{"type":"link","label":"otomi diff","href":"/docs/for-ops/cli/diff","docId":"for-ops/cli/diff","unlisted":false},{"type":"link","label":"otomi encrypt","href":"/docs/for-ops/cli/encrypt","docId":"for-ops/cli/encrypt","unlisted":false},{"type":"link","label":"otomi lint","href":"/docs/for-ops/cli/lint","docId":"for-ops/cli/lint","unlisted":false},{"type":"link","label":"otomi pull","href":"/docs/for-ops/cli/pull","docId":"for-ops/cli/pull","unlisted":false},{"type":"link","label":"otomi rotate-keys","href":"/docs/for-ops/cli/rotate-keys","docId":"for-ops/cli/rotate-keys","unlisted":false},{"type":"link","label":"otomi status","href":"/docs/for-ops/cli/status","docId":"for-ops/cli/status","unlisted":false},{"type":"link","label":"otomi sync","href":"/docs/for-ops/cli/sync","docId":"for-ops/cli/sync","unlisted":false},{"type":"link","label":"otomi template","href":"/docs/for-ops/cli/template","docId":"for-ops/cli/template","unlisted":false},{"type":"link","label":"otomi test","href":"/docs/for-ops/cli/test","docId":"for-ops/cli/test","unlisted":false},{"type":"link","label":"otomi validate-templates","href":"/docs/for-ops/cli/validate-templates","docId":"for-ops/cli/validate-templates","unlisted":false},{"type":"link","label":"otomi validate-values","href":"/docs/for-ops/cli/validate-values","docId":"for-ops/cli/validate-values","unlisted":false},{"type":"link","label":"otomi values","href":"/docs/for-ops/cli/values","docId":"for-ops/cli/values","unlisted":false},{"type":"link","label":"otomi x","href":"/docs/for-ops/cli/x","docId":"for-ops/cli/x","unlisted":false}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"SRE","items":[{"type":"link","label":"Overview","href":"/docs/for-ops/sre/overview","docId":"for-ops/sre/overview","unlisted":false},{"type":"link","label":"Daily Routine","href":"/docs/for-ops/sre/daily","docId":"for-ops/sre/daily","unlisted":false},{"type":"link","label":"Upgrades","href":"/docs/for-ops/sre/upgrades","docId":"for-ops/sre/upgrades","unlisted":false},{"type":"link","label":"Troubleshooting","href":"/docs/for-ops/sre/troubleshooting","docId":"for-ops/sre/troubleshooting","unlisted":false}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"For DevOps Teams","items":[{"type":"category","label":"Otomi Console","items":[{"type":"link","label":"Dashboard","href":"/docs/for-devs/console/dashboard","docId":"for-devs/console/dashboard","unlisted":false},{"type":"link","label":"Apps","href":"/docs/for-devs/console/apps","docId":"for-devs/console/apps","unlisted":false},{"type":"link","label":"Otomi Catalog","href":"/docs/for-devs/console/catalog","docId":"for-devs/console/catalog","unlisted":false},{"type":"link","label":"Shortcuts","href":"/docs/for-devs/console/shortcuts","docId":"for-devs/console/shortcuts","unlisted":false},{"type":"link","label":"Projects","href":"/docs/for-devs/console/projects","docId":"for-devs/console/projects","unlisted":false},{"type":"link","label":"Builds","href":"/docs/for-devs/console/builds","docId":"for-devs/console/builds","unlisted":false},{"type":"link","label":"Workloads","href":"/docs/for-devs/console/workloads","docId":"for-devs/console/workloads","unlisted":false},{"type":"link","label":"Services","href":"/docs/for-devs/console/services","docId":"for-devs/console/services","unlisted":false},{"type":"link","label":"Secrets","href":"/docs/for-devs/console/secrets","docId":"for-devs/console/secrets","unlisted":false},{"type":"link","label":"Shell","href":"/docs/for-devs/console/shell","docId":"for-devs/console/shell","unlisted":false},{"type":"link","label":"Deploy Changes","href":"/docs/for-devs/console/deploy-changes","docId":"for-devs/console/deploy-changes","unlisted":false},{"type":"link","label":"Settings","href":"/docs/for-devs/console/settings","docId":"for-devs/console/settings","unlisted":false}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"Otomi Applications","items":[{"type":"link","label":"Alertmanager","href":"/docs/apps/alertmanager","docId":"apps/alertmanager","unlisted":false},{"type":"link","label":"Argo CD","href":"/docs/apps/argocd","docId":"apps/argocd","unlisted":false},{"type":"link","label":"Cert-Manager","href":"/docs/apps/certmanager","docId":"apps/certmanager","unlisted":false},{"type":"link","label":"Cloudnative Postgresql","href":"/docs/apps/cloudnativepg","docId":"apps/cloudnativepg","unlisted":false},{"type":"link","label":"Drone","href":"/docs/apps/drone","docId":"apps/drone","unlisted":false},{"type":"link","label":"ExternalDNS","href":"/docs/apps/external-dns","docId":"apps/external-dns","unlisted":false},{"type":"link","label":"Gatekeeper","href":"/docs/apps/gatekeeper","docId":"apps/gatekeeper","unlisted":false},{"type":"link","label":"Gitea","href":"/docs/apps/gitea","docId":"apps/gitea","unlisted":false},{"type":"link","label":"Grafana","href":"/docs/apps/grafana","docId":"apps/grafana","unlisted":false},{"type":"link","label":"Harbor","href":"/docs/apps/harbor","docId":"apps/harbor","unlisted":false},{"type":"link","label":"Ingress-nginx","href":"/docs/apps/ingress-nginx","docId":"apps/ingress-nginx","unlisted":false},{"type":"link","label":"Istio","href":"/docs/apps/istio","docId":"apps/istio","unlisted":false},{"type":"link","label":"Jaeger","href":"/docs/apps/jaeger","docId":"apps/jaeger","unlisted":false},{"type":"link","label":"Keycloak","href":"/docs/apps/keycloak","docId":"apps/keycloak","unlisted":false},{"type":"link","label":"Knative","href":"/docs/apps/knative","docId":"apps/knative","unlisted":false},{"type":"link","label":"Loki","href":"/docs/apps/loki","docId":"apps/loki","unlisted":false},{"type":"link","label":"Minio","href":"/docs/apps/minio","docId":"apps/minio","unlisted":false},{"type":"link","label":"Open Telemetry Operator","href":"/docs/apps/otel","docId":"apps/otel","unlisted":false},{"type":"link","label":"Prometheus","href":"/docs/apps/prometheus","docId":"apps/prometheus","unlisted":false},{"type":"link","label":"RabbitMQ","href":"/docs/apps/rabbitmq","docId":"apps/rabbitmq","unlisted":false},{"type":"link","label":"Sealed Secrets","href":"/docs/apps/sealed-secrets","docId":"apps/sealedsecrets","unlisted":false},{"type":"link","label":"Thanos","href":"/docs/apps/thanos","docId":"apps/thanos","unlisted":false},{"type":"link","label":"Trivy Operator","href":"/docs/apps/trivy","docId":"apps/trivy","unlisted":false},{"type":"link","label":"Tekton","href":"/docs/apps/tekton","docId":"apps/tekton","unlisted":false},{"type":"link","label":"Hashicorp Vault","href":"/docs/apps/vault","docId":"apps/vault","unlisted":false},{"type":"link","label":"Velero","href":"/docs/apps/velero","docId":"apps/velero","unlisted":false}],"collapsed":true,"collapsible":true}]},"docs":{"apps/alertmanager":{"id":"apps/alertmanager","title":"Alertmanager","description":"Alertmanager handles alerts sent by client applications such as the Prometheus server. It takes care of de-duplicating, grouping, and routing them to the correct receiver integration such as email, Slack, MS Teams, or OpsGenie. It also takes care of silencing and inhibition of alerts.","sidebar":"mainSidebar"},"apps/argocd":{"id":"apps/argocd","title":"Argo CD","description":"Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes. Argo CD is configured by Otomi to use the SSO provided by keycloak, and maps otomi groups to Argo CD roles. The otomi-admin role is made super admin within Argo CD. The team-admin role has access to Argo CD and is admin of all team projects. Members of team roles are only allowed to administer their own projects. All Teams will automatically get access to a Git repo, and Argo CD is configured to listen to this repo. All a team has to do is to fill their repo with intended state, commit, and automation takes care of the rest.","sidebar":"mainSidebar"},"apps/certmanager":{"id":"apps/certmanager","title":"CertManager","description":"Cert-Manager is used by Otomi to automatically create and rotate wildcard TLS certificates for service endpoints. You may bring your own CA, or let Otomi create one for you. If you bring your own trusted wildcard certificate, then cert-manager will not manage this certificate.","sidebar":"mainSidebar"},"apps/cloudnativepg":{"id":"apps/cloudnativepg","title":"Cloudnative Postgresql","description":"CloudNativePG is used by Otomi to provide Postgresql database for Otomi applications like Harbor and Keycloak. In the values you can configure a storageprovider to store backups in (external) object storage. The backups can be enabled in the settings.","sidebar":"mainSidebar"},"apps/drone":{"id":"apps/drone","title":"Drone","description":"Drone has been deprecated. We advise to use Tekton if you would need to create custom CI/CD pipelines","sidebar":"mainSidebar"},"apps/external-dns":{"id":"apps/external-dns","title":"External-DNS","description":"External-dns is required to make public service domains accessible by registering them with Otomi\'s front loadbalancer CNAME or IP address. When it is not enabled (default) Otomi will instead rely on nip.io to create host names for all services.","sidebar":"mainSidebar"},"apps/falco":{"id":"apps/falco","title":"Falco","description":"Falco can be used for thread detection. Before activating Falco, please first check which Driver to use. If you know which driver should be selected, activate Falco, go to the Values, select the Driver and submit changes. No Deploy Changes"},"apps/gatekeeper":{"id":"apps/gatekeeper","title":"Gatekeeper","description":"Otomi offers Kubernetes security best practices through security constraints defined as OPA policies and enforced by Gatekeeper.","sidebar":"mainSidebar"},"apps/gitea":{"id":"apps/gitea","title":"Gitea","description":"Gitea is a community managed lightweight code hosting solution written in Go. Because Otomi uses Tekton to deploy changes to the values repo, it needs a git hosting solution. When no source control is configured, Otomi will deploy Gitea for Tekton to target as a git repo. Gitea may be used for other purposes, and is especially useful in combination with Tekton as a CI/CD solution. Just like Otomi uses it.","sidebar":"mainSidebar"},"apps/grafana":{"id":"apps/grafana","title":"Grafana","description":"Otomi uses Grafana to visualize Prometheus metrics and Loki logs. Team members are automatically given Editor role, while admins are also given Admin role. It is possible to make configuration changes directly in Grafana, but only to non-conflicting settings. Data sources are preconfigured and must not be edited as changes will be lost when Grafana is redeployed.","sidebar":"mainSidebar"},"apps/harbor":{"id":"apps/harbor","title":"Harbor","description":"Harbor is an open-source registry that secures artifacts with policies and role-based access control, ensures images are scanned and free from vulnerabilities, and signs images as trusted. As a CNCF graduated project, Harbor delivers compliance, performance, and interoperability to help you consistently and securely manage artifacts across cloud-native compute platforms like Kubernetes. (source//goharbor.io/)","sidebar":"mainSidebar"},"apps/ingress-nginx":{"id":"apps/ingress-nginx","title":"NGINX Ingress","description":"Ingress NGINX is the default ingress controller in Otomi and part of the core setup (this means it is not possible use another controller within Otomi).","sidebar":"mainSidebar"},"apps/istio":{"id":"apps/istio","title":"Istio","description":"Since Otomi has security best practices built in, it is designed for intrusion.","sidebar":"mainSidebar"},"apps/jaeger":{"id":"apps/jaeger","title":"Jaeger","description":"Jaeger can be activated by Otomi to gain tracing insights on its network traffic. It runs in anonymous mode and each authenticated user is given the same authorization, allowing them to see everything. In the future this may be limited according to scope such as role and teams.","sidebar":"mainSidebar"},"apps/keycloak":{"id":"apps/keycloak","title":"Keycloak","description":"The SSO login page for Otomi is served by Keycloak. It is used as an identity broker or provider for all Otomi integrated applications. Keycloak is configured with mappers that normalize incoming identities from an IDP to have predictable claims format to be used by Otomi applications.","sidebar":"mainSidebar"},"apps/kiali":{"id":"apps/kiali","title":"Kiali","description":"Kiali can be activated in Otomi to gain observability insights on its network traffic. It runs in anonymous mode and each authenticated user is given the same authorization, allowing them to see everything. In the future this may be limited according to scope such as role and teams."},"apps/knative":{"id":"apps/knative","title":"Knative","description":"Knative can be activated in Otomi to deliver Container-as-a-Service (CaaS) functionality with scale-to-zero possibility. It can be compared to Functions-as-a-service (FaaS) but is container oriented, and takes only one manifest to configure an autoscaling service based on a container image of choice. Otomi uses Istio Virtual Services under the hood to route traffic coming in for a public domain to its backing Knative Service, allowing to set a custom domain.","sidebar":"mainSidebar"},"apps/loki":{"id":"apps/loki","title":"Loki","description":"Loki aggregates all the container logs from the platform and stores them in a storage endpoint of choice (defaults to PVC). When Otomi is installed in multi-tenancy mode (see here) it will split logs from team namespaces and make them available only to team members. Otomi provides shortcuts to selections of logs based on interest. Otomi splits logs per team, installs a dedicated Grafana instance per team and configures authentication for Grafana to allow access for team members only.","sidebar":"mainSidebar"},"apps/minio":{"id":"apps/minio","title":"Minio","description":"Minio can be enabled to provice an in-cluster S3 compatible Object Store service. Minio is by default provisioned to be used by:","sidebar":"mainSidebar"},"apps/otel":{"id":"apps/otel","title":"Open Telemetry Operator","description":"OpenTelemetry Operator is used to create an OTEL Collector to receive telemetry data from Istio and Nginx Ingress (and applications configured with Instrumentation) and export this data to the Tempo backend. Grafana can then be used to see traces.","sidebar":"mainSidebar"},"apps/prometheus":{"id":"apps/prometheus","title":"Prometheus","description":"Prometheus aggregates all the metrics from the platform and stores them in a storage endpoint of choice (defaults to PVC).","sidebar":"mainSidebar"},"apps/rabbitmq":{"id":"apps/rabbitmq","title":"RabbitMQ","description":"Kubernetes operator to deploy and manage RabbitMQ clusters.","sidebar":"mainSidebar"},"apps/sealedsecrets":{"id":"apps/sealedsecrets","title":"Sealed Secrets","description":"Encrypt your Secret into a SealedSecret, which is safe to store - even inside a public repository.","sidebar":"mainSidebar"},"apps/tekton":{"id":"apps/tekton","title":"Tekton","description":"Tekton is used in Otomi for the Builds self-service. When a Build is created, Otomi generates the Tekton Pipeline and Pipelinerun resources. There are 2 types op pipelines:","sidebar":"mainSidebar"},"apps/thanos":{"id":"apps/thanos","title":"Thanos","description":"Thanos can be enabled for multi-cluster metrics retention using an off-site object storage service.","sidebar":"mainSidebar"},"apps/trivy":{"id":"apps/trivy","title":"Trivy Operator","description":"Trivy can be enabled to scan all running containers in all team namespaces. When enabled, the team\'s Grafana instance will be configured to provide a dashboard for teams to see all vulnerabilities within their applications.","sidebar":"mainSidebar"},"apps/vault":{"id":"apps/vault","title":"Hashicorp Vault","description":"Hashicorp Vault is being deprecated. The Otomi Secrets feature is soon going to be based on SealedSecrets.","sidebar":"mainSidebar"},"apps/velero":{"id":"apps/velero","title":"Velero","description":"Velero can be activated for creating backups of PVC\'s and Kubernetes resources.","sidebar":"mainSidebar"},"for-ciso/overview":{"id":"for-ciso/overview","title":"Overview","description":"ISO 27001 controls checklist"},"for-devs/console/apps":{"id":"for-devs/console/apps","title":"Team Apps","description":"The team apps are shared apps on the platform available for teams to use. Click on the app to open the app, or click on the configuration icon to go to the app details:","sidebar":"mainSidebar"},"for-devs/console/builds":{"id":"for-devs/console/builds","title":"Team Builds","description":"A Build in Otomi is a self-service feature for building OCI compliant images based on application source code.","sidebar":"mainSidebar"},"for-devs/console/catalog":{"id":"for-devs/console/catalog","title":"Otomi Catalog","description":"The Catalog is a library of curated Helm charts to create Kubernetes resources. By default the Catalog contains a set of Helm charts provided by Otomi to get started quickly, but they can also be modified depending on your requirements or be removed from the Catalog.","sidebar":"mainSidebar"},"for-devs/console/dashboard":{"id":"for-devs/console/dashboard","title":"Team Dashboard","description":"The team dashboard gives a global overview of information most relevant to the team.","sidebar":"mainSidebar"},"for-devs/console/deploy-changes":{"id":"for-devs/console/deploy-changes","title":"Deploy changes","description":"When a form (build, workload, service, backup, secret) is submitted, Otomi will prepare a commit in the Otomi Values Git repository. When the commit is prepared, the Deploy Changes button in the top of the left menu will become active. To commit your changes, click on the Deploy Changes button.","sidebar":"mainSidebar"},"for-devs/console/projects":{"id":"for-devs/console/projects","title":"Team Projects","description":"A Project in Otomi is a collection of a Build, a Workload and a Service in ONE form.","sidebar":"mainSidebar"},"for-devs/console/secrets":{"id":"for-devs/console/secrets","title":"Team Secrets","description":"Any secret that is created here should have it\'s counterpart in Vault by the same name. Otomi will create kubernetes secrets from those Vault secrets. These can then be used in Otomi Services and Otomi Workloads, as injected env vars, or as file mounts.","sidebar":"mainSidebar"},"for-devs/console/services":{"id":"for-devs/console/services","title":"Team Services","description":"A service in Otomi is a self-service feature for:","sidebar":"mainSidebar"},"for-devs/console/settings":{"id":"for-devs/console/settings","title":"Team Settings","description":"Based on self-service options allowed by the platfrom administrator, team members can change the settings of their team.","sidebar":"mainSidebar"},"for-devs/console/shell":{"id":"for-devs/console/shell","title":"Shell (TTY Console)","description":"The Shell feature allows to start a web based shell in Console with Kube API access. When starting a shell, a dedicated shell instance will be started for the user. The shell includes the following tools:","sidebar":"mainSidebar"},"for-devs/console/shortcuts":{"id":"for-devs/console/shortcuts","title":"Team Shortcuts","description":"The Shortcuts section shows all shortcuts created and available for the team.","sidebar":"mainSidebar"},"for-devs/console/workloads":{"id":"for-devs/console/workloads","title":"Team Workloads","description":"A Workload in Otomi is a self-service feature for creating Kubernetes resources using Helm charts from the Otomi Developer Catalog.","sidebar":"mainSidebar"},"for-ops/cli/apply":{"id":"for-ops/cli/apply","title":"otomi apply","description":"otomi apply [options]","sidebar":"mainSidebar"},"for-ops/cli/bash":{"id":"for-ops/cli/bash","title":"otomi bash","description":"otomi bash","sidebar":"mainSidebar"},"for-ops/cli/bootstrap":{"id":"for-ops/cli/bootstrap","title":"otomi bootstrap","description":"otomi bootstrap [options]","sidebar":"mainSidebar"},"for-ops/cli/check-policies":{"id":"for-ops/cli/check-policies","title":"check-policies","description":"otomi check-policies [options]","sidebar":"mainSidebar"},"for-ops/cli/commit":{"id":"for-ops/cli/commit","title":"otomi commit","description":"otomi commit [options]","sidebar":"mainSidebar"},"for-ops/cli/decrypt":{"id":"for-ops/cli/decrypt","title":"otomi decrypt","description":"otomi decrypt [options]","sidebar":"mainSidebar"},"for-ops/cli/deploying":{"id":"for-ops/cli/deploying","title":"Using Otomi CLI","description":"1. Initialize a values repo","sidebar":"mainSidebar"},"for-ops/cli/destroy":{"id":"for-ops/cli/destroy","title":"otomi destroy","description":"otomi destroy [options]","sidebar":"mainSidebar"},"for-ops/cli/diff":{"id":"for-ops/cli/diff","title":"otomi diff","description":"otomi diff [options]","sidebar":"mainSidebar"},"for-ops/cli/encrypt":{"id":"for-ops/cli/encrypt","title":"otomi encrypt","description":"otomi encrypt [files...] [options]","sidebar":"mainSidebar"},"for-ops/cli/installation":{"id":"for-ops/cli/installation","title":"Installing and using Otomi CLI","description":"Prerequisites","sidebar":"mainSidebar"},"for-ops/cli/known-issues":{"id":"for-ops/cli/known-issues","title":"Known Issues","description":"The otomi (diff|apply|sync|template) commands are delegated to helmfile, which in turn delegates the deployment work to helm. Sometimes it is not clear wether the issue is from Helm or Helmfile, so we will address them together in this section.","sidebar":"mainSidebar"},"for-ops/cli/lint":{"id":"for-ops/cli/lint","title":"otomi lint","description":"otomi lint [options]","sidebar":"mainSidebar"},"for-ops/cli/pull":{"id":"for-ops/cli/pull","title":"otomi pull","description":"otomi pull [options]","sidebar":"mainSidebar"},"for-ops/cli/rotate-keys":{"id":"for-ops/cli/rotate-keys","title":"otomi rotate-keys","description":"otomi rotate-keys [options]","sidebar":"mainSidebar"},"for-ops/cli/status":{"id":"for-ops/cli/status","title":"otomi status","description":"otomi status [options]","sidebar":"mainSidebar"},"for-ops/cli/sync":{"id":"for-ops/cli/sync","title":"otomi sync","description":"otomi sync [options]","sidebar":"mainSidebar"},"for-ops/cli/template":{"id":"for-ops/cli/template","title":"otomi template","description":"otomi template [options]","sidebar":"mainSidebar"},"for-ops/cli/test":{"id":"for-ops/cli/test","title":"otomi test","description":"otomi test [options]","sidebar":"mainSidebar"},"for-ops/cli/validate-templates":{"id":"for-ops/cli/validate-templates","title":"otomi validate-templates","description":"otomi validate-templates [options]","sidebar":"mainSidebar"},"for-ops/cli/validate-values":{"id":"for-ops/cli/validate-values","title":"otomi validate-values","description":"otomi validate-values [options]","sidebar":"mainSidebar"},"for-ops/cli/values":{"id":"for-ops/cli/values","title":"otomi values","description":"otomi values [options]","sidebar":"mainSidebar"},"for-ops/cli/x":{"id":"for-ops/cli/x","title":"otomi x","description":"otomi x","sidebar":"mainSidebar"},"for-ops/console/apps":{"id":"for-ops/console/apps","title":"Platform - Apps","description":"The apps section lists all apps available.","sidebar":"mainSidebar"},"for-ops/console/backups":{"id":"for-ops/console/backups","title":"Platform - Backups","description":"To enable this feature, first make sure Velero is activated.","sidebar":"mainSidebar"},"for-ops/console/builds":{"id":"for-ops/console/builds","title":"Platform - Builds","description":"To enable this feature, first make sure Harbor and Tekton are activated. To be able to push images to Harbor, Otomi needs to be configured with a DNS and trusted certificates (Lets encrypt with production certificates).","sidebar":"mainSidebar"},"for-ops/console/clusters":{"id":"for-ops/console/clusters","title":"Platform - Clusters","description":"All known Otomi clusters are listed here. Clusters can be sorted based on:"},"for-ops/console/dashboard":{"id":"for-ops/console/dashboard","title":"Platform Dashboard","description":"The platform dashboard gives a global overview of information most relevant to the team. In the top bar, select the View: platform.","sidebar":"mainSidebar"},"for-ops/console/deploy-changes":{"id":"for-ops/console/deploy-changes","title":"Deploy changes","description":"When a change has been made, by pressing Submit, the Deploy Changes button will light up to deploy the changes you have made in the console. This will create a commit of the changes to the values repository in Gitea and trigger the Drone pipeline run."},"for-ops/console/overview":{"id":"for-ops/console/overview","title":"Overview","description":"Otomi Console","sidebar":"mainSidebar"},"for-ops/console/policies":{"id":"for-ops/console/policies","title":"Platform - Policies","description":"To enable this feature, first make sure OPA/Gatekeeper is activated.","sidebar":"mainSidebar"},"for-ops/console/projects":{"id":"for-ops/console/projects","title":"Projects","description":"A Project in Otomi is a collection of a Build, a Workload and a Service in ONE form. When a user creates a project, the name of the project will be used for all created tasks (build, workload, service).","sidebar":"mainSidebar"},"for-ops/console/secrets":{"id":"for-ops/console/secrets","title":"Platform - Secrets","description":"To enable this feature, first make sure Hashicorp Vault is activated.","sidebar":"mainSidebar"},"for-ops/console/services":{"id":"for-ops/console/services","title":"Platform - Services","description":"All known Services on the platform are listed here. Services can be sorted based on:","sidebar":"mainSidebar"},"for-ops/console/settings/alerts":{"id":"for-ops/console/settings/alerts","title":"Platform settings","description":"Alerts","sidebar":"mainSidebar"},"for-ops/console/settings/azure":{"id":"for-ops/console/settings/azure","title":"Platform settings","description":"Azure","sidebar":"mainSidebar"},"for-ops/console/settings/backup":{"id":"for-ops/console/settings/backup","title":"Platform settings","description":"Backup","sidebar":"mainSidebar"},"for-ops/console/settings/cluster":{"id":"for-ops/console/settings/cluster","title":"Platform settings","description":"Cluster","sidebar":"mainSidebar"},"for-ops/console/settings/co-monitoring":{"id":"for-ops/console/settings/co-monitoring","title":"Platform settings","description":"Co-Monitoring","sidebar":"mainSidebar"},"for-ops/console/settings/dns":{"id":"for-ops/console/settings/dns","title":"Platform settings","description":"DNS","sidebar":"mainSidebar"},"for-ops/console/settings/ingress":{"id":"for-ops/console/settings/ingress","title":"Platform settings","description":"Ingress","sidebar":"mainSidebar"},"for-ops/console/settings/key-management":{"id":"for-ops/console/settings/key-management","title":"Platform settings","description":"Key management","sidebar":"mainSidebar"},"for-ops/console/settings/oidc":{"id":"for-ops/console/settings/oidc","title":"Platform settings","description":"OIDC","sidebar":"mainSidebar"},"for-ops/console/settings/otomi":{"id":"for-ops/console/settings/otomi","title":"Platform settings","description":"Otomi","sidebar":"mainSidebar"},"for-ops/console/settings/smtp":{"id":"for-ops/console/settings/smtp","title":"Platform settings","description":"SMTP","sidebar":"mainSidebar"},"for-ops/console/shell":{"id":"for-ops/console/shell","title":"Shell","description":"The Shell feature allows to start a web based shell in Otomi Console with Kube API access. When starting a shell, a dedicated shell instance will be started for the user. The shell includes the following tools:","sidebar":"mainSidebar"},"for-ops/console/shortcuts":{"id":"for-ops/console/shortcuts","title":"Platform - Shortcuts","description":"The Shortcuts section shows all shortcuts created and available on the platform for users with the otomi-admin role.","sidebar":"mainSidebar"},"for-ops/console/teams":{"id":"for-ops/console/teams","title":"Platform - Teams","description":"- Teams are tenants on the platform to support Development/DevOps teams, projects or even DTAP","sidebar":"mainSidebar"},"for-ops/console/workloads":{"id":"for-ops/console/workloads","title":"Platform - Workloads","description":"To enable this feature, first make sure Argo CD is activated.","sidebar":"mainSidebar"},"for-ops/how-to/backups":{"id":"for-ops/how-to/backups","title":"Create/Restore backups","description":"When Velero is activated on the platform level, platform admins can create backups of Persistent Volumes (PVs) in Team namespaces using Otomi Console. When creating backups using Otomi Console, a Velero schedule resource is created that will create the backup at a specified time, defined by a Cron expression.","sidebar":"mainSidebar"},"for-ops/how-to/clone-otomi":{"id":"for-ops/how-to/clone-otomi","title":"Clone Otomi Instance","description":"It may happen that you need to move Otomi to another Kubernetes cluster. Because Otomi is a GitOps driven platfrom, you can export existing values that can then be used to install a new Otomi instance.","sidebar":"mainSidebar"},"for-ops/how-to/core-only":{"id":"for-ops/how-to/core-only","title":"Use Otomi Core only","description":"Otomi by default installs Gitea, Drone, Otomi API and Otomi Console. Otomi Console is the self-service UI and uses Otomi API to generate validated configuration code. This configuration code is then committed to Gitea (in the values repository), which will trigger teh pre-configured Drone pipeline to apply the changes.","sidebar":"mainSidebar"},"for-ops/how-to/ingress-classes":{"id":"for-ops/how-to/ingress-classes","title":"Manage Ingress Controllers","description":"When Otomi is installed, exposure (ingress) for all services (included exposure for platform services) is handeled by the default platform ingress class using a public (cloud) load balancer. Otomi offers the option to use multiple ingress classes. Each class get a dedicated ingress controller. In case of security requirements, where platform services are not allowed to be exposed publicly, the default platform class can be configured to use a private load balancer instead of a public one. Additional (public) ingress classes can be created to expose team (application) services.","sidebar":"mainSidebar"},"for-ops/how-to/overview":{"id":"for-ops/how-to/overview","title":"How to\'s for Ops","description":"How to\'s for Ops / Platform administrators","sidebar":"mainSidebar"},"for-ops/how-to/switch-to-dns":{"id":"for-ops/how-to/switch-to-dns","title":"Switch to use DNS","description":"When Otomi is installed with minimal values, a custom CA is generated and Otomi uses nip.io for host names. It is possible to switch from nip.io to using a DNS zone after installing Otomi initially without DNS. To switch from nip.io to a DNS zone, follow the instructions as described below."},"for-ops/how-to/use-catalog":{"id":"for-ops/how-to/use-catalog","title":"Managing the Catalog","description":"Otomi offers a Catalog to Teams on the platform to offer them golden path templates (Helm charts). This is how it works:","sidebar":"mainSidebar"},"for-ops/how-to/use-team-admin":{"id":"for-ops/how-to/use-team-admin","title":"Use team-admin","description":"When Otomi is installed, by default a team called team-admin is created. The Admin Team is no regular team. This team for instance has no apps. Instead the admin needs to use the platform apps to see logs and metrics of workloads deployed in the team-admin namespace.","sidebar":"mainSidebar"},"for-ops/sre/daily":{"id":"for-ops/sre/daily","title":"SRE Daily Routine","description":"As an SRE you would like to keep your daily tasks to a minimum and be automatically informed on issues. Otomi offers the following tooling to automate this:","sidebar":"mainSidebar"},"for-ops/sre/overview":{"id":"for-ops/sre/overview","title":"SRE Overview","description":"Otomi is a set of functions built on top of a suite of pre-configured and integrated open source applications. Instead of selecting, configuring, and integrating all the parts that are needed to securely manage containerized applications in multi- and hybrid environments, Otomi offers all required parts in a single package. Otomi can be seen as any other Kubernetes application or add-on, with the difference that Otomi is pre-configured and offers a higher abstraction of configuration for all the integrated solutions. All integrated applications can however be used freely, meaning that a user can benefit from the pre-configuration to start using the offered applications.","sidebar":"mainSidebar"},"for-ops/sre/troubleshooting":{"id":"for-ops/sre/troubleshooting","title":"SRE Troubleshooting Checklist","description":"Pods not starting","sidebar":"mainSidebar"},"for-ops/sre/upgrades":{"id":"for-ops/sre/upgrades","title":"Upgrades","description":"Introduction","sidebar":"mainSidebar"},"get-started/activation":{"id":"get-started/activation","title":"Activation steps","description":"Follow the steps below to activate Otomi after initial installation.","sidebar":"mainSidebar"},"get-started/installation/aws":{"id":"get-started/installation/aws","title":"AWS","description":"Prerequisites","sidebar":"mainSidebar"},"get-started/installation/azure":{"id":"get-started/installation/azure","title":"Azure","description":"Prerequisites","sidebar":"mainSidebar"},"get-started/installation/byo-wildcard":{"id":"get-started/installation/byo-wildcard","title":"BYO Wild card Certificate","description":"When installing Otomi with DNS, there are 3 issuers you can use:","sidebar":"mainSidebar"},"get-started/installation/civo":{"id":"get-started/installation/civo","title":"Civo","description":"Otomi can also be installed using the Civo marketplace. When Otomi is installed using the Civo marketplace, Otomi is installed without DNS! To see the full potential of Otomi, install Otomi with DNS as described here.","sidebar":"mainSidebar"},"get-started/installation/custom":{"id":"get-started/installation/custom","title":"Custom","description":"To install Otomi on any other cloud or infrastructure platform, use the custom provider in Otomi. Make sure your infrastructure adheres to the following pre-requisites:","sidebar":"mainSidebar"},"get-started/installation/digitalocean":{"id":"get-started/installation/digitalocean","title":"Digital Ocean","description":"Otomi can be installed as a 1-click-app on DigitalOcean marketplace. You can find the install instructions here.","sidebar":"mainSidebar"},"get-started/installation/entrypoint":{"id":"get-started/installation/entrypoint","title":"Install Otomi with entrypoint","description":"In some cases, the Kubernetes cluster will de deployed in a private setup where public access is only possible using an external gateway or firewall.","sidebar":"mainSidebar"},"get-started/installation/gcp":{"id":"get-started/installation/gcp","title":"Google Cloud Platform","description":"Prerequisites","sidebar":"mainSidebar"},"get-started/installation/helm":{"id":"get-started/installation/helm","title":"Helm","description":"Add the Otomi repository","sidebar":"mainSidebar"},"get-started/installation/kms":{"id":"get-started/installation/kms","title":"Use KMS to manage keys for encryption","description":"If you would like the secrets in the values repository to be encrypted, you will have to setup an account with your Key Management Service (KMS) provider. It is needed by sops, the tool used for encryption.","sidebar":"mainSidebar"},"get-started/installation/known-issues":{"id":"get-started/installation/known-issues","title":"Known Installation Issues","description":"Metrics server does not start with untrusted Kube API certificates","sidebar":"mainSidebar"},"get-started/installation/linode":{"id":"get-started/installation/linode","title":"Linode","description":"Install Otomi on Linode Kubernetes Engine (LKE) with Linode DNS","sidebar":"mainSidebar"},"get-started/installation/minikube":{"id":"get-started/installation/minikube","title":"Minikube","description":"Otomi does NOT support ARM architecture and therefor can not be installed on Apple MacBook with Apple M1 chipset"},"get-started/installation/oidc":{"id":"get-started/installation/oidc","title":"Azure AD for OIDC","description":"The authentication of brokered identities through Azure AD requires a service principal with certain Azure AD API permissions. An app registration needs to be created with the following API permissions:","sidebar":"mainSidebar"},"get-started/installation/overview":{"id":"get-started/installation/overview","title":"Installation","description":"How to install Otomi on various cloud and infrastructure platforms","sidebar":"mainSidebar"},"get-started/installation/scaleway":{"id":"get-started/installation/scaleway","title":"Scaleway","description":"Prerequisites","sidebar":"mainSidebar"},"get-started/installation/vultr":{"id":"get-started/installation/vultr","title":"Vultr","description":"Prerequisites","sidebar":"mainSidebar"},"get-started/labs/lab-1":{"id":"get-started/labs/lab-1","title":"Prerequisites for getting started","description":"Welcome to Otomi! If you would like to explore Otomi, this getting started guide is for you.","sidebar":"mainSidebar"},"get-started/labs/lab-10":{"id":"get-started/labs/lab-10","title":"Using Argo CD","description":"Learn how to deploy your applications on Kubernetes using Argo CD with this comprehensive guide. Discover how to manage resources effectively using Git and streamline your deployment process.","sidebar":"mainSidebar"},"get-started/labs/lab-11":{"id":"get-started/labs/lab-11","title":"Configure auto image updater","description":"When using the Workload feature in Otomi to deploy Helm charts from the Developer Catalog, then you can also use the Auto image updater feature to to automatically update the container images of Kubernetes workloads.","sidebar":"mainSidebar"},"get-started/labs/lab-12":{"id":"get-started/labs/lab-12","title":"Deploy a BYO Helm chart","description":"Otomi offers a self-service feature to create 3 types of workloads:"},"get-started/labs/lab-13":{"id":"get-started/labs/lab-13","title":"Deploy workloads using Otomi","description":"In the previous lab we deployed a workload using Argo CD with a BYO manifest and we explored the Catalog. In this lab we\'ll create a workload (a Kubernetes Deployment) using the Catalog and the Workload feature.","sidebar":"mainSidebar"},"get-started/labs/lab-14":{"id":"get-started/labs/lab-14","title":"Deploy serverless workloads","description":"Prerequisite: For this lab, Argo CD needs to be activated."},"get-started/labs/lab-15":{"id":"get-started/labs/lab-15","title":"Check policy compliance","description":"Prerequisite: For this lab, Gatekeeper needs to be activated.","sidebar":"mainSidebar"},"get-started/labs/lab-16":{"id":"get-started/labs/lab-16","title":"Check for threads","description":"Prerequisite: For this lab, Falco needs to be activated."},"get-started/labs/lab-17":{"id":"get-started/labs/lab-17","title":"Scan your running containers for vulnerabilities","description":"Trivy need to be activated for this lab.","sidebar":"mainSidebar"},"get-started/labs/lab-18":{"id":"get-started/labs/lab-18","title":"Publicly expose workloads","description":"When you have deployed your application using the Workloads feature, you will probably like to expose it publicly. In this lab we\'ll create a Service in Otomi to expose your application publicly. When you create a Service, Otomi will create the Istio virtual service and configure ingress for your application.","sidebar":"mainSidebar"},"get-started/labs/lab-19":{"id":"get-started/labs/lab-19","title":"Configuring network policies","description":"In some cases you want to explicitly allow access to your application. This can be done by creating network policies. Otomi supports 2 types of network policies:","sidebar":"mainSidebar"},"get-started/labs/lab-2":{"id":"get-started/labs/lab-2","title":"Access Otomi Console and download the KUBECFG","description":"When you have received the URL of the web UI of Otomi Platform and have a username/password with access permissions, then it\'s time to sign-in"},"get-started/labs/lab-20":{"id":"get-started/labs/lab-20","title":"View container logs","description":"Loki, Minio, Prometheus and Grafana need to be activated for this lab.","sidebar":"mainSidebar"},"get-started/labs/lab-21":{"id":"get-started/labs/lab-21","title":"View container metrics","description":"Prometheus and Grafana for the Team need to be activated for this lab.","sidebar":"mainSidebar"},"get-started/labs/lab-22":{"id":"get-started/labs/lab-22","title":"Using custom metrics","description":"What are custom metrics","sidebar":"mainSidebar"},"get-started/labs/lab-23":{"id":"get-started/labs/lab-23","title":"Monitoring service availability","description":"When your application is deployed, you would of course like to get an alert when you application (service) is not available anymore. To automatically monitor you applications for availability, Otomi automatically configures a prope to monitor your service.","sidebar":"mainSidebar"},"get-started/labs/lab-24":{"id":"get-started/labs/lab-24","title":"Create a PostgreSQL database","description":"Otomi by default installs the Cloudnative POstgreSQL database operator. Teams can use the operator and the postgresql quick start to create their own PostgreSQL databases.","sidebar":"mainSidebar"},"get-started/labs/lab-25":{"id":"get-started/labs/lab-25","title":"Monitor PostgreSQL databases","description":"If you previously created a database, you\'ll noticed that we did not let the operator create a PodMonitor. The reason of this, is that the PodMonitor requires specific lables to be picked-up by the team\'s own Prometheus. In this lab we\'ll create a custom PodMonitor and create a dashboard in the team\'s own Grafana."},"get-started/labs/lab-26":{"id":"get-started/labs/lab-26","title":"Trigger builds","description":"In the previous lab we created a build in Otomi using the blue repo in Gitea. In this lab we\'ll create a build for the green repo and trigger the build based on a webhook.","sidebar":"mainSidebar"},"get-started/labs/lab-27":{"id":"get-started/labs/lab-27","title":"OpenTelemetry","description":"In order to make a system observable, it must be instrumented. Language specific implementation of OpenTelemetry provides a way to instrument your application without touching your source code. In this lab we\'re going to instrument a Java application.","sidebar":"mainSidebar"},"get-started/labs/lab-28":{"id":"get-started/labs/lab-28","title":"Canary deployments","description":"In this lab we are going to create a canary deployment. The idea behind canary deployment (or rollout) is to introduce a new version of a service by first testing it using a small percentage of user traffic, and then if all goes well the percentage while simultaneously phasing out the old version.","sidebar":"mainSidebar"},"get-started/labs/lab-29":{"id":"get-started/labs/lab-29","title":"Explore the Catalog","description":"In this lab we are going to explore the Catalog in Otomi. The Catalog is a library of curated Helm charts to create Kubernetes resources. By default the Catalog contains a set of Helm charts provided by Otomi to get started quickly, but they can also be modified depending on your requirements or be removed from the Catalog. The contents of the Catalog and the RBAC configuration (which Team can use which Helm chart) are managed by the platform administrator. Contact the platform administrator if you would like to add your own charts to use within your Team.","sidebar":"mainSidebar"},"get-started/labs/lab-3":{"id":"get-started/labs/lab-3","title":"Create a private Git repo","description":"As a developer you\'ll need a Git repository for your code. Most organizations will probably have a central code repository like Gitlab, or use Github. But if you don\'t, Otomi has you covered. Otomi includes a complete self-hosted Git solution called Gitea.","sidebar":"mainSidebar"},"get-started/labs/lab-30":{"id":"get-started/labs/lab-30","title":"Create custom dashboards","description":"In the lab Using custom metrics we created a Workload with a ServiceMonitor so the Team\'s Prometheus can scrape our custom metrics. In this lab we are going to create a custom Grafana dashboard and add the dashboard to a Configmap so the Team\'s Grafana will automatically load the dashboard.","sidebar":"mainSidebar"},"get-started/labs/lab-31":{"id":"get-started/labs/lab-31","title":"Create custom rules","description":"Now we are exporting metrics, these metrics can also be used to generate alerts. To generate alerts, we first need to create a Prometheus Rule:","sidebar":"mainSidebar"},"get-started/labs/lab-32":{"id":"get-started/labs/lab-32","title":"Create projects","description":"A Project in Otomi is a collection of a Build, a Workload and a Service. The benefit of using Projects is that you can create a Build, a Workload and a Service in one run. Projects are ideal for developers to run multiple code branches next to each other and automatically update the deployment based on a push. In this lab we are going to create a Project and see how everything now comes together is one simple form.","sidebar":"mainSidebar"},"get-started/labs/lab-33":{"id":"get-started/labs/lab-33","title":"Create rabbitMQ Cluster","description":"In this lab we will deploy a RabbitMQ workload that is created with the Catalog.","sidebar":"mainSidebar"},"get-started/labs/lab-4":{"id":"get-started/labs/lab-4","title":"Create a CI pipeline","description":"Kubernetes is a container orchestrator, so we need to create container images that we can deploy. Next to providing a Git service. Otomi also has a complete CI solution called Drone integrated. You can use Drone to create and run CI pipelines to build images and push them to your private image registry (Harbor)."},"get-started/labs/lab-5":{"id":"get-started/labs/lab-5","title":"Push your container images","description":"For this lab, Harbor needs to be activated and the cluster needs to be configured with trusted certificates (like Let\'s Encrypt using production certificate)."},"get-started/labs/lab-6":{"id":"get-started/labs/lab-6","title":"Build images from application source","description":"Harbor needs to be activated for this lab.","sidebar":"mainSidebar"},"get-started/labs/lab-7":{"id":"get-started/labs/lab-7","title":"Scan your images for vulnerabilities","description":"Prerequisites","sidebar":"mainSidebar"},"get-started/labs/lab-8":{"id":"get-started/labs/lab-8","title":"Create secrets","description":"Hashicorp Vault needs to be activated for this lab.","sidebar":"mainSidebar"},"get-started/labs/lab-9":{"id":"get-started/labs/lab-9","title":"Deploy your application","description":"Now that you have access to the team namespace and have pushed your image to Harbor, you can now deploy your application."},"get-started/labs/overview":{"id":"get-started/labs/overview","title":"Labs Overview","description":"Welcome to Otomi! If you are going to use Otomi or like to learn Kubernetes, these labs are for you. Step by step we\'ll guide you in how to build, deploy, secure and observe containerized applications on Kubernetes. The labs cover the most common activities performed by developer- and/or DevOps teams when using Kubernetes with Otomi.","sidebar":"mainSidebar"},"get-started/overview":{"id":"get-started/overview","title":"Overview","description":"How to get started with Otomi","sidebar":"mainSidebar"},"get-started/prerequisites":{"id":"get-started/prerequisites","title":"Prerequisites","description":"Client binaries","sidebar":"mainSidebar"},"get-started/promo":{"id":"get-started/promo","title":"Promotions","description":"This is your chance to win an Amazon Gift Card!","sidebar":"mainSidebar"},"tutorials/overview":{"id":"tutorials/overview","title":"Tutorial Overview","description":"This section contains tutorials for more advanced installation scenario\'s."},"tutorials/tutorial-1":{"id":"tutorials/tutorial-1","title":"Installing Otomi","description":"To go through the tutorials, you first need to install Otomi on a running Kubernetes cluster."},"tutorials/tutorial-10":{"id":"tutorials/tutorial-10","title":"Creating a micro service architecture","description":"In this tutorial we are going to deploy multiple services from different teams and expose them using a shared domain, but each on their own path. We will use on-the-fly Knative services for speed and simplicity."},"tutorials/tutorial-2":{"id":"tutorials/tutorial-2","title":"Creating teams","description":"In this tutorial, we are going to create a Team in Otomi. Teams in Otomi serve the following purpose:"},"tutorials/tutorial-3":{"id":"tutorials/tutorial-3","title":"Activating tools","description":"Core Apps"},"tutorials/tutorial-4":{"id":"tutorials/tutorial-4","title":"Build, tag and push an image to Harbor","description":"When Otomi is installed without using Let\'s Encrypt production certificates, make sure you download the CA.crt, add it to your Keychain and restarted Docker."},"tutorials/tutorial-5":{"id":"tutorials/tutorial-5","title":"Create a Workload","description":"In his tutorial, we are going to create a Workload in Otomi."},"tutorials/tutorial-6":{"id":"tutorials/tutorial-6","title":"Create a Service","description":"In his tutorial, we are going to create a Service in Otomi to publicly expose the ClusterIP service of the Workload we deployed in the previous tutorial."},"tutorials/tutorial-7":{"id":"tutorials/tutorial-7","title":"Using Knative","description":"In this lab, we are going to:"},"tutorials/tutorial-8":{"id":"tutorials/tutorial-8","title":"Using secrets","description":"In his tutorial, you are going to:"},"tutorials/tutorial-9":{"id":"tutorials/tutorial-9","title":"Configuring network policies","description":"In this tutorial we are going to deploy a multi tier web application, called guestbook, register the 3 K8s services in Otomi and configure public access to the frontend service. Next, we will turn on the Network policies option for the team."},"tutorials/tutorial-create-byo-ksvc":{"id":"tutorials/tutorial-create-byo-ksvc","title":"Create a Knative service","description":"In this tutorial, you are going to deploy the image you build, tagged and pushed to harbor in the previous tutorial by creating a Knative service."},"tutorials/tutorial-create-byo-svc":{"id":"tutorials/tutorial-create-byo-svc","title":"Create a Kubernetes service","description":"In this tutorial, we are going to deploy the image we pushed to harbor in the previous tutorial, by creating a Kubernetes Deployment and Service."},"tutorials/tutorial-create-otomi-ksvc":{"id":"tutorials/tutorial-create-otomi-ksvc","title":"Create and expose a Knative service with Otomi","description":"In his tutorial, we are going to create a Knative service with Otomi Console and publicly expose it."},"tutorials/tutorial-use-secrets":{"id":"tutorials/tutorial-use-secrets","title":"Use secrets in Kubernetes","description":"In his tutorial, you are going to use the secret created in Hashicorp Vault and added to Kubernetes using the Otomi Secrets feature in a Kubernetes deployment."}}}')}}]); \ No newline at end of file diff --git a/assets/js/a5fb0fed.209401aa.js b/assets/js/a5fb0fed.209401aa.js new file mode 100644 index 000000000..623028339 --- /dev/null +++ b/assets/js/a5fb0fed.209401aa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[5459],{2894:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>o,contentTitle:()=>i,default:()=>h,frontMatter:()=>a,metadata:()=>l,toc:()=>d});var s=r(5893),t=r(1151);const a={slug:"lab-28",title:"Canary deployments",sidebar_label:"Canary Deployments"},i=void 0,l={id:"get-started/labs/lab-28",title:"Canary deployments",description:"In this lab we are going to create a canary deployment. The idea behind canary deployment (or rollout) is to introduce a new version of a service by first testing it using a small percentage of user traffic, and then if all goes well the percentage while simultaneously phasing out the old version.",source:"@site/docs/get-started/labs/lab-28.md",sourceDirName:"get-started/labs",slug:"/get-started/labs/lab-28",permalink:"/docs/get-started/labs/lab-28",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/tree/main/docs/get-started/labs/lab-28.md",tags:[],version:"current",frontMatter:{slug:"lab-28",title:"Canary deployments",sidebar_label:"Canary Deployments"},sidebar:"mainSidebar",previous:{title:"Use OpenTelemery",permalink:"/docs/get-started/labs/lab-27"},next:{title:"Create RabbitMQ cluster",permalink:"/docs/get-started/labs/lab-33"}},o={},d=[{value:"Prepare images",id:"prepare-images",level:2},{value:"Create a workload from the developer catalog",id:"create-a-workload-from-the-developer-catalog",level:2},{value:"Expose the service",id:"expose-the-service",level:2},{value:"See the results",id:"see-the-results",level:2},{value:"Update the canary image",id:"update-the-canary-image",level:2}];function c(e){const n={a:"a",code:"code",h2:"h2",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"In this lab we are going to create a canary deployment. The idea behind canary deployment (or rollout) is to introduce a new version of a service by first testing it using a small percentage of user traffic, and then if all goes well the percentage while simultaneously phasing out the old version."}),"\n",(0,s.jsx)(n.p,{children:"For this we are going to deploy the stable version (blue), introduce a new version and then change the new version until we are happy with it and then increase the traffic to the new version."}),"\n",(0,s.jsx)(n.h2,{id:"prepare-images",children:"Prepare images"}),"\n",(0,s.jsxs)(n.p,{children:["For this lab we need the 2 images (",(0,s.jsx)(n.code,{children:"blue"})," and ",(0,s.jsx)(n.code,{children:"green"}),") we already created in the previous labs. If you haven't created the blue and green images, first complete these 2 labs:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"/docs/get-started/labs/lab-6",children:"Build images"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"/docs/get-started/labs/lab-26",children:"Trigger builds"})}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"create-a-workload-from-the-developer-catalog",children:"Create a workload from the developer catalog"}),"\n",(0,s.jsxs)(n.p,{children:["Go to the list of Builds and add the repository of the ",(0,s.jsx)(n.code,{children:"green"})," build to your clipboard."]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["Go to ",(0,s.jsx)(n.code,{children:"Workloads"})," in the left menu and click on ",(0,s.jsx)(n.code,{children:"New Workload"})]}),"\n",(0,s.jsxs)(n.li,{children:["Add the Name ",(0,s.jsx)(n.code,{children:"canary"})," for the workload"]}),"\n",(0,s.jsxs)(n.li,{children:["Select ",(0,s.jsx)(n.code,{children:"otomi-quickstart-k8s-deployment-canary"})," from the catalog"]}),"\n",(0,s.jsxs)(n.li,{children:["Set the ",(0,s.jsx)(n.code,{children:"Auto image updater"})," to ",(0,s.jsx)(n.code,{children:"Digest"})," and fill in:"]}),"\n"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"imageRepository = paste from the clipboard"}),"\n",(0,s.jsxs)(n.li,{children:["imageParameter = ",(0,s.jsx)(n.code,{children:"versionTwo.image.repository"})]}),"\n",(0,s.jsxs)(n.li,{children:["tagParameter = ",(0,s.jsx)(n.code,{children:"versionTwo.image.tag"})]}),"\n"]}),"\n",(0,s.jsxs)(n.ol,{start:"5",children:["\n",(0,s.jsxs)(n.li,{children:["In the workload ",(0,s.jsx)(n.code,{children:"values"}),", change the following parameters:"]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"# For the v1 as the stable version\nversionOne:\n image:\n repository: # paste from clipboard, but change to blue\n tag: latest\n# The v2 as canary with the auto image updater configured\nversionTwo:\n image:\n repository: # paste from clipboard. This will be the green image\n tag: latest\n"})}),"\n",(0,s.jsxs)(n.ol,{start:"6",children:["\n",(0,s.jsxs)(n.li,{children:["Click ",(0,s.jsx)(n.code,{children:"Submit"})]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Now click on ",(0,s.jsx)(n.code,{children:"Deploy Changes"})]}),"\n",(0,s.jsxs)(n.p,{children:["We now created 2 deployments. One for ",(0,s.jsx)(n.code,{children:"blue"})," and one for ",(0,s.jsx)(n.code,{children:"green"}),". The ",(0,s.jsx)(n.code,{children:"green"})," image (our canary) will be automatically updated after a change (commit)."]}),"\n",(0,s.jsx)(n.h2,{id:"expose-the-service",children:"Expose the service"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["In the left menu panel under click ",(0,s.jsx)(n.code,{children:"Services"})," then click on ",(0,s.jsx)(n.code,{children:"Create Service"})]}),"\n",(0,s.jsxs)(n.li,{children:["Select the ",(0,s.jsx)(n.code,{children:"canary"})," service"]}),"\n",(0,s.jsxs)(n.li,{children:["Under ",(0,s.jsx)(n.code,{children:"Traffic Control"})," click ",(0,s.jsx)(n.code,{children:"enabled"})," (and use the default weights for v1 and v2)"]}),"\n",(0,s.jsxs)(n.li,{children:["Under ",(0,s.jsx)(n.code,{children:"Exposure Ingress"}),", select ",(0,s.jsx)(n.code,{children:"Ingress"})," and use the default configuration"]}),"\n",(0,s.jsxs)(n.li,{children:["Click ",(0,s.jsx)(n.code,{children:"Submit"})]}),"\n",(0,s.jsxs)(n.li,{children:["Click ",(0,s.jsx)(n.code,{children:"Deploy Changes"})]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"see-the-results",children:"See the results"}),"\n",(0,s.jsxs)(n.p,{children:["You will see the ",(0,s.jsx)(n.code,{children:"canary"})," service in the list of Services. Click on the URL and refresh the page for a couple of times. You should first see:"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Team apps",src:r(4353).Z+"",width:"1946",height:"974"})}),"\n",(0,s.jsx)(n.p,{children:"After a refresh of the page you should see:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Team apps",src:r(1663).Z+"",width:"1944",height:"968"})}),"\n",(0,s.jsx)(n.h2,{id:"update-the-canary-image",children:"Update the canary image"}),"\n",(0,s.jsxs)(n.p,{children:["Go to the ",(0,s.jsx)(n.code,{children:"green"})," repo and change the ",(0,s.jsx)(n.code,{children:"background-color"})," in the ",(0,s.jsx)(n.code,{children:"green.html"})," file from ",(0,s.jsx)(n.code,{children:"green"})," to ",(0,s.jsx)(n.code,{children:"MediumSeaGreen"})," and commit the change. After a couple of minutes you should now see the background color of version 1 (our canary) changed:"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Team apps",src:r(9736).Z+"",width:"2422",height:"1188"})}),"\n",(0,s.jsx)(n.p,{children:"Do you see the difference?"})]})}function h(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},4353:(e,n,r)=>{r.d(n,{Z:()=>s});const s=r.p+"assets/images/canary-v1-7918cee6deeb9623785fde0e3f2ad204.png"},9736:(e,n,r)=>{r.d(n,{Z:()=>s});const s=r.p+"assets/images/canary-v2-mediumgreen-159d17ee97473283700b9d217c99ba84.png"},1663:(e,n,r)=>{r.d(n,{Z:()=>s});const s=r.p+"assets/images/canary-v2-de0a8acd39d54883520fbb243566df54.png"},1151:(e,n,r)=>{r.d(n,{Z:()=>l,a:()=>i});var s=r(7294);const t={},a=s.createContext(t);function i(e){const n=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),s.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a5fb0fed.a20924d5.js b/assets/js/a5fb0fed.a20924d5.js deleted file mode 100644 index 00233a760..000000000 --- a/assets/js/a5fb0fed.a20924d5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[5459],{2894:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>o,contentTitle:()=>i,default:()=>h,frontMatter:()=>a,metadata:()=>l,toc:()=>d});var s=r(5893),t=r(1151);const a={slug:"lab-28",title:"Canary deployments",sidebar_label:"Canary Deployments"},i=void 0,l={id:"get-started/labs/lab-28",title:"Canary deployments",description:"In this lab we are going to create a canary deployment. The idea behind canary deployment (or rollout) is to introduce a new version of a service by first testing it using a small percentage of user traffic, and then if all goes well the percentage while simultaneously phasing out the old version.",source:"@site/docs/get-started/labs/lab-28.md",sourceDirName:"get-started/labs",slug:"/get-started/labs/lab-28",permalink:"/docs/get-started/labs/lab-28",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/tree/main/docs/get-started/labs/lab-28.md",tags:[],version:"current",frontMatter:{slug:"lab-28",title:"Canary deployments",sidebar_label:"Canary Deployments"},sidebar:"mainSidebar",previous:{title:"Use OpenTelemery",permalink:"/docs/get-started/labs/lab-27"},next:{title:"Overview",permalink:"/docs/for-ops/console/overview"}},o={},d=[{value:"Prepare images",id:"prepare-images",level:2},{value:"Create a workload from the developer catalog",id:"create-a-workload-from-the-developer-catalog",level:2},{value:"Expose the service",id:"expose-the-service",level:2},{value:"See the results",id:"see-the-results",level:2},{value:"Update the canary image",id:"update-the-canary-image",level:2}];function c(e){const n={a:"a",code:"code",h2:"h2",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"In this lab we are going to create a canary deployment. The idea behind canary deployment (or rollout) is to introduce a new version of a service by first testing it using a small percentage of user traffic, and then if all goes well the percentage while simultaneously phasing out the old version."}),"\n",(0,s.jsx)(n.p,{children:"For this we are going to deploy the stable version (blue), introduce a new version and then change the new version until we are happy with it and then increase the traffic to the new version."}),"\n",(0,s.jsx)(n.h2,{id:"prepare-images",children:"Prepare images"}),"\n",(0,s.jsxs)(n.p,{children:["For this lab we need the 2 images (",(0,s.jsx)(n.code,{children:"blue"})," and ",(0,s.jsx)(n.code,{children:"green"}),") we already created in the previous labs. If you haven't created the blue and green images, first complete these 2 labs:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"/docs/get-started/labs/lab-6",children:"Build images"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"/docs/get-started/labs/lab-26",children:"Trigger builds"})}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"create-a-workload-from-the-developer-catalog",children:"Create a workload from the developer catalog"}),"\n",(0,s.jsxs)(n.p,{children:["Go to the list of Builds and add the repository of the ",(0,s.jsx)(n.code,{children:"green"})," build to your clipboard."]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["Go to ",(0,s.jsx)(n.code,{children:"Workloads"})," in the left menu and click on ",(0,s.jsx)(n.code,{children:"New Workload"})]}),"\n",(0,s.jsxs)(n.li,{children:["Add the Name ",(0,s.jsx)(n.code,{children:"canary"})," for the workload"]}),"\n",(0,s.jsxs)(n.li,{children:["Select ",(0,s.jsx)(n.code,{children:"otomi-quickstart-k8s-deployment-canary"})," from the catalog"]}),"\n",(0,s.jsxs)(n.li,{children:["Set the ",(0,s.jsx)(n.code,{children:"Auto image updater"})," to ",(0,s.jsx)(n.code,{children:"Digest"})," and fill in:"]}),"\n"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"imageRepository = paste from the clipboard"}),"\n",(0,s.jsxs)(n.li,{children:["imageParameter = ",(0,s.jsx)(n.code,{children:"versionTwo.image.repository"})]}),"\n",(0,s.jsxs)(n.li,{children:["tagParameter = ",(0,s.jsx)(n.code,{children:"versionTwo.image.tag"})]}),"\n"]}),"\n",(0,s.jsxs)(n.ol,{start:"5",children:["\n",(0,s.jsxs)(n.li,{children:["In the workload ",(0,s.jsx)(n.code,{children:"values"}),", change the following parameters:"]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"# For the v1 as the stable version\nversionOne:\n image:\n repository: # paste from clipboard, but change to blue\n tag: latest\n# The v2 as canary with the auto image updater configured\nversionTwo:\n image:\n repository: # paste from clipboard. This will be the green image\n tag: latest\n"})}),"\n",(0,s.jsxs)(n.ol,{start:"6",children:["\n",(0,s.jsxs)(n.li,{children:["Click ",(0,s.jsx)(n.code,{children:"Submit"})]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Now click on ",(0,s.jsx)(n.code,{children:"Deploy Changes"})]}),"\n",(0,s.jsxs)(n.p,{children:["We now created 2 deployments. One for ",(0,s.jsx)(n.code,{children:"blue"})," and one for ",(0,s.jsx)(n.code,{children:"green"}),". The ",(0,s.jsx)(n.code,{children:"green"})," image (our canary) will be automatically updated after a change (commit)."]}),"\n",(0,s.jsx)(n.h2,{id:"expose-the-service",children:"Expose the service"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["In the left menu panel under click ",(0,s.jsx)(n.code,{children:"Services"})," then click on ",(0,s.jsx)(n.code,{children:"Create Service"})]}),"\n",(0,s.jsxs)(n.li,{children:["Select the ",(0,s.jsx)(n.code,{children:"canary"})," service"]}),"\n",(0,s.jsxs)(n.li,{children:["Under ",(0,s.jsx)(n.code,{children:"Traffic Control"})," click ",(0,s.jsx)(n.code,{children:"enabled"})," (and use the default weights for v1 and v2)"]}),"\n",(0,s.jsxs)(n.li,{children:["Under ",(0,s.jsx)(n.code,{children:"Exposure Ingress"}),", select ",(0,s.jsx)(n.code,{children:"Ingress"})," and use the default configuration"]}),"\n",(0,s.jsxs)(n.li,{children:["Click ",(0,s.jsx)(n.code,{children:"Submit"})]}),"\n",(0,s.jsxs)(n.li,{children:["Click ",(0,s.jsx)(n.code,{children:"Deploy Changes"})]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"see-the-results",children:"See the results"}),"\n",(0,s.jsxs)(n.p,{children:["You will see the ",(0,s.jsx)(n.code,{children:"canary"})," service in the list of Services. Click on the URL and refresh the page for a couple of times. You should first see:"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Team apps",src:r(4353).Z+"",width:"1946",height:"974"})}),"\n",(0,s.jsx)(n.p,{children:"After a refresh of the page you should see:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Team apps",src:r(1663).Z+"",width:"1944",height:"968"})}),"\n",(0,s.jsx)(n.h2,{id:"update-the-canary-image",children:"Update the canary image"}),"\n",(0,s.jsxs)(n.p,{children:["Go to the ",(0,s.jsx)(n.code,{children:"green"})," repo and change the ",(0,s.jsx)(n.code,{children:"background-color"})," in the ",(0,s.jsx)(n.code,{children:"green.html"})," file from ",(0,s.jsx)(n.code,{children:"green"})," to ",(0,s.jsx)(n.code,{children:"MediumSeaGreen"})," and commit the change. After a couple of minutes you should now see the background color of version 1 (our canary) changed:"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Team apps",src:r(9736).Z+"",width:"2422",height:"1188"})}),"\n",(0,s.jsx)(n.p,{children:"Do you see the difference?"})]})}function h(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},4353:(e,n,r)=>{r.d(n,{Z:()=>s});const s=r.p+"assets/images/canary-v1-7918cee6deeb9623785fde0e3f2ad204.png"},9736:(e,n,r)=>{r.d(n,{Z:()=>s});const s=r.p+"assets/images/canary-v2-mediumgreen-159d17ee97473283700b9d217c99ba84.png"},1663:(e,n,r)=>{r.d(n,{Z:()=>s});const s=r.p+"assets/images/canary-v2-de0a8acd39d54883520fbb243566df54.png"},1151:(e,n,r)=>{r.d(n,{Z:()=>l,a:()=>i});var s=r(7294);const t={},a=s.createContext(t);function i(e){const n=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),s.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/af971854.272b6328.js b/assets/js/af971854.272b6328.js new file mode 100644 index 000000000..1e610bc01 --- /dev/null +++ b/assets/js/af971854.272b6328.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[1509],{5575:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>a,default:()=>h,frontMatter:()=>c,metadata:()=>r,toc:()=>l});var s=n(5893),i=n(1151);const c={slug:"lab-33",title:"Create rabbitMQ Cluster",sidebar_label:"Create RabbitMQ cluster"},a=void 0,r={id:"get-started/labs/lab-33",title:"Create rabbitMQ Cluster",description:"In this lab we will deploy a RabbitMQ workload that is created with the Catalog.",source:"@site/docs/get-started/labs/lab-33.md",sourceDirName:"get-started/labs",slug:"/get-started/labs/lab-33",permalink:"/docs/get-started/labs/lab-33",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/tree/main/docs/get-started/labs/lab-33.md",tags:[],version:"current",frontMatter:{slug:"lab-33",title:"Create rabbitMQ Cluster",sidebar_label:"Create RabbitMQ cluster"},sidebar:"mainSidebar",previous:{title:"Canary Deployments",permalink:"/docs/get-started/labs/lab-28"},next:{title:"Overview",permalink:"/docs/for-ops/console/overview"}},d={},l=[{value:"Enabling RabbitMQ",id:"enabling-rabbitmq",level:2},{value:"Creating a RabbitMQ Cluster",id:"creating-a-rabbitmq-cluster",level:2},{value:"Adding Queues and Policies",id:"adding-queues-and-policies",level:2},{value:"Accessing the RabbitMQ Management UI",id:"accessing-the-rabbitmq-management-ui",level:2},{value:"Checking the RabbitMQ Management UI",id:"checking-the-rabbitmq-management-ui",level:2},{value:"Connecting an Application to the rabbitMQ Cluster",id:"connecting-an-application-to-the-rabbitmq-cluster",level:2}];function o(e){const t={admonition:"admonition",code:"code",h2:"h2",img:"img",p:"p",pre:"pre",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:"In this lab we will deploy a RabbitMQ workload that is created with the Catalog."}),"\n",(0,s.jsx)(t.h2,{id:"enabling-rabbitmq",children:"Enabling RabbitMQ"}),"\n",(0,s.jsxs)(t.p,{children:["As an ",(0,s.jsx)(t.code,{children:"Admin"})," go to the ",(0,s.jsx)(t.code,{children:"Apps"})," panel and activate ",(0,s.jsx)(t.code,{children:"RabbitMQ"}),", afterwards click the ",(0,s.jsx)(t.code,{children:"deploy"})," button.\nIf you are not and ",(0,s.jsx)(t.code,{children:"Admin"})," then ask your ",(0,s.jsx)(t.code,{children:"Admin"})," to enable the ",(0,s.jsx)(t.code,{children:"RabbitMQ"})," application."]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Apps Overview",src:n(3695).Z+"",width:"901",height:"619"})}),"\n",(0,s.jsx)(t.h2,{id:"creating-a-rabbitmq-cluster",children:"Creating a RabbitMQ Cluster"}),"\n",(0,s.jsxs)(t.p,{children:["To create a RabbitMQ Cluster, on the team overview click on the ",(0,s.jsx)(t.code,{children:"Catalog"})," in the sidebar and select the ",(0,s.jsx)(t.code,{children:"RabbitMQ"})," workload. This will take you to the page with the readme where you can see all specifications and definitions that you can use to create your RabbitMQ Cluster with Queues and Policies."]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Workload Catalog",src:n(8521).Z+"",width:"1917",height:"903"})}),"\n",(0,s.jsxs)(t.p,{children:["To configure the RabbitMQ Cluster workload go to the ",(0,s.jsx)(t.code,{children:"Values"})," tab and fill in a name for the RabbitMQ Cluster workload. Afterwards you can scroll down an edit the cluster parameters."]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Add Name",src:n(2020).Z+"",width:"1920",height:"950"})}),"\n",(0,s.jsx)(t.h2,{id:"adding-queues-and-policies",children:"Adding Queues and Policies"}),"\n",(0,s.jsxs)(t.p,{children:["To configure ",(0,s.jsx)(t.code,{children:"Queues"})," and ",(0,s.jsx)(t.code,{children:"Policies"})," for the rabbitMQ Cluster you can add them to the ",(0,s.jsx)(t.code,{children:"queues"})," and ",(0,s.jsx)(t.code,{children:"policies"})," parameters respectively.\nFor example we create a rabbitMQ Cluster workload with the name ",(0,s.jsx)(t.code,{children:"rabbit1"})," with 2 ",(0,s.jsx)(t.code,{children:"queues"})," and 2 ",(0,s.jsx)(t.code,{children:"policies"}),"."]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Fill In Values",src:n(6009).Z+"",width:"1920",height:"966"})}),"\n",(0,s.jsx)(t.admonition,{title:"ALERT",type:"info",children:(0,s.jsxs)(t.p,{children:["Do remember that even though these values can be edited afterwards, not all specifications or definitions can be updated after a ",(0,s.jsx)(t.code,{children:"queue"})," or ",(0,s.jsx)(t.code,{children:"policy"})," has been created. Please make sure everything is filled in correctly."]})}),"\n",(0,s.jsxs)(t.p,{children:["When everything is filled in correctly you can ",(0,s.jsx)(t.code,{children:"submit"})," and click the ",(0,s.jsx)(t.code,{children:"deploy changes"})," button."]}),"\n",(0,s.jsxs)(t.p,{children:["To check the status of the deployment you can go to the ",(0,s.jsx)(t.code,{children:"workload"})," list page."]}),"\n",(0,s.jsxs)(t.p,{children:["Workload Status:\n",(0,s.jsx)(t.img,{alt:"Check Workload Status",src:n(7338).Z+"",width:"1920",height:"966"})]}),"\n",(0,s.jsxs)(t.p,{children:["ArgoCD Status:\n",(0,s.jsx)(t.img,{alt:"Check ArgoCD",src:n(9740).Z+"",width:"1920",height:"968"})]}),"\n",(0,s.jsx)(t.h2,{id:"accessing-the-rabbitmq-management-ui",children:"Accessing the RabbitMQ Management UI"}),"\n",(0,s.jsxs)(t.p,{children:["To access the ",(0,s.jsx)(t.code,{children:"RabbitMQ Management UI"})," you have to retrieve the default user credentials and ",(0,s.jsx)(t.code,{children:"port-forward"})," the ",(0,s.jsx)(t.code,{children:"rabbitMQ server"}),".\nTo do this connect to your k8s cluster with ",(0,s.jsx)(t.code,{children:"kubectl"}),"."]}),"\n",(0,s.jsx)(t.admonition,{title:"NOTE",type:"info",children:(0,s.jsxs)(t.p,{children:["In this example the ",(0,s.jsx)(t.code,{children:"rabbitMQ cluster"})," was created in the demo team so we have to get the ",(0,s.jsx)(t.code,{children:"secret"})," from the ",(0,s.jsx)(t.code,{children:"team-demo"})," namespace. Please retrieve the ",(0,s.jsx)(t.code,{children:"secret"})," from the namespace where the ",(0,s.jsx)(t.code,{children:"rabbitMQ cluster"})," was created."]})}),"\n",(0,s.jsx)(t.p,{children:"To retrieve the username and decode it from base64 use the following command:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:'kubectl get secret rabbit1-rabbitmq-default-user -n team-demo -o jsonpath="{.data.username}" | base64 --decode\n'})}),"\n",(0,s.jsx)(t.p,{children:"To retrieve the password and decode it from base64 use the following command:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:'kubectl get secret rabbit1-rabbitmq-default-user -n team-demo -o jsonpath="{.data.password}" | base64 --decode\n'})}),"\n",(0,s.jsxs)(t.p,{children:["Which looks like the this:\n",(0,s.jsx)(t.img,{alt:"User Credentials",src:n(107).Z+"",width:"797",height:"77"})]}),"\n",(0,s.jsx)(t.admonition,{title:"ALERT",type:"info",children:(0,s.jsxs)(t.p,{children:["Make sure you don't copy the ",(0,s.jsx)(t.code,{children:"%"})," symbol at the end."]})}),"\n",(0,s.jsxs)(t.p,{children:["Now you have to ",(0,s.jsx)(t.code,{children:"port-forward"})," the rabbitmq ",(0,s.jsx)(t.code,{children:"container"})," with port number ",(0,s.jsx)(t.code,{children:"15672"})," that is inside the rabbitmq ",(0,s.jsx)(t.code,{children:"pod"})," called ",(0,s.jsx)(t.code,{children:"rabbit1-rabbitmq-server-0"})," to a port of your choice that is not used, I use port ",(0,s.jsx)(t.code,{children:"56027"})," for this example."]}),"\n",(0,s.jsx)(t.admonition,{title:"ALERT",type:"info",children:(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.code,{children:"rabbit1-rabbitmq-server-0"})," has the prefix ",(0,s.jsx)(t.code,{children:"rabbit1"})," because this is the name that we gave it when creating the workload."]})}),"\n",(0,s.jsxs)(t.p,{children:["To ",(0,s.jsx)(t.code,{children:"port-forward"})," use the following command:"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:"kubectl port-forward -n team-demo rabbit1-rabbitmq-server-0 56027:15672\n"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Port Forwarding",src:n(2933).Z+"",width:"523",height:"64"})}),"\n",(0,s.jsxs)(t.p,{children:["Access ",(0,s.jsx)(t.code,{children:"http://localhost:56027"})," and use the previously acquired user credentials to log in. If you cannot log in, please check if the credentials are for the correct rabbitMQ cluster."]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Logging-in to Management UI",src:n(8603).Z+"",width:"863",height:"252"})}),"\n",(0,s.jsx)(t.h2,{id:"checking-the-rabbitmq-management-ui",children:"Checking the RabbitMQ Management UI"}),"\n",(0,s.jsx)(t.p,{children:"Now that we are logged in you should see the following:"}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"ManagementUI Overview",src:n(8757).Z+"",width:"1920",height:"968"})}),"\n",(0,s.jsxs)(t.p,{children:["We can also check the ",(0,s.jsx)(t.code,{children:"queues"})," that we specified when creating the rabbitmq cluster in the ",(0,s.jsx)(t.code,{children:"Queues and Streams"})," tab."]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Overview Queues",src:n(5459).Z+"",width:"2153",height:"486"})}),"\n",(0,s.jsxs)(t.p,{children:["To see the ",(0,s.jsx)(t.code,{children:"policies"})," that we defined you can see them in the ",(0,s.jsx)(t.code,{children:"Admin"})," tab and under ",(0,s.jsx)(t.code,{children:"Policies"}),":"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Overview Policies",src:n(5331).Z+"",width:"1919",height:"614"})}),"\n",(0,s.jsx)(t.h2,{id:"connecting-an-application-to-the-rabbitmq-cluster",children:"Connecting an Application to the rabbitMQ Cluster"}),"\n",(0,s.jsx)(t.admonition,{title:"NOTE",type:"info",children:(0,s.jsx)(t.p,{children:"Will be expanded upon"})}),"\n",(0,s.jsxs)(t.p,{children:["To connect to the ",(0,s.jsx)(t.code,{children:"rabbitMQ cluster"})," you use ",(0,s.jsx)(t.code,{children:"AMQP"})," to open a connection. To open a connection you need to create a connection string using the ",(0,s.jsx)(t.code,{children:"username"}),", ",(0,s.jsx)(t.code,{children:"password"}),", ",(0,s.jsx)(t.code,{children:"host"})," and ",(0,s.jsx)(t.code,{children:"port"})," of the rabbitmq cluster."]}),"\n",(0,s.jsx)(t.p,{children:"To get the host use the following command:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:'kubectl get secret rabbit1-rabbitmq-default-user -n team-demo -o jsonpath="{.data.host}" | base64 --decode\n'})}),"\n",(0,s.jsx)(t.p,{children:"To get the port use the following command:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:'kubectl get secret rabbit1-rabbitmq-default-user -n team-demo -o jsonpath="{.data.port}" | base64 --decode\n'})}),"\n",(0,s.jsx)(t.p,{children:"The connection string is build like this:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:"amqp://USERNAME:PASSWORD@HOST:PORT/\n"})}),"\n",(0,s.jsx)(t.p,{children:"With values:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:"amqp://default_user_mWPUECo5wsbtpgY3oze:MdzUL4CcgF-cQryLfk5uxqf57qqWBG8l@matthew-rabbit1-rabbitmq.team-admin.svc:5672/\n"})})]})}function h(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(o,{...e})}):o(e)}},3695:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/rabbitmq-0-enable-rabbitmq-41fe464d5087649f78f676b568bc284d.png"},8521:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/rabbitmq-1-click-workload-80714dc960e250ad522bad870cfb3f0a.png"},5459:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/rabbitmq-10-queues-c7282e26180c8b45ad0feff6f3f371c4.png"},5331:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/rabbitmq-11-policies-7b9fd478e92bcfae01acec2631c8f014.png"},2020:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/rabbitmq-2-add-name-b1d02de65d838bcfba89fba525a26c66.png"},6009:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/rabbitmq-3-add-queues-and-policies-50d05b131a2233305b0f823cadac520c.png"},7338:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/rabbitmq-4-check-status-cfe771d487ed7a5c525958cb5c4c12d0.png"},9740:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/rabbitmq-5-check-argocd-status-3b82c45792c65008c36d7831ff13f318.png"},107:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/rabbitmq-6-user-credentials-e21d1f14b2081e44510671e2a59e1246.png"},2933:(e,t,n)=>{n.d(t,{Z:()=>s});const s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgsAAABACAYAAACUXzRIAAABJ2lDQ1BrQ0dDb2xvclNwYWNlQWRvYmVSR0IxOTk4AAAokWNgYFJILCjIYRJgYMjNKykKcndSiIiMUmB/wcDMwM7Ax6DEwJWYXFzgGBDgwwAEMBoVfLvGwAiiL+uCzMKUxwu4UlKLk4H0HyDOTi4oKmFgYMwAspXLSwpA7B4gWyQpG8xeAGIXAR0IZG8BsdMh7BNgNRD2HbCakCBnIPsDkM2XBGYzgeziS4ewBUBsqL0gIOiYkp+UqgDyvYahpaWFJol+IAhKUitKQLRzfkFlUWZ6RomCIzCkUhU885L1dBSMDIxMGBhA4Q5R/TkQHJ6MYmcQYgiAEJsjwcDgv5SBgeUPQsykl4FhgQ4DA/9UhJiaIQODgD4Dw745yaVFZVBjGJmMGRgI8QH19EpCKA4mkQAAAFZlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA5KGAAcAAAASAAAARKACAAQAAAABAAACC6ADAAQAAAABAAAAQAAAAABBU0NJSQAAAFNjcmVlbnNob3TMTbuhAAAB1WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNi4wLjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+CiAgICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj42NDwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj41MjM8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpVc2VyQ29tbWVudD5TY3JlZW5zaG90PC9leGlmOlVzZXJDb21tZW50PgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KT4iVhwAAIlhJREFUeAHtnQnMJEUVxwsXFUTUKB5BiBeyKIsiC3JERVGMREJUwHiR3aAIKFFjDF4RRUWyEoKrwrpeCKIr3lEOUcGoiEoQT0C8VlGOAF4gHoC07/fwNTX9VVX39BzfzMerZKa763z1r+qqV9VV9d8khFDJz40j4Ag4Ao6AI+AIOAJJBO6RtHVLR8ARcAQcAUfAEXAE/o+AKwteFRwBR8ARcAQcAUegiIArC0V43NERcAQcAUfAEXAEXFnwOuAIOAKOgCPgCDgCRQRcWSjC446OgCPgCDgCjoAj4MqC1wFHwBFwBBwBR8ARKCIwdmXhXve6Vzj11FPD9ttvX0y46bj55ptruMc+9rFNp4k9n3TSSZom8r7oRS+aWDrTiPjFL35x+OEPfxguu+yycPzxx08jyZHS+NjHPhae8IQnjBTHUgw8b7iU3tuSW1x2D3zgA8M97jH2pihOovd9KQ8ltzjBWc5fLOe83D/mMY+Zan3JpUdf96hHPWpeYEvKOWweOGch+5NOtPrLX/6i7rfcckv17Gc/O+uXeB70oAdVmAMOOKDor5nm1ltvreH222+/ocI140k9P+95z6te8pKXLIj3ggsuqH76059Wt912W3XWWWctcE/FNUm7nJxtaT7lKU9R7H75y19WH/zgB6s3vvGNi56XNpkR+JBDDlk0Ofti3ZavUd0XG5dh5S+9tyW3OJ2///3vyfcvV0abbrpp9ZrXvKb61a9+VX3/+9+faB0q5aHkNkr+4rB+f1ffRBt+6623alt3xx13VGvXru1U9q997Ws1TPxH/TFsjz322Oqmm26qiHP58uW1fSm97373u3V0//73v+v+7sMf/nBtH9984QtfqOO1dJvXUr3uk4c2WXJ5aMoVPd9VGJFlnTEZ6VSXXHJJxYsBmKKJ1G4p/7OoLNCg0LCk5MXu2muvTTZWOf+Tsm+TM5cuCsJ///vfisqW8zNr9rxIi6ks9MV60jguNi7D5q/UYZbc4nSe8YxnVDKjuKDu5sqIwQudxn/+85/qxz/+8YJwcdyj3pfyUHKL0x02f3FYv7+zf6Lfobxl9rTadtttqxNOOEH74ic/+cmt5f/+97+/YqCL8mm/bbbZRsOdeOKJ2q994hOfqJ71rGdVMsOl9qX0UC7oC5/61KdWMrtUMUj785//rOFkFql63OMeV/8YXGOe85znDMgpM++VzKwO2JXqdZ88lGQp5aFQ59LKAsAx6v7Xv/6lWtfGjRsVoB/96EcDGWxG3FQWGLH/4x//UPAoAF7y5z73uXUcVABmL+zF+/3vf6/p4O/tb3977Q+Nz2RAkzv66KNrN0D/05/+pOGI77jjjlO3gw46SNOjYDHEye8Rj3hEHRb5h1EWHv7wh2scv/jFL+r03vzmN9fxUYGuv/56dSPfL3/5y2s3Kjbpv+9976vIA+b1r3991VXOJtY0QsTXzN8LX/hCTbOPLJdffnn1rne9S8Mz4ttzzz2rnXfeWV9U0qes0MIxYP2Wt7ylNX+Eoz6Z9k45YkZRFh760Idq3j/5yU/WGHzpS1+qZWliZc9tWJfqWS7vn/nMZ3T2DYXtZz/7WXXjjTfqbNWRRx7ZKk8Jl5wsbemVyt1wSF1z9RO/ubyX3tuSG3Fa40gdPu2002qs2srIGl6wHkZZmIf8tZUtebf3749//KO2IwceeGCNXapcsdtrr720XeK9YyaVQaD5zdUz3HOYHXPMMSqHda74vfLKKysbQfeJ0+RJXZEDY2W/YsUKfba2PhXG7GgXaHPo2GN5cafunXzyydr/mH+upfTIO8qF+V+zZo1ias/x9ctf/rLiHttxT99Aux3bW95S9bpPHuK4uY9lGSYPUTxpZYEOgmkMGsCvfe1rCvZ1112nwEaBBzKLfawsnH766Vqg9gkAZQFjnRn+MYcddlitLPzhD3+oqPw2RYIGhr9rrrmmIv3999+/OvPMMzXc4x//eHW74YYbtEDQGnkJMEzNIwsFQCUmPPf8miPwYZQFtFrM7373O/208ZOf/ESfH/3oR2u8KFe48Rnm/PPPVzc0TfJAI47hZaVRoJKBc1c5iSP+3f/+99f8kA7pWv6Ijzz2keVb3/pW9e1vf7vaZZddVFY0b6bsbr75Zk2bl4sRH0rE17/+dfWDHKX84cbLAc7UhQsvvFDDjaIsoLRh0OhXrVqlnQ3PyBVj1Lxvw7pUz3J5/+Y3v6kNJ4ofhoaEmSxGHM30m88lXHKylNJrK/dm+vFzrn7iJ5d3UwhS723JjThRpJleBYP4M2BbGZnMqUbV3FLXechfqWzJEyNk3iMGXNYOdnmPUCyuvvrq6pnPfKa24dRT2gvizNUz3HKYMeDCHHrooRoH7TTGPj/3iTNVZmaHsoqhD6Gdpw3F0MeYn9yV2QgbUHH94he/qGFWrlypcdCGYOjr3va2t6nbMOkxUL3iiisWyHHf+95X44wHVCYjgxzaT3uOr6l63ScPcZwlWfCXy0Mch9wPdkDxs3XuvLzMKKA8xO6pe/xirLN/wxveUIex+ErKglU2/FJ473nPe+qOi04BjZIfjRcdGbMKGKv4yETnGWvbuelMk7+PsmDp0VFSAdHUrIKZgoMWi5yGm714r3zlK2tMTAauOTl5Iehg7YeiEYejc2K0Edv1lYVZBV50NHbydemll2pHbCM4GhumjJleY+SMYYaDtHP5owPH7L333rWMPHdp5HJ5N2XB6gvpI+/rXve6Oo0Yj+Z9CmtTkFL1jPC5vNPAm2JAvpCJMkG5JVwuDyVcSrKU0msr9yYO8XOu/Ep5N4XAyiF+b0tucbq59y9VRnG4VKOaw5pw85C/UtlafaEeGg7xe1TKO3URhY62k7C0QbRTpXrWhpksptb2AX+0cSh93I8SZy4PsoCbrOqsJ+85g0JmPul0SbP0YyaX/og6iqKA4T2xd4W+DcWBgRJx07Z0TY98E2b33XdfIAPp0v43B6clWXFL1es+eYjTKclSykMcx6bykDTvfe97g7xc6vapT30q7LTTTmHLLbcMr371q4NM2yTDxJYystdHVucPY0RjVO8CchAtOogGG3bddVe1kwZ4ICoZ5Ycdd9xR7WQ0XLvJy1TfT+pGKohGLRU2/POf/wyPfOQjw7JlywL2MqpUN+7lk0RgNW1spOLGj633Urc1XvPIc5uR2Yxesoi2G970pjcFMJSXJ8j0pSb1gx/8QK/SwQfpTMPtt98eZOZC7ch3bJr5k0ZJnZv2cZjcfVverb4QHr+sUO9rSvWMOLvkPZV2Lg8lXNpkSaWDXddyz4XHPlVObXm3cojfW0uj5GZ+xnXNYR3HP6/522677TQbcVsX56uU95e+9KXhs5/9bPj5z3+u7eq6deuCdBJBlAaNItW2xnGnMJPBWvjoRz8a7nOf+4TnP//5QWY6NEjXupuKM5cHGThq3G9961vDq171qvChD30oHHzwwQPtYixvfC8DiPrxK1/5ShClRuU999xz1X7fffcN8kksyAAzyCxDkMFPoB5jSumBncyKB1lQrjvRNED0h5soJ9pWRta9bvvk4YwzzqjTysnSloc6ArnJKgsUjiwC0YpFAd7znvcMv/3tb4MVWhxJ6n7Dhg2qbMi3lkAll2mOGjQqVxez2WabaWcr02fqHcXAOmIs6Iz32GMPdaORlFGw3suOCvWHvGZklG+3Y70SLx2UaO5BNHfd0sNWKSof5gEPeEAw+bsknJKTznlY01eW733ve6r0POlJTwoyexJQHuT7Y5CZhiAatyoKsgo5UHlR5GSNSatoV111lfrZYYcdgqyJaPUfe+iT9zh86b6JtZVTqp71zTvp5/JQwqUkC2WSM33LPRcf9sPm3d7bVJwlt5T/Zhml/MR2OaxjP837eckfbShGPr8GGX02s5GtZ3jcZJNNAtvSadPp3GTGN8i6q7ptStX5BQk0LD7+8Y8HlA7ag6222krbCLyU6m4jigWPufKzdv/www8PH/nIR4LMYOngtUv7w2B3/fr14Tvf+Y6mxyDn3ve+d9i4caM+gwvbzmV2tpanLb2nPe1pqrDIWpvAwLppGFTTz8kniKZTr+c+ebCEcrK05cHC2zXbg8qivSDf+rWzkE8BqmnRCaPRdTEyVR6e/vSna+cpWxQ1CJ27LIrTMw0AkkJvGtKl8+UMBBSUz33uczrCRdOTxTNhiy22CLI+IMjiy7DPPvuEiy++OMhiQa0MhJOppnDOOeeE3XbbrY6ajpyXRBbFBflMooWII3tkqSgyTaTxco+fLuYVr3iFVtgPfOADmkdkO/vss1WBQaMjTioK8lKhupicnF3CNv30lYUykgV6ij0zC7xQlNV5550X5JOLJoP2zb3NMFFOJYMCwuiSxoW40NYX26SwJr+5etY376V8lnApyVKKs2+5l+LskvfUe2tx5tza3r9UGVmc47zOS/6Y3eM9ouOjs6TD72JQuHh/ZYpfFQRrw+UzUbFt7RL3V7/61UBb+Otf/zrIWi0N0rfultJDOaKdR1mgLUdJwdDuthn5ZKp5Z3BD/4BiQ5/EDA39ETMs4AkuDIyxL6VH/4PCLp9mw1FHHRVkPYD+YsWWth93w6Qp4+c///laeWm6pZ775MHiScnSJQ8WPr4u+NYijmrHogcWbbHog0V7Zl+62poF+4Zp336kIDQ8cZnh27h0TrrQidXtGBYrmpHZiTpN4mNxjxnkkUqj7rixmM+MFEQdDln5HiWdgDnr9yjsYztzvOiiiwbCNvNqCxxjWeKV3CzasnjJG9saLQ47D4GVwmYXX3Nyxn5S9zKFuGDNAv76yiIve13eMs1YL24kTs6mMMOuD4yd61DKH4tYWYOC4dsmpsuahVR+sZPRoMZha0ewI36TJRfO7HNYl+pZLu/f+MY3BtYssAiXMpHOLlnOJgPXEi45WdrSK5V7nHbzvlR+ubyX3tuSG2nbe6IF+f+/+P3LlZHJzW4tW0tjdqXrPOSvrWyPOOKI+j2yNq/Le8RCUlE0aqhZYyOKu9bPXD0DyxJmuNuaMek0B+r6KHHmypA1BlZnaFvZTpjzG9uz48iwAoC4jtnOG+yJk7VnFjaXHn1ZysggSMOyhgtTOjOI9RaUh6UVX1P1um8ecrK05SGWJ7ovLw6JPCYz1sedSiqjimx8KAGs3kzFzSpcFk6l3GRtgG6PSbmxyISKjTKTcu9qZ8oCC/yQJSenzFIs2KbTJY1xyRmn1VeWOI74HgyJM7brci+ad69wXeLu46eEda6e9c17Sb42XHKylOLEbdrlXnpvS26lfJTKqBSuj1tb2ZbyUHIrydInf3F9oVPqoiyYDCxqZP+9PcfXvvUsjqN5P4k4yQO4NdNqe+Z9MAUp9gueDOC4xvZ23zc9C5+6Uga5fizl3+z65sHCj3idvrIwosDJAp1WnLGyMK00PR2vo14HvA6k6sCwykIqDrfzutWlDmTXLEhgNwkE+F7Pt7948WTCm1s5Ao6AIzBxBFgPxfotN47ApBHYRBJgpO7GEXAEHAFHwBFwBByBJAJLcmZBDuxYwGjIdkb5JpUEYRKW88ACyQpgVqSP2+RY2trS6RuuLd5xu+fknBSe45Z/2vE5LtNG3NNzBCaDQHYNAKtDm0a2v2X9i3gz4Zb6jsfq0/hI2UnKaiuIWXG8mCyQLALKsfPJgSh10cJTweplMOE0r5SxM99LuJVY2iYRrpS/Unp9GNyIr5S/SeBZykNftxJmfXBpqy85XPrK7+Fmo431crhblkM+0ygLsFOxc8F+udX/s1R5UsoCW0j6rODvk69ZYYE0oh4In+ItZiXGMVbpwmVhP3Z9YOItiilMZPTYixWubzhkyOUvlo+VzOyCie36MLiV5JwEnrG847wvYdYHl1J9KeEyzjx5XPk23LFxbMZYB/Jgoiww2kglxjnrw7IrLgajoTWO7M+Nz0NgDzh2OdZCOkljSeRMB/bpxpwWKUxQSIjTZmS452fhcgxuxJXDs42FLiWH2VkH3zxrfBjGsZipzOJNXUssbSn/Ztc3HOFz+bO4uXKmA+UR2/VhcCvJOQk8Y3mb9yjsEHvBmyIHkQ3krem3+VzCrA8uzfjj+jIMLs14/DnfLjs2js0i1YE88DSycpSljswYndlhQkxl0nnSiTJ93ZVdkcN+5HSsmmhkGoyGHFCDwkOnEX+GsEN9YBxblWAtxD8EN3T0clqXjq5Xr15dbJjlJDjtwFIskBSuEdlwGEfMOlnCs42FrkulaSoLzTA5xjE6JQ46khPAivkmPiNlYQQ+DCtc33BxHkr5S7G79WFwG0bOceAZ5695T32BZIn3E2WUA6CG3bOdwqwPLrFsbfUlh0sch9/n22PHxrFZ5DqQLwAbIWtPKX8oCAhrDSdTvDxzmAWNFt8vebZOEWazOHOLyWjYZLYzZcG+1SMn+YW10NjdmiyJbcqC5TV3omIOlxKeJRY6S6/tmuoYLAxlRr5HZU2zkzopY+LrygrXN5zJz7WUv9if3fdhcOsq57jwRNYcA5/lg0OETjjhhHoGDCXN3NquKcz64BKnMw5muzg+v8+3zY6NYzPtOtC6PYBzpaVR0t+DH/xgka87s12TVYzztInDGA0hf4LNMmY0hMCD8+3XrFmjaU2S0ZAEOGvdjOhDykth7G5N+c3fqNdmvOAgHWxNksV9iq1y1HSb4Y1xDJZJiFSaJsdU1vTHsxGMGUubzOgoeQ15KZm+4UpxtrlBgiWKW4CB7gUveIGSpcGaB8kRBhY6oa1VFjoIeOTzUqf8jRNP5KA+gp/9eI4NhEIw/ME/AvPpX//619h56Ps+uMSJ5OpLGy5xHH7vCDgCs4lAq7JAIyTf/fUnU/Oai5jZzrLVhV0xZjR897vfrWRLMBrK6HmA2Q5iIpSILiZm7uviv4sfmS5VbzTG0zB98RxFtjbGsRxTWS7NmKUNQhb5HNGJFa5vuJwcXexhcCP/ZmTGbAELHW45FrpU/saNJ+nL5zGVk7j5sR0XA7YyU6ZENLAFCn+LEtnkqIs1UIe/PrhYtLn60oaLhferI+AIzD4C2alLGdEkFziyOJBv2cLuqGd0800bIzMGGpdNt7OiXrI/8LNFkdhLR6Hh+NYpHbPeQzTFt3/WF2CMjCMXJ9/I+QQisxN67jdkHhg7L51dHOyCgKCKNRPcI799hrD4kYc8CUNe1YzTyK/G9RmiiUsJz0l8hhDGsYrtkjJ6Vm4L8OcXn40uNLOVUH4PlJ2VJSvg2Rb6zne+s3YnLJ+pLrnkEiX44jMEJt6JMM5wJgvX1JS6uUMqJtS0tZzYUxeE2rbi3Ho+Q2HYYoobuEDkQh2ARIt3gCO+S/kbFU+TteuV8+15dw488MCBfHUNj78UZn1wsTRT9aULLhber4PtpOPheMxgHcgXSk5ZIBMlZjs7Z8AWRMaZpsNmYSR202A0RJFoGljHTFmw1eHIg7JgrIUxuxuLHTGjKgslXHJ4trHQxdjm7pssZm2MYzmmMot/xYoVike8HRM31l4Y3tSdJivcuMOZPM38mT3XFLtbXwa3XP5GxTOWd1r3Kcz64pKrL224TCuvnk6+jXdsHJsh6sBoYDFSj0ekQyScHBW1Mb/l4keGcZ6jAM0w29KIkxkTTGoRYE6evvbjxrOvHG3hmLFh9J3yV2Jpm0S4lAxmx2xGbqcAWM8KC53JOwvXvrjMguwuw2jtuePn+OXqgHNDCDIpc8011+g398suuyysXLkysI5BOrqUV7dzBBwBR8ARcASWNALLJHfvWNI57Jm5devWBXZisEJ+w4YNQaagdVV6z+g8mCPgCDgCjoAjMLcI+MzC3BZdN8GZDWHrq6wlCLKorVugEXzJJ4hwv/vdT7cjXnHFFSPE5EEdAUfAEXAEZgmB5HdnEXBu7VmJH6/CJy98ux7n2oo2fDjEhxPx5DNGdfzxxy8alnbS33XXXTcVGdiVwkJRTsZsw2hc7sICmSxb1lSwRmJc6SyVeByX+W3blkod9HzMXx0snrMgK9r1YBhZ21dfhXVSynm2zaGHHhqe+MQnDgi5ceNGPYRnwHJCD7LrIXz6058OsgU0yO6P8Le//W1CKXWLVnYthIc97GHdPLf4kqOGg2wz1AOkRBFZ4HuPPfYI69evX2BfspDjuOv6ZXWNNMwIIZGeeUB95FwOM8ICqTMmv/nNb8Ltt98e1q5da06Bg6+EQCvIzpsg2yGDbJFUNzlhcUFapCmsmnXYad6U8OyDS1v+crhMM8+eliPgCMwnAtmRF9vfYI5jdGY/9uNLNmf6J41/fc6Cycr2LlZ52/Mkr7PCOkkemVngPIVcflOsjOY35WbEXE0mSwvD9ZRTTsnOLKTi7MN2yOgYGZi94RwEjj3GQPhUYjtkholzLuzXlVUzzt8470t49sGllL8SLuPMk8c12+2jl4+XT886kAcOZcFZJ+/QcyE4cMjYI3NAo5BwzgC4YbjnZ+HoyHjmDH0O/8HI6XvakXPolB1YxbkOnLtAOqOwThK+TVkgLeRN5SnlZudSpA71sThKykIqzj5sh84CeWt18sknZ7eFWlk4C2S+fTOM/OoYeR3oVAfynuhEnHVyvlkn25SFFCujvTglt77KQirOPmyHRr7FDEMby2WO7ZBZMtZXdGHVNExSV2eBzLchKbzczvHyOjCXdSAvtI2QdQgsf846uTo5Am9W/FlinWxTFpqyd33uqyyk4u/DdugskJV+XpIzQCpZF6OzQ5xKGuPrLJD5ti3Gye8dJ68D7XVgUwGpaGCdtAVrMoWufuV7byeWxCa7IqyTMBwa6+Ree+2l8cWsk6uEPIfFapD7YO7urJOioykOS/kPtkMzMEHKp4oAC+S5556r1rBAQmYmXAhBdlkoC6TVRWO5hNzp4IMPHjgLw9gO5QjvkVk1EYSyEAXaRNXn+kFuJsECafF3xeWMM86wIKGNBTKHSx2B3zgCjoAj8H8Eirsh8OOsk5OvK4vBOjn5XHVPoQ/bYRtbZRvbYY4lsSQ1iqwxQDoLZAkpd3MEHIGlhkCrspDK8Nlnn60jLEYxbP1i9mGLLbYIp512Wsp7bceo7MYbbwxQULOlcKNsZ5Sz+cN5552n2wzxyMiRLYeyeEvD4bdkoL2+7bbbAls6iYuRZmw4lEh2QaicyMi9sDzGXhbcW5xCdKVxCuvkAj/jtOiL5zhkEFZGpTpOxVVyS/nvYpeKU3YkhNNPPz0IC6Rucdxqq63CBRdcEKBcZvsj2wFlbUJg9oDRPfYcMMWWyMMPPzxss802gRM3MWyBFLbDwCwWW0aPOuoopW+W9QlBztmoRaTO4s7WylEN78DNN98cDjrooPCQhzxkYAvnKHH3wcXSS+WvCy4W3q+OgCPgCDQRGPjOKY71M2sWcrshciyJhC+xK/J91Vknl9cYG945PEdlnWxbs5BiZTSZSm4p1kILV9oNkYqzL9uhs0DeyajKe3rMMcfUdcpZIO9qw6xO+tUx8Towch0YLQLOLhjnyYjOOjlePFEWZAan2m+//erOJH5pSqyMJbc4jvgeRREFJ3eCYylO6pKzQC58H/viEpeL3y/E1TFxTLwODFUHhvKc7HCWIuDCOlnJ1HLF8cXymUM73HnMp0z7V7fccks1zeOeSe/yyy+/29SVeawXLrO3e14HvA4MUwecSErQShnWP7BafMcddwyXXnppkPMmdJdGyq/bOQKOgCPgCDgCSxkBVxaWcul63hwBR8ARcAQcgTEgcNfy8DFE1icKYYgMwhCpQU866aRw6qmn6k8WryWjk2/eA6vak57ccgCBaWMmBybpuQbCuBmEcXNAlll6ELbKZF1i5wW7aNw4Ao6AI+AI3IlAVllYvXp1kKNwB3CS7/it2yMHAnR4iBkiYYrcZZddwste9jL9pYLLYr2psUem0p9FOznuOMDAmDPTxGyajJt9WBnBaCmwVebK2u0dAUfAEZgUAsmFaNKJ67n5kmjtfu2111ayH75+jt363su++QUMkaRz1llnJdOZJntk3zxNOxw7HuSQoiReyDJNzKbJuNmHlXGpsFVOu455ene1g46FY3E3rQPpgm9TFtjjftNNN9HXK1WwHAKjnZUceKTMihAGwbDIHnBYBQ1c9tQTDvuNsqUPc8ghh9Tu+EspC0blS5xy+FPtvy09KIgtPc536MIeiQzyaaSCgAg5oUI+7rjj6jRzDJElWUpupLd8+XLFg/RgpDz66KPr9HKyyCFANcbgCDb85HAjDZvDjPT65IFwuV8b42YuPeIrsXHm0sN+3tkqS3lzt3xdc2wcG68Di1IH0omiLNBxQaFsP+iFbWaBTokR7Z577lnJaXn0VZWcvFhBZoNhn/2qVau0Y+cZfxQwcaAMyFRwdeGFF+LUSVng0CIOiCJ8POvQNT1ook1O+cSS7fSsEt5www1KGQ2joayrUDk5QwCGQRQOFI8DDjigOv/889VN+DKKeW+Tk62abG/cf//9qzPPPFPjFK4BlTMnC2dSQBl95ZVXVoTnnh8yko8cZn3zYNikrpQ9aYMH+JgsyFhKj7hQJDBsUYWSe82aNdXOO+/cWkbzzlaZwtHt0u2R4+K4eB1Y9DqQFgBlAcMo1348m7IgZFAVh8Uwcj/yyCNx0ulu6xTpSK1wUTqELEgVBvztvffetRvPXWYWLK7mrEOf9NqUBUbyGDo8S5dOUIiMKqNG3n777dWNA6lQnORI4lpZSOW9JKes09D0UK5WrFihP+I88cQTdYYjJ4vJ1vYZoolZ3zxYeqVrinGzlB5xmbIgxE813qU0zG1e2CpNXr+m2xrHxXHxOjD7daDIOimdfNhss82kHO800unYbZAOPkjnlmWIhK/BjHR2YfPNNw/SwapVk43S/I1yTaW33Xbb9UqPsxUwcBCYgSkTc+yxx7YybqZksXhSbrvuuqs6S0dr3vS67bbb6jkPPKRkGfA8xEMX1tCUnEMkMeC1S3oEGLZezAtb5QAY/uAIOAKOwBwikN0NUcqLjJJVUVi7dq2SQu20004l77XbVVddpfc77LBDbTfJG1lzoNFDHTyMgQUSQydnRo5LDmy1mwRD5NVXX63JoKRAnGU/GZFrejimZDHZuMYkSbF96n4SeUilY3aTSm9e2CoNB786Ao6AIzCvCPRSFmCFxEyTIXKa7JEXX3yxMhquX79eZ0Tks0I455xzwm677RYmwRAJA6d8dlDGRJgxYQcUoqawzz77hJIsVulkrYMyL8oiyiBrBJQpE7ccZpPIg8mSuk4qvT6sjLPEVpnCyu0cAUfAEZhVBJLfifmuL+csDLjx7dt2IgiFsH5n5+/666/Xezkeuf5uH3/vJx7cBIDqsMMO03gJwGJFjK1Z4Dt901x00UUaLudmawFy6R1xxBEL0mtbs4CcrDtgoZ4ZOBaw55djiCzJUnKz9OBUMMMCSqFe1vRKshB25cqVum7CwsqhSEXM+uaBcG2/1JqFUnq4lVhKS+k5W2V7eZTwczfHz+uA14Eh6kB/sGaFIbKUWXYXyHoJXYzJokzM7rvv3trpWZzy6UHD23N8HTfjJnGz7XHrrbdOyleShR0HLMykTGIZ2+4nkYdSmpNIjzidrbL/e1wqL3dzXL0OeB2gDix5bghOndxyyy0DRw/LCDywjsGP8pWid+MIOAKOgCPgCHREYJn4e0dHv3Ppbd26dWHZsmW6q2PDhg2BRYPs8nDjCDgCjoAj4Ag4At0QWPIzC91gcF+OgCPgCDgCjoAjkEOg126IXGR97J11sg9qw4Vx1sk0Xs46mcbFbR0BR8ARaCLwPzE4HSivW2vnAAAAAElFTkSuQmCC"},8603:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/rabbitmq-8-logging-in-4c9c20d1499ca0bcc942ba7d863a0ed3.png"},8757:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/rabbitmq-9-management-ui-0eb14163f450f423a0e19145512cad3e.png"},1151:(e,t,n)=>{n.d(t,{Z:()=>r,a:()=>a});var s=n(7294);const i={},c=s.createContext(i);function a(e){const t=s.useContext(c);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),s.createElement(c.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b0500dc6.7ce4d717.js b/assets/js/b0500dc6.7ce4d717.js new file mode 100644 index 000000000..02113a2d6 --- /dev/null +++ b/assets/js/b0500dc6.7ce4d717.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[8185],{6065:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>r,toc:()=>c});var s=n(5893),i=n(1151);const a={slug:"multi-tenancy",title:"Multi-tenancy",sidebar_label:"Multi-tenancy"},o=void 0,r={id:"use-cases/multi-tenancy",title:"Multi-tenancy",description:"Introduction",source:"@site/product/use-cases/multi-tenancy.md",sourceDirName:"use-cases",slug:"/use-cases/multi-tenancy",permalink:"/product/use-cases/multi-tenancy",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/edit/main/product/use-cases/multi-tenancy.md",tags:[],version:"current",lastUpdatedBy:"ElderMatt",lastUpdatedAt:1710142611,formattedLastUpdatedAt:"Mar 11, 2024",frontMatter:{slug:"multi-tenancy",title:"Multi-tenancy",sidebar_label:"Multi-tenancy"},sidebar:"mainSidebar",previous:{title:"Adoption Framework",permalink:"/product/use-cases/adoption-framework"},next:{title:"CI/CD",permalink:"/product/use-cases/ci-cd"}},l={},c=[{value:"Introduction",id:"introduction",level:2},{value:"Multi-tenancy in Otomi",id:"multi-tenancy-in-otomi",level:2},{value:"Why multi-tenancy in Otomi?",id:"why-multi-tenancy-in-otomi",level:2},{value:"Prevent cluster sprawl",id:"prevent-cluster-sprawl",level:3},{value:"Fast onboarding of multiple tenants",id:"fast-onboarding-of-multiple-tenants",level:3}];function d(e){const t={a:"a",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"introduction",children:"Introduction"}),"\n",(0,s.jsx)(t.p,{children:'Multi-tenant Kubernetes clusters are shared by multiple users and/or workloads which are referred to as "tenants". Operators most commonly implement resource isolation in Kubernetes, using namespaces and resource quota.'}),"\n",(0,s.jsx)(t.p,{children:"The most common use cases for implementing multi-tenancy are:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"https://kubernetes.io/docs/concepts/security/multi-tenancy/#multiple-teams",children:"Multiple teams"})," (within an organization) share a single cluster"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"https://kubernetes.io/docs/concepts/security/multi-tenancy/#multiple-customers",children:"Multiple customers"})," share a single cluster"]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["Probably the most known tools to implement multi-tenancy are ",(0,s.jsx)(t.a,{href:"https://github.com/clastix/capsule",children:"Capsule"})," and ",(0,s.jsx)(t.a,{href:"https://github.com/loft-sh/kiosk",children:"Kiosk"}),". But these tools only implement multi-tenancy on cluster API level. What they don't offer is multi-tenant and role based access to shared tools on the cluster like Harbor, Vault, Git, and Argo CD. They also don't provide isolation for container logs and custom metrics."]}),"\n",(0,s.jsx)(t.p,{children:"So what if you would like to offer teams or customers not only access to the Kubernetes API, but also to (automatically provisioned) access to a Git repo, a private docker registry, a space in Vault to create and manage secrets, Argo CD, a private Prometheus instance, isolated log aggregation? This is where Otomi steps in."}),"\n",(0,s.jsx)(t.h2,{id:"multi-tenancy-in-otomi",children:"Multi-tenancy in Otomi"}),"\n",(0,s.jsx)(t.p,{children:"Otomi goes a step higher up in the stack. Otomi does not only provide multi-tenancy on the K8s API level, but also for shared tools on the cluster."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"multi-tenancy",src:n(1998).Z+"",width:"2025",height:"1465"})}),"\n",(0,s.jsx)(t.p,{children:"When multi-tenancy in Otomi is activated (which is optional), Otomi will support the following features:"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsx)(t.li,{children:"Teams are provided with a dedicated Prometheus instance for custom metrics (for metrics that should not be accessible for other tenants)"}),"\n",(0,s.jsx)(t.li,{children:"Teams are provided with a dedicated Grafana instance configured with authorization, allowing only authenticated tenant members to access tenant dashboards"}),"\n",(0,s.jsx)(t.li,{children:"Container logs are separated in Loki combined with authorization, allowing only authenticated tenant members access to the tenants container logs"}),"\n",(0,s.jsx)(t.li,{children:"When Harbor is enabled, tenants will get access to a tenant project, allowing only authenticated tenant members to access tenant registries"}),"\n",(0,s.jsx)(t.li,{children:"When Vault is enabled, tenant will get access to a space in Vault, allowing only authenticated tenant members access to tenant secrets"}),"\n",(0,s.jsx)(t.li,{children:"When ArgoCD is enabled, tenants can only see the tenants ArgoCD applications created by Otomi"}),"\n",(0,s.jsx)(t.li,{children:"Tenants will get access to Gitea and can create their own Git repositories"}),"\n",(0,s.jsx)(t.li,{children:"Tenant namespaces are by default isolated for ingress and egress network traffic"}),"\n",(0,s.jsx)(t.li,{children:"Tenants can allow other tenants to access their services"}),"\n",(0,s.jsx)(t.li,{children:"Tenant services that are publicly exposed can be configured with OIDC, only allowing tenant members to access the exposed services"}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"why-multi-tenancy-in-otomi",children:"Why multi-tenancy in Otomi?"}),"\n",(0,s.jsx)(t.h3,{id:"prevent-cluster-sprawl",children:"Prevent cluster sprawl"}),"\n",(0,s.jsx)(t.p,{children:"As companies look to further harness the power of cloud-native, they are adopting container technologies at rapid speed, increasing the number of clusters and workloads. As the number of Kubernetes clusters grows, this is creating increased work for Platform teams. When it comes to patching security vulnerabilities or upgrading clusters, teams are doing five times the amount of work."}),"\n",(0,s.jsx)(t.p,{children:"With Otomi you can support multi-tenancy, allowing multiple tenants (like multiple development teams) to work independently on the same cluster, while sharing all the tools. Now you only have to deploy a single development cluster to support multiple development teams. This prevents you from Kubernetes cluster sprawl."}),"\n",(0,s.jsx)(t.h3,{id:"fast-onboarding-of-multiple-tenants",children:"Fast onboarding of multiple tenants"}),"\n",(0,s.jsx)(t.p,{children:"When a new project starts, or when a new development team would like to start using Kubernetes, onboarding usually takes a lot of time. It's not only about providing development teams access to a Kubernetes namespace. No, developers also need access to an image registry, container logs, container metrics, alerts, secrets stores, container vulnerability reports and policy compliance reports."}),"\n",(0,s.jsx)(t.p,{children:"With Otomi you can onboard development teams (tenants) in just a couple of minutes, allowing them to login to the self-service portal and:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Get access to a private image registry"}),"\n",(0,s.jsx)(t.li,{children:"Download the Docker login credentials to get access to their private image registry"}),"\n",(0,s.jsx)(t.li,{children:"Build OCI-compliant images from application code"}),"\n",(0,s.jsx)(t.li,{children:"Deploy images (stored in the private registry) using the Otomi workloads feature"}),"\n",(0,s.jsx)(t.li,{children:"Get access to pre-configured dashboards to see container metrics, policy violations, detected threads in containers and detected vulnerabilities in containers"}),"\n",(0,s.jsx)(t.li,{children:"Configure ingress and network policies"}),"\n",(0,s.jsx)(t.li,{children:"Configure HTTP response headers"}),"\n",(0,s.jsx)(t.li,{children:"Configure CNAMEs"}),"\n",(0,s.jsx)(t.li,{children:"Get access to Vault to create and manage secrets"}),"\n",(0,s.jsx)(t.li,{children:"Use secrets for ingress or workloads"}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"When a team already has a code repo with a Dockderfile, they can build, deploy and expose this app within minutes after they have been onboarded onto the platform."})]})}function u(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},1998:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/multi-tenancy-6d20d20cfd471ce025aa59ca8b3498bf.png"},1151:(e,t,n)=>{n.d(t,{Z:()=>r,a:()=>o});var s=n(7294);const i={},a=s.createContext(i);function o(e){const t=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b0500dc6.a2c41e40.js b/assets/js/b0500dc6.a2c41e40.js deleted file mode 100644 index 49ba0b390..000000000 --- a/assets/js/b0500dc6.a2c41e40.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[8185],{6065:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>r,toc:()=>c});var s=n(5893),i=n(1151);const a={slug:"multi-tenancy",title:"Multi-tenancy",sidebar_label:"Multi-tenancy"},o=void 0,r={id:"use-cases/multi-tenancy",title:"Multi-tenancy",description:"Introduction",source:"@site/product/use-cases/multi-tenancy.md",sourceDirName:"use-cases",slug:"/use-cases/multi-tenancy",permalink:"/product/use-cases/multi-tenancy",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/edit/main/product/use-cases/multi-tenancy.md",tags:[],version:"current",lastUpdatedBy:"jeho",lastUpdatedAt:1709649459,formattedLastUpdatedAt:"Mar 5, 2024",frontMatter:{slug:"multi-tenancy",title:"Multi-tenancy",sidebar_label:"Multi-tenancy"},sidebar:"mainSidebar",previous:{title:"Adoption Framework",permalink:"/product/use-cases/adoption-framework"},next:{title:"CI/CD",permalink:"/product/use-cases/ci-cd"}},l={},c=[{value:"Introduction",id:"introduction",level:2},{value:"Multi-tenancy in Otomi",id:"multi-tenancy-in-otomi",level:2},{value:"Why multi-tenancy in Otomi?",id:"why-multi-tenancy-in-otomi",level:2},{value:"Prevent cluster sprawl",id:"prevent-cluster-sprawl",level:3},{value:"Fast onboarding of multiple tenants",id:"fast-onboarding-of-multiple-tenants",level:3}];function d(e){const t={a:"a",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"introduction",children:"Introduction"}),"\n",(0,s.jsx)(t.p,{children:'Multi-tenant Kubernetes clusters are shared by multiple users and/or workloads which are referred to as "tenants". Operators most commonly implement resource isolation in Kubernetes, using namespaces and resource quota.'}),"\n",(0,s.jsx)(t.p,{children:"The most common use cases for implementing multi-tenancy are:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"https://kubernetes.io/docs/concepts/security/multi-tenancy/#multiple-teams",children:"Multiple teams"})," (within an organization) share a single cluster"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"https://kubernetes.io/docs/concepts/security/multi-tenancy/#multiple-customers",children:"Multiple customers"})," share a single cluster"]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["Probably the most known tools to implement multi-tenancy are ",(0,s.jsx)(t.a,{href:"https://github.com/clastix/capsule",children:"Capsule"})," and ",(0,s.jsx)(t.a,{href:"https://github.com/loft-sh/kiosk",children:"Kiosk"}),". But these tools only implement multi-tenancy on cluster API level. What they don't offer is multi-tenant and role based access to shared tools on the cluster like Harbor, Vault, Git, and Argo CD. They also don't provide isolation for container logs and custom metrics."]}),"\n",(0,s.jsx)(t.p,{children:"So what if you would like to offer teams or customers not only access to the Kubernetes API, but also to (automatically provisioned) access to a Git repo, a private docker registry, a space in Vault to create and manage secrets, Argo CD, a private Prometheus instance, isolated log aggregation? This is where Otomi steps in."}),"\n",(0,s.jsx)(t.h2,{id:"multi-tenancy-in-otomi",children:"Multi-tenancy in Otomi"}),"\n",(0,s.jsx)(t.p,{children:"Otomi goes a step higher up in the stack. Otomi does not only provide multi-tenancy on the K8s API level, but also for shared tools on the cluster."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"multi-tenancy",src:n(1998).Z+"",width:"2025",height:"1465"})}),"\n",(0,s.jsx)(t.p,{children:"When multi-tenancy in Otomi is activated (which is optional), Otomi will support the following features:"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsx)(t.li,{children:"Teams are provided with a dedicated Prometheus instance for custom metrics (for metrics that should not be accessible for other tenants)"}),"\n",(0,s.jsx)(t.li,{children:"Teams are provided with a dedicated Grafana instance configured with authorization, allowing only authenticated tenant members to access tenant dashboards"}),"\n",(0,s.jsx)(t.li,{children:"Container logs are separated in Loki combined with authorization, allowing only authenticated tenant members access to the tenants container logs"}),"\n",(0,s.jsx)(t.li,{children:"When Harbor is enabled, tenants will get access to a tenant project, allowing only authenticated tenant members to access tenant registries"}),"\n",(0,s.jsx)(t.li,{children:"When Vault is enabled, tenant will get access to a space in Vault, allowing only authenticated tenant members access to tenant secrets"}),"\n",(0,s.jsx)(t.li,{children:"When ArgoCD is enabled, tenants can only see the tenants ArgoCD applications created by Otomi"}),"\n",(0,s.jsx)(t.li,{children:"Tenants will get access to Gitea and can create their own Git repositories"}),"\n",(0,s.jsx)(t.li,{children:"Tenant namespaces are by default isolated for ingress and egress network traffic"}),"\n",(0,s.jsx)(t.li,{children:"Tenants can allow other tenants to access their services"}),"\n",(0,s.jsx)(t.li,{children:"Tenant services that are publicly exposed can be configured with OIDC, only allowing tenant members to access the exposed services"}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"why-multi-tenancy-in-otomi",children:"Why multi-tenancy in Otomi?"}),"\n",(0,s.jsx)(t.h3,{id:"prevent-cluster-sprawl",children:"Prevent cluster sprawl"}),"\n",(0,s.jsx)(t.p,{children:"As companies look to further harness the power of cloud-native, they are adopting container technologies at rapid speed, increasing the number of clusters and workloads. As the number of Kubernetes clusters grows, this is creating increased work for Platform teams. When it comes to patching security vulnerabilities or upgrading clusters, teams are doing five times the amount of work."}),"\n",(0,s.jsx)(t.p,{children:"With Otomi you can support multi-tenancy, allowing multiple tenants (like multiple development teams) to work independently on the same cluster, while sharing all the tools. Now you only have to deploy a single development cluster to support multiple development teams. This prevents you from Kubernetes cluster sprawl."}),"\n",(0,s.jsx)(t.h3,{id:"fast-onboarding-of-multiple-tenants",children:"Fast onboarding of multiple tenants"}),"\n",(0,s.jsx)(t.p,{children:"When a new project starts, or when a new development team would like to start using Kubernetes, onboarding usually takes a lot of time. It's not only about providing development teams access to a Kubernetes namespace. No, developers also need access to an image registry, container logs, container metrics, alerts, secrets stores, container vulnerability reports and policy compliance reports."}),"\n",(0,s.jsx)(t.p,{children:"With Otomi you can onboard development teams (tenants) in just a couple of minutes, allowing them to login to the self-service portal and:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Get access to a private image registry"}),"\n",(0,s.jsx)(t.li,{children:"Download the Docker login credentials to get access to their private image registry"}),"\n",(0,s.jsx)(t.li,{children:"Build OCI-compliant images from application code"}),"\n",(0,s.jsx)(t.li,{children:"Deploy images (stored in the private registry) using the Otomi workloads feature"}),"\n",(0,s.jsx)(t.li,{children:"Get access to pre-configured dashboards to see container metrics, policy violations, detected threads in containers and detected vulnerabilities in containers"}),"\n",(0,s.jsx)(t.li,{children:"Configure ingress and network policies"}),"\n",(0,s.jsx)(t.li,{children:"Configure HTTP response headers"}),"\n",(0,s.jsx)(t.li,{children:"Configure CNAMEs"}),"\n",(0,s.jsx)(t.li,{children:"Get access to Vault to create and manage secrets"}),"\n",(0,s.jsx)(t.li,{children:"Use secrets for ingress or workloads"}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"When a team already has a code repo with a Dockderfile, they can build, deploy and expose this app within minutes after they have been onboarded onto the platform."})]})}function u(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},1998:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/multi-tenancy-6d20d20cfd471ce025aa59ca8b3498bf.png"},1151:(e,t,n)=>{n.d(t,{Z:()=>r,a:()=>o});var s=n(7294);const i={},a=s.createContext(i);function o(e){const t=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b4b7b186.e3cb903e.js b/assets/js/b4b7b186.e3cb903e.js deleted file mode 100644 index 568183c33..000000000 --- a/assets/js/b4b7b186.e3cb903e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[3520],{9108:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>r,metadata:()=>o,toc:()=>c});var i=n(5893),s=n(1151);const r={slug:"serverless",title:"Serverless",sidebar_label:"Serverless"},a=void 0,o={id:"use-cases/serverless",title:"Serverless",description:"Introduction",source:"@site/product/use-cases/serverless.md",sourceDirName:"use-cases",slug:"/use-cases/serverless",permalink:"/product/use-cases/serverless",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/edit/main/product/use-cases/serverless.md",tags:[],version:"current",lastUpdatedBy:"jeho",lastUpdatedAt:1709649459,formattedLastUpdatedAt:"Mar 5, 2024",frontMatter:{slug:"serverless",title:"Serverless",sidebar_label:"Serverless"},sidebar:"mainSidebar",previous:{title:"CI/CD",permalink:"/product/use-cases/ci-cd"},next:{title:"EULA",permalink:"/product/eula/v1"}},l={},c=[{value:"Introduction",id:"introduction",level:2},{value:"Creating Knative services",id:"creating-knative-services",level:2},{value:"Migrating Lambda functions to Knative",id:"migrating-lambda-functions-to-knative",level:2}];function d(e){const t={a:"a",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",strong:"strong",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h2,{id:"introduction",children:"Introduction"}),"\n",(0,i.jsxs)(t.p,{children:["Knative is a platform that provides tools for deploying, running, and managing ",(0,i.jsx)(t.strong,{children:"serverless"})," cloud-native applications to Kubernetes. Knative brings together the scalability of Kubernetes and ease of development of serverless applications, giving you more control over the resources, and allowing you to focus on the application without worrying about the infrastructure."]}),"\n",(0,i.jsx)(t.p,{children:"Otomi includes Knative Serving as an optional tool. Otomi installs and configures the correct version of Knative based on the used Kubernetes version and integrates Knative into the Otomi ingress architecture. All you need to do after activating Knative is to deploy a Knative service."}),"\n",(0,i.jsx)(t.h2,{id:"creating-knative-services",children:"Creating Knative services"}),"\n",(0,i.jsx)(t.p,{children:"There are 3 ways to deploy Knative serverless workloads in Otomi:"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:["Create a raw Knative service manifest and add it to the teams ",(0,i.jsx)(t.code,{children:"-argocd"})," repository"]}),"\n",(0,i.jsx)(t.li,{children:"Create a Otomi serverless workload"}),"\n",(0,i.jsx)(t.li,{children:"Create a Otomi workload with a custom (BYO) Helm chart"}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"migrating-lambda-functions-to-knative",children:"Migrating Lambda functions to Knative"}),"\n",(0,i.jsxs)(t.p,{children:["A great way to migrate AWS Lambda functions to Kubernetes/Knative is to use ",(0,i.jsx)(t.a,{href:"https://github.com/triggermesh/knative-lambda-runtime",children:"Triggermesh KLR"}),". KLR (pronounced clear) are Tekton Tasks that can be used to run an AWS Lambda function in a Kubernetes cluster installed with Knative."]}),"\n",(0,i.jsx)(t.p,{children:"Steps:"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsx)(t.li,{children:"Activate Knative and Argo CD in Otomi"}),"\n",(0,i.jsxs)(t.li,{children:["Create a Dockerfile, extracting the desired ",(0,i.jsx)(t.a,{href:"https://github.com/triggermesh/knative-lambda-runtime#run-in-docker",children:"runtime"})]}),"\n",(0,i.jsx)(t.li,{children:"Build and push the image (to the private repository in Harbor)"}),"\n",(0,i.jsx)(t.li,{children:"Create a Knative service using the Otomi workload feature"}),"\n",(0,i.jsx)(t.li,{children:"Expose the service publicly using the Otomi services feature"}),"\n"]})]})}function u(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>o,a:()=>a});var i=n(7294);const s={},r=i.createContext(s);function a(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b4b7b186.fdb324c2.js b/assets/js/b4b7b186.fdb324c2.js new file mode 100644 index 000000000..6a2c732ac --- /dev/null +++ b/assets/js/b4b7b186.fdb324c2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[3520],{9108:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>r,metadata:()=>o,toc:()=>c});var i=n(5893),s=n(1151);const r={slug:"serverless",title:"Serverless",sidebar_label:"Serverless"},a=void 0,o={id:"use-cases/serverless",title:"Serverless",description:"Introduction",source:"@site/product/use-cases/serverless.md",sourceDirName:"use-cases",slug:"/use-cases/serverless",permalink:"/product/use-cases/serverless",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/edit/main/product/use-cases/serverless.md",tags:[],version:"current",lastUpdatedBy:"ElderMatt",lastUpdatedAt:1710142611,formattedLastUpdatedAt:"Mar 11, 2024",frontMatter:{slug:"serverless",title:"Serverless",sidebar_label:"Serverless"},sidebar:"mainSidebar",previous:{title:"CI/CD",permalink:"/product/use-cases/ci-cd"},next:{title:"EULA",permalink:"/product/eula/v1"}},l={},c=[{value:"Introduction",id:"introduction",level:2},{value:"Creating Knative services",id:"creating-knative-services",level:2},{value:"Migrating Lambda functions to Knative",id:"migrating-lambda-functions-to-knative",level:2}];function d(e){const t={a:"a",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",strong:"strong",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h2,{id:"introduction",children:"Introduction"}),"\n",(0,i.jsxs)(t.p,{children:["Knative is a platform that provides tools for deploying, running, and managing ",(0,i.jsx)(t.strong,{children:"serverless"})," cloud-native applications to Kubernetes. Knative brings together the scalability of Kubernetes and ease of development of serverless applications, giving you more control over the resources, and allowing you to focus on the application without worrying about the infrastructure."]}),"\n",(0,i.jsx)(t.p,{children:"Otomi includes Knative Serving as an optional tool. Otomi installs and configures the correct version of Knative based on the used Kubernetes version and integrates Knative into the Otomi ingress architecture. All you need to do after activating Knative is to deploy a Knative service."}),"\n",(0,i.jsx)(t.h2,{id:"creating-knative-services",children:"Creating Knative services"}),"\n",(0,i.jsx)(t.p,{children:"There are 3 ways to deploy Knative serverless workloads in Otomi:"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:["Create a raw Knative service manifest and add it to the teams ",(0,i.jsx)(t.code,{children:"-argocd"})," repository"]}),"\n",(0,i.jsx)(t.li,{children:"Create a Otomi serverless workload"}),"\n",(0,i.jsx)(t.li,{children:"Create a Otomi workload with a custom (BYO) Helm chart"}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"migrating-lambda-functions-to-knative",children:"Migrating Lambda functions to Knative"}),"\n",(0,i.jsxs)(t.p,{children:["A great way to migrate AWS Lambda functions to Kubernetes/Knative is to use ",(0,i.jsx)(t.a,{href:"https://github.com/triggermesh/knative-lambda-runtime",children:"Triggermesh KLR"}),". KLR (pronounced clear) are Tekton Tasks that can be used to run an AWS Lambda function in a Kubernetes cluster installed with Knative."]}),"\n",(0,i.jsx)(t.p,{children:"Steps:"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsx)(t.li,{children:"Activate Knative and Argo CD in Otomi"}),"\n",(0,i.jsxs)(t.li,{children:["Create a Dockerfile, extracting the desired ",(0,i.jsx)(t.a,{href:"https://github.com/triggermesh/knative-lambda-runtime#run-in-docker",children:"runtime"})]}),"\n",(0,i.jsx)(t.li,{children:"Build and push the image (to the private repository in Harbor)"}),"\n",(0,i.jsx)(t.li,{children:"Create a Knative service using the Otomi workload feature"}),"\n",(0,i.jsx)(t.li,{children:"Expose the service publicly using the Otomi services feature"}),"\n"]})]})}function u(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>o,a:()=>a});var i=n(7294);const s={},r=i.createContext(s);function a(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c1cd9779.1fc615f4.js b/assets/js/c1cd9779.1fc615f4.js deleted file mode 100644 index e1adfe1f8..000000000 --- a/assets/js/c1cd9779.1fc615f4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[1658],{7327:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>r,metadata:()=>s,toc:()=>l});var t=i(5893),o=i(1151);const r={slug:"code-of-conduct",title:"Code of Conduct",sidebar_label:"Code of Conduct"},a=void 0,s={id:"code-of-conduct",title:"Code of Conduct",description:"Our Pledge",source:"@site/community/code-of-conduct.md",sourceDirName:".",slug:"/code-of-conduct",permalink:"/community/code-of-conduct",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/edit/main/community/code-of-conduct.md",tags:[],version:"current",lastUpdatedBy:"jeho",lastUpdatedAt:1709649459,formattedLastUpdatedAt:"Mar 5, 2024",frontMatter:{slug:"code-of-conduct",title:"Code of Conduct",sidebar_label:"Code of Conduct"},sidebar:"mainSidebar",previous:{title:"Values",permalink:"/community/community-values"},next:{title:"Expectations",permalink:"/community/expectations"}},c={},l=[{value:"Our Pledge",id:"our-pledge",level:2},{value:"Our Standards",id:"our-standards",level:2},{value:"Enforcement Responsibilities",id:"enforcement-responsibilities",level:2},{value:"Scope",id:"scope",level:2},{value:"Enforcement",id:"enforcement",level:2},{value:"Enforcement Guidelines",id:"enforcement-guidelines",level:2},{value:"1. Correction",id:"1-correction",level:3},{value:"2. Warning",id:"2-warning",level:3},{value:"3. Temporary Ban",id:"3-temporary-ban",level:3},{value:"4. Permanent Ban",id:"4-permanent-ban",level:3},{value:"Attribution",id:"attribution",level:2}];function d(e){const n={a:"a",h2:"h2",h3:"h3",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h2,{id:"our-pledge",children:"Our Pledge"}),"\n",(0,t.jsx)(n.p,{children:"We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation."}),"\n",(0,t.jsx)(n.p,{children:"We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community."}),"\n",(0,t.jsx)(n.h2,{id:"our-standards",children:"Our Standards"}),"\n",(0,t.jsx)(n.p,{children:"Examples of behavior that contributes to a positive environment for our community include:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Demonstrating empathy and kindness toward other people"}),"\n",(0,t.jsx)(n.li,{children:"Being respectful of differing opinions, viewpoints, and experiences"}),"\n",(0,t.jsx)(n.li,{children:"Giving and gracefully accepting constructive feedback"}),"\n",(0,t.jsx)(n.li,{children:"Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience"}),"\n",(0,t.jsx)(n.li,{children:"Focusing on what is best not just for us as individuals, but for the overall community"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Examples of unacceptable behavior include:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"The use of sexualized language or imagery, and sexual attention or advances of any kind"}),"\n",(0,t.jsx)(n.li,{children:"Trolling, insulting or derogatory comments, and personal or political attacks"}),"\n",(0,t.jsx)(n.li,{children:"Public or private harassment"}),"\n",(0,t.jsx)(n.li,{children:"Publishing others' private information, such as a physical or email address, without their explicit permission"}),"\n",(0,t.jsx)(n.li,{children:"Other conduct which could reasonably be considered inappropriate in a professional setting"}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"enforcement-responsibilities",children:"Enforcement Responsibilities"}),"\n",(0,t.jsx)(n.p,{children:"Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful."}),"\n",(0,t.jsx)(n.p,{children:"Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate."}),"\n",(0,t.jsx)(n.h2,{id:"scope",children:"Scope"}),"\n",(0,t.jsx)(n.p,{children:"This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event."}),"\n",(0,t.jsx)(n.h2,{id:"enforcement",children:"Enforcement"}),"\n",(0,t.jsxs)(n.p,{children:["Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at ",(0,t.jsx)(n.a,{href:"mailto:community@redkubes.com",children:"community@redkubes.com"}),". All complaints will be reviewed and investigated promptly and fairly."]}),"\n",(0,t.jsx)(n.p,{children:"All community leaders are obligated to respect the privacy and security of the reporter of any incident."}),"\n",(0,t.jsx)(n.h2,{id:"enforcement-guidelines",children:"Enforcement Guidelines"}),"\n",(0,t.jsx)(n.p,{children:"Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:"}),"\n",(0,t.jsx)(n.h3,{id:"1-correction",children:"1. Correction"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Community Impact"}),": Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Consequence"}),": A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested."]}),"\n",(0,t.jsx)(n.h3,{id:"2-warning",children:"2. Warning"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Community Impact"}),": A violation through a single incident or series of actions."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Consequence"}),": A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban."]}),"\n",(0,t.jsx)(n.h3,{id:"3-temporary-ban",children:"3. Temporary Ban"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Community Impact"}),": A serious violation of community standards, including sustained inappropriate behavior."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Consequence"}),": A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban."]}),"\n",(0,t.jsx)(n.h3,{id:"4-permanent-ban",children:"4. Permanent Ban"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Community Impact"}),": Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Consequence"}),": A permanent ban from any sort of public interaction within the community."]}),"\n",(0,t.jsx)(n.h2,{id:"attribution",children:"Attribution"}),"\n",(0,t.jsxs)(n.p,{children:["This Code of Conduct is adapted from the ",(0,t.jsx)(n.a,{href:"https://www.contributor-covenant.org",children:"Contributor Covenant"}),", version 2.0, available at ",(0,t.jsx)(n.a,{href:"https://www.contributor-covenant.org/version/2/0/code_of_conduct.html",children:"v2.0"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["Community Impact Guidelines were inspired by ",(0,t.jsx)(n.a,{href:"https://github.com/mozilla/diversity",children:"Mozilla's code of conduct enforcement ladder"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["For answers to common questions about this code of conduct, see the FAQ at ",(0,t.jsx)(n.a,{href:"https://www.contributor-covenant.org/faq",children:"https://www.contributor-covenant.org/faq"}),". Translations are available at ",(0,t.jsx)(n.a,{href:"https://www.contributor-covenant.org/translations",children:"https://www.contributor-covenant.org/translations"}),"."]})]})}function u(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>s,a:()=>a});var t=i(7294);const o={},r=t.createContext(o);function a(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c1cd9779.99f7def3.js b/assets/js/c1cd9779.99f7def3.js new file mode 100644 index 000000000..df17fdd2e --- /dev/null +++ b/assets/js/c1cd9779.99f7def3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[1658],{7327:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>r,metadata:()=>s,toc:()=>l});var t=i(5893),o=i(1151);const r={slug:"code-of-conduct",title:"Code of Conduct",sidebar_label:"Code of Conduct"},a=void 0,s={id:"code-of-conduct",title:"Code of Conduct",description:"Our Pledge",source:"@site/community/code-of-conduct.md",sourceDirName:".",slug:"/code-of-conduct",permalink:"/community/code-of-conduct",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/edit/main/community/code-of-conduct.md",tags:[],version:"current",lastUpdatedBy:"ElderMatt",lastUpdatedAt:1710142611,formattedLastUpdatedAt:"Mar 11, 2024",frontMatter:{slug:"code-of-conduct",title:"Code of Conduct",sidebar_label:"Code of Conduct"},sidebar:"mainSidebar",previous:{title:"Values",permalink:"/community/community-values"},next:{title:"Expectations",permalink:"/community/expectations"}},c={},l=[{value:"Our Pledge",id:"our-pledge",level:2},{value:"Our Standards",id:"our-standards",level:2},{value:"Enforcement Responsibilities",id:"enforcement-responsibilities",level:2},{value:"Scope",id:"scope",level:2},{value:"Enforcement",id:"enforcement",level:2},{value:"Enforcement Guidelines",id:"enforcement-guidelines",level:2},{value:"1. Correction",id:"1-correction",level:3},{value:"2. Warning",id:"2-warning",level:3},{value:"3. Temporary Ban",id:"3-temporary-ban",level:3},{value:"4. Permanent Ban",id:"4-permanent-ban",level:3},{value:"Attribution",id:"attribution",level:2}];function d(e){const n={a:"a",h2:"h2",h3:"h3",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h2,{id:"our-pledge",children:"Our Pledge"}),"\n",(0,t.jsx)(n.p,{children:"We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation."}),"\n",(0,t.jsx)(n.p,{children:"We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community."}),"\n",(0,t.jsx)(n.h2,{id:"our-standards",children:"Our Standards"}),"\n",(0,t.jsx)(n.p,{children:"Examples of behavior that contributes to a positive environment for our community include:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Demonstrating empathy and kindness toward other people"}),"\n",(0,t.jsx)(n.li,{children:"Being respectful of differing opinions, viewpoints, and experiences"}),"\n",(0,t.jsx)(n.li,{children:"Giving and gracefully accepting constructive feedback"}),"\n",(0,t.jsx)(n.li,{children:"Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience"}),"\n",(0,t.jsx)(n.li,{children:"Focusing on what is best not just for us as individuals, but for the overall community"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Examples of unacceptable behavior include:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"The use of sexualized language or imagery, and sexual attention or advances of any kind"}),"\n",(0,t.jsx)(n.li,{children:"Trolling, insulting or derogatory comments, and personal or political attacks"}),"\n",(0,t.jsx)(n.li,{children:"Public or private harassment"}),"\n",(0,t.jsx)(n.li,{children:"Publishing others' private information, such as a physical or email address, without their explicit permission"}),"\n",(0,t.jsx)(n.li,{children:"Other conduct which could reasonably be considered inappropriate in a professional setting"}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"enforcement-responsibilities",children:"Enforcement Responsibilities"}),"\n",(0,t.jsx)(n.p,{children:"Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful."}),"\n",(0,t.jsx)(n.p,{children:"Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate."}),"\n",(0,t.jsx)(n.h2,{id:"scope",children:"Scope"}),"\n",(0,t.jsx)(n.p,{children:"This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event."}),"\n",(0,t.jsx)(n.h2,{id:"enforcement",children:"Enforcement"}),"\n",(0,t.jsxs)(n.p,{children:["Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at ",(0,t.jsx)(n.a,{href:"mailto:community@redkubes.com",children:"community@redkubes.com"}),". All complaints will be reviewed and investigated promptly and fairly."]}),"\n",(0,t.jsx)(n.p,{children:"All community leaders are obligated to respect the privacy and security of the reporter of any incident."}),"\n",(0,t.jsx)(n.h2,{id:"enforcement-guidelines",children:"Enforcement Guidelines"}),"\n",(0,t.jsx)(n.p,{children:"Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:"}),"\n",(0,t.jsx)(n.h3,{id:"1-correction",children:"1. Correction"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Community Impact"}),": Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Consequence"}),": A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested."]}),"\n",(0,t.jsx)(n.h3,{id:"2-warning",children:"2. Warning"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Community Impact"}),": A violation through a single incident or series of actions."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Consequence"}),": A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban."]}),"\n",(0,t.jsx)(n.h3,{id:"3-temporary-ban",children:"3. Temporary Ban"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Community Impact"}),": A serious violation of community standards, including sustained inappropriate behavior."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Consequence"}),": A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban."]}),"\n",(0,t.jsx)(n.h3,{id:"4-permanent-ban",children:"4. Permanent Ban"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Community Impact"}),": Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Consequence"}),": A permanent ban from any sort of public interaction within the community."]}),"\n",(0,t.jsx)(n.h2,{id:"attribution",children:"Attribution"}),"\n",(0,t.jsxs)(n.p,{children:["This Code of Conduct is adapted from the ",(0,t.jsx)(n.a,{href:"https://www.contributor-covenant.org",children:"Contributor Covenant"}),", version 2.0, available at ",(0,t.jsx)(n.a,{href:"https://www.contributor-covenant.org/version/2/0/code_of_conduct.html",children:"v2.0"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["Community Impact Guidelines were inspired by ",(0,t.jsx)(n.a,{href:"https://github.com/mozilla/diversity",children:"Mozilla's code of conduct enforcement ladder"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["For answers to common questions about this code of conduct, see the FAQ at ",(0,t.jsx)(n.a,{href:"https://www.contributor-covenant.org/faq",children:"https://www.contributor-covenant.org/faq"}),". Translations are available at ",(0,t.jsx)(n.a,{href:"https://www.contributor-covenant.org/translations",children:"https://www.contributor-covenant.org/translations"}),"."]})]})}function u(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>s,a:()=>a});var t=i(7294);const o={},r=t.createContext(o);function a(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c642c7e8.0f5733a5.js b/assets/js/c642c7e8.0f5733a5.js deleted file mode 100644 index d6ca3da81..000000000 --- a/assets/js/c642c7e8.0f5733a5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[512],{6173:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>a,frontMatter:()=>r,metadata:()=>d,toc:()=>c});var n=o(5893),i=o(1151);const r={title:"Welcome to our community",slug:"welcome",sidebar_label:"Welcome"},s=void 0,d={id:"welcome",title:"Welcome to our community",description:"So you are interested to get involved with Otomi? Awesome! This guide will help you understand the overall organization of the project, and direct you to the best places to get started. You'll be able to pick up issues, write code to fix them, and get your work reviewed and merged. All feedback is welcome!",source:"@site/community/welcome.md",sourceDirName:".",slug:"/welcome",permalink:"/community/welcome",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/edit/main/community/welcome.md",tags:[],version:"current",lastUpdatedBy:"jeho",lastUpdatedAt:1709649459,formattedLastUpdatedAt:"Mar 5, 2024",frontMatter:{title:"Welcome to our community",slug:"welcome",sidebar_label:"Welcome"},sidebar:"mainSidebar",next:{title:"Values",permalink:"/community/community-values"}},l={},c=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Code of Conduct",id:"code-of-conduct",level:3},{value:"Developer guide",id:"developer-guide",level:3},{value:"Setting up your development environment",id:"setting-up-your-development-environment",level:3},{value:"Community Expectations and Roles",id:"community-expectations-and-roles",level:3}];function u(e){const t={a:"a",h2:"h2",h3:"h3",li:"li",p:"p",ul:"ul",...(0,i.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:"So you are interested to get involved with Otomi? Awesome! This guide will help you understand the overall organization of the project, and direct you to the best places to get started. You'll be able to pick up issues, write code to fix them, and get your work reviewed and merged. All feedback is welcome!"}),"\n",(0,n.jsx)(t.p,{children:"This document is the single source of truth for how to contribute to the following code bases:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.a,{href:"https://github.com/redkubes/otomi-core/",children:"otomi-core"}),": The heart of Otomi, a monorepo containing all the apps and configurations"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.a,{href:"https://github.com/redkubes/otomi-tasks/",children:"otomi-tasks"}),": The tasks used by core to massage apps to adhere to the configurations"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.a,{href:"https://github.com/redkubes/otomi-clients/",children:"otomi-clients"}),": The openapi generator for the clients used by the tasks"]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,n.jsx)(t.p,{children:"Before submitting code to Otomi, you should first complete the following prerequisites. Completing these steps will make your first contribution easier:"}),"\n",(0,n.jsx)(t.h3,{id:"code-of-conduct",children:"Code of Conduct"}),"\n",(0,n.jsxs)(t.p,{children:["Please make sure to read and observe the ",(0,n.jsx)(t.a,{href:"/community/code-of-conduct",children:"Code of Conduct"})," and\n",(0,n.jsx)(t.a,{href:"/community/community-values",children:"Community Values"})]}),"\n",(0,n.jsx)(t.h3,{id:"developer-guide",children:"Developer guide"}),"\n",(0,n.jsxs)(t.p,{children:["Effective development starts with an understanding the code structure and the relationship between different components of the system. Read the ",(0,n.jsx)(t.a,{href:"https://github.com/redkubes/otomi-core/blob/main/docs/development.md",children:"Code development guide"})," to learn how to develop on Otomi."]}),"\n",(0,n.jsx)(t.h3,{id:"setting-up-your-development-environment",children:"Setting up your development environment"}),"\n",(0,n.jsxs)(t.p,{children:["It is not required to set up a developer environment in order to contribute to Otomi, but if you do plan to contribute code changes, follow the instructions in the Developer Docs on how to ",(0,n.jsx)(t.a,{href:"https://github.com/redkubes/otomi-core/blob/main/docs/setup.md",children:"Set up your development environment"}),"."]}),"\n",(0,n.jsx)(t.h3,{id:"community-expectations-and-roles",children:"Community Expectations and Roles"}),"\n",(0,n.jsx)(t.p,{children:"Otomi is a community project. Consequently, it is wholly dependent on its community to provide a productive, friendly and collaborative environment."}),"\n",(0,n.jsxs)(t.p,{children:["Please read and review the ",(0,n.jsx)(t.a,{href:"/community/expectations",children:"Contribution Expectations"})," for an understanding of code and review expectations."]})]})}function a(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},1151:(e,t,o)=>{o.d(t,{Z:()=>d,a:()=>s});var n=o(7294);const i={},r=n.createContext(i);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c642c7e8.5799dddd.js b/assets/js/c642c7e8.5799dddd.js new file mode 100644 index 000000000..c3f3cdca7 --- /dev/null +++ b/assets/js/c642c7e8.5799dddd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[512],{6173:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>a,frontMatter:()=>r,metadata:()=>d,toc:()=>c});var n=o(5893),i=o(1151);const r={title:"Welcome to our community",slug:"welcome",sidebar_label:"Welcome"},s=void 0,d={id:"welcome",title:"Welcome to our community",description:"So you are interested to get involved with Otomi? Awesome! This guide will help you understand the overall organization of the project, and direct you to the best places to get started. You'll be able to pick up issues, write code to fix them, and get your work reviewed and merged. All feedback is welcome!",source:"@site/community/welcome.md",sourceDirName:".",slug:"/welcome",permalink:"/community/welcome",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/edit/main/community/welcome.md",tags:[],version:"current",lastUpdatedBy:"ElderMatt",lastUpdatedAt:1710142611,formattedLastUpdatedAt:"Mar 11, 2024",frontMatter:{title:"Welcome to our community",slug:"welcome",sidebar_label:"Welcome"},sidebar:"mainSidebar",next:{title:"Values",permalink:"/community/community-values"}},l={},c=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Code of Conduct",id:"code-of-conduct",level:3},{value:"Developer guide",id:"developer-guide",level:3},{value:"Setting up your development environment",id:"setting-up-your-development-environment",level:3},{value:"Community Expectations and Roles",id:"community-expectations-and-roles",level:3}];function u(e){const t={a:"a",h2:"h2",h3:"h3",li:"li",p:"p",ul:"ul",...(0,i.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:"So you are interested to get involved with Otomi? Awesome! This guide will help you understand the overall organization of the project, and direct you to the best places to get started. You'll be able to pick up issues, write code to fix them, and get your work reviewed and merged. All feedback is welcome!"}),"\n",(0,n.jsx)(t.p,{children:"This document is the single source of truth for how to contribute to the following code bases:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.a,{href:"https://github.com/redkubes/otomi-core/",children:"otomi-core"}),": The heart of Otomi, a monorepo containing all the apps and configurations"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.a,{href:"https://github.com/redkubes/otomi-tasks/",children:"otomi-tasks"}),": The tasks used by core to massage apps to adhere to the configurations"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.a,{href:"https://github.com/redkubes/otomi-clients/",children:"otomi-clients"}),": The openapi generator for the clients used by the tasks"]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,n.jsx)(t.p,{children:"Before submitting code to Otomi, you should first complete the following prerequisites. Completing these steps will make your first contribution easier:"}),"\n",(0,n.jsx)(t.h3,{id:"code-of-conduct",children:"Code of Conduct"}),"\n",(0,n.jsxs)(t.p,{children:["Please make sure to read and observe the ",(0,n.jsx)(t.a,{href:"/community/code-of-conduct",children:"Code of Conduct"})," and\n",(0,n.jsx)(t.a,{href:"/community/community-values",children:"Community Values"})]}),"\n",(0,n.jsx)(t.h3,{id:"developer-guide",children:"Developer guide"}),"\n",(0,n.jsxs)(t.p,{children:["Effective development starts with an understanding the code structure and the relationship between different components of the system. Read the ",(0,n.jsx)(t.a,{href:"https://github.com/redkubes/otomi-core/blob/main/docs/development.md",children:"Code development guide"})," to learn how to develop on Otomi."]}),"\n",(0,n.jsx)(t.h3,{id:"setting-up-your-development-environment",children:"Setting up your development environment"}),"\n",(0,n.jsxs)(t.p,{children:["It is not required to set up a developer environment in order to contribute to Otomi, but if you do plan to contribute code changes, follow the instructions in the Developer Docs on how to ",(0,n.jsx)(t.a,{href:"https://github.com/redkubes/otomi-core/blob/main/docs/setup.md",children:"Set up your development environment"}),"."]}),"\n",(0,n.jsx)(t.h3,{id:"community-expectations-and-roles",children:"Community Expectations and Roles"}),"\n",(0,n.jsx)(t.p,{children:"Otomi is a community project. Consequently, it is wholly dependent on its community to provide a productive, friendly and collaborative environment."}),"\n",(0,n.jsxs)(t.p,{children:["Please read and review the ",(0,n.jsx)(t.a,{href:"/community/expectations",children:"Contribution Expectations"})," for an understanding of code and review expectations."]})]})}function a(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},1151:(e,t,o)=>{o.d(t,{Z:()=>d,a:()=>s});var n=o(7294);const i={},r=n.createContext(i);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/cd151fd5.64374d34.js b/assets/js/cd151fd5.2749a039.js similarity index 51% rename from assets/js/cd151fd5.64374d34.js rename to assets/js/cd151fd5.2749a039.js index e35f4b2e0..81ea11c01 100644 --- a/assets/js/cd151fd5.64374d34.js +++ b/assets/js/cd151fd5.2749a039.js @@ -1 +1 @@ -"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[3544],{9507:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>u,contentTitle:()=>a,default:()=>m,frontMatter:()=>n,metadata:()=>i,toc:()=>p});var o=s(5893),r=s(1151);const n={slug:"prometheus",title:"Prometheus",sidebar_label:"Prometheus"},a=void 0,i={id:"apps/prometheus",title:"Prometheus",description:"Prometheus aggregates all the metrics from the platform and stores them in a storage endpoint of choice (defaults to PVC).",source:"@site/docs/apps/prometheus.md",sourceDirName:"apps",slug:"/apps/prometheus",permalink:"/docs/apps/prometheus",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/tree/main/docs/apps/prometheus.md",tags:[],version:"current",frontMatter:{slug:"prometheus",title:"Prometheus",sidebar_label:"Prometheus"},sidebar:"mainSidebar",previous:{title:"Open Telemetry Operator",permalink:"/docs/apps/otel"},next:{title:"Sealed Secrets",permalink:"/docs/apps/sealed-secrets"}},u={},p=[];function c(e){const t={p:"p",...(0,r.a)(),...e.components};return(0,o.jsx)(t.p,{children:"Prometheus aggregates all the metrics from the platform and stores them in a storage endpoint of choice (defaults to PVC)."})}function m(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},1151:(e,t,s)=>{s.d(t,{Z:()=>i,a:()=>a});var o=s(7294);const r={},n=o.createContext(r);function a(e){const t=o.useContext(n);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),o.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[3544],{9507:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>u,contentTitle:()=>a,default:()=>m,frontMatter:()=>n,metadata:()=>i,toc:()=>p});var o=s(5893),r=s(1151);const n={slug:"prometheus",title:"Prometheus",sidebar_label:"Prometheus"},a=void 0,i={id:"apps/prometheus",title:"Prometheus",description:"Prometheus aggregates all the metrics from the platform and stores them in a storage endpoint of choice (defaults to PVC).",source:"@site/docs/apps/prometheus.md",sourceDirName:"apps",slug:"/apps/prometheus",permalink:"/docs/apps/prometheus",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/tree/main/docs/apps/prometheus.md",tags:[],version:"current",frontMatter:{slug:"prometheus",title:"Prometheus",sidebar_label:"Prometheus"},sidebar:"mainSidebar",previous:{title:"Open Telemetry Operator",permalink:"/docs/apps/otel"},next:{title:"RabbitMQ",permalink:"/docs/apps/rabbitmq"}},u={},p=[];function c(e){const t={p:"p",...(0,r.a)(),...e.components};return(0,o.jsx)(t.p,{children:"Prometheus aggregates all the metrics from the platform and stores them in a storage endpoint of choice (defaults to PVC)."})}function m(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},1151:(e,t,s)=>{s.d(t,{Z:()=>i,a:()=>a});var o=s(7294);const r={},n=o.createContext(r);function a(e){const t=o.useContext(n);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),o.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d673e682.138464b1.js b/assets/js/d673e682.138464b1.js new file mode 100644 index 000000000..2d5392899 --- /dev/null +++ b/assets/js/d673e682.138464b1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[3120],{1929:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>u,frontMatter:()=>n,metadata:()=>r,toc:()=>d});var i=o(5893),a=o(1151);const n={slug:"ci-cd",title:"CI/CD",sidebar_label:"CI/CD"},s=void 0,r={id:"use-cases/ci-cd",title:"CI/CD",description:"Introduction",source:"@site/product/use-cases/ci-cd.md",sourceDirName:"use-cases",slug:"/use-cases/ci-cd",permalink:"/product/use-cases/ci-cd",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/edit/main/product/use-cases/ci-cd.md",tags:[],version:"current",lastUpdatedBy:"ElderMatt",lastUpdatedAt:1710142611,formattedLastUpdatedAt:"Mar 11, 2024",frontMatter:{slug:"ci-cd",title:"CI/CD",sidebar_label:"CI/CD"},sidebar:"mainSidebar",previous:{title:"Multi-tenancy",permalink:"/product/use-cases/multi-tenancy"},next:{title:"Serverless",permalink:"/product/use-cases/serverless"}},c={},d=[{value:"Introduction",id:"introduction",level:2},{value:"CI with Otomi",id:"ci-with-otomi",level:2},{value:"CD with Otomi",id:"cd-with-otomi",level:2}];function l(e){const t={a:"a",code:"code",h2:"h2",p:"p",...(0,a.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h2,{id:"introduction",children:"Introduction"}),"\n",(0,i.jsx)(t.p,{children:"Otomi adds developer- and operations-centric tools, automation and self-service on top of Kubernetes. The integrated tools mainly focus on Continuous Deployment (to automatically deploy code changes after the build stage) and on all runtime controls. When using Otomi, we advice to setup a seprate CI environment (using specialized CI tools like GitHub Actions or CircleCI) where artifacts (images) are build and then pushed to an image registry (like Harbor provided by Otomi). But with integrated tools like Gitea and Tekton, Otomi can in some cases also be used for Continuous Integration (CI). This can be especially interesting in greenfield environments (where there is (not yet) a full CI toolset implemented) or in isolated environments (where developers don't have access to cloud CI services)."}),"\n",(0,i.jsx)(t.h2,{id:"ci-with-otomi",children:"CI with Otomi"}),"\n",(0,i.jsxs)(t.p,{children:["Users on the platform can get access to an organization in Gitea. See ",(0,i.jsx)(t.a,{href:"https://docs.gitea.io/en-us/comparison/",children:"here"})," for a full list of all Gitea features and a comparison with other self-hosted Git solutions."]}),"\n",(0,i.jsx)(t.p,{children:"Otomi also includes Tekton pipelines. Tekton is used for the build feature in Otomi. The build feature can be used to build images from source using Kaniko (when there is a Docker file), or Buildpacks. To use the build feature, source code needs to be in a private Gitea repo, or in a public git repo. Other private repo's can also be replicated to Gitea."}),"\n",(0,i.jsx)(t.h2,{id:"cd-with-otomi",children:"CD with Otomi"}),"\n",(0,i.jsx)(t.p,{children:"The most common workflow when using Otomi starts when an artifact (image) has been build. Using the workloads feature in Otomi, images can be deployed using a Helm chart from the Developer Catalog."}),"\n",(0,i.jsxs)(t.p,{children:["Otomi uses the ",(0,i.jsx)(t.code,{children:"otomi/charts"})," repository in Gitea that contains a library of curated Helm charts that are offered as a quick start. The quick start Helm charts can be adjusted or replaced by your custom (Golden path) Helm charts."]}),"\n",(0,i.jsxs)(t.p,{children:["When a workload specification (a combination of a Helm chart with custom values) has been created, Otomi automatically creates an Argo CD applicationset that deploys the configured chart. A workload can also be configured with the ",(0,i.jsx)(t.a,{href:"https://argocd-image-updater.readthedocs.io/en/stable/",children:"Argo CD Image Updater"})," that can check for new versions of images that are deployed with by the workload and then automatically update to the latest allowed version. The Argo CD Image Updater is only supported in combination with Otomi workloads and images stored in Harbor."]})]})}function u(e={}){const{wrapper:t}={...(0,a.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},1151:(e,t,o)=>{o.d(t,{Z:()=>r,a:()=>s});var i=o(7294);const a={},n=i.createContext(a);function s(e){const t=i.useContext(n);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),i.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d673e682.9bbea9f8.js b/assets/js/d673e682.9bbea9f8.js deleted file mode 100644 index 082c1b7ab..000000000 --- a/assets/js/d673e682.9bbea9f8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[3120],{1929:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>u,frontMatter:()=>n,metadata:()=>r,toc:()=>d});var i=o(5893),a=o(1151);const n={slug:"ci-cd",title:"CI/CD",sidebar_label:"CI/CD"},s=void 0,r={id:"use-cases/ci-cd",title:"CI/CD",description:"Introduction",source:"@site/product/use-cases/ci-cd.md",sourceDirName:"use-cases",slug:"/use-cases/ci-cd",permalink:"/product/use-cases/ci-cd",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/edit/main/product/use-cases/ci-cd.md",tags:[],version:"current",lastUpdatedBy:"jeho",lastUpdatedAt:1709649459,formattedLastUpdatedAt:"Mar 5, 2024",frontMatter:{slug:"ci-cd",title:"CI/CD",sidebar_label:"CI/CD"},sidebar:"mainSidebar",previous:{title:"Multi-tenancy",permalink:"/product/use-cases/multi-tenancy"},next:{title:"Serverless",permalink:"/product/use-cases/serverless"}},c={},d=[{value:"Introduction",id:"introduction",level:2},{value:"CI with Otomi",id:"ci-with-otomi",level:2},{value:"CD with Otomi",id:"cd-with-otomi",level:2}];function l(e){const t={a:"a",code:"code",h2:"h2",p:"p",...(0,a.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h2,{id:"introduction",children:"Introduction"}),"\n",(0,i.jsx)(t.p,{children:"Otomi adds developer- and operations-centric tools, automation and self-service on top of Kubernetes. The integrated tools mainly focus on Continuous Deployment (to automatically deploy code changes after the build stage) and on all runtime controls. When using Otomi, we advice to setup a seprate CI environment (using specialized CI tools like GitHub Actions or CircleCI) where artifacts (images) are build and then pushed to an image registry (like Harbor provided by Otomi). But with integrated tools like Gitea and Tekton, Otomi can in some cases also be used for Continuous Integration (CI). This can be especially interesting in greenfield environments (where there is (not yet) a full CI toolset implemented) or in isolated environments (where developers don't have access to cloud CI services)."}),"\n",(0,i.jsx)(t.h2,{id:"ci-with-otomi",children:"CI with Otomi"}),"\n",(0,i.jsxs)(t.p,{children:["Users on the platform can get access to an organization in Gitea. See ",(0,i.jsx)(t.a,{href:"https://docs.gitea.io/en-us/comparison/",children:"here"})," for a full list of all Gitea features and a comparison with other self-hosted Git solutions."]}),"\n",(0,i.jsx)(t.p,{children:"Otomi also includes Tekton pipelines. Tekton is used for the build feature in Otomi. The build feature can be used to build images from source using Kaniko (when there is a Docker file), or Buildpacks. To use the build feature, source code needs to be in a private Gitea repo, or in a public git repo. Other private repo's can also be replicated to Gitea."}),"\n",(0,i.jsx)(t.h2,{id:"cd-with-otomi",children:"CD with Otomi"}),"\n",(0,i.jsx)(t.p,{children:"The most common workflow when using Otomi starts when an artifact (image) has been build. Using the workloads feature in Otomi, images can be deployed using a Helm chart from the Developer Catalog."}),"\n",(0,i.jsxs)(t.p,{children:["Otomi uses the ",(0,i.jsx)(t.code,{children:"otomi/charts"})," repository in Gitea that contains a library of curated Helm charts that are offered as a quick start. The quick start Helm charts can be adjusted or replaced by your custom (Golden path) Helm charts."]}),"\n",(0,i.jsxs)(t.p,{children:["When a workload specification (a combination of a Helm chart with custom values) has been created, Otomi automatically creates an Argo CD applicationset that deploys the configured chart. A workload can also be configured with the ",(0,i.jsx)(t.a,{href:"https://argocd-image-updater.readthedocs.io/en/stable/",children:"Argo CD Image Updater"})," that can check for new versions of images that are deployed with by the workload and then automatically update to the latest allowed version. The Argo CD Image Updater is only supported in combination with Otomi workloads and images stored in Harbor."]})]})}function u(e={}){const{wrapper:t}={...(0,a.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},1151:(e,t,o)=>{o.d(t,{Z:()=>r,a:()=>s});var i=o(7294);const a={},n=i.createContext(a);function s(e){const t=i.useContext(n);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),i.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e878c199.b15dad35.js b/assets/js/e878c199.b15dad35.js new file mode 100644 index 000000000..55859b190 --- /dev/null +++ b/assets/js/e878c199.b15dad35.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[2163],{1370:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>u,contentTitle:()=>r,default:()=>m,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var n=o(5893),i=o(1151);const s={title:"Otomi Community Values",slug:"community-values",sidebar_label:"Values"},r="Otomi Community Values",a={id:"values",title:"Otomi Community Values",description:'Otomi Community culture contributes substantially to the project\'s success. The following values (blatantly copied and adopted from kubernetes, as those are almost "universal") are central to this:',source:"@site/community/values.md",sourceDirName:".",slug:"/community-values",permalink:"/community/community-values",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/edit/main/community/values.md",tags:[],version:"current",lastUpdatedBy:"ElderMatt",lastUpdatedAt:1710142611,formattedLastUpdatedAt:"Mar 11, 2024",frontMatter:{title:"Otomi Community Values",slug:"community-values",sidebar_label:"Values"},sidebar:"mainSidebar",previous:{title:"Welcome",permalink:"/community/welcome"},next:{title:"Code of Conduct",permalink:"/community/code-of-conduct"}},u={},l=[{value:"Distribution is better than centralization",id:"distribution-is-better-than-centralization",level:2},{value:"Community over product or company",id:"community-over-product-or-company",level:2},{value:"Automation over process",id:"automation-over-process",level:2},{value:"Inclusive is better than exclusive",id:"inclusive-is-better-than-exclusive",level:2},{value:"Evolution is better than stagnation",id:"evolution-is-better-than-stagnation",level:2}];function c(e){const t={h1:"h1",h2:"h2",p:"p",strong:"strong",...(0,i.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"otomi-community-values",children:"Otomi Community Values"}),"\n",(0,n.jsx)(t.p,{children:'Otomi Community culture contributes substantially to the project\'s success. The following values (blatantly copied and adopted from kubernetes, as those are almost "universal") are central to this:'}),"\n",(0,n.jsx)(t.h2,{id:"distribution-is-better-than-centralization",children:"Distribution is better than centralization"}),"\n",(0,n.jsx)(t.p,{children:"The scale of the Otomi project is only viable through high-trust and high-visibility distribution of work, which includes delegation of authority, decision making, technical design, code ownership, and documentation. Distributed asynchronous ownership, collaboration, communication and decision making are the cornerstones of our community."}),"\n",(0,n.jsx)(t.h2,{id:"community-over-product-or-company",children:"Community over product or company"}),"\n",(0,n.jsx)(t.p,{children:"We are here as a community first. Our allegiance is to the intentional stewardship of the Otomi project for the benefit of all its members and users everywhere. We support working together publicly for the common goal of a vibrant interoperable ecosystem, providing an excellent experience for our users. Individuals gain status through work. Companies gain status through their commitments to support this community and fund the resources necessary for the project to operate."}),"\n",(0,n.jsx)(t.h2,{id:"automation-over-process",children:"Automation over process"}),"\n",(0,n.jsx)(t.p,{children:"Large projects have a lot of hard yet less exciting work. We value time spent automating repetitive work more highly than toil. Where work cannot be automated, our culture recognizes and rewards all types of contributions while recognizing that heroism is not sustainable."}),"\n",(0,n.jsx)(t.h2,{id:"inclusive-is-better-than-exclusive",children:"Inclusive is better than exclusive"}),"\n",(0,n.jsx)(t.p,{children:"Broadly successful and useful technologies require different perspectives and skill sets, which can only be heard in a welcoming and respectful environment. Community membership is a privilege, not a right. Community members earn leadership through effort, scope, quality, quantity, and duration of contributions. Our community respects the time and effort put into a discussion, regardless of where a contributor is on their growth path."}),"\n",(0,n.jsx)(t.h2,{id:"evolution-is-better-than-stagnation",children:"Evolution is better than stagnation"}),"\n",(0,n.jsx)(t.p,{children:"Openness to new ideas and studied technological evolution make Otomi a stronger project. Continual improvement, servant leadership, mentorship, and respect are the foundations of Otomi culture. Otomi community leaders have a duty to find, sponsor, and promote new community members. Leaders should expect to step aside. Community members should expect to step up."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:'"Culture eats strategy for breakfast." --Peter Drucker'})})]})}function m(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},1151:(e,t,o)=>{o.d(t,{Z:()=>a,a:()=>r});var n=o(7294);const i={},s=n.createContext(i);function r(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e878c199.de82a828.js b/assets/js/e878c199.de82a828.js deleted file mode 100644 index 0d2414d09..000000000 --- a/assets/js/e878c199.de82a828.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[2163],{1370:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>u,contentTitle:()=>r,default:()=>m,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var n=o(5893),i=o(1151);const s={title:"Otomi Community Values",slug:"community-values",sidebar_label:"Values"},r="Otomi Community Values",a={id:"values",title:"Otomi Community Values",description:'Otomi Community culture contributes substantially to the project\'s success. The following values (blatantly copied and adopted from kubernetes, as those are almost "universal") are central to this:',source:"@site/community/values.md",sourceDirName:".",slug:"/community-values",permalink:"/community/community-values",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/edit/main/community/values.md",tags:[],version:"current",lastUpdatedBy:"jeho",lastUpdatedAt:1709649459,formattedLastUpdatedAt:"Mar 5, 2024",frontMatter:{title:"Otomi Community Values",slug:"community-values",sidebar_label:"Values"},sidebar:"mainSidebar",previous:{title:"Welcome",permalink:"/community/welcome"},next:{title:"Code of Conduct",permalink:"/community/code-of-conduct"}},u={},l=[{value:"Distribution is better than centralization",id:"distribution-is-better-than-centralization",level:2},{value:"Community over product or company",id:"community-over-product-or-company",level:2},{value:"Automation over process",id:"automation-over-process",level:2},{value:"Inclusive is better than exclusive",id:"inclusive-is-better-than-exclusive",level:2},{value:"Evolution is better than stagnation",id:"evolution-is-better-than-stagnation",level:2}];function c(e){const t={h1:"h1",h2:"h2",p:"p",strong:"strong",...(0,i.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"otomi-community-values",children:"Otomi Community Values"}),"\n",(0,n.jsx)(t.p,{children:'Otomi Community culture contributes substantially to the project\'s success. The following values (blatantly copied and adopted from kubernetes, as those are almost "universal") are central to this:'}),"\n",(0,n.jsx)(t.h2,{id:"distribution-is-better-than-centralization",children:"Distribution is better than centralization"}),"\n",(0,n.jsx)(t.p,{children:"The scale of the Otomi project is only viable through high-trust and high-visibility distribution of work, which includes delegation of authority, decision making, technical design, code ownership, and documentation. Distributed asynchronous ownership, collaboration, communication and decision making are the cornerstones of our community."}),"\n",(0,n.jsx)(t.h2,{id:"community-over-product-or-company",children:"Community over product or company"}),"\n",(0,n.jsx)(t.p,{children:"We are here as a community first. Our allegiance is to the intentional stewardship of the Otomi project for the benefit of all its members and users everywhere. We support working together publicly for the common goal of a vibrant interoperable ecosystem, providing an excellent experience for our users. Individuals gain status through work. Companies gain status through their commitments to support this community and fund the resources necessary for the project to operate."}),"\n",(0,n.jsx)(t.h2,{id:"automation-over-process",children:"Automation over process"}),"\n",(0,n.jsx)(t.p,{children:"Large projects have a lot of hard yet less exciting work. We value time spent automating repetitive work more highly than toil. Where work cannot be automated, our culture recognizes and rewards all types of contributions while recognizing that heroism is not sustainable."}),"\n",(0,n.jsx)(t.h2,{id:"inclusive-is-better-than-exclusive",children:"Inclusive is better than exclusive"}),"\n",(0,n.jsx)(t.p,{children:"Broadly successful and useful technologies require different perspectives and skill sets, which can only be heard in a welcoming and respectful environment. Community membership is a privilege, not a right. Community members earn leadership through effort, scope, quality, quantity, and duration of contributions. Our community respects the time and effort put into a discussion, regardless of where a contributor is on their growth path."}),"\n",(0,n.jsx)(t.h2,{id:"evolution-is-better-than-stagnation",children:"Evolution is better than stagnation"}),"\n",(0,n.jsx)(t.p,{children:"Openness to new ideas and studied technological evolution make Otomi a stronger project. Continual improvement, servant leadership, mentorship, and respect are the foundations of Otomi culture. Otomi community leaders have a duty to find, sponsor, and promote new community members. Leaders should expect to step aside. Community members should expect to step up."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:'"Culture eats strategy for breakfast." --Peter Drucker'})})]})}function m(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},1151:(e,t,o)=>{o.d(t,{Z:()=>a,a:()=>r});var n=o(7294);const i={},s=n.createContext(i);function r(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/efe7c983.8e5cdc3d.js b/assets/js/efe7c983.8e5cdc3d.js deleted file mode 100644 index 60fd134b5..000000000 --- a/assets/js/efe7c983.8e5cdc3d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[9613],{7313:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>d});var r=t(5893),n=t(1151);const o={slug:"roadmap",title:"Product Roadmap",sidebar_label:"Roadmap"},a="Roadmap",s={id:"roadmap",title:"Product Roadmap",description:"Supported Kubernetes version",source:"@site/product/roadmap.md",sourceDirName:".",slug:"/roadmap",permalink:"/product/roadmap",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/edit/main/product/roadmap.md",tags:[],version:"current",lastUpdatedBy:"jeho",lastUpdatedAt:1709649459,formattedLastUpdatedAt:"Mar 5, 2024",frontMatter:{slug:"roadmap",title:"Product Roadmap",sidebar_label:"Roadmap"},sidebar:"mainSidebar",previous:{title:"Otomi Projects",permalink:"/product/architecture"},next:{title:"FAQ",permalink:"/product/faq"}},l={},d=[{value:"Supported Kubernetes version",id:"supported-kubernetes-version",level:2},{value:"Plan",id:"plan",level:2},{value:"2023 Q4",id:"2023-q4",level:3},{value:"2024 Q1",id:"2024-q1",level:3},{value:"2024 Q2",id:"2024-q2",level:3},{value:"Q3 2024",id:"q3-2024",level:3},{value:"Q4 2024",id:"q4-2024",level:3},{value:"Removed features by release",id:"removed-features-by-release",level:2},{value:"v3.0",id:"v30",level:3},{value:"Drone",id:"drone",level:4},{value:"Hashicorp Vault",id:"hashicorp-vault",level:4},{value:"OPA Gatekeeper",id:"opa-gatekeeper",level:4},{value:"Otomi shortcuts",id:"otomi-shortcuts",level:4}];function c(e){const i={a:"a",admonition:"admonition",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(i.h1,{id:"roadmap",children:"Roadmap"}),"\n",(0,r.jsx)(i.h2,{id:"supported-kubernetes-version",children:"Supported Kubernetes version"}),"\n",(0,r.jsx)(i.p,{children:"We are dedicated to maintain support for three different Kubernetes versions within a specific major version of Otomi. Whenever we decide to discontinue support for a particular Kubernetes version, we increment the major version of Otomi."}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Otomi Version"}),(0,r.jsx)(i.th,{children:"Supported Kubernetes version"}),(0,r.jsx)(i.th,{children:"Expected release date"})]})}),(0,r.jsxs)(i.tbody,{children:[(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"v1.0"}),(0,r.jsx)(i.td,{children:"1.24, 1.25, 1.26"}),(0,r.jsx)(i.td,{children:"2023-09-28"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"v2.0"}),(0,r.jsx)(i.td,{children:"1.25, 1.26, 1.27"}),(0,r.jsx)(i.td,{children:"2023-11-28"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"v3.0"}),(0,r.jsx)(i.td,{children:"1.26, 1.27, 1.28"}),(0,r.jsx)(i.td,{children:"2024-03-28"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"v4.0"}),(0,r.jsx)(i.td,{children:"1.27, 1.28, 1.29"}),(0,r.jsx)(i.td,{children:"2024-05-14"})]})]})]}),"\n",(0,r.jsx)(i.h2,{id:"plan",children:"Plan"}),"\n",(0,r.jsx)(i.h3,{id:"2023-q4",children:"2023 Q4"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Provide a developer catalog in Gitea \u2705"}),"\n",(0,r.jsx)(i.li,{children:"Migrate platform pipeline from Drone to Tekton \u2705"}),"\n",(0,r.jsx)(i.li,{children:"Implement status indicators within Otomi Console to keep Team users informed about the status of various components, including Build processes, Workload management, and Service availability \u2705"}),"\n",(0,r.jsx)(i.li,{children:"Add Team and Platform Dashboards to provide an overview of team resource status using Prometheus metrics \u2705"}),"\n",(0,r.jsx)(i.li,{children:"Leverage Argo CD to deploy Team K8s resources \u2705"}),"\n",(0,r.jsx)(i.li,{children:"Quality assurance cluster for continuous Otomi hardening and performance testing \u2705"}),"\n",(0,r.jsx)(i.li,{children:"Provide UI interface for adding Helm charts to developer catalog in Gitea \u2705"}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"2024-q1",children:"2024 Q1"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Add Grype to the Otomi Build pipeline to scan source code for security vulnerabilities \u2705"}),"\n",(0,r.jsx)(i.li,{children:"Implement a new secret management solution (as a replacement for Hashicorp Vault) \u2705"}),"\n",(0,r.jsx)(i.li,{children:"Move network policies out of the Service configuration to improve network policy management \ud83d\udd04"}),"\n",(0,r.jsx)(i.li,{children:"Migrate OPA/Gatekeeper to Kyverno and offer a large set of default policies that can also be managed by Teams \ud83d\udd04"}),"\n",(0,r.jsx)(i.li,{children:"Improve Team self-service permissions \u2705"}),"\n",(0,r.jsx)(i.li,{children:"Create an Organization in Gitea for each Team (tenant)"}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"2024-q2",children:"2024 Q2"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Harden the Istio service mesh configuration"}),"\n",(0,r.jsx)(i.li,{children:"Implement Gitea with a database managed by the CloudNativePG operator"}),"\n",(0,r.jsx)(i.li,{children:"Migrate Harbor and Keycloak Jobs to the Otomi operators"}),"\n",(0,r.jsx)(i.li,{children:"Enhance network policies across the platform"}),"\n",(0,r.jsx)(i.li,{children:"Enable user configurable storage classes"}),"\n",(0,r.jsx)(i.li,{children:"Provide disaster recovery procedures for Otomi core applications, such as Gitea, Keycloak and Harbor"}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"q3-2024",children:"Q3 2024"}),"\n",(0,r.jsx)(i.p,{children:"After Q2 2024 we have the following goals:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["Add the option to add charts from ",(0,r.jsx)(i.a,{href:"https://artifacthub.io",children:"artifacthub"})," to the Catalog \ud83d\udd04"]}),"\n",(0,r.jsx)(i.li,{children:"Leverage Argo CD to deploy Otomi Platform apps \ud83d\udd04"}),"\n",(0,r.jsx)(i.li,{children:"Bring user management into Otomi when Keycloak is used as an IdP"}),"\n",(0,r.jsx)(i.li,{children:"Ensure Otomi's NSA and CISA compliance"}),"\n",(0,r.jsx)(i.li,{children:"Show a compliance report (code vulnerabilities, image vulnerabilities, security violations, container vulnerabilities, config audit, exposed secrets) per workload"}),"\n",(0,r.jsx)(i.li,{children:"Make Otomi more plugable by enabling users to bring their own platform apps"}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"q4-2024",children:"Q4 2024"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Encrypt platform secrets with SealedSecrets instead of SOPS"}),"\n",(0,r.jsx)(i.li,{children:"Remove platform app forms in favor of generated values that can be customized in an editor"}),"\n",(0,r.jsx)(i.li,{children:"Migrate to ambient mesh using eBPF"}),"\n"]}),"\n",(0,r.jsx)(i.h2,{id:"removed-features-by-release",children:"Removed features by release"}),"\n",(0,r.jsx)(i.h3,{id:"v30",children:"v3.0"}),"\n",(0,r.jsx)(i.h4,{id:"drone",children:"Drone"}),"\n",(0,r.jsx)(i.p,{children:"Otomi will stop delivering Drone as a platform app.\nThe Tekton app is introduced in Otomi v2.0 as a replacement. There is no migration procedure, Drone is used primarely as an Otomi deployment pipeline. However if you used it as for custom pipeline then you may need to migrate them Tekton."}),"\n",(0,r.jsx)(i.admonition,{type:"note",children:(0,r.jsx)(i.p,{children:"This app will not be deleted if it is already deployed."})}),"\n",(0,r.jsx)(i.h4,{id:"hashicorp-vault",children:"Hashicorp Vault"}),"\n",(0,r.jsx)(i.p,{children:"Otomi will stop delivering the Hashicorp Vault as a platform app.\nThe SealedSecrets app is introduced in Otomi v2.7 as a replacement.\nThe procedure to migrate from Hashicorp Vault to SealedSecrets is going to be announced soon."}),"\n",(0,r.jsx)(i.admonition,{type:"note",children:(0,r.jsx)(i.p,{children:"This app will not be deleted if it is already deployed.\nThe external-secrets app is still going to be part of Otomi"})}),"\n",(0,r.jsx)(i.h4,{id:"opa-gatekeeper",children:"OPA Gatekeeper"}),"\n",(0,r.jsx)(i.p,{children:"Otomi will stop delivering the OPA Gatekeeper as a platform app.\nThe Kyverno app is going to be introduced as a replacement. There is no migration procedure, as the basic policies are already covered. However if you used your custom policies then you may need to migrated them on your own."}),"\n",(0,r.jsx)(i.admonition,{type:"note",children:(0,r.jsx)(i.p,{children:"This app will not be deleted if it is already deployed."})}),"\n",(0,r.jsx)(i.h4,{id:"otomi-shortcuts",children:"Otomi shortcuts"}),"\n",(0,r.jsx)(i.p,{children:"Due to lack of interest in this feature, we decided to remove it from Otomi."}),"\n",(0,r.jsx)(i.admonition,{type:"note",children:(0,r.jsx)(i.p,{children:"The shortcuts will be automatically removed from the values repo."})})]})}function h(e={}){const{wrapper:i}={...(0,n.a)(),...e.components};return i?(0,r.jsx)(i,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},1151:(e,i,t)=>{t.d(i,{Z:()=>s,a:()=>a});var r=t(7294);const n={},o=r.createContext(n);function a(e){const i=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function s(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),r.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/efe7c983.bc7c7e2f.js b/assets/js/efe7c983.bc7c7e2f.js new file mode 100644 index 000000000..e807a3560 --- /dev/null +++ b/assets/js/efe7c983.bc7c7e2f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[9613],{7313:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>d});var r=t(5893),n=t(1151);const o={slug:"roadmap",title:"Product Roadmap",sidebar_label:"Roadmap"},a="Roadmap",s={id:"roadmap",title:"Product Roadmap",description:"Supported Kubernetes version",source:"@site/product/roadmap.md",sourceDirName:".",slug:"/roadmap",permalink:"/product/roadmap",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/edit/main/product/roadmap.md",tags:[],version:"current",lastUpdatedBy:"ElderMatt",lastUpdatedAt:1710142611,formattedLastUpdatedAt:"Mar 11, 2024",frontMatter:{slug:"roadmap",title:"Product Roadmap",sidebar_label:"Roadmap"},sidebar:"mainSidebar",previous:{title:"Otomi Projects",permalink:"/product/architecture"},next:{title:"FAQ",permalink:"/product/faq"}},l={},d=[{value:"Supported Kubernetes version",id:"supported-kubernetes-version",level:2},{value:"Plan",id:"plan",level:2},{value:"2023 Q4",id:"2023-q4",level:3},{value:"2024 Q1",id:"2024-q1",level:3},{value:"2024 Q2",id:"2024-q2",level:3},{value:"Q3 2024",id:"q3-2024",level:3},{value:"Q4 2024",id:"q4-2024",level:3},{value:"Removed features by release",id:"removed-features-by-release",level:2},{value:"v3.0",id:"v30",level:3},{value:"Drone",id:"drone",level:4},{value:"Hashicorp Vault",id:"hashicorp-vault",level:4},{value:"OPA Gatekeeper",id:"opa-gatekeeper",level:4},{value:"Otomi shortcuts",id:"otomi-shortcuts",level:4}];function c(e){const i={a:"a",admonition:"admonition",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(i.h1,{id:"roadmap",children:"Roadmap"}),"\n",(0,r.jsx)(i.h2,{id:"supported-kubernetes-version",children:"Supported Kubernetes version"}),"\n",(0,r.jsx)(i.p,{children:"We are dedicated to maintain support for three different Kubernetes versions within a specific major version of Otomi. Whenever we decide to discontinue support for a particular Kubernetes version, we increment the major version of Otomi."}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Otomi Version"}),(0,r.jsx)(i.th,{children:"Supported Kubernetes version"}),(0,r.jsx)(i.th,{children:"Expected release date"})]})}),(0,r.jsxs)(i.tbody,{children:[(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"v1.0"}),(0,r.jsx)(i.td,{children:"1.24, 1.25, 1.26"}),(0,r.jsx)(i.td,{children:"2023-09-28"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"v2.0"}),(0,r.jsx)(i.td,{children:"1.25, 1.26, 1.27"}),(0,r.jsx)(i.td,{children:"2023-11-28"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"v3.0"}),(0,r.jsx)(i.td,{children:"1.26, 1.27, 1.28"}),(0,r.jsx)(i.td,{children:"2024-03-28"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"v4.0"}),(0,r.jsx)(i.td,{children:"1.27, 1.28, 1.29"}),(0,r.jsx)(i.td,{children:"2024-05-14"})]})]})]}),"\n",(0,r.jsx)(i.h2,{id:"plan",children:"Plan"}),"\n",(0,r.jsx)(i.h3,{id:"2023-q4",children:"2023 Q4"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Provide a developer catalog in Gitea \u2705"}),"\n",(0,r.jsx)(i.li,{children:"Migrate platform pipeline from Drone to Tekton \u2705"}),"\n",(0,r.jsx)(i.li,{children:"Implement status indicators within Otomi Console to keep Team users informed about the status of various components, including Build processes, Workload management, and Service availability \u2705"}),"\n",(0,r.jsx)(i.li,{children:"Add Team and Platform Dashboards to provide an overview of team resource status using Prometheus metrics \u2705"}),"\n",(0,r.jsx)(i.li,{children:"Leverage Argo CD to deploy Team K8s resources \u2705"}),"\n",(0,r.jsx)(i.li,{children:"Quality assurance cluster for continuous Otomi hardening and performance testing \u2705"}),"\n",(0,r.jsx)(i.li,{children:"Provide UI interface for adding Helm charts to developer catalog in Gitea \u2705"}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"2024-q1",children:"2024 Q1"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Add Grype to the Otomi Build pipeline to scan source code for security vulnerabilities \u2705"}),"\n",(0,r.jsx)(i.li,{children:"Implement a new secret management solution (as a replacement for Hashicorp Vault) \u2705"}),"\n",(0,r.jsx)(i.li,{children:"Move network policies out of the Service configuration to improve network policy management \ud83d\udd04"}),"\n",(0,r.jsx)(i.li,{children:"Migrate OPA/Gatekeeper to Kyverno and offer a large set of default policies that can also be managed by Teams \ud83d\udd04"}),"\n",(0,r.jsx)(i.li,{children:"Improve Team self-service permissions \u2705"}),"\n",(0,r.jsx)(i.li,{children:"Create an Organization in Gitea for each Team (tenant)"}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"2024-q2",children:"2024 Q2"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Harden the Istio service mesh configuration"}),"\n",(0,r.jsx)(i.li,{children:"Implement Gitea with a database managed by the CloudNativePG operator"}),"\n",(0,r.jsx)(i.li,{children:"Migrate Harbor and Keycloak Jobs to the Otomi operators"}),"\n",(0,r.jsx)(i.li,{children:"Enhance network policies across the platform"}),"\n",(0,r.jsx)(i.li,{children:"Enable user configurable storage classes"}),"\n",(0,r.jsx)(i.li,{children:"Provide disaster recovery procedures for Otomi core applications, such as Gitea, Keycloak and Harbor"}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"q3-2024",children:"Q3 2024"}),"\n",(0,r.jsx)(i.p,{children:"After Q2 2024 we have the following goals:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["Add the option to add charts from ",(0,r.jsx)(i.a,{href:"https://artifacthub.io",children:"artifacthub"})," to the Catalog \ud83d\udd04"]}),"\n",(0,r.jsx)(i.li,{children:"Leverage Argo CD to deploy Otomi Platform apps \ud83d\udd04"}),"\n",(0,r.jsx)(i.li,{children:"Bring user management into Otomi when Keycloak is used as an IdP"}),"\n",(0,r.jsx)(i.li,{children:"Ensure Otomi's NSA and CISA compliance"}),"\n",(0,r.jsx)(i.li,{children:"Show a compliance report (code vulnerabilities, image vulnerabilities, security violations, container vulnerabilities, config audit, exposed secrets) per workload"}),"\n",(0,r.jsx)(i.li,{children:"Make Otomi more plugable by enabling users to bring their own platform apps"}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"q4-2024",children:"Q4 2024"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Encrypt platform secrets with SealedSecrets instead of SOPS"}),"\n",(0,r.jsx)(i.li,{children:"Remove platform app forms in favor of generated values that can be customized in an editor"}),"\n",(0,r.jsx)(i.li,{children:"Migrate to ambient mesh using eBPF"}),"\n"]}),"\n",(0,r.jsx)(i.h2,{id:"removed-features-by-release",children:"Removed features by release"}),"\n",(0,r.jsx)(i.h3,{id:"v30",children:"v3.0"}),"\n",(0,r.jsx)(i.h4,{id:"drone",children:"Drone"}),"\n",(0,r.jsx)(i.p,{children:"Otomi will stop delivering Drone as a platform app.\nThe Tekton app is introduced in Otomi v2.0 as a replacement. There is no migration procedure, Drone is used primarely as an Otomi deployment pipeline. However if you used it as for custom pipeline then you may need to migrate them Tekton."}),"\n",(0,r.jsx)(i.admonition,{type:"note",children:(0,r.jsx)(i.p,{children:"This app will not be deleted if it is already deployed."})}),"\n",(0,r.jsx)(i.h4,{id:"hashicorp-vault",children:"Hashicorp Vault"}),"\n",(0,r.jsx)(i.p,{children:"Otomi will stop delivering the Hashicorp Vault as a platform app.\nThe SealedSecrets app is introduced in Otomi v2.7 as a replacement.\nThe procedure to migrate from Hashicorp Vault to SealedSecrets is going to be announced soon."}),"\n",(0,r.jsx)(i.admonition,{type:"note",children:(0,r.jsx)(i.p,{children:"This app will not be deleted if it is already deployed.\nThe external-secrets app is still going to be part of Otomi"})}),"\n",(0,r.jsx)(i.h4,{id:"opa-gatekeeper",children:"OPA Gatekeeper"}),"\n",(0,r.jsx)(i.p,{children:"Otomi will stop delivering the OPA Gatekeeper as a platform app.\nThe Kyverno app is going to be introduced as a replacement. There is no migration procedure, as the basic policies are already covered. However if you used your custom policies then you may need to migrated them on your own."}),"\n",(0,r.jsx)(i.admonition,{type:"note",children:(0,r.jsx)(i.p,{children:"This app will not be deleted if it is already deployed."})}),"\n",(0,r.jsx)(i.h4,{id:"otomi-shortcuts",children:"Otomi shortcuts"}),"\n",(0,r.jsx)(i.p,{children:"Due to lack of interest in this feature, we decided to remove it from Otomi."}),"\n",(0,r.jsx)(i.admonition,{type:"note",children:(0,r.jsx)(i.p,{children:"The shortcuts will be automatically removed from the values repo."})})]})}function h(e={}){const{wrapper:i}={...(0,n.a)(),...e.components};return i?(0,r.jsx)(i,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},1151:(e,i,t)=>{t.d(i,{Z:()=>s,a:()=>a});var r=t(7294);const n={},o=r.createContext(n);function a(e){const i=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function s(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),r.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f1abdd8c.7662ac08.js b/assets/js/f1abdd8c.7662ac08.js new file mode 100644 index 000000000..4ec78b32f --- /dev/null +++ b/assets/js/f1abdd8c.7662ac08.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[4734],{3167:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>u,frontMatter:()=>n,metadata:()=>a,toc:()=>d});var i=o(5893),s=o(1151);const n={slug:"faq",title:"FAQ"},r=void 0,a={id:"faq",title:"FAQ",description:"More about Otomi",source:"@site/product/faq.md",sourceDirName:".",slug:"/faq",permalink:"/product/faq",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/edit/main/product/faq.md",tags:[],version:"current",lastUpdatedBy:"ElderMatt",lastUpdatedAt:1710142611,formattedLastUpdatedAt:"Mar 11, 2024",frontMatter:{slug:"faq",title:"FAQ"},sidebar:"mainSidebar",previous:{title:"Roadmap",permalink:"/product/roadmap"},next:{title:"Overview",permalink:"/product/use-cases/overview"}},l={},d=[{value:"More about Otomi",id:"more-about-otomi",level:2},{value:"Setup and Installation",id:"setup-and-installation",level:2},{value:"Other",id:"other",level:2}];function c(e){const t={a:"a",code:"code",h2:"h2",p:"p",...(0,s.a)(),...e.components},{Details:o}=t;return o||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h2,{id:"more-about-otomi",children:"More about Otomi"}),"\n",(0,i.jsxs)(o,{children:[(0,i.jsx)("summary",{children:"Is Otomi a lightweight version of Rancher or OpenShift"}),(0,i.jsx)(t.p,{children:"No. Otomi is a pre-configured and curated package of open source projects combined with a self-service portal and requires an existing Kubernetes cluster to be installed on. Otomi can not be used to install a Kubernetes cluster."})]}),"\n",(0,i.jsxs)(o,{children:[(0,i.jsx)("summary",{children:"Is Otomi some kind of Kubeapps"}),(0,i.jsx)(t.p,{children:"We can imagine when looking at the list of all pre-configured and ready-to-use apps, you might get the impression that Otomi is some kind of application catalog for Kubernetes. But the opposite is true. When you install Otomi, you will get all of these apps and they\u2019re already configured for you, and they will work out-of-the-box. You can then use the web UI or values repository to adjust the configuration of these apps based on your own requirements."}),(0,i.jsx)(t.p,{children:"Otomi itself comes with a Developer Catalog that can be customized do offer custom Helm charts (Golden path Templates) to developers to use."})]}),"\n",(0,i.jsxs)(o,{children:[(0,i.jsx)("summary",{children:"Do I need to use Gitea for my code repositories?"}),(0,i.jsxs)(t.p,{children:["No. Otomi itself uses Gitea for 2 repositories: the ",(0,i.jsx)(t.code,{children:"otomi/values"})," and the ",(0,i.jsx)(t.code,{children:"otomi/charts"})," repositories. ",(0,i.jsx)(t.code,{children:"otomi/values"}),' is used for the "local bookkeeping" of the platform configuration and ',(0,i.jsx)(t.code,{children:"otomi/charts"})," is used for the Developer Catalog. Using external Git services for these repositories is not supported."]}),(0,i.jsx)(t.p,{children:"But it is not required to use Gitea for your own code repositories. Yes, Gitea can be used as a Git service for your own code projects, but if you are already using a Git service like Gitlab or GitHub, you are not forced to migrate."}),(0,i.jsx)(t.p,{children:"The Build feature in Otomi is configured with credentials for Gitea private repositories, but it is also possible to use public Git repositories, or create a secret for an external Git service and use this secret."})]}),"\n",(0,i.jsxs)(o,{children:[(0,i.jsx)("summary",{children:"I already have a CI build pipeline. Do I need to use the Build feature in Otomi? "}),(0,i.jsx)(t.p,{children:"No. If you already have a CI build pipeline you can keep using it. You can choose to push your images to Harbor in Otomi. For this you can download the Docker credentials in Otomi Console."})]}),"\n",(0,i.jsxs)(o,{children:[(0,i.jsx)("summary",{children:"Do I need to use Harbor?"}),(0,i.jsxs)(t.p,{children:["No, using Harbor is optional. The advantage of using Harbor is that Otomi automatically adds a ",(0,i.jsx)(t.code,{children:"pull-secret"})," for Harbor to the Team namespace. If you would like to use an external image registry, then you will need to create the pull-secrets yourself."]})]}),"\n",(0,i.jsx)(t.h2,{id:"setup-and-installation",children:"Setup and Installation"}),"\n",(0,i.jsxs)(o,{children:[(0,i.jsx)("summary",{children:"What are the minimal requirements to install Otomi?"}),(0,i.jsxs)(t.p,{children:["Otomi requires a running Kubernetes cluster of version ",(0,i.jsx)(t.code,{children:"1.25"})," up to ",(0,i.jsx)(t.code,{children:"1.27"})," using a Node pool with at least ",(0,i.jsx)(t.code,{children:"12 vCPU"})," and ",(0,i.jsx)(t.code,{children:"24 GiB memory"}),", but more is recommended. When using the ",(0,i.jsx)(t.code,{children:"custom"})," provider (when installing Kubernetes on a unsupported provider), make sure Otomi can create a K8s LoadBalancer Service that is accessible from your machine (but not using 127.0.0.1)."]})]}),"\n",(0,i.jsxs)(o,{children:[(0,i.jsx)("summary",{children:"Where can I find all possible configuration options for Otomi?"}),(0,i.jsxs)(t.p,{children:["When installing Otomi with the helm chart you can find its ",(0,i.jsx)(t.code,{children:"values-schema.json"})," inside, which contains all the possible configuration parameters. It is generated from ",(0,i.jsx)(t.a,{href:"https://github.com/redkubes/otomi-core/blob/main/values-schema.yaml",children:"otomi-core/values-schema.yaml"}),"."]})]}),"\n",(0,i.jsxs)(o,{children:[(0,i.jsx)("summary",{children:"Can Otomi be deployed on an existing cluster?"}),(0,i.jsx)(t.p,{children:"Yes, Otomi can be installed on an existing cluster as long as there are no namespaces that are also used by Otomi. We advise to install Otomi on a Vanilla Kubernetes cluster without any cloud specific add-ons installed."})]}),"\n",(0,i.jsxs)(o,{children:[(0,i.jsx)("summary",{children:"Can I install Otomi without using a DNS zone?"}),(0,i.jsx)(t.p,{children:"Yes, using a DNS zone for name resolution is optional (but prefferred). When installing Otomi with minimal values, nip.io is used for name resolution pointing to the public IP of the cloud load balancer."})]}),"\n",(0,i.jsxs)(o,{children:[(0,i.jsx)("summary",{children:"I don't have an external IdP like Azure AD. Can I still install Otomi?"}),(0,i.jsxs)(t.p,{children:["Yes, using an external IdP like Azure AD is optional. When installing Otomi without ",(0,i.jsx)(t.code,{children:"OIDC"})," values, Otomi will configure Keycloak as an IdP. You can create users in Keycloak and assign them to the pre-configured roles."]})]}),"\n",(0,i.jsxs)(o,{children:[(0,i.jsx)("summary",{children:"Can I install Otomi on my laptop using Minikube?"}),(0,i.jsxs)(t.p,{children:["Yes. You can use the Otomi ",(0,i.jsx)(t.code,{children:"custom"})," provider to install Otomi on Kubernetes running on your own hardware, including Minikube. Note that Otomi needs to be able to create a Kubernetes LoadBalancer service and the IP needs to be accessible for pods running in the cluster and for your local browser. ",(0,i.jsx)(t.code,{children:"127.0.0.1"})," can not be used, so running minikube with the Docker provider is not supported. Use the ",(0,i.jsx)(t.a,{href:"https://minikube.sigs.k8s.io/docs/drivers/hyperkit/",children:"Hyperkit driver"})," instead. Also note that Otomi does not support ARM."]}),(0,i.jsx)(t.p,{children:"Otomi is a complete platform suite and not a single purpose tool. This is why otomi requires a stable (cloud) infrastructure and sufficient resources. Running Otomi on your laptop is therefor not advised."})]}),"\n",(0,i.jsx)(t.h2,{id:"other",children:"Other"}),"\n",(0,i.jsxs)(o,{children:[(0,i.jsx)("summary",{children:"Do you provide commercial support?"}),(0,i.jsxs)(t.p,{children:["Yes, you can contact us for commercial support. ",(0,i.jsx)(t.a,{href:"https://redkubes.com",children:"Red Kubes"})," is the company behind Otomi."]})]})]})}function u(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},1151:(e,t,o)=>{o.d(t,{Z:()=>a,a:()=>r});var i=o(7294);const s={},n=i.createContext(s);function r(e){const t=i.useContext(n);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f1abdd8c.79d7a38a.js b/assets/js/f1abdd8c.79d7a38a.js deleted file mode 100644 index d186b86af..000000000 --- a/assets/js/f1abdd8c.79d7a38a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[4734],{3167:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>l,contentTitle:()=>r,default:()=>u,frontMatter:()=>n,metadata:()=>a,toc:()=>c});var i=t(5893),s=t(1151);const n={slug:"faq",title:"FAQ"},r=void 0,a={id:"faq",title:"FAQ",description:"More about Otomi",source:"@site/product/faq.md",sourceDirName:".",slug:"/faq",permalink:"/product/faq",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/edit/main/product/faq.md",tags:[],version:"current",lastUpdatedBy:"jeho",lastUpdatedAt:1709649459,formattedLastUpdatedAt:"Mar 5, 2024",frontMatter:{slug:"faq",title:"FAQ"},sidebar:"mainSidebar",previous:{title:"Roadmap",permalink:"/product/roadmap"},next:{title:"Overview",permalink:"/product/use-cases/overview"}},l={},c=[{value:"More about Otomi",id:"more-about-otomi",level:2},{value:"Setup and Installation",id:"setup-and-installation",level:2},{value:"Other",id:"other",level:2}];function d(e){const o={a:"a",code:"code",h2:"h2",p:"p",...(0,s.a)(),...e.components},{Details:t}=o;return t||function(e,o){throw new Error("Expected "+(o?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.h2,{id:"more-about-otomi",children:"More about Otomi"}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Is Otomi a lightweight version of Rancher or OpenShift"}),(0,i.jsx)(o.p,{children:"No. Otomi is a pre-configured and curated package of open source projects combined with a self-service portal and requires an existing Kubernetes cluster to be installed on. Otomi can not be used to install a Kubernetes cluster."})]}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Is Otomi some kind of Kubeapps"}),(0,i.jsx)(o.p,{children:"We can imagine when looking at the list of all pre-configured and ready-to-use apps, you might get the impression that Otomi is some kind of application catalog for Kubernetes. But the opposite is true. When you install Otomi, you will get all of these apps and they\u2019re already configured for you, and they will work out-of-the-box. You can then use the web UI or values repository to adjust the configuration of these apps based on your own requirements."}),(0,i.jsx)(o.p,{children:"Otomi itself comes with a Developer Catalog that can be customized do offer custom Helm charts (Golden path Templates) to developers to use."})]}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Do I need to use Gitea for my code repositories?"}),(0,i.jsxs)(o.p,{children:["No. Otomi itself uses Gitea for 2 repositories: the ",(0,i.jsx)(o.code,{children:"otomi/values"})," and the ",(0,i.jsx)(o.code,{children:"otomi/charts"})," repositories. ",(0,i.jsx)(o.code,{children:"otomi/values"}),' is used for the "local bookkeeping" of the platform configuration and ',(0,i.jsx)(o.code,{children:"otomi/charts"})," is used for the Developer Catalog. Using external Git services for these repositories is not supported."]}),(0,i.jsx)(o.p,{children:"But it is not required to use Gitea for your own code repositories. Yes, Gitea can be used as a Git service for your own code projects, but if you are already using a Git service like Gitlab or GitHub, you are not forced to migrate."}),(0,i.jsx)(o.p,{children:"The Build feature in Otomi is configured with credentials for Gitea private repositories, but it is also possible to use public Git repositories, or create a secret for an external Git service and use this secret."})]}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"I already have a CI build pipeline. Do I need to use the Build feature in Otomi? "}),(0,i.jsx)(o.p,{children:"No. If you already have a CI build pipeline you can keep using it. You can choose to push your images to Harbor in Otomi. For this you can download the Docker credentials in Otomi Console."})]}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Do I need to use Harbor?"}),(0,i.jsxs)(o.p,{children:["No, using Harbor is optional. The advantage of using Harbor is that Otomi automatically adds a ",(0,i.jsx)(o.code,{children:"pull-secret"})," for Harbor to the Team namespace. If you would like to use an external image registry, then you will need to create the pull-secrets yourself."]})]}),"\n",(0,i.jsx)(o.h2,{id:"setup-and-installation",children:"Setup and Installation"}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"What are the minimal requirements to install Otomi?"}),(0,i.jsxs)(o.p,{children:["Otomi requires a running Kubernetes cluster of version ",(0,i.jsx)(o.code,{children:"1.25"})," up to ",(0,i.jsx)(o.code,{children:"1.27"})," using a Node pool with at least ",(0,i.jsx)(o.code,{children:"12 vCPU"})," and ",(0,i.jsx)(o.code,{children:"24 GiB memory"}),", but more is recommended. When using the ",(0,i.jsx)(o.code,{children:"custom"})," provider (when installing Kubernetes on a unsupported provider), make sure Otomi can create a K8s LoadBalancer Service that is accessible from your machine (but not using 127.0.0.1)."]})]}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Where can I find all possible configuration options for Otomi?"}),(0,i.jsxs)(o.p,{children:["When installing Otomi with the helm chart you can find its ",(0,i.jsx)(o.code,{children:"values-schema.json"})," inside, which contains all the possible configuration parameters. It is generated from ",(0,i.jsx)(o.a,{href:"https://github.com/redkubes/otomi-core/blob/main/values-schema.yaml",children:"otomi-core/values-schema.yaml"}),"."]})]}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Can Otomi be deployed on an existing cluster?"}),(0,i.jsx)(o.p,{children:"Yes, Otomi can be installed on an existing cluster as long as there are no namespaces that are also used by Otomi. We advise to install Otomi on a Vanilla Kubernetes cluster without any cloud specific add-ons installed."})]}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Can I install Otomi without using a DNS zone?"}),(0,i.jsx)(o.p,{children:"Yes, using a DNS zone for name resolution is optional (but prefferred). When installing Otomi with minimal values, nip.io is used for name resolution pointing to the public IP of the cloud load balancer."})]}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"I don't have an external IdP like Azure AD. Can I still install Otomi?"}),(0,i.jsxs)(o.p,{children:["Yes, using an external IdP like Azure AD is optional. When installing Otomi without ",(0,i.jsx)(o.code,{children:"OIDC"})," values, Otomi will configure Keycloak as an IdP. You can create users in Keycloak and assign them to the pre-configured roles."]})]}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Can I install Otomi on my laptop using Minikube?"}),(0,i.jsxs)(o.p,{children:["Yes. You can use the Otomi ",(0,i.jsx)(o.code,{children:"custom"})," provider to install Otomi on Kubernetes running on your own hardware, including Minikube. Note that Otomi needs to be able to create a Kubernetes LoadBalancer service and the IP needs to be accessible for pods running in the cluster and for your local browser. ",(0,i.jsx)(o.code,{children:"127.0.0.1"})," can not be used, so running minikube with the Docker provider is not supported. Use the ",(0,i.jsx)(o.a,{href:"https://minikube.sigs.k8s.io/docs/drivers/hyperkit/",children:"Hyperkit driver"})," instead. Also note that Otomi does not support ARM."]}),(0,i.jsx)(o.p,{children:"Otomi is a complete platform suite and not a single purpose tool. This is why otomi requires a stable (cloud) infrastructure and sufficient resources. Running Otomi on your laptop is therefor not advised."})]}),"\n",(0,i.jsx)(o.h2,{id:"other",children:"Other"}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Do you provide commercial support?"}),(0,i.jsxs)(o.p,{children:["Yes, you can contact us for commercial support. ",(0,i.jsx)(o.a,{href:"https://redkubes.com",children:"Red Kubes"})," is the company behind Otomi."]})]})]})}function u(e={}){const{wrapper:o}={...(0,s.a)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},1151:(e,o,t)=>{t.d(o,{Z:()=>a,a:()=>r});var i=t(7294);const s={},n=i.createContext(s);function r(e){const o=i.useContext(n);return i.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(n.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f4935766.eabbdbb3.js b/assets/js/f4935766.eabbdbb3.js new file mode 100644 index 000000000..1aa13d547 --- /dev/null +++ b/assets/js/f4935766.eabbdbb3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[6907],{9641:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>o,contentTitle:()=>i,default:()=>p,frontMatter:()=>a,metadata:()=>c,toc:()=>l});var r=s(5893),n=s(1151);const a={slug:"sealed-secrets",title:"Sealed Secrets",sidebar_label:"Sealed Secrets"},i=void 0,c={id:"apps/sealedsecrets",title:"Sealed Secrets",description:"Encrypt your Secret into a SealedSecret, which is safe to store - even inside a public repository.",source:"@site/docs/apps/sealedsecrets.md",sourceDirName:"apps",slug:"/apps/sealed-secrets",permalink:"/docs/apps/sealed-secrets",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/tree/main/docs/apps/sealedsecrets.md",tags:[],version:"current",frontMatter:{slug:"sealed-secrets",title:"Sealed Secrets",sidebar_label:"Sealed Secrets"},sidebar:"mainSidebar",previous:{title:"RabbitMQ",permalink:"/docs/apps/rabbitmq"},next:{title:"Thanos",permalink:"/docs/apps/thanos"}},o={},l=[{value:"Overview",id:"overview",level:2},{value:"Bring your own certificates",id:"bring-your-own-certificates",level:2}];function d(e){const t={a:"a",admonition:"admonition",code:"code",h2:"h2",p:"p",pre:"pre",...(0,n.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.p,{children:"Encrypt your Secret into a SealedSecret, which is safe to store - even inside a public repository."}),"\n",(0,r.jsx)(t.h2,{id:"overview",children:"Overview"}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.a,{href:"https://github.com/bitnami-labs/sealed-secrets",children:"Bitnami Sealed Secrets"})," is a controller that allows you to encrypt your kubernetes secrets and store them in a secure manner, even in public repositories. The controller works by encrypting your secret into a SealedSecret, which can only be decrypted by the sealed secrets controller in your cluster."]}),"\n",(0,r.jsx)(t.h2,{id:"bring-your-own-certificates",children:"Bring your own certificates"}),"\n",(0,r.jsx)(t.admonition,{title:"AlERT",type:"info",children:(0,r.jsx)(t.p,{children:"You can use your certificates for the disaster recovery purpose. Please make sure to download encryption keys."})}),"\n",(0,r.jsxs)(t.p,{children:["While the controller generates its own certificates upon deployment, you also have the option to bring your own certificates. This allows the controller to consume certificates from a secret labeled with ",(0,r.jsx)(t.code,{children:"sealedsecrets.bitnami.com/sealed-secrets-key=active"}),". The Secret should reside in the ",(0,r.jsx)(t.code,{children:"sealed-secrets"})," namespace, which must be the same as the controller's namespace. You can have multiple secrets with this label."]}),"\n",(0,r.jsxs)(t.p,{children:["To configure the certificates, add the following to the ",(0,r.jsx)(t.code,{children:"values.yaml"})," when installing Otomi:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",children:"apps:\n sealed-secrets:\n enabled: true\nbootstrap:\n apiVersion: v1\n items:\n - apiVersion: v1\n data:\n tls.crt: \n tls.key: \n kind: Secret\n metadata:\n generateName: sealed-secrets-key\n labels:\n sealedsecrets.bitnami.com/sealed-secrets-key: active\n name: \n namespace: sealed-secrets\n type: kubernetes.io/tls\n kind: List\n"})}),"\n",(0,r.jsxs)(t.p,{children:["Make sure to replace ",(0,r.jsx)(t.code,{children:""}),", ",(0,r.jsx)(t.code,{children:""}),", ",(0,r.jsx)(t.code,{children:""})," with your actual certificate data and sealed secrets name."]})]})}function p(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},1151:(e,t,s)=>{s.d(t,{Z:()=>c,a:()=>i});var r=s(7294);const n={},a=r.createContext(n);function i(e){const t=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),r.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f4935766.eee54616.js b/assets/js/f4935766.eee54616.js deleted file mode 100644 index f996cc53a..000000000 --- a/assets/js/f4935766.eee54616.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[6907],{9641:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>o,contentTitle:()=>i,default:()=>u,frontMatter:()=>a,metadata:()=>c,toc:()=>l});var r=s(5893),n=s(1151);const a={slug:"sealed-secrets",title:"Sealed Secrets",sidebar_label:"Sealed Secrets"},i=void 0,c={id:"apps/sealedsecrets",title:"Sealed Secrets",description:"Encrypt your Secret into a SealedSecret, which is safe to store - even inside a public repository.",source:"@site/docs/apps/sealedsecrets.md",sourceDirName:"apps",slug:"/apps/sealed-secrets",permalink:"/docs/apps/sealed-secrets",draft:!1,unlisted:!1,editUrl:"https://github.com/redkubes/redkubes.github.io/tree/main/docs/apps/sealedsecrets.md",tags:[],version:"current",frontMatter:{slug:"sealed-secrets",title:"Sealed Secrets",sidebar_label:"Sealed Secrets"},sidebar:"mainSidebar",previous:{title:"Prometheus",permalink:"/docs/apps/prometheus"},next:{title:"Thanos",permalink:"/docs/apps/thanos"}},o={},l=[{value:"Overview",id:"overview",level:2},{value:"Bring your own certificates",id:"bring-your-own-certificates",level:2}];function d(e){const t={a:"a",admonition:"admonition",code:"code",h2:"h2",p:"p",pre:"pre",...(0,n.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.p,{children:"Encrypt your Secret into a SealedSecret, which is safe to store - even inside a public repository."}),"\n",(0,r.jsx)(t.h2,{id:"overview",children:"Overview"}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.a,{href:"https://github.com/bitnami-labs/sealed-secrets",children:"Bitnami Sealed Secrets"})," is a controller that allows you to encrypt your kubernetes secrets and store them in a secure manner, even in public repositories. The controller works by encrypting your secret into a SealedSecret, which can only be decrypted by the sealed secrets controller in your cluster."]}),"\n",(0,r.jsx)(t.h2,{id:"bring-your-own-certificates",children:"Bring your own certificates"}),"\n",(0,r.jsx)(t.admonition,{title:"AlERT",type:"info",children:(0,r.jsx)(t.p,{children:"You can use your certificates for the disaster recovery purpose. Please make sure to download encryption keys."})}),"\n",(0,r.jsxs)(t.p,{children:["While the controller generates its own certificates upon deployment, you also have the option to bring your own certificates. This allows the controller to consume certificates from a secret labeled with ",(0,r.jsx)(t.code,{children:"sealedsecrets.bitnami.com/sealed-secrets-key=active"}),". The Secret should reside in the ",(0,r.jsx)(t.code,{children:"sealed-secrets"})," namespace, which must be the same as the controller's namespace. You can have multiple secrets with this label."]}),"\n",(0,r.jsxs)(t.p,{children:["To configure the certificates, add the following to the ",(0,r.jsx)(t.code,{children:"values.yaml"})," when installing Otomi:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",children:"apps:\n sealed-secrets:\n enabled: true\nbootstrap:\n apiVersion: v1\n items:\n - apiVersion: v1\n data:\n tls.crt: \n tls.key: \n kind: Secret\n metadata:\n generateName: sealed-secrets-key\n labels:\n sealedsecrets.bitnami.com/sealed-secrets-key: active\n name: \n namespace: sealed-secrets\n type: kubernetes.io/tls\n kind: List\n"})}),"\n",(0,r.jsxs)(t.p,{children:["Make sure to replace ",(0,r.jsx)(t.code,{children:""}),", ",(0,r.jsx)(t.code,{children:""}),", ",(0,r.jsx)(t.code,{children:""})," with your actual certificate data and sealed secrets name."]})]})}function u(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},1151:(e,t,s)=>{s.d(t,{Z:()=>c,a:()=>i});var r=s(7294);const n={},a=r.createContext(n);function i(e){const t=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),r.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/main.1094fe04.js b/assets/js/main.1094fe04.js new file mode 100644 index 000000000..feb41eee4 --- /dev/null +++ b/assets/js/main.1094fe04.js @@ -0,0 +1,2 @@ +/*! For license information please see main.1094fe04.js.LICENSE.txt */ +(self.webpackChunkredkubes_github_io=self.webpackChunkredkubes_github_io||[]).push([[179],{830:(e,t,n)=>{"use strict";n.d(t,{W:()=>o});var r=n(7294);function o(){return r.createElement("svg",{width:"20",height:"20",className:"DocSearch-Search-Icon",viewBox:"0 0 20 20"},r.createElement("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}},723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});n(7294);var r=n(8356),o=n.n(r),a=n(6887);const i={"00210a32":[()=>n.e(2098).then(n.bind(n,1623)),"@site/docs/apps/gitea.md",1623],"03608398":[()=>n.e(8367).then(n.bind(n,7723)),"@site/docs/tutorials/overview.md",7723],"03eadeb8":[()=>n.e(1948).then(n.bind(n,3953)),"@site/docs/get-started/labs/lab-9.md",3953],"042c512d":[()=>n.e(2018).then(n.bind(n,9242)),"@site/product/use-cases/multi-cluster.md",9242],"052260a8":[()=>n.e(3272).then(n.bind(n,9914)),"@site/docs/for-ops/cli/encrypt.md",9914],"08d2d3ef":[()=>n.e(5229).then(n.bind(n,5130)),"@site/docs/get-started/labs/lab-23.md",5130],"08d8079e":[()=>n.e(7683).then(n.t.bind(n,3769,19)),"/home/runner/work/redkubes.github.io/redkubes.github.io/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],"09735fc0":[()=>n.e(1591).then(n.bind(n,6001)),"@site/docs/apps/jaeger.md",6001],"0be2dc55":[()=>n.e(8392).then(n.bind(n,1915)),"@site/docs/for-ops/cli/template.md",1915],"0c3fdeeb":[()=>n.e(6096).then(n.bind(n,1573)),"@site/docs/for-ops/console/overview.md",1573],"0d519d5d":[()=>n.e(634).then(n.bind(n,2672)),"@site/docs/for-devs/console/deploy-changes.md",2672],10959509:[()=>n.e(2704).then(n.bind(n,6255)),"@site/docs/for-ops/sre/troubleshooting.md",6255],"12174d43":[()=>n.e(8479).then(n.bind(n,2625)),"@site/docs/get-started/installation/known-issues.md",2625],"13689ae4":[()=>n.e(3576).then(n.bind(n,382)),"@site/docs/for-ops/console/backups.md",382],"14bc3799":[()=>n.e(2722).then(n.bind(n,8963)),"@site/docs/for-ops/cli/bootstrap.md",8963],"1691c9ac":[()=>n.e(6547).then(n.bind(n,2169)),"@site/docs/for-ops/console/clusters.md",2169],"17725d1c":[()=>n.e(8052).then(n.bind(n,2569)),"@site/docs/for-ops/console/policies.md",2569],17896441:[()=>Promise.all([n.e(532),n.e(7918)]).then(n.bind(n,7310)),"@theme/DocItem",7310],"17a7c5fe":[()=>n.e(3126).then(n.bind(n,9076)),"@site/docs/for-ops/console/settings/key-management.md",9076],"1807f63e":[()=>n.e(3056).then(n.bind(n,9994)),"@site/docs/get-started/promo.md",9994],"1830c2e3":[()=>n.e(1195).then(n.bind(n,6189)),"@site/docs/apps/certmanager.md",6189],"188da18d":[()=>n.e(2430).then(n.bind(n,2385)),"@site/docs/apps/trivy.md",2385],"1a23fb22":[()=>n.e(4234).then(n.bind(n,5320)),"@site/docs/get-started/installation/byo-wildcard.md",5320],"1a4e3797":[()=>Promise.all([n.e(532),n.e(7920)]).then(n.bind(n,6675)),"@theme/SearchPage",6675],"1afc8419":[()=>n.e(8344).then(n.bind(n,8300)),"@site/docs/for-ops/sre/overview.md",8300],"1d3542c3":[()=>n.e(4473).then(n.bind(n,5408)),"@site/docs/for-ops/console/settings/smtp.md",5408],"1d911987":[()=>n.e(912).then(n.bind(n,4080)),"@site/docs/for-ops/console/settings/ingress.md",4080],"1dcded0d":[()=>n.e(7282).then(n.bind(n,7930)),"@site/docs/apps/grafana.md",7930],"1df93b7f":[()=>Promise.all([n.e(532),n.e(3237)]).then(n.bind(n,3808)),"@site/src/pages/index.tsx",3808],"1e3926cf":[()=>n.e(65).then(n.bind(n,2217)),"@site/docs/get-started/labs/lab-8.md",2217],"1f25a778":[()=>n.e(7927).then(n.bind(n,8481)),"@site/docs/tutorials/tutorial-3.md",8481],"1f668492":[()=>n.e(2237).then(n.bind(n,9456)),"@site/docs/apps/falco.md",9456],"1f918bbd":[()=>n.e(3635).then(n.bind(n,3020)),"@site/docs/get-started/installation/oidc.md",3020],"1fba201f":[()=>n.e(8587).then(n.bind(n,2248)),"@site/docs/get-started/labs/lab-19.md",2248],"20c7dd93":[()=>n.e(4882).then(n.bind(n,7613)),"@site/docs/tutorials/tutorial-4.md",7613],"21fbcd7c":[()=>n.e(3563).then(n.bind(n,7032)),"@site/product/architecture.md",7032],"246b758f":[()=>n.e(8383).then(n.bind(n,4829)),"@site/docs/for-ops/console/dashboard.md",4829],"270f6692":[()=>n.e(7674).then(n.bind(n,6012)),"@site/docs/for-devs/console/catalog.md",6012],"28c78037":[()=>n.e(7386).then(n.bind(n,1245)),"@site/docs/for-devs/console/dashboard.md",1245],"2a1f96be":[()=>n.e(192).then(n.bind(n,2397)),"@site/docs/tutorials/tutorial-8.md",2397],"2a3fc902":[()=>n.e(4655).then(n.bind(n,6791)),"@site/docs/for-ops/how-to/use-team-admin.md",6791],"2afdefd3":[()=>n.e(1717).then(n.bind(n,8258)),"@site/docs/get-started/installation/kms.md",8258],"2d9c895d":[()=>n.e(5022).then(n.bind(n,9776)),"@site/product/use-cases/overview.md",9776],"2df7e88d":[()=>n.e(8607).then(n.bind(n,7407)),"@site/docs/for-ops/cli/sync.md",7407],"2f26dbd7":[()=>n.e(4041).then(n.bind(n,511)),"@site/docs/for-ops/console/shortcuts.md",511],"306a8c6c":[()=>n.e(7616).then(n.t.bind(n,9479,19)),"~docs/community/version-current-metadata-prop-751.json",9479],"30f4d83c":[()=>n.e(8129).then(n.bind(n,4746)),"@site/docs/for-devs/console/shell.md",4746],"3379d6c0":[()=>n.e(5195).then(n.bind(n,1333)),"@site/docs/for-ops/console/settings/dns.md",1333],"35ac0aef":[()=>n.e(1104).then(n.t.bind(n,2481,19)),"/home/runner/work/redkubes.github.io/redkubes.github.io/.docusaurus/docusaurus-plugin-content-docs/community/plugin-route-context-module-100.json",2481],"3765f133":[()=>n.e(7514).then(n.bind(n,5358)),"@site/docs/for-devs/console/shortcuts.md",5358],"3829398f":[()=>n.e(8379).then(n.bind(n,7505)),"@site/docs/for-ops/sre/upgrades.md",7505],"385dd0a0":[()=>n.e(5940).then(n.bind(n,1505)),"@site/docs/for-ops/how-to/overview.md",1505],"386e030b":[()=>n.e(7878).then(n.bind(n,3860)),"@site/docs/apps/kiali.md",3860],"39901f0d":[()=>n.e(6906).then(n.bind(n,8405)),"@site/docs/for-ops/console/secrets.md",8405],"3a0feb37":[()=>n.e(4825).then(n.bind(n,1084)),"@site/docs/for-ops/how-to/switch-to-dns.md",1084],"3b8b7efd":[()=>n.e(3121).then(n.bind(n,7036)),"@site/docs/get-started/labs/lab-18.md",7036],"3c110fea":[()=>n.e(2780).then(n.bind(n,6563)),"@site/docs/for-ops/console/settings/backup.md",6563],"3c6d57b1":[()=>n.e(253).then(n.bind(n,8623)),"@site/docs/get-started/labs/lab-32.md",8623],"3ca1c20f":[()=>n.e(3458).then(n.bind(n,2357)),"@site/docs/tutorials/tutorial-create-otomi-ksvc.md",2357],"3d235714":[()=>n.e(2117).then(n.bind(n,2510)),"@site/product/use-cases/adoption-framework.md",2510],"3fd50427":[()=>n.e(3418).then(n.bind(n,3922)),"@site/docs/for-ops/console/deploy-changes.md",3922],"4380e181":[()=>n.e(1113).then(n.bind(n,2226)),"@site/docs/apps/loki.md",2226],"443e3a65":[()=>n.e(1254).then(n.bind(n,8414)),"@site/docs/for-ops/console/teams.md",8414],"46a4fdf9":[()=>n.e(5775).then(n.bind(n,6979)),"@site/docs/for-devs/console/projects.md",6979],"46be4bcd":[()=>n.e(7973).then(n.bind(n,1645)),"@site/docs/for-devs/console/workloads.md",1645],"4892c042":[()=>n.e(4493).then(n.bind(n,2663)),"@site/docs/get-started/installation/civo.md",2663],"48f8b5b9":[()=>n.e(6299).then(n.bind(n,7966)),"@site/docs/get-started/installation/overview.md",7966],"4f01d7c7":[()=>n.e(7015).then(n.bind(n,9855)),"@site/product/introduction.md",9855],"541249eb":[()=>n.e(8696).then(n.bind(n,8153)),"@site/docs/for-ops/cli/diff.md",8153],"54cc2d4c":[()=>n.e(2036).then(n.bind(n,6833)),"@site/docs/get-started/overview.md",6833],"56d1269f":[()=>n.e(2687).then(n.bind(n,4671)),"@site/docs/get-started/installation/vultr.md",4671],"59a7de32":[()=>n.e(9892).then(n.bind(n,5399)),"@site/docs/tutorials/tutorial-9.md",5399],"5a2e1e49":[()=>n.e(2122).then(n.bind(n,2995)),"@site/docs/get-started/installation/digitalocean.md",2995],"5c500e73":[()=>n.e(9753).then(n.bind(n,8905)),"@site/docs/get-started/labs/lab-21.md",8905],"5c5eecab":[()=>n.e(4559).then(n.bind(n,3724)),"@site/docs/for-ops/cli/status.md",3724],"5cb822a3":[()=>n.e(9216).then(n.bind(n,752)),"@site/docs/get-started/installation/linode.md",752],"5ce65c80":[()=>n.e(2280).then(n.bind(n,5222)),"@site/docs/for-ops/cli/installation.md",5222],"5cecd17a":[()=>n.e(7622).then(n.bind(n,6359)),"@site/docs/tutorials/tutorial-use-secrets.md",6359],"5db37859":[()=>n.e(344).then(n.bind(n,1577)),"@site/community/expectations.md",1577],"5e95c892":[()=>n.e(9661).then(n.bind(n,1892)),"@theme/DocsRoot",1892],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,6809)),"@generated/docusaurus.config",6809],"5f4e8093":[()=>n.e(3942).then(n.bind(n,542)),"@site/docs/for-ops/console/workloads.md",542],"612b9100":[()=>n.e(4576).then(n.bind(n,9387)),"@site/docs/apps/otel.md",9387],"646a49d4":[()=>n.e(5720).then(n.bind(n,6968)),"@site/docs/for-ops/cli/commit.md",6968],"66c551f1":[()=>n.e(8442).then(n.bind(n,5613)),"@site/docs/tutorials/tutorial-7.md",5613],"66ebdfe3":[()=>n.e(7263).then(n.bind(n,1633)),"@site/docs/get-started/labs/lab-12.md",1633],"69fd0b9a":[()=>n.e(1730).then(n.bind(n,6248)),"@site/docs/for-ops/sre/daily.md",6248],"6abedfc3":[()=>n.e(1369).then(n.bind(n,3448)),"@site/docs/get-started/labs/lab-7.md",3448],"6b7c6343":[()=>n.e(7365).then(n.bind(n,9111)),"@site/docs/get-started/labs/lab-15.md",9111],"6d553b82":[()=>n.e(4321).then(n.bind(n,8857)),"@site/docs/for-devs/console/services.md",8857],"70b0dc77":[()=>n.e(2515).then(n.bind(n,9677)),"@site/product/use-cases/edge.md",9677],73148982:[()=>n.e(1409).then(n.bind(n,3380)),"@site/product/eula/v1.md",3380],"734d54da":[()=>n.e(7778).then(n.t.bind(n,7085,19)),"/home/runner/work/redkubes.github.io/redkubes.github.io/.docusaurus/docusaurus-theme-search-algolia/default/plugin-route-context-module-100.json",7085],"7545be8c":[()=>n.e(7227).then(n.bind(n,6679)),"@site/docs/get-started/installation/minikube.md",6679],"7d5c16d7":[()=>n.e(2248).then(n.bind(n,4687)),"@site/docs/get-started/installation/gcp.md",4687],"7ea98ab3":[()=>n.e(9683).then(n.bind(n,9381)),"@site/docs/for-ops/console/apps.md",9381],"7f5d7fca":[()=>n.e(2020).then(n.bind(n,8121)),"@site/docs/for-ops/how-to/backups.md",8121],"80cc8fc2":[()=>n.e(411).then(n.bind(n,7783)),"@site/docs/get-started/installation/entrypoint.md",7783],"81b812c0":[()=>n.e(7980).then(n.bind(n,33)),"@site/docs/get-started/installation/azure.md",33],"81e06d7e":[()=>n.e(5824).then(n.bind(n,6805)),"@site/docs/apps/istio.md",6805],"81f8c379":[()=>n.e(2552).then(n.bind(n,984)),"@site/docs/apps/gatekeeper.md",984],"8213a342":[()=>n.e(1882).then(n.bind(n,866)),"@site/docs/apps/vault.md",866],"83b70ecd":[()=>n.e(6128).then(n.bind(n,4422)),"@site/docs/for-ops/how-to/use-catalog.md",4422],"842ea3d4":[()=>n.e(2851).then(n.bind(n,7075)),"@site/docs/tutorials/tutorial-6.md",7075],"84b718dc":[()=>n.e(8801).then(n.bind(n,5347)),"@site/docs/tutorials/tutorial-create-byo-svc.md",5347],"861ce6bc":[()=>n.e(6871).then(n.bind(n,1380)),"@site/docs/get-started/labs/lab-20.md",1380],"871ddaf7":[()=>n.e(5018).then(n.bind(n,8635)),"@site/docs/get-started/installation/custom.md",8635],"8924d81d":[()=>n.e(6946).then(n.bind(n,6579)),"@site/docs/get-started/labs/lab-2.md",6579],"8f69df39":[()=>n.e(8589).then(n.bind(n,7556)),"@site/docs/get-started/installation/aws.md",7556],"9184e37b":[()=>n.e(6535).then(n.bind(n,7667)),"@site/docs/apps/rabbitmq.md",7667],"930e985e":[()=>n.e(2084).then(n.bind(n,3454)),"@site/docs/get-started/labs/lab-31.md",3454],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"940ad428":[()=>n.e(6779).then(n.bind(n,6501)),"@site/docs/get-started/labs/lab-11.md",6501],"942fe4d7":[()=>n.e(5616).then(n.bind(n,4198)),"@site/docs/get-started/labs/lab-16.md",4198],"94da8644":[()=>n.e(1056).then(n.bind(n,8751)),"@site/docs/tutorials/tutorial-5.md",8751],"96d3f3ac":[()=>n.e(1390).then(n.bind(n,5101)),"@site/docs/for-devs/console/apps.md",5101],98242336:[()=>n.e(5290).then(n.bind(n,3051)),"@site/docs/for-ops/cli/validate-values.md",3051],"9824b3d7":[()=>n.e(443).then(n.bind(n,2694)),"@site/docs/for-devs/console/settings.md",2694],"9899ea6d":[()=>n.e(8506).then(n.bind(n,4342)),"@site/docs/for-ops/console/settings/cluster.md",4342],"99018ea3":[()=>n.e(597).then(n.bind(n,2936)),"@site/docs/for-ops/console/settings/azure.md",2936],"9a44d6ca":[()=>n.e(2276).then(n.bind(n,2410)),"@site/docs/for-ciso/overview.md",2410],"9b2db8ea":[()=>n.e(8852).then(n.bind(n,9081)),"@site/docs/for-ops/cli/rotate-keys.md",9081],"9cb4274e":[()=>n.e(1391).then(n.bind(n,6929)),"@site/docs/for-ops/cli/lint.md",6929],"9ed16ae1":[()=>n.e(7896).then(n.bind(n,3521)),"@site/docs/get-started/installation/helm.md",3521],"9f25d002":[()=>n.e(190).then(n.bind(n,4150)),"@site/docs/get-started/labs/lab-22.md",4150],a0650468:[()=>n.e(781).then(n.bind(n,7873)),"@site/docs/tutorials/tutorial-2.md",7873],a0cf5b3c:[()=>n.e(860).then(n.bind(n,5189)),"@site/docs/get-started/labs/lab-4.md",5189],a353273a:[()=>n.e(6611).then(n.bind(n,2636)),"@site/docs/get-started/labs/lab-13.md",2636],a39a834c:[()=>n.e(7498).then(n.t.bind(n,5745,19)),"/home/runner/work/redkubes.github.io/redkubes.github.io/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",5745],a3cca685:[()=>n.e(4791).then(n.bind(n,8677)),"@site/docs/for-ops/console/builds.md",8677],a47e2810:[()=>n.e(7984).then(n.bind(n,6465)),"@site/docs/for-ops/console/services.md",6465],a5fb0fed:[()=>n.e(5459).then(n.bind(n,2894)),"@site/docs/get-started/labs/lab-28.md",2894],a6a14297:[()=>n.e(6866).then(n.bind(n,4030)),"@site/docs/apps/knative.md",4030],a6ef47a7:[()=>n.e(5039).then(n.bind(n,7305)),"@site/docs/get-started/labs/lab-10.md",7305],a722ee7a:[()=>n.e(1573).then(n.bind(n,5799)),"@site/docs/for-ops/console/shell.md",5799],a7bd4aaa:[()=>n.e(8518).then(n.bind(n,8564)),"@theme/DocVersionRoot",8564],a92bb299:[()=>n.e(5092).then(n.t.bind(n,8427,19)),"~docs/product/version-current-metadata-prop-751.json",8427],a94703ab:[()=>Promise.all([n.e(532),n.e(4368)]).then(n.bind(n,2674)),"@theme/DocRoot",2674],aa3203ff:[()=>n.e(2144).then(n.bind(n,4037)),"@site/docs/for-devs/console/builds.md",4037],ab3bc09d:[()=>n.e(3474).then(n.bind(n,9982)),"@site/docs/get-started/labs/lab-29.md",9982],ac482592:[()=>n.e(1506).then(n.bind(n,9980)),"@site/docs/tutorials/tutorial-1.md",9980],acbd0412:[()=>n.e(7763).then(n.bind(n,5978)),"@site/docs/tutorials/tutorial-10.md",5978],ace391e9:[()=>n.e(4505).then(n.t.bind(n,3206,19)),"/home/runner/work/redkubes.github.io/redkubes.github.io/.docusaurus/docusaurus-plugin-content-docs/product/plugin-route-context-module-100.json",3206],af477ebb:[()=>n.e(8897).then(n.bind(n,516)),"@site/docs/for-ops/cli/validate-templates.md",516],af8b4e82:[()=>n.e(7444).then(n.bind(n,9663)),"@site/docs/apps/tekton.md",9663],af971854:[()=>n.e(1509).then(n.bind(n,5575)),"@site/docs/get-started/labs/lab-33.md",5575],af9df136:[()=>n.e(6888).then(n.bind(n,8749)),"@site/docs/for-ops/cli/bash.md",8749],afd24866:[()=>n.e(2370).then(n.bind(n,2889)),"@site/docs/apps/argocd.md",2889],b00e4863:[()=>n.e(8643).then(n.bind(n,773)),"@site/docs/get-started/labs/lab-6.md",773],b04270fa:[()=>n.e(5920).then(n.bind(n,7935)),"@site/docs/apps/ingress-nginx.md",7935],b0500dc6:[()=>n.e(8185).then(n.bind(n,6065)),"@site/product/use-cases/multi-tenancy.md",6065],b458a144:[()=>n.e(2869).then(n.bind(n,5885)),"@site/docs/for-ops/console/settings/co-monitoring.md",5885],b4b7b186:[()=>n.e(3520).then(n.bind(n,9108)),"@site/product/use-cases/serverless.md",9108],b68546d1:[()=>n.e(5730).then(n.bind(n,4704)),"@site/docs/get-started/labs/lab-17.md",4704],bb6d4937:[()=>n.e(9637).then(n.bind(n,9701)),"@site/docs/get-started/activation.md",9701],bcbdbf75:[()=>n.e(6576).then(n.bind(n,3231)),"@site/docs/for-ops/cli/x.md",3231],bde17074:[()=>n.e(9237).then(n.bind(n,4608)),"@site/docs/apps/thanos.md",4608],be94a9c8:[()=>n.e(1854).then(n.bind(n,9237)),"@site/docs/for-ops/cli/deploying.md",9237],beacde48:[()=>n.e(4890).then(n.bind(n,4904)),"@site/docs/get-started/installation/scaleway.md",4904],c0fcc3ac:[()=>n.e(3644).then(n.bind(n,4692)),"@site/docs/for-ops/cli/check-policies.md",4692],c1cd9779:[()=>n.e(1658).then(n.bind(n,7327)),"@site/community/code-of-conduct.md",7327],c3394322:[()=>n.e(9742).then(n.bind(n,8439)),"@site/docs/for-ops/cli/values.md",8439],c3a9c637:[()=>n.e(1576).then(n.bind(n,8962)),"@site/docs/apps/alertmanager.md",8962],c42226db:[()=>n.e(1872).then(n.bind(n,1984)),"@site/docs/apps/cloudnativepg.md",1984],c4d36760:[()=>n.e(8028).then(n.bind(n,5878)),"@site/docs/apps/external-dns.md",5878],c5c74bfd:[()=>n.e(534).then(n.bind(n,3985)),"@site/docs/for-ops/console/settings/alerts.md",3985],c61e7c1f:[()=>n.e(4258).then(n.bind(n,3408)),"@site/docs/tutorials/tutorial-create-byo-ksvc.md",3408],c642c7e8:[()=>n.e(512).then(n.bind(n,6173)),"@site/community/welcome.md",6173],c9644b78:[()=>n.e(537).then(n.bind(n,8828)),"@site/docs/for-ops/console/settings/oidc.md",8828],c9ff9b08:[()=>n.e(1913).then(n.bind(n,6869)),"@site/docs/for-ops/console/projects.md",6869],ca4242f5:[()=>n.e(5033).then(n.bind(n,4118)),"@site/docs/for-ops/cli/known-issues.md",4118],cb0338eb:[()=>n.e(4724).then(n.bind(n,3491)),"@site/docs/get-started/labs/lab-14.md",3491],cce2f323:[()=>n.e(12).then(n.bind(n,7102)),"@site/docs/get-started/labs/lab-24.md",7102],cd151fd5:[()=>n.e(3544).then(n.bind(n,9507)),"@site/docs/apps/prometheus.md",9507],d1ff794b:[()=>n.e(5586).then(n.bind(n,4813)),"@site/docs/get-started/labs/lab-25.md",4813],d40b8d5d:[()=>n.e(6820).then(n.bind(n,9986)),"@site/docs/get-started/labs/lab-26.md",9986],d53aaf7f:[()=>n.e(965).then(n.bind(n,3861)),"@site/docs/for-ops/cli/apply.md",3861],d673e682:[()=>n.e(3120).then(n.bind(n,1929)),"@site/product/use-cases/ci-cd.md",1929],d76c6a89:[()=>n.e(4717).then(n.bind(n,7114)),"@site/docs/apps/harbor.md",7114],d818d016:[()=>n.e(1785).then(n.bind(n,6582)),"@site/docs/for-ops/how-to/clone-otomi.md",6582],d8a040d1:[()=>n.e(2615).then(n.bind(n,8507)),"@site/docs/for-ops/cli/pull.md",8507],d9893b92:[()=>n.e(2668).then(n.bind(n,1755)),"@site/docs/for-ops/cli/destroy.md",1755],da6d770b:[()=>n.e(4875).then(n.bind(n,3407)),"@site/docs/get-started/labs/overview.md",3407],db2fd2f7:[()=>n.e(439).then(n.bind(n,9286)),"@site/docs/apps/minio.md",9286],db4c0e54:[()=>n.e(1713).then(n.bind(n,9690)),"@site/docs/for-devs/console/secrets.md",9690],db897548:[()=>n.e(9329).then(n.bind(n,74)),"@site/docs/get-started/labs/lab-5.md",74],df2434c5:[()=>n.e(767).then(n.bind(n,4097)),"@site/docs/apps/drone.md",4097],dfc1ee8e:[()=>n.e(3927).then(n.bind(n,2359)),"@site/docs/get-started/labs/lab-1.md",2359],e216824f:[()=>n.e(9109).then(n.bind(n,4261)),"@site/docs/get-started/prerequisites.md",4261],e2cc03cb:[()=>n.e(1241).then(n.bind(n,1534)),"@site/docs/for-ops/how-to/ingress-classes.md",1534],e4550136:[()=>n.e(528).then(n.bind(n,4755)),"@site/docs/get-started/labs/lab-27.md",4755],e65ca800:[()=>n.e(6306).then(n.bind(n,3659)),"@site/docs/for-ops/cli/decrypt.md",3659],e6cdbc01:[()=>n.e(4027).then(n.bind(n,7235)),"@site/docs/for-ops/console/settings/otomi.md",7235],e7ee1f4e:[()=>n.e(4722).then(n.bind(n,2973)),"@site/docs/for-ops/how-to/core-only.md",2973],e878c199:[()=>n.e(2163).then(n.bind(n,1370)),"@site/community/values.md",1370],ed3faf6d:[()=>n.e(9153).then(n.bind(n,6209)),"@site/docs/apps/keycloak.md",6209],efe7c983:[()=>n.e(9613).then(n.bind(n,7313)),"@site/product/roadmap.md",7313],f1abdd8c:[()=>n.e(4734).then(n.bind(n,3167)),"@site/product/faq.md",3167],f34c6cc5:[()=>n.e(1515).then(n.bind(n,8718)),"@site/docs/apps/velero.md",8718],f4935766:[()=>n.e(6907).then(n.bind(n,9641)),"@site/docs/apps/sealedsecrets.md",9641],f50c0130:[()=>n.e(5914).then(n.bind(n,5165)),"@site/docs/get-started/labs/lab-30.md",5165],f80fe6b5:[()=>n.e(9620).then(n.bind(n,9184)),"@site/docs/get-started/labs/lab-3.md",9184],feda9f98:[()=>n.e(4011).then(n.bind(n,6023)),"@site/docs/for-ops/cli/test.md",6023]};var s=n(5893);function l(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,s.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,s.jsx)("p",{children:String(t)}),(0,s.jsx)("div",{children:(0,s.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,s.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,s.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,s.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,s.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var c=n(9670),u=n(226);function d(e,t){if("*"===e)return o()({loading:l,loader:()=>n.e(1772).then(n.bind(n,1772)),modules:["@theme/NotFound"],webpack:()=>[1772],render(e,t){const n=e.default;return(0,s.jsx)(u.z,{value:{plugin:{name:"native",id:"default"}},children:(0,s.jsx)(n,{...t})})}});const r=a[`${e}-${t}`],d={},p=[],f=[],m=(0,c.Z)(r);return Object.entries(m).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],p.push(r[1]),f.push(r[2]))})),o().Map({loading:l,loader:d,modules:p,webpack:()=>f,render(t,n){const o=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let i=o;const s=n.split(".");s.slice(0,-1).forEach((e=>{i=i[e]})),i[s[s.length-1]]=a}));const a=o.__comp;delete o.__comp;const i=o.__context;return delete o.__context,(0,s.jsx)(u.z,{value:i,children:(0,s.jsx)(a,{...o,...n})})}})}const p=[{path:"/search",component:d("/search","354"),exact:!0},{path:"/community",component:d("/community","851"),routes:[{path:"/community",component:d("/community","e36"),routes:[{path:"/community",component:d("/community","09e"),routes:[{path:"/community/code-of-conduct",component:d("/community/code-of-conduct","88e"),exact:!0,sidebar:"mainSidebar"},{path:"/community/community-values",component:d("/community/community-values","83d"),exact:!0,sidebar:"mainSidebar"},{path:"/community/expectations",component:d("/community/expectations","9e9"),exact:!0,sidebar:"mainSidebar"},{path:"/community/welcome",component:d("/community/welcome","87f"),exact:!0,sidebar:"mainSidebar"}]}]}]},{path:"/docs",component:d("/docs","a24"),routes:[{path:"/docs",component:d("/docs","ab9"),routes:[{path:"/docs",component:d("/docs","139"),routes:[{path:"/docs/apps/alertmanager",component:d("/docs/apps/alertmanager","5d5"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/apps/argocd",component:d("/docs/apps/argocd","d53"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/apps/certmanager",component:d("/docs/apps/certmanager","2e5"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/apps/cloudnativepg",component:d("/docs/apps/cloudnativepg","a99"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/apps/drone",component:d("/docs/apps/drone","98f"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/apps/external-dns",component:d("/docs/apps/external-dns","412"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/apps/falco",component:d("/docs/apps/falco","2b7"),exact:!0},{path:"/docs/apps/gatekeeper",component:d("/docs/apps/gatekeeper","960"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/apps/gitea",component:d("/docs/apps/gitea","b47"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/apps/grafana",component:d("/docs/apps/grafana","947"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/apps/harbor",component:d("/docs/apps/harbor","b89"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/apps/ingress-nginx",component:d("/docs/apps/ingress-nginx","4a8"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/apps/istio",component:d("/docs/apps/istio","05b"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/apps/jaeger",component:d("/docs/apps/jaeger","8a6"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/apps/keycloak",component:d("/docs/apps/keycloak","316"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/apps/kiali",component:d("/docs/apps/kiali","06b"),exact:!0},{path:"/docs/apps/knative",component:d("/docs/apps/knative","49e"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/apps/loki",component:d("/docs/apps/loki","266"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/apps/minio",component:d("/docs/apps/minio","804"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/apps/otel",component:d("/docs/apps/otel","49e"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/apps/prometheus",component:d("/docs/apps/prometheus","523"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/apps/rabbitmq",component:d("/docs/apps/rabbitmq","b34"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/apps/sealed-secrets",component:d("/docs/apps/sealed-secrets","452"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/apps/tekton",component:d("/docs/apps/tekton","2af"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/apps/thanos",component:d("/docs/apps/thanos","b34"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/apps/trivy",component:d("/docs/apps/trivy","323"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/apps/vault",component:d("/docs/apps/vault","f81"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/apps/velero",component:d("/docs/apps/velero","2e5"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ciso/overview",component:d("/docs/for-ciso/overview","de6"),exact:!0},{path:"/docs/for-devs/console/apps",component:d("/docs/for-devs/console/apps","05b"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-devs/console/builds",component:d("/docs/for-devs/console/builds","b55"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-devs/console/catalog",component:d("/docs/for-devs/console/catalog","52b"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-devs/console/dashboard",component:d("/docs/for-devs/console/dashboard","83e"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-devs/console/deploy-changes",component:d("/docs/for-devs/console/deploy-changes","e7f"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-devs/console/projects",component:d("/docs/for-devs/console/projects","140"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-devs/console/secrets",component:d("/docs/for-devs/console/secrets","a74"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-devs/console/services",component:d("/docs/for-devs/console/services","367"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-devs/console/settings",component:d("/docs/for-devs/console/settings","898"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-devs/console/shell",component:d("/docs/for-devs/console/shell","2e9"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-devs/console/shortcuts",component:d("/docs/for-devs/console/shortcuts","2d4"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-devs/console/workloads",component:d("/docs/for-devs/console/workloads","f60"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/cli/apply",component:d("/docs/for-ops/cli/apply","f61"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/cli/bash",component:d("/docs/for-ops/cli/bash","408"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/cli/bootstrap",component:d("/docs/for-ops/cli/bootstrap","3a6"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/cli/check-policies",component:d("/docs/for-ops/cli/check-policies","c28"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/cli/commit",component:d("/docs/for-ops/cli/commit","8f3"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/cli/decrypt",component:d("/docs/for-ops/cli/decrypt","e7f"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/cli/deploying",component:d("/docs/for-ops/cli/deploying","b05"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/cli/destroy",component:d("/docs/for-ops/cli/destroy","6ff"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/cli/diff",component:d("/docs/for-ops/cli/diff","2eb"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/cli/encrypt",component:d("/docs/for-ops/cli/encrypt","689"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/cli/installation",component:d("/docs/for-ops/cli/installation","af1"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/cli/known-issues",component:d("/docs/for-ops/cli/known-issues","548"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/cli/lint",component:d("/docs/for-ops/cli/lint","770"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/cli/pull",component:d("/docs/for-ops/cli/pull","83f"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/cli/rotate-keys",component:d("/docs/for-ops/cli/rotate-keys","f9d"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/cli/status",component:d("/docs/for-ops/cli/status","b45"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/cli/sync",component:d("/docs/for-ops/cli/sync","e42"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/cli/template",component:d("/docs/for-ops/cli/template","4e3"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/cli/test",component:d("/docs/for-ops/cli/test","a8c"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/cli/validate-templates",component:d("/docs/for-ops/cli/validate-templates","9a5"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/cli/validate-values",component:d("/docs/for-ops/cli/validate-values","9ed"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/cli/values",component:d("/docs/for-ops/cli/values","4af"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/cli/x",component:d("/docs/for-ops/cli/x","da3"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/console/apps",component:d("/docs/for-ops/console/apps","a5e"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/console/backups",component:d("/docs/for-ops/console/backups","795"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/console/builds",component:d("/docs/for-ops/console/builds","ec9"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/console/clusters",component:d("/docs/for-ops/console/clusters","9f3"),exact:!0},{path:"/docs/for-ops/console/dashboard",component:d("/docs/for-ops/console/dashboard","0db"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/console/deploy-changes",component:d("/docs/for-ops/console/deploy-changes","a49"),exact:!0},{path:"/docs/for-ops/console/overview",component:d("/docs/for-ops/console/overview","e4a"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/console/policies",component:d("/docs/for-ops/console/policies","c53"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/console/projects",component:d("/docs/for-ops/console/projects","75a"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/console/secrets",component:d("/docs/for-ops/console/secrets","791"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/console/services",component:d("/docs/for-ops/console/services","c27"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/console/settings/alerts",component:d("/docs/for-ops/console/settings/alerts","ed2"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/console/settings/azure",component:d("/docs/for-ops/console/settings/azure","87d"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/console/settings/backup",component:d("/docs/for-ops/console/settings/backup","501"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/console/settings/cluster",component:d("/docs/for-ops/console/settings/cluster","66d"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/console/settings/co-monitoring",component:d("/docs/for-ops/console/settings/co-monitoring","d07"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/console/settings/dns",component:d("/docs/for-ops/console/settings/dns","853"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/console/settings/ingress",component:d("/docs/for-ops/console/settings/ingress","d6e"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/console/settings/key-management",component:d("/docs/for-ops/console/settings/key-management","2a4"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/console/settings/oidc",component:d("/docs/for-ops/console/settings/oidc","6e2"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/console/settings/otomi",component:d("/docs/for-ops/console/settings/otomi","d98"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/console/settings/smtp",component:d("/docs/for-ops/console/settings/smtp","bcd"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/console/shell",component:d("/docs/for-ops/console/shell","40c"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/console/shortcuts",component:d("/docs/for-ops/console/shortcuts","45b"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/console/teams",component:d("/docs/for-ops/console/teams","a65"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/console/workloads",component:d("/docs/for-ops/console/workloads","d65"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/how-to/backups",component:d("/docs/for-ops/how-to/backups","43b"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/how-to/core-only",component:d("/docs/for-ops/how-to/core-only","415"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/how-to/dev-catalog",component:d("/docs/for-ops/how-to/dev-catalog","2ce"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/how-to/ingress-classes",component:d("/docs/for-ops/how-to/ingress-classes","0ae"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/how-to/otomi",component:d("/docs/for-ops/how-to/otomi","247"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/how-to/overview",component:d("/docs/for-ops/how-to/overview","68a"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/how-to/switch-to-dns",component:d("/docs/for-ops/how-to/switch-to-dns","ce0"),exact:!0},{path:"/docs/for-ops/how-to/use-team-admin",component:d("/docs/for-ops/how-to/use-team-admin","fbd"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/sre/daily",component:d("/docs/for-ops/sre/daily","532"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/sre/overview",component:d("/docs/for-ops/sre/overview","461"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/sre/troubleshooting",component:d("/docs/for-ops/sre/troubleshooting","1f6"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/for-ops/sre/upgrades",component:d("/docs/for-ops/sre/upgrades","da0"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/activation",component:d("/docs/get-started/activation","efb"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/installation/aws",component:d("/docs/get-started/installation/aws","64b"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/installation/azure",component:d("/docs/get-started/installation/azure","283"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/installation/byo-wildcard-cert",component:d("/docs/get-started/installation/byo-wildcard-cert","2fe"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/installation/civo",component:d("/docs/get-started/installation/civo","85c"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/installation/custom",component:d("/docs/get-started/installation/custom","ccc"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/installation/digitalocean",component:d("/docs/get-started/installation/digitalocean","d64"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/installation/entrypoint",component:d("/docs/get-started/installation/entrypoint","d8d"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/installation/gcp",component:d("/docs/get-started/installation/gcp","056"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/installation/helm",component:d("/docs/get-started/installation/helm","efc"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/installation/kms",component:d("/docs/get-started/installation/kms","49c"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/installation/known-issues",component:d("/docs/get-started/installation/known-issues","15a"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/installation/linode",component:d("/docs/get-started/installation/linode","719"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/installation/minikube",component:d("/docs/get-started/installation/minikube","95c"),exact:!0},{path:"/docs/get-started/installation/oidc",component:d("/docs/get-started/installation/oidc","f3f"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/installation/overview",component:d("/docs/get-started/installation/overview","04e"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/installation/scaleway",component:d("/docs/get-started/installation/scaleway","006"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/installation/vultr",component:d("/docs/get-started/installation/vultr","648"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/labs/deploy-workloads-argo-cd-otomi-kubernetes",component:d("/docs/get-started/labs/deploy-workloads-argo-cd-otomi-kubernetes","ae9"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/labs/lab-1",component:d("/docs/get-started/labs/lab-1","8b6"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/labs/lab-11",component:d("/docs/get-started/labs/lab-11","c06"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/labs/lab-12",component:d("/docs/get-started/labs/lab-12","ec8"),exact:!0},{path:"/docs/get-started/labs/lab-13",component:d("/docs/get-started/labs/lab-13","44e"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/labs/lab-14",component:d("/docs/get-started/labs/lab-14","0e3"),exact:!0},{path:"/docs/get-started/labs/lab-15",component:d("/docs/get-started/labs/lab-15","c78"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/labs/lab-16",component:d("/docs/get-started/labs/lab-16","20b"),exact:!0},{path:"/docs/get-started/labs/lab-17",component:d("/docs/get-started/labs/lab-17","0a6"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/labs/lab-18",component:d("/docs/get-started/labs/lab-18","748"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/labs/lab-19",component:d("/docs/get-started/labs/lab-19","3b9"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/labs/lab-2",component:d("/docs/get-started/labs/lab-2","053"),exact:!0},{path:"/docs/get-started/labs/lab-20",component:d("/docs/get-started/labs/lab-20","a07"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/labs/lab-21",component:d("/docs/get-started/labs/lab-21","cf8"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/labs/lab-22",component:d("/docs/get-started/labs/lab-22","069"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/labs/lab-23",component:d("/docs/get-started/labs/lab-23","7bb"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/labs/lab-24",component:d("/docs/get-started/labs/lab-24","9c2"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/labs/lab-25",component:d("/docs/get-started/labs/lab-25","158"),exact:!0},{path:"/docs/get-started/labs/lab-26",component:d("/docs/get-started/labs/lab-26","198"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/labs/lab-27",component:d("/docs/get-started/labs/lab-27","b1a"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/labs/lab-28",component:d("/docs/get-started/labs/lab-28","b18"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/labs/lab-29",component:d("/docs/get-started/labs/lab-29","8c2"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/labs/lab-3",component:d("/docs/get-started/labs/lab-3","c9c"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/labs/lab-30",component:d("/docs/get-started/labs/lab-30","db3"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/labs/lab-31",component:d("/docs/get-started/labs/lab-31","33b"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/labs/lab-32",component:d("/docs/get-started/labs/lab-32","01c"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/labs/lab-33",component:d("/docs/get-started/labs/lab-33","17e"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/labs/lab-4",component:d("/docs/get-started/labs/lab-4","abb"),exact:!0},{path:"/docs/get-started/labs/lab-5",component:d("/docs/get-started/labs/lab-5","0e2"),exact:!0},{path:"/docs/get-started/labs/lab-6",component:d("/docs/get-started/labs/lab-6","784"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/labs/lab-7",component:d("/docs/get-started/labs/lab-7","5c4"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/labs/lab-8",component:d("/docs/get-started/labs/lab-8","8bc"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/labs/lab-9",component:d("/docs/get-started/labs/lab-9","1e3"),exact:!0},{path:"/docs/get-started/labs/overview",component:d("/docs/get-started/labs/overview","c01"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/overview",component:d("/docs/get-started/overview","935"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/prerequisites",component:d("/docs/get-started/prerequisites","858"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/get-started/promotions",component:d("/docs/get-started/promotions","43e"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/tutorials/overview",component:d("/docs/tutorials/overview","7fc"),exact:!0},{path:"/docs/tutorials/tutorial-1",component:d("/docs/tutorials/tutorial-1","075"),exact:!0},{path:"/docs/tutorials/tutorial-10",component:d("/docs/tutorials/tutorial-10","b8b"),exact:!0},{path:"/docs/tutorials/tutorial-2",component:d("/docs/tutorials/tutorial-2","720"),exact:!0},{path:"/docs/tutorials/tutorial-3",component:d("/docs/tutorials/tutorial-3","1c7"),exact:!0},{path:"/docs/tutorials/tutorial-4",component:d("/docs/tutorials/tutorial-4","10d"),exact:!0},{path:"/docs/tutorials/tutorial-5",component:d("/docs/tutorials/tutorial-5","4dc"),exact:!0},{path:"/docs/tutorials/tutorial-6",component:d("/docs/tutorials/tutorial-6","393"),exact:!0},{path:"/docs/tutorials/tutorial-7",component:d("/docs/tutorials/tutorial-7","028"),exact:!0},{path:"/docs/tutorials/tutorial-8",component:d("/docs/tutorials/tutorial-8","c9a"),exact:!0},{path:"/docs/tutorials/tutorial-9",component:d("/docs/tutorials/tutorial-9","e79"),exact:!0},{path:"/docs/tutorials/tutorials/create-k8s-service",component:d("/docs/tutorials/tutorials/create-k8s-service","d97"),exact:!0},{path:"/docs/tutorials/tutorials/create-knative-service",component:d("/docs/tutorials/tutorials/create-knative-service","0c7"),exact:!0},{path:"/docs/tutorials/tutorials/create-ksvc-otomi",component:d("/docs/tutorials/tutorials/create-ksvc-otomi","f7a"),exact:!0},{path:"/docs/tutorials/tutorials/use-secret",component:d("/docs/tutorials/tutorials/use-secret","125"),exact:!0}]}]}]},{path:"/product",component:d("/product","fd4"),routes:[{path:"/product",component:d("/product","e77"),routes:[{path:"/product",component:d("/product","dbb"),routes:[{path:"/product/architecture",component:d("/product/architecture","754"),exact:!0,sidebar:"mainSidebar"},{path:"/product/eula/v1",component:d("/product/eula/v1","6c8"),exact:!0,sidebar:"mainSidebar"},{path:"/product/faq",component:d("/product/faq","401"),exact:!0,sidebar:"mainSidebar"},{path:"/product/introduction",component:d("/product/introduction","2ba"),exact:!0,sidebar:"mainSidebar"},{path:"/product/roadmap",component:d("/product/roadmap","94b"),exact:!0,sidebar:"mainSidebar"},{path:"/product/use-cases/adoption-framework",component:d("/product/use-cases/adoption-framework","0e7"),exact:!0,sidebar:"mainSidebar"},{path:"/product/use-cases/ci-cd",component:d("/product/use-cases/ci-cd","672"),exact:!0,sidebar:"mainSidebar"},{path:"/product/use-cases/edge",component:d("/product/use-cases/edge","f15"),exact:!0},{path:"/product/use-cases/multi-cluster",component:d("/product/use-cases/multi-cluster","a5e"),exact:!0},{path:"/product/use-cases/multi-tenancy",component:d("/product/use-cases/multi-tenancy","114"),exact:!0,sidebar:"mainSidebar"},{path:"/product/use-cases/overview",component:d("/product/use-cases/overview","819"),exact:!0,sidebar:"mainSidebar"},{path:"/product/use-cases/serverless",component:d("/product/use-cases/serverless","ec9"),exact:!0,sidebar:"mainSidebar"}]}]}]},{path:"/",component:d("/","050"),exact:!0},{path:"*",component:d("*")}]},8934:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,t:()=>i});var r=n(7294),o=n(5893);const a=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,o.jsx)(a.Provider,{value:n,children:t})}},7221:(e,t,n)=>{"use strict";var r=n(7294),o=n(745),a=n(3727),i=n(405),s=n(412);const l=[n(6657),n(2497),n(3310),n(8320),n(2295)];var c=n(723),u=n(6550),d=n(8790),p=n(5893);function f(e){let{children:t}=e;return(0,p.jsx)(p.Fragment,{children:t})}var m=n(5742),h=n(2263),b=n(4996),g=n(6668),y=n(833),v=n(4711),w=n(9727),k=n(3320),x=n(8780),S=n(197);function _(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,h.Z)(),r=(0,v.l)(),o=n[e].htmlLang,a=e=>e.replace("-","_");return(0,p.jsxs)(m.Z,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,p.jsx)("meta",{property:"og:locale",content:a(o)}),Object.values(n).filter((e=>o!==e.htmlLang)).map((e=>(0,p.jsx)("meta",{property:"og:locale:alternate",content:a(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function E(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,h.Z)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,h.Z)(),{pathname:r}=(0,u.TH)();return e+(0,x.applyTrailingSlash)((0,b.Z)(r),{trailingSlash:n,baseUrl:t})}(),o=t?`${n}${t}`:r;return(0,p.jsxs)(m.Z,{children:[(0,p.jsx)("meta",{property:"og:url",content:o}),(0,p.jsx)("link",{rel:"canonical",href:o})]})}function C(){const{i18n:{currentLocale:e}}=(0,h.Z)(),{metadata:t,image:n}=(0,g.L)();return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(m.Z,{children:[(0,p.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,p.jsx)("body",{className:w.h})]}),n&&(0,p.jsx)(y.d,{image:n}),(0,p.jsx)(E,{}),(0,p.jsx)(_,{}),(0,p.jsx)(S.Z,{tag:k.HX,locale:e}),(0,p.jsx)(m.Z,{children:t.map(((e,t)=>(0,p.jsx)("meta",{...e},t)))})]})}const T=new Map;function j(e){if(T.has(e.pathname))return{...e,pathname:T.get(e.pathname)};if((0,d.f)(c.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return T.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return T.set(e.pathname,t),{...e,pathname:t}}var A=n(8934),L=n(8940),R=n(469);function N(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>o.forEach((e=>e?.()))}const P=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,R.Z)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,o=t.hash===n.hash,a=t.search===n.search;if(r&&o&&!a)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),N("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function O(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.f)(c.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class I extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=s.Z.canUseDOM?N("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=N("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),O(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return(0,p.jsx)(P,{previousLocation:this.previousLocation,location:t,children:(0,p.jsx)(u.AW,{location:t,render:()=>e})})}}const D=I,M="__docusaurus-base-url-issue-banner-container",F="__docusaurus-base-url-issue-banner",z="__docusaurus-base-url-issue-banner-suggestion-container";function B(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '${M}';\n var bannerHtml = ${JSON.stringify(function(e){return`\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

\n

We suggest trying baseUrl =

\n
\n`}(e)).replace(/{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const o=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;o?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var Q=n(9670);const Y=new Set,X=new Set,J=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ee={prefetch(e){if(!(e=>!J()&&!X.has(e)&&!Y.has(e))(e))return!1;Y.add(e);const t=(0,d.f)(c.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(W).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,Q.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?K(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!J()&&!X.has(e))(e)&&(X.add(e),O(e))},te=Object.freeze(ee),ne=Boolean(!0);if(s.Z.canUseDOM){window.docusaurus=te;const e=document.getElementById("__docusaurus"),t=(0,p.jsx)(i.B6,{children:(0,p.jsx)(a.VK,{children:(0,p.jsx)(V,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},s=()=>{if(ne)r.startTransition((()=>{o.hydrateRoot(e,t,{onRecoverableError:n})}));else{const a=o.createRoot(e,{onRecoverableError:n});r.startTransition((()=>{a.render(t)}))}};O(window.location.pathname).then(s)}},8940:(e,t,n)=>{"use strict";n.d(t,{_:()=>d,M:()=>p});var r=n(7294),o=n(6809);const a=JSON.parse('{"docusaurus-plugin-google-gtag":{"default":{"trackingID":["G-KKV4ZVDEKQ"],"anonymizeIP":false,"id":"default"}},"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/docs","mainDocId":"get-started/overview","docs":[{"id":"apps/alertmanager","path":"/docs/apps/alertmanager","sidebar":"mainSidebar"},{"id":"apps/argocd","path":"/docs/apps/argocd","sidebar":"mainSidebar"},{"id":"apps/certmanager","path":"/docs/apps/certmanager","sidebar":"mainSidebar"},{"id":"apps/cloudnativepg","path":"/docs/apps/cloudnativepg","sidebar":"mainSidebar"},{"id":"apps/drone","path":"/docs/apps/drone","sidebar":"mainSidebar"},{"id":"apps/external-dns","path":"/docs/apps/external-dns","sidebar":"mainSidebar"},{"id":"apps/falco","path":"/docs/apps/falco"},{"id":"apps/gatekeeper","path":"/docs/apps/gatekeeper","sidebar":"mainSidebar"},{"id":"apps/gitea","path":"/docs/apps/gitea","sidebar":"mainSidebar"},{"id":"apps/grafana","path":"/docs/apps/grafana","sidebar":"mainSidebar"},{"id":"apps/harbor","path":"/docs/apps/harbor","sidebar":"mainSidebar"},{"id":"apps/ingress-nginx","path":"/docs/apps/ingress-nginx","sidebar":"mainSidebar"},{"id":"apps/istio","path":"/docs/apps/istio","sidebar":"mainSidebar"},{"id":"apps/jaeger","path":"/docs/apps/jaeger","sidebar":"mainSidebar"},{"id":"apps/keycloak","path":"/docs/apps/keycloak","sidebar":"mainSidebar"},{"id":"apps/kiali","path":"/docs/apps/kiali"},{"id":"apps/knative","path":"/docs/apps/knative","sidebar":"mainSidebar"},{"id":"apps/loki","path":"/docs/apps/loki","sidebar":"mainSidebar"},{"id":"apps/minio","path":"/docs/apps/minio","sidebar":"mainSidebar"},{"id":"apps/otel","path":"/docs/apps/otel","sidebar":"mainSidebar"},{"id":"apps/prometheus","path":"/docs/apps/prometheus","sidebar":"mainSidebar"},{"id":"apps/rabbitmq","path":"/docs/apps/rabbitmq","sidebar":"mainSidebar"},{"id":"apps/sealedsecrets","path":"/docs/apps/sealed-secrets","sidebar":"mainSidebar"},{"id":"apps/tekton","path":"/docs/apps/tekton","sidebar":"mainSidebar"},{"id":"apps/thanos","path":"/docs/apps/thanos","sidebar":"mainSidebar"},{"id":"apps/trivy","path":"/docs/apps/trivy","sidebar":"mainSidebar"},{"id":"apps/vault","path":"/docs/apps/vault","sidebar":"mainSidebar"},{"id":"apps/velero","path":"/docs/apps/velero","sidebar":"mainSidebar"},{"id":"for-ciso/overview","path":"/docs/for-ciso/overview"},{"id":"for-devs/console/apps","path":"/docs/for-devs/console/apps","sidebar":"mainSidebar"},{"id":"for-devs/console/builds","path":"/docs/for-devs/console/builds","sidebar":"mainSidebar"},{"id":"for-devs/console/catalog","path":"/docs/for-devs/console/catalog","sidebar":"mainSidebar"},{"id":"for-devs/console/dashboard","path":"/docs/for-devs/console/dashboard","sidebar":"mainSidebar"},{"id":"for-devs/console/deploy-changes","path":"/docs/for-devs/console/deploy-changes","sidebar":"mainSidebar"},{"id":"for-devs/console/projects","path":"/docs/for-devs/console/projects","sidebar":"mainSidebar"},{"id":"for-devs/console/secrets","path":"/docs/for-devs/console/secrets","sidebar":"mainSidebar"},{"id":"for-devs/console/services","path":"/docs/for-devs/console/services","sidebar":"mainSidebar"},{"id":"for-devs/console/settings","path":"/docs/for-devs/console/settings","sidebar":"mainSidebar"},{"id":"for-devs/console/shell","path":"/docs/for-devs/console/shell","sidebar":"mainSidebar"},{"id":"for-devs/console/shortcuts","path":"/docs/for-devs/console/shortcuts","sidebar":"mainSidebar"},{"id":"for-devs/console/workloads","path":"/docs/for-devs/console/workloads","sidebar":"mainSidebar"},{"id":"for-ops/cli/apply","path":"/docs/for-ops/cli/apply","sidebar":"mainSidebar"},{"id":"for-ops/cli/bash","path":"/docs/for-ops/cli/bash","sidebar":"mainSidebar"},{"id":"for-ops/cli/bootstrap","path":"/docs/for-ops/cli/bootstrap","sidebar":"mainSidebar"},{"id":"for-ops/cli/check-policies","path":"/docs/for-ops/cli/check-policies","sidebar":"mainSidebar"},{"id":"for-ops/cli/commit","path":"/docs/for-ops/cli/commit","sidebar":"mainSidebar"},{"id":"for-ops/cli/decrypt","path":"/docs/for-ops/cli/decrypt","sidebar":"mainSidebar"},{"id":"for-ops/cli/deploying","path":"/docs/for-ops/cli/deploying","sidebar":"mainSidebar"},{"id":"for-ops/cli/destroy","path":"/docs/for-ops/cli/destroy","sidebar":"mainSidebar"},{"id":"for-ops/cli/diff","path":"/docs/for-ops/cli/diff","sidebar":"mainSidebar"},{"id":"for-ops/cli/encrypt","path":"/docs/for-ops/cli/encrypt","sidebar":"mainSidebar"},{"id":"for-ops/cli/installation","path":"/docs/for-ops/cli/installation","sidebar":"mainSidebar"},{"id":"for-ops/cli/known-issues","path":"/docs/for-ops/cli/known-issues","sidebar":"mainSidebar"},{"id":"for-ops/cli/lint","path":"/docs/for-ops/cli/lint","sidebar":"mainSidebar"},{"id":"for-ops/cli/pull","path":"/docs/for-ops/cli/pull","sidebar":"mainSidebar"},{"id":"for-ops/cli/rotate-keys","path":"/docs/for-ops/cli/rotate-keys","sidebar":"mainSidebar"},{"id":"for-ops/cli/status","path":"/docs/for-ops/cli/status","sidebar":"mainSidebar"},{"id":"for-ops/cli/sync","path":"/docs/for-ops/cli/sync","sidebar":"mainSidebar"},{"id":"for-ops/cli/template","path":"/docs/for-ops/cli/template","sidebar":"mainSidebar"},{"id":"for-ops/cli/test","path":"/docs/for-ops/cli/test","sidebar":"mainSidebar"},{"id":"for-ops/cli/validate-templates","path":"/docs/for-ops/cli/validate-templates","sidebar":"mainSidebar"},{"id":"for-ops/cli/validate-values","path":"/docs/for-ops/cli/validate-values","sidebar":"mainSidebar"},{"id":"for-ops/cli/values","path":"/docs/for-ops/cli/values","sidebar":"mainSidebar"},{"id":"for-ops/cli/x","path":"/docs/for-ops/cli/x","sidebar":"mainSidebar"},{"id":"for-ops/console/apps","path":"/docs/for-ops/console/apps","sidebar":"mainSidebar"},{"id":"for-ops/console/backups","path":"/docs/for-ops/console/backups","sidebar":"mainSidebar"},{"id":"for-ops/console/builds","path":"/docs/for-ops/console/builds","sidebar":"mainSidebar"},{"id":"for-ops/console/clusters","path":"/docs/for-ops/console/clusters"},{"id":"for-ops/console/dashboard","path":"/docs/for-ops/console/dashboard","sidebar":"mainSidebar"},{"id":"for-ops/console/deploy-changes","path":"/docs/for-ops/console/deploy-changes"},{"id":"for-ops/console/overview","path":"/docs/for-ops/console/overview","sidebar":"mainSidebar"},{"id":"for-ops/console/policies","path":"/docs/for-ops/console/policies","sidebar":"mainSidebar"},{"id":"for-ops/console/projects","path":"/docs/for-ops/console/projects","sidebar":"mainSidebar"},{"id":"for-ops/console/secrets","path":"/docs/for-ops/console/secrets","sidebar":"mainSidebar"},{"id":"for-ops/console/services","path":"/docs/for-ops/console/services","sidebar":"mainSidebar"},{"id":"for-ops/console/settings/alerts","path":"/docs/for-ops/console/settings/alerts","sidebar":"mainSidebar"},{"id":"for-ops/console/settings/azure","path":"/docs/for-ops/console/settings/azure","sidebar":"mainSidebar"},{"id":"for-ops/console/settings/backup","path":"/docs/for-ops/console/settings/backup","sidebar":"mainSidebar"},{"id":"for-ops/console/settings/cluster","path":"/docs/for-ops/console/settings/cluster","sidebar":"mainSidebar"},{"id":"for-ops/console/settings/co-monitoring","path":"/docs/for-ops/console/settings/co-monitoring","sidebar":"mainSidebar"},{"id":"for-ops/console/settings/dns","path":"/docs/for-ops/console/settings/dns","sidebar":"mainSidebar"},{"id":"for-ops/console/settings/ingress","path":"/docs/for-ops/console/settings/ingress","sidebar":"mainSidebar"},{"id":"for-ops/console/settings/key-management","path":"/docs/for-ops/console/settings/key-management","sidebar":"mainSidebar"},{"id":"for-ops/console/settings/oidc","path":"/docs/for-ops/console/settings/oidc","sidebar":"mainSidebar"},{"id":"for-ops/console/settings/otomi","path":"/docs/for-ops/console/settings/otomi","sidebar":"mainSidebar"},{"id":"for-ops/console/settings/smtp","path":"/docs/for-ops/console/settings/smtp","sidebar":"mainSidebar"},{"id":"for-ops/console/shell","path":"/docs/for-ops/console/shell","sidebar":"mainSidebar"},{"id":"for-ops/console/shortcuts","path":"/docs/for-ops/console/shortcuts","sidebar":"mainSidebar"},{"id":"for-ops/console/teams","path":"/docs/for-ops/console/teams","sidebar":"mainSidebar"},{"id":"for-ops/console/workloads","path":"/docs/for-ops/console/workloads","sidebar":"mainSidebar"},{"id":"for-ops/how-to/backups","path":"/docs/for-ops/how-to/backups","sidebar":"mainSidebar"},{"id":"for-ops/how-to/clone-otomi","path":"/docs/for-ops/how-to/otomi","sidebar":"mainSidebar"},{"id":"for-ops/how-to/core-only","path":"/docs/for-ops/how-to/core-only","sidebar":"mainSidebar"},{"id":"for-ops/how-to/ingress-classes","path":"/docs/for-ops/how-to/ingress-classes","sidebar":"mainSidebar"},{"id":"for-ops/how-to/overview","path":"/docs/for-ops/how-to/overview","sidebar":"mainSidebar"},{"id":"for-ops/how-to/switch-to-dns","path":"/docs/for-ops/how-to/switch-to-dns"},{"id":"for-ops/how-to/use-catalog","path":"/docs/for-ops/how-to/dev-catalog","sidebar":"mainSidebar"},{"id":"for-ops/how-to/use-team-admin","path":"/docs/for-ops/how-to/use-team-admin","sidebar":"mainSidebar"},{"id":"for-ops/sre/daily","path":"/docs/for-ops/sre/daily","sidebar":"mainSidebar"},{"id":"for-ops/sre/overview","path":"/docs/for-ops/sre/overview","sidebar":"mainSidebar"},{"id":"for-ops/sre/troubleshooting","path":"/docs/for-ops/sre/troubleshooting","sidebar":"mainSidebar"},{"id":"for-ops/sre/upgrades","path":"/docs/for-ops/sre/upgrades","sidebar":"mainSidebar"},{"id":"get-started/activation","path":"/docs/get-started/activation","sidebar":"mainSidebar"},{"id":"get-started/installation/aws","path":"/docs/get-started/installation/aws","sidebar":"mainSidebar"},{"id":"get-started/installation/azure","path":"/docs/get-started/installation/azure","sidebar":"mainSidebar"},{"id":"get-started/installation/byo-wildcard","path":"/docs/get-started/installation/byo-wildcard-cert","sidebar":"mainSidebar"},{"id":"get-started/installation/civo","path":"/docs/get-started/installation/civo","sidebar":"mainSidebar"},{"id":"get-started/installation/custom","path":"/docs/get-started/installation/custom","sidebar":"mainSidebar"},{"id":"get-started/installation/digitalocean","path":"/docs/get-started/installation/digitalocean","sidebar":"mainSidebar"},{"id":"get-started/installation/entrypoint","path":"/docs/get-started/installation/entrypoint","sidebar":"mainSidebar"},{"id":"get-started/installation/gcp","path":"/docs/get-started/installation/gcp","sidebar":"mainSidebar"},{"id":"get-started/installation/helm","path":"/docs/get-started/installation/helm","sidebar":"mainSidebar"},{"id":"get-started/installation/kms","path":"/docs/get-started/installation/kms","sidebar":"mainSidebar"},{"id":"get-started/installation/known-issues","path":"/docs/get-started/installation/known-issues","sidebar":"mainSidebar"},{"id":"get-started/installation/linode","path":"/docs/get-started/installation/linode","sidebar":"mainSidebar"},{"id":"get-started/installation/minikube","path":"/docs/get-started/installation/minikube"},{"id":"get-started/installation/oidc","path":"/docs/get-started/installation/oidc","sidebar":"mainSidebar"},{"id":"get-started/installation/overview","path":"/docs/get-started/installation/overview","sidebar":"mainSidebar"},{"id":"get-started/installation/scaleway","path":"/docs/get-started/installation/scaleway","sidebar":"mainSidebar"},{"id":"get-started/installation/vultr","path":"/docs/get-started/installation/vultr","sidebar":"mainSidebar"},{"id":"get-started/labs/lab-1","path":"/docs/get-started/labs/lab-1","sidebar":"mainSidebar"},{"id":"get-started/labs/lab-10","path":"/docs/get-started/labs/deploy-workloads-argo-cd-otomi-kubernetes","sidebar":"mainSidebar"},{"id":"get-started/labs/lab-11","path":"/docs/get-started/labs/lab-11","sidebar":"mainSidebar"},{"id":"get-started/labs/lab-12","path":"/docs/get-started/labs/lab-12"},{"id":"get-started/labs/lab-13","path":"/docs/get-started/labs/lab-13","sidebar":"mainSidebar"},{"id":"get-started/labs/lab-14","path":"/docs/get-started/labs/lab-14"},{"id":"get-started/labs/lab-15","path":"/docs/get-started/labs/lab-15","sidebar":"mainSidebar"},{"id":"get-started/labs/lab-16","path":"/docs/get-started/labs/lab-16"},{"id":"get-started/labs/lab-17","path":"/docs/get-started/labs/lab-17","sidebar":"mainSidebar"},{"id":"get-started/labs/lab-18","path":"/docs/get-started/labs/lab-18","sidebar":"mainSidebar"},{"id":"get-started/labs/lab-19","path":"/docs/get-started/labs/lab-19","sidebar":"mainSidebar"},{"id":"get-started/labs/lab-2","path":"/docs/get-started/labs/lab-2"},{"id":"get-started/labs/lab-20","path":"/docs/get-started/labs/lab-20","sidebar":"mainSidebar"},{"id":"get-started/labs/lab-21","path":"/docs/get-started/labs/lab-21","sidebar":"mainSidebar"},{"id":"get-started/labs/lab-22","path":"/docs/get-started/labs/lab-22","sidebar":"mainSidebar"},{"id":"get-started/labs/lab-23","path":"/docs/get-started/labs/lab-23","sidebar":"mainSidebar"},{"id":"get-started/labs/lab-24","path":"/docs/get-started/labs/lab-24","sidebar":"mainSidebar"},{"id":"get-started/labs/lab-25","path":"/docs/get-started/labs/lab-25"},{"id":"get-started/labs/lab-26","path":"/docs/get-started/labs/lab-26","sidebar":"mainSidebar"},{"id":"get-started/labs/lab-27","path":"/docs/get-started/labs/lab-27","sidebar":"mainSidebar"},{"id":"get-started/labs/lab-28","path":"/docs/get-started/labs/lab-28","sidebar":"mainSidebar"},{"id":"get-started/labs/lab-29","path":"/docs/get-started/labs/lab-29","sidebar":"mainSidebar"},{"id":"get-started/labs/lab-3","path":"/docs/get-started/labs/lab-3","sidebar":"mainSidebar"},{"id":"get-started/labs/lab-30","path":"/docs/get-started/labs/lab-30","sidebar":"mainSidebar"},{"id":"get-started/labs/lab-31","path":"/docs/get-started/labs/lab-31","sidebar":"mainSidebar"},{"id":"get-started/labs/lab-32","path":"/docs/get-started/labs/lab-32","sidebar":"mainSidebar"},{"id":"get-started/labs/lab-33","path":"/docs/get-started/labs/lab-33","sidebar":"mainSidebar"},{"id":"get-started/labs/lab-4","path":"/docs/get-started/labs/lab-4"},{"id":"get-started/labs/lab-5","path":"/docs/get-started/labs/lab-5"},{"id":"get-started/labs/lab-6","path":"/docs/get-started/labs/lab-6","sidebar":"mainSidebar"},{"id":"get-started/labs/lab-7","path":"/docs/get-started/labs/lab-7","sidebar":"mainSidebar"},{"id":"get-started/labs/lab-8","path":"/docs/get-started/labs/lab-8","sidebar":"mainSidebar"},{"id":"get-started/labs/lab-9","path":"/docs/get-started/labs/lab-9"},{"id":"get-started/labs/overview","path":"/docs/get-started/labs/overview","sidebar":"mainSidebar"},{"id":"get-started/overview","path":"/docs/get-started/overview","sidebar":"mainSidebar"},{"id":"get-started/prerequisites","path":"/docs/get-started/prerequisites","sidebar":"mainSidebar"},{"id":"get-started/promo","path":"/docs/get-started/promotions","sidebar":"mainSidebar"},{"id":"tutorials/overview","path":"/docs/tutorials/overview"},{"id":"tutorials/tutorial-1","path":"/docs/tutorials/tutorial-1"},{"id":"tutorials/tutorial-10","path":"/docs/tutorials/tutorial-10"},{"id":"tutorials/tutorial-2","path":"/docs/tutorials/tutorial-2"},{"id":"tutorials/tutorial-3","path":"/docs/tutorials/tutorial-3"},{"id":"tutorials/tutorial-4","path":"/docs/tutorials/tutorial-4"},{"id":"tutorials/tutorial-5","path":"/docs/tutorials/tutorial-5"},{"id":"tutorials/tutorial-6","path":"/docs/tutorials/tutorial-6"},{"id":"tutorials/tutorial-7","path":"/docs/tutorials/tutorial-7"},{"id":"tutorials/tutorial-8","path":"/docs/tutorials/tutorial-8"},{"id":"tutorials/tutorial-9","path":"/docs/tutorials/tutorial-9"},{"id":"tutorials/tutorial-create-byo-ksvc","path":"/docs/tutorials/tutorials/create-knative-service"},{"id":"tutorials/tutorial-create-byo-svc","path":"/docs/tutorials/tutorials/create-k8s-service"},{"id":"tutorials/tutorial-create-otomi-ksvc","path":"/docs/tutorials/tutorials/create-ksvc-otomi"},{"id":"tutorials/tutorial-use-secrets","path":"/docs/tutorials/tutorials/use-secret"}],"draftIds":[],"sidebars":{"mainSidebar":{"link":{"path":"/docs/get-started/overview","label":"get-started/overview"}}}}],"breadcrumbs":false},"community":{"path":"/community","versions":[{"name":"current","label":"Next","isLast":true,"path":"/community","mainDocId":"welcome","docs":[{"id":"code-of-conduct","path":"/community/code-of-conduct","sidebar":"mainSidebar"},{"id":"expectations","path":"/community/expectations","sidebar":"mainSidebar"},{"id":"values","path":"/community/community-values","sidebar":"mainSidebar"},{"id":"welcome","path":"/community/welcome","sidebar":"mainSidebar"}],"draftIds":[],"sidebars":{"mainSidebar":{"link":{"path":"/community/welcome","label":"welcome"}}}}],"breadcrumbs":false},"product":{"path":"/product","versions":[{"name":"current","label":"Next","isLast":true,"path":"/product","mainDocId":"introduction","docs":[{"id":"architecture","path":"/product/architecture","sidebar":"mainSidebar"},{"id":"eula/v1","path":"/product/eula/v1","sidebar":"mainSidebar"},{"id":"faq","path":"/product/faq","sidebar":"mainSidebar"},{"id":"introduction","path":"/product/introduction","sidebar":"mainSidebar"},{"id":"roadmap","path":"/product/roadmap","sidebar":"mainSidebar"},{"id":"use-cases/adoption-framework","path":"/product/use-cases/adoption-framework","sidebar":"mainSidebar"},{"id":"use-cases/ci-cd","path":"/product/use-cases/ci-cd","sidebar":"mainSidebar"},{"id":"use-cases/edge","path":"/product/use-cases/edge"},{"id":"use-cases/multi-cluster","path":"/product/use-cases/multi-cluster"},{"id":"use-cases/multi-tenancy","path":"/product/use-cases/multi-tenancy","sidebar":"mainSidebar"},{"id":"use-cases/overview","path":"/product/use-cases/overview","sidebar":"mainSidebar"},{"id":"use-cases/serverless","path":"/product/use-cases/serverless","sidebar":"mainSidebar"}],"draftIds":[],"sidebars":{"mainSidebar":{"link":{"path":"/product/introduction","label":"introduction"}}}}],"breadcrumbs":false}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var s=n(7529);const l=JSON.parse('{"docusaurusVersion":"3.1.1","siteVersion":"0.16.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.1.1"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.1.1"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.1.1"},"docusaurus-plugin-google-gtag":{"type":"package","name":"@docusaurus/plugin-google-gtag","version":"3.1.1"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.1.1"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.1.1"},"docusaurus-theme-search-algolia":{"type":"package","name":"@docusaurus/theme-search-algolia","version":"3.1.1"},"docusaurus-plugin-client-redirects":{"type":"package","name":"@docusaurus/plugin-client-redirects","version":"3.1.1"}}}');var c=n(5893);const u={siteConfig:o.default,siteMetadata:l,globalData:a,i18n:i,codeTranslations:s},d=r.createContext(u);function p(e){let{children:t}=e;return(0,c.jsx)(d.Provider,{value:u,children:t})}},4763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(7294),o=n(412),a=n(5742),i=n(8780),s=n(7372),l=n(5893);function c(e){let{error:t,tryAgain:n}=e;return(0,l.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,l.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,l.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,l.jsx)(u,{error:t})]})}function u(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,l.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function d(e){let{error:t,tryAgain:n}=e;return(0,l.jsxs)(f,{fallback:()=>(0,l.jsx)(c,{error:t,tryAgain:n}),children:[(0,l.jsx)(a.Z,{children:(0,l.jsx)("title",{children:"Page Error"})}),(0,l.jsx)(s.Z,{children:(0,l.jsx)(c,{error:t,tryAgain:n})})]})}const p=e=>(0,l.jsx)(d,{...e});class f extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){o.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??p)(e)}return e??null}}},412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,o={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});n(7294);var r=n(405),o=n(5893);function a(e){return(0,o.jsx)(r.ql,{...e})}},3692:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(7294),o=n(3727),a=n(8780),i=n(2263),s=n(3919),l=n(412),c=n(8138),u=n(4996),d=n(5893);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:m,isActive:h,"data-noBrokenLinkCheck":b,autoAddBaseUrl:g=!0,...y}=e;const{siteConfig:{trailingSlash:v,baseUrl:w}}=(0,i.Z)(),{withBaseUrl:k}=(0,u.C)(),x=(0,c.Z)(),S=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>S.current));const _=p||f;const E=(0,s.Z)(_),C=_?.replace("pathname://","");let T=void 0!==C?(j=C,g&&(e=>e.startsWith("/"))(j)?k(j):j):void 0;var j;T&&E&&(T=(0,a.applyTrailingSlash)(T,{trailingSlash:v,baseUrl:w}));const A=(0,r.useRef)(!1),L=n?o.OL:o.rU,R=l.Z.canUseIntersectionObserver,N=(0,r.useRef)(),P=()=>{A.current||null==T||(window.docusaurus.preload(T),A.current=!0)};(0,r.useEffect)((()=>(!R&&E&&null!=T&&window.docusaurus.prefetch(T),()=>{R&&N.current&&N.current.disconnect()})),[N,T,R,E]);const O=T?.startsWith("#")??!1,I=!y.target||"_self"===y.target,D=!T||!E||!I||O;return b||!O&&D||x.collectLink(T),y.id&&x.collectAnchor(y.id),D?(0,d.jsx)("a",{ref:S,href:T,..._&&!E&&{target:"_blank",rel:"noopener noreferrer"},...y}):(0,d.jsx)(L,{...y,onMouseEnter:P,onTouchStart:P,innerRef:e=>{S.current=e,R&&e&&E&&(N.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(N.current.unobserve(e),N.current.disconnect(),null!=T&&window.docusaurus.prefetch(T))}))})),N.current.observe(e))},to:T,...n&&{isActive:h,activeClassName:m}})}const f=r.forwardRef(p)},5999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c,I:()=>l});var r=n(7294),o=n(5893);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var i=n(7529);function s(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return i[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return a(s({message:n,id:r}),t)}function c(e){let{children:t,id:n,values:r}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const i=s({message:t,id:n});return(0,o.jsx)(o.Fragment,{children:a(i,r)})}},9935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},3919:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function o(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>o,b:()=>r})},4996:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,Z:()=>s});var r=n(7294),o=n(2263),a=n(3919);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,o.Z)(),n=(0,r.useCallback)(((n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:o=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,a.b)(n))return n;if(o)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const s=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+s:s}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function s(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},8138:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});var r=n(7294);n(5893);const o=r.createContext({collectAnchor:()=>{},collectLink:()=>{}}),a=()=>(0,r.useContext)(o);function i(){return a()}},2263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(7294),o=n(8940);function a(){return(0,r.useContext)(o._)}},2389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(7294),o=n(8934);function a(){return(0,r.useContext)(o._)}},469:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294);const o=n(412).Z.canUseDOM?r.useLayoutEffect:r.useEffect},9670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function o(e){const t={};return function e(n,o){Object.entries(n).forEach((n=>{let[a,i]=n;const s=o?`${o}.${a}`:a;r(i)?e(i,s):t[s]=i}))}(e),t}},226:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,z:()=>i});var r=n(7294),o=n(5893);const a=r.createContext(null);function i(e){let{children:t,value:n}=e;const i=r.useContext(a),s=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:i,value:n})),[i,n]);return(0,o.jsx)(a.Provider,{value:s,children:t})}},143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>g,gA:()=>f,WS:()=>m,_r:()=>d,Jo:()=>y,zh:()=>p,yW:()=>b,gB:()=>h});var r=n(6550),o=n(2263),a=n(9935);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,o.Z)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const s=e=>e.versions.find((e=>e.isLast));function l(e,t){const n=s(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}function c(e,t){const n=l(e,t),o=n?.docs.find((e=>!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:o,alternateDocVersions:o?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(o.id):{}}}const u={},d=()=>i("docusaurus-plugin-content-docs")??u,p=e=>function(e,t,n){void 0===t&&(t=a.m),void 0===n&&(n={});const r=i(e),o=r?.[t];if(!o&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return o}("docusaurus-plugin-content-docs",e,{failfast:!0});function f(e){void 0===e&&(e={});const t=d(),{pathname:n}=(0,r.TH)();return function(e,t,n){void 0===n&&(n={});const o=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),a=o?{pluginId:o[0],pluginData:o[1]}:void 0;if(!a&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return a}(t,n,e)}function m(e){void 0===e&&(e={});const t=f(e),{pathname:n}=(0,r.TH)();if(!t)return;return{activePlugin:t,activeVersion:l(t.pluginData,n)}}function h(e){return p(e).versions}function b(e){const t=p(e);return s(t)}function g(e){const t=p(e),{pathname:n}=(0,r.TH)();return c(t,n)}function y(e){const t=p(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=s(e);return{latestDocSuggestion:c(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},6657:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={onRouteDidUpdate(e){let{location:t,previousLocation:n}=e;!n||t.pathname===n.pathname&&t.search===n.search&&t.hash===n.hash||setTimeout((()=>{window.gtag("set","page_path",t.pathname+t.search+t.hash),window.gtag("event","page_view")}))}}},8320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>a});var r=n(4865),o=n.n(r);o().configure({showSpinner:!1});const a={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{o().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){o().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var r=n(2573),o=n(6809);!function(e){const{themeConfig:{prism:t}}=o.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(6854),n(6726)(`./prism-${e}`)})),delete globalThis.Prism}(r.p1)},2503:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});n(7294);var r=n(512),o=n(5999),a=n(6668),i=n(3692),s=n(8138);const l={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var c=n(5893);function u(e){let{as:t,id:n,...u}=e;const d=(0,s.Z)(),{navbar:{hideOnScroll:p}}=(0,a.L)();if("h1"===t||!n)return(0,c.jsx)(t,{...u,id:void 0});d.collectAnchor(n);const f=(0,o.I)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof u.children?u.children:n});return(0,c.jsxs)(t,{...u,className:(0,r.Z)("anchor",p?l.anchorWithHideOnScrollNavbar:l.anchorWithStickyNavbar,u.className),id:n,children:[u.children,(0,c.jsx)(i.Z,{className:"hash-link",to:`#${n}`,"aria-label":f,title:f,children:"\u200b"})]})}},9471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});n(7294);const r={iconExternalLink:"iconExternalLink_nPIU"};var o=n(5893);function a(e){let{width:t=13.5,height:n=13.5}=e;return(0,o.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,o.jsx)("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"})})}},7372:(e,t,n)=>{"use strict";n.d(t,{Z:()=>Nt});var r=n(7294),o=n(512),a=n(4763),i=n(833),s=n(6550),l=n(5999),c=n(5936),u=n(5893);const d="__docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,r.useRef)(null),{action:t}=(0,s.k6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&p(t)}),[]);return(0,c.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const m=(0,l.I)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function h(e){const t=e.children??m,{containerRef:n,onClick:r}=f();return(0,u.jsx)("div",{ref:n,role:"region","aria-label":m,children:(0,u.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var b=n(5281),g=n(9727);const y={skipToContent:"skipToContent_fXgn"};function v(){return(0,u.jsx)(h,{className:y.skipToContent})}var w=n(6668),k=n(9689);function x(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:o=1.2,className:a,...i}=e;return(0,u.jsx)("svg",{viewBox:"0 0 15 15",width:t,height:n,...i,children:(0,u.jsx)("g",{stroke:r,strokeWidth:o,children:(0,u.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const S={closeButton:"closeButton_CVFx"};function _(e){return(0,u.jsx)("button",{type:"button","aria-label":(0,l.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,o.Z)("clean-btn close",S.closeButton,e.className),children:(0,u.jsx)(x,{width:14,height:14,strokeWidth:3.1})})}const E={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,w.L)(),{content:n}=t;return(0,u.jsx)("div",{...e,className:(0,o.Z)(E.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const T={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function j(){const{announcementBar:e}=(0,w.L)(),{isActive:t,close:n}=(0,k.nT)();if(!t)return null;const{backgroundColor:r,textColor:o,isCloseable:a}=e;return(0,u.jsxs)("div",{className:T.announcementBar,style:{backgroundColor:r,color:o},role:"banner",children:[a&&(0,u.jsx)("div",{className:T.announcementBarPlaceholder}),(0,u.jsx)(C,{className:T.announcementBarContent}),a&&(0,u.jsx)(_,{onClick:n,className:T.announcementBarClose})]})}var A=n(3163),L=n(2466);var R=n(902),N=n(3102);const P=r.createContext(null);function O(e){let{children:t}=e;const n=function(){const e=(0,A.e)(),t=(0,N.HY)(),[n,o]=(0,r.useState)(!1),a=null!==t.component,i=(0,R.D9)(a);return(0,r.useEffect)((()=>{a&&!i&&o(!0)}),[a,i]),(0,r.useEffect)((()=>{a?e.shown||o(!0):o(!1)}),[e.shown,a]),(0,r.useMemo)((()=>[n,o]),[n])}();return(0,u.jsx)(P.Provider,{value:n,children:t})}function I(e){if(e.component){const t=e.component;return(0,u.jsx)(t,{...e.props})}}function D(){const e=(0,r.useContext)(P);if(!e)throw new R.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,o=(0,r.useCallback)((()=>n(!1)),[n]),a=(0,N.HY)();return(0,r.useMemo)((()=>({shown:t,hide:o,content:I(a)})),[o,a,t])}function M(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:a}=D();return(0,u.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,u.jsxs)("div",{className:(0,o.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":a}),children:[(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:n}),(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:r})]})]})}var F=n(2949),z=n(2389);function B(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"})})}function U(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"})})}const $={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function q(e){let{className:t,buttonClassName:n,value:r,onChange:a}=e;const i=(0,z.Z)(),s=(0,l.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===r?(0,l.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,l.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,u.jsx)("div",{className:(0,o.Z)($.toggle,t),children:(0,u.jsxs)("button",{className:(0,o.Z)("clean-btn",$.toggleButton,!i&&$.toggleButtonDisabled,n),type:"button",onClick:()=>a("dark"===r?"light":"dark"),disabled:!i,title:s,"aria-label":s,"aria-live":"polite",children:[(0,u.jsx)(B,{className:(0,o.Z)($.toggleIcon,$.lightToggleIcon)}),(0,u.jsx)(U,{className:(0,o.Z)($.toggleIcon,$.darkToggleIcon)})]})})}const H=r.memo(q),Z={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function G(e){let{className:t}=e;const n=(0,w.L)().navbar.style,r=(0,w.L)().colorMode.disableSwitch,{colorMode:o,setColorMode:a}=(0,F.I)();return r?null:(0,u.jsx)(H,{className:t,buttonClassName:"dark"===n?Z.darkNavbarColorModeToggle:void 0,value:o,onChange:a})}var V=n(1327);function W(){return(0,u.jsx)(V.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function K(){const e=(0,A.e)();return(0,u.jsx)("button",{type:"button","aria-label":(0,l.I)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,u.jsx)(x,{color:"var(--ifm-color-emphasis-600)"})})}function Q(){return(0,u.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,u.jsx)(W,{}),(0,u.jsx)(G,{className:"margin-right--md"}),(0,u.jsx)(K,{})]})}var Y=n(3692),X=n(4996),J=n(3919),ee=n(8022),te=n(9471);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:o,label:a,html:i,isDropdownLink:s,prependBaseUrlToHref:l,...c}=e;const d=(0,X.Z)(r),p=(0,X.Z)(t),f=(0,X.Z)(o,{forcePrependBaseUrl:!0}),m=a&&o&&!(0,J.Z)(o),h=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,u.jsxs)(u.Fragment,{children:[a,m&&(0,u.jsx)(te.Z,{...s&&{width:12,height:12}})]})};return o?(0,u.jsx)(Y.Z,{href:l?f:o,...c,...h}):(0,u.jsx)(Y.Z,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?(0,ee.F)(n,t.pathname):t.pathname.startsWith(p)},...c,...h})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const a=(0,u.jsx)(ne,{className:(0,o.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,u.jsx)("li",{children:a}):a}function oe(e){let{className:t,isDropdownItem:n,...r}=e;return(0,u.jsx)("li",{className:"menu__list-item",children:(0,u.jsx)(ne,{className:(0,o.Z)("menu__link",t),...r})})}function ae(e){let{mobile:t=!1,position:n,...r}=e;const o=t?oe:re;return(0,u.jsx)(o,{...r,activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ie=n(6043),se=n(8596),le=n(2263);const ce={dropdownNavbarItemMobile:"dropdownNavbarItemMobile_S0Fm"};function ue(e,t){return e.some((e=>function(e,t){return!!(0,se.Mg)(e.to,t)||!!(0,ee.F)(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function de(e){let{items:t,position:n,className:a,onClick:i,...s}=e;const l=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{l.current&&!l.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[l]),(0,u.jsxs)("div",{ref:l,className:(0,o.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c}),children:[(0,u.jsx)(ne,{"aria-haspopup":"true","aria-expanded":c,role:"button",href:s.to?void 0:"#",className:(0,o.Z)("navbar__link",a),...s,onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))},children:s.children??s.label}),(0,u.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(He,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function pe(e){let{items:t,className:n,position:a,onClick:i,...l}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,le.Z)(),{pathname:t}=(0,s.TH)();return t.replace(e,"/")}(),d=ue(t,c),{collapsed:p,toggleCollapsed:f,setCollapsed:m}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&m(!d)}),[c,d,m]),(0,u.jsxs)("li",{className:(0,o.Z)("menu__list-item",{"menu__list-item--collapsed":p}),children:[(0,u.jsx)(ne,{role:"button",className:(0,o.Z)(ce.dropdownNavbarItemMobile,"menu__link menu__link--sublist menu__link--sublist-caret",n),...l,onClick:e=>{e.preventDefault(),f()},children:l.children??l.label}),(0,u.jsx)(ie.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:p,children:t.map(((e,t)=>(0,r.createElement)(He,{mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active",...e,key:t})))})]})}function fe(e){let{mobile:t=!1,...n}=e;const r=t?pe:de;return(0,u.jsx)(r,{...n})}var me=n(4711);function he(e){let{width:t=20,height:n=20,...r}=e;return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0,...r,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"})})}const be="iconLanguage_nlXk";var ge=n(3935);function ye(){return r.createElement("svg",{width:"15",height:"15",className:"DocSearch-Control-Key-Icon"},r.createElement("path",{d:"M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953",strokeWidth:"1.2",stroke:"currentColor",fill:"none",strokeLinecap:"square"}))}var ve=n(830),we=["translations"];function ke(){return ke=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var Ee="Ctrl";var Ce=r.forwardRef((function(e,t){var n=e.translations,o=void 0===n?{}:n,a=_e(e,we),i=o.buttonText,s=void 0===i?"Search":i,l=o.buttonAriaLabel,c=void 0===l?"Search":l,u=xe((0,r.useState)(null),2),d=u[0],p=u[1];return(0,r.useEffect)((function(){"undefined"!=typeof navigator&&(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?p("\u2318"):p(Ee))}),[]),r.createElement("button",ke({type:"button",className:"DocSearch DocSearch-Button","aria-label":c},a,{ref:t}),r.createElement("span",{className:"DocSearch-Button-Container"},r.createElement(ve.W,null),r.createElement("span",{className:"DocSearch-Button-Placeholder"},s)),r.createElement("span",{className:"DocSearch-Button-Keys"},null!==d&&r.createElement(r.Fragment,null,r.createElement("kbd",{className:"DocSearch-Button-Key"},d===Ee?r.createElement(ye,null):d),r.createElement("kbd",{className:"DocSearch-Button-Key"},"K"))))})),Te=n(5742),je=n(6177),Ae=n(239),Le=n(3320);const Re={button:{buttonText:(0,l.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),buttonAriaLabel:(0,l.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"})},modal:{searchBox:{resetButtonTitle:(0,l.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),resetButtonAriaLabel:(0,l.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),cancelButtonText:(0,l.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"}),cancelButtonAriaLabel:(0,l.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"})},startScreen:{recentSearchesTitle:(0,l.I)({id:"theme.SearchModal.startScreen.recentSearchesTitle",message:"Recent",description:"The title for recent searches"}),noRecentSearchesText:(0,l.I)({id:"theme.SearchModal.startScreen.noRecentSearchesText",message:"No recent searches",description:"The text when no recent searches"}),saveRecentSearchButtonTitle:(0,l.I)({id:"theme.SearchModal.startScreen.saveRecentSearchButtonTitle",message:"Save this search",description:"The label for save recent search button"}),removeRecentSearchButtonTitle:(0,l.I)({id:"theme.SearchModal.startScreen.removeRecentSearchButtonTitle",message:"Remove this search from history",description:"The label for remove recent search button"}),favoriteSearchesTitle:(0,l.I)({id:"theme.SearchModal.startScreen.favoriteSearchesTitle",message:"Favorite",description:"The title for favorite searches"}),removeFavoriteSearchButtonTitle:(0,l.I)({id:"theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle",message:"Remove this search from favorites",description:"The label for remove favorite search button"})},errorScreen:{titleText:(0,l.I)({id:"theme.SearchModal.errorScreen.titleText",message:"Unable to fetch results",description:"The title for error screen of search modal"}),helpText:(0,l.I)({id:"theme.SearchModal.errorScreen.helpText",message:"You might want to check your network connection.",description:"The help text for error screen of search modal"})},footer:{selectText:(0,l.I)({id:"theme.SearchModal.footer.selectText",message:"to select",description:"The explanatory text of the action for the enter key"}),selectKeyAriaLabel:(0,l.I)({id:"theme.SearchModal.footer.selectKeyAriaLabel",message:"Enter key",description:"The ARIA label for the Enter key button that makes the selection"}),navigateText:(0,l.I)({id:"theme.SearchModal.footer.navigateText",message:"to navigate",description:"The explanatory text of the action for the Arrow up and Arrow down key"}),navigateUpKeyAriaLabel:(0,l.I)({id:"theme.SearchModal.footer.navigateUpKeyAriaLabel",message:"Arrow up",description:"The ARIA label for the Arrow up key button that makes the navigation"}),navigateDownKeyAriaLabel:(0,l.I)({id:"theme.SearchModal.footer.navigateDownKeyAriaLabel",message:"Arrow down",description:"The ARIA label for the Arrow down key button that makes the navigation"}),closeText:(0,l.I)({id:"theme.SearchModal.footer.closeText",message:"to close",description:"The explanatory text of the action for Escape key"}),closeKeyAriaLabel:(0,l.I)({id:"theme.SearchModal.footer.closeKeyAriaLabel",message:"Escape key",description:"The ARIA label for the Escape key button that close the modal"}),searchByText:(0,l.I)({id:"theme.SearchModal.footer.searchByText",message:"Search by",description:"The text explain that the search is making by Algolia"})},noResultsScreen:{noResultsText:(0,l.I)({id:"theme.SearchModal.noResultsScreen.noResultsText",message:"No results for",description:"The text explains that there are no results for the following search"}),suggestedQueryText:(0,l.I)({id:"theme.SearchModal.noResultsScreen.suggestedQueryText",message:"Try searching for",description:"The text for the suggested query when no results are found for the following search"}),reportMissingResultsText:(0,l.I)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsText",message:"Believe this query should return results?",description:"The text for the question where the user thinks there are missing results"}),reportMissingResultsLinkText:(0,l.I)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsLinkText",message:"Let us know.",description:"The text for the link to report missing results"})}},placeholder:(0,l.I)({id:"theme.SearchModal.placeholder",message:"Search docs",description:"The placeholder of the input of the DocSearch pop-up modal"})};let Ne=null;function Pe(e){let{hit:t,children:n}=e;return(0,u.jsx)(Y.Z,{to:t.url,children:n})}function Oe(e){let{state:t,onClose:n}=e;const r=(0,je.M)();return(0,u.jsx)(Y.Z,{to:r(t.query),onClick:n,children:(0,u.jsx)(l.Z,{id:"theme.SearchBar.seeAll",values:{count:t.context.nbHits},children:"See all {count} results"})})}function Ie(e){let{contextualSearch:t,externalUrlRegex:o,...a}=e;const{siteMetadata:i}=(0,le.Z)(),l=(0,Ae.l)(),c=function(){const{locale:e,tags:t}=(0,Le._q)();return[`language:${e}`,t.map((e=>`docusaurus_tag:${e}`))]}(),d=a.searchParameters?.facetFilters??[],p=t?function(e,t){const n=e=>"string"==typeof e?[e]:e;return[...n(e),...n(t)]}(c,d):d,f={...a.searchParameters,facetFilters:p},m=(0,s.k6)(),h=(0,r.useRef)(null),b=(0,r.useRef)(null),[g,y]=(0,r.useState)(!1),[v,w]=(0,r.useState)(void 0),k=(0,r.useCallback)((()=>Ne?Promise.resolve():Promise.all([n.e(1426).then(n.bind(n,1426)),Promise.all([n.e(532),n.e(6945)]).then(n.bind(n,6945)),Promise.all([n.e(532),n.e(8894)]).then(n.bind(n,8894))]).then((e=>{let[{DocSearchModal:t}]=e;Ne=t}))),[]),x=(0,r.useCallback)((()=>{k().then((()=>{h.current=document.createElement("div"),document.body.insertBefore(h.current,document.body.firstChild),y(!0)}))}),[k,y]),S=(0,r.useCallback)((()=>{y(!1),h.current?.remove()}),[y]),_=(0,r.useCallback)((e=>{k().then((()=>{y(!0),w(e.key)}))}),[k,y,w]),E=(0,r.useRef)({navigate(e){let{itemUrl:t}=e;(0,ee.F)(o,t)?window.location.href=t:m.push(t)}}).current,C=(0,r.useRef)((e=>a.transformItems?a.transformItems(e):e.map((e=>({...e,url:l(e.url)}))))).current,T=(0,r.useMemo)((()=>e=>(0,u.jsx)(Oe,{...e,onClose:S})),[S]),j=(0,r.useCallback)((e=>(e.addAlgoliaAgent("docusaurus",i.docusaurusVersion),e)),[i.docusaurusVersion]);return function(e){var t=e.isOpen,n=e.onOpen,o=e.onClose,a=e.onInput,i=e.searchButtonRef;r.useEffect((function(){function e(e){var r;(27===e.keyCode&&t||"k"===(null===(r=e.key)||void 0===r?void 0:r.toLowerCase())&&(e.metaKey||e.ctrlKey)||!function(e){var t=e.target,n=t.tagName;return t.isContentEditable||"INPUT"===n||"SELECT"===n||"TEXTAREA"===n}(e)&&"/"===e.key&&!t)&&(e.preventDefault(),t?o():document.body.classList.contains("DocSearch--active")||document.body.classList.contains("DocSearch--active")||n()),i&&i.current===document.activeElement&&a&&/[a-zA-Z0-9]/.test(String.fromCharCode(e.keyCode))&&a(e)}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}}),[t,n,o,a,i])}({isOpen:g,onOpen:x,onClose:S,onInput:_,searchButtonRef:b}),(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(Te.Z,{children:(0,u.jsx)("link",{rel:"preconnect",href:`https://${a.appId}-dsn.algolia.net`,crossOrigin:"anonymous"})}),(0,u.jsx)(Ce,{onTouchStart:k,onFocus:k,onMouseOver:k,onClick:x,ref:b,translations:Re.button}),g&&Ne&&h.current&&(0,ge.createPortal)((0,u.jsx)(Ne,{onClose:S,initialScrollY:window.scrollY,initialQuery:v,navigator:E,transformItems:C,hitComponent:Pe,transformSearchClient:j,...a.searchPagePath&&{resultsFooterComponent:T},...a,searchParameters:f,placeholder:Re.placeholder,translations:Re.modal}),h.current)]})}function De(){const{siteConfig:e}=(0,le.Z)();return(0,u.jsx)(Ie,{...e.themeConfig.algolia})}const Me={navbarSearchContainer:"navbarSearchContainer_Bca1"};function Fe(e){let{children:t,className:n}=e;return(0,u.jsx)("div",{className:(0,o.Z)(n,Me.navbarSearchContainer),children:t})}var ze=n(143),Be=n(2802);var Ue=n(373);const $e=e=>e.docs.find((t=>t.id===e.mainDocId));const qe={default:ae,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,queryString:o="",...a}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,le.Z)(),p=(0,me.l)(),{search:f,hash:m}=(0,s.TH)(),h=[...n,...c.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${m}${o}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...r],b=t?(0,l.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return(0,u.jsx)(fe,{...a,mobile:t,label:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(he,{className:be}),b]}),items:h})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,u.jsx)(Fe,{className:n,children:(0,u.jsx)(De,{})})},dropdown:fe,html:function(e){let{value:t,className:n,mobile:r=!1,isDropdownItem:a=!1}=e;const i=a?"li":"div";return(0,u.jsx)(i,{className:(0,o.Z)({navbar__item:!r&&!a,"menu__list-item":r},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,ze.Iw)(r),i=(0,Be.vY)(t,r),s=a?.path===i?.path;return null===i||i.unlisted&&!s?null:(0,u.jsx)(ae,{exact:!0,...o,isActive:()=>s||!!a?.sidebar&&a.sidebar===i.sidebar,label:n??i.id,to:i.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,ze.Iw)(r),i=(0,Be.oz)(t,r).link;if(!i)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return(0,u.jsx)(ae,{exact:!0,...o,isActive:()=>a?.sidebar===t,label:n??i.label,to:i.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...o}=e;const a=(0,Be.lO)(r)[0],i=t??a.label,s=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(a).path;return(0,u.jsx)(ae,{...o,label:i,to:s})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:o,dropdownItemsAfter:a,...i}=e;const{search:c,hash:d}=(0,s.TH)(),p=(0,ze.Iw)(n),f=(0,ze.gB)(n),{savePreferredVersionName:m}=(0,Ue.J)(n),h=[...o,...f.map((e=>{const t=p.alternateDocVersions[e.name]??$e(e);return{label:e.label,to:`${t.path}${c}${d}`,isActive:()=>e===p.activeVersion,onClick:()=>m(e.name)}})),...a],b=(0,Be.lO)(n)[0],g=t&&h.length>1?(0,l.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):b.label,y=t&&h.length>1?void 0:$e(b).path;return h.length<=1?(0,u.jsx)(ae,{...i,mobile:t,label:g,to:y,isActive:r?()=>!1:void 0}):(0,u.jsx)(fe,{...i,mobile:t,label:g,to:y,items:h,isActive:r?()=>!1:void 0})}};function He(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=qe[r];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,u.jsx)(o,{...n})}function Ze(){const e=(0,A.e)(),t=(0,w.L)().navbar.items;return(0,u.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(He,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function Ge(e){return(0,u.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,u.jsx)(l.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)",children:"\u2190 Back to main menu"})})}function Ve(){const e=0===(0,w.L)().navbar.items.length,t=D();return(0,u.jsxs)(u.Fragment,{children:[!e&&(0,u.jsx)(Ge,{onClick:()=>t.hide()}),t.content]})}function We(){const e=(0,A.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?(0,u.jsx)(M,{header:(0,u.jsx)(Q,{}),primaryMenu:(0,u.jsx)(Ze,{}),secondaryMenu:(0,u.jsx)(Ve,{})}):null}const Ke={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Qe(e){return(0,u.jsx)("div",{role:"presentation",...e,className:(0,o.Z)("navbar-sidebar__backdrop",e.className)})}function Ye(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:a}}=(0,w.L)(),i=(0,A.e)(),{navbarRef:s,isNavbarVisible:d}=function(e){const[t,n]=(0,r.useState)(e),o=(0,r.useRef)(!1),a=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(a.current=e.getBoundingClientRect().height)}),[]);return(0,L.RF)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=s?n(!1):i+c{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return o.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return(0,u.jsxs)("nav",{ref:s,"aria-label":(0,l.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,o.Z)("navbar","navbar--fixed-top",n&&[Ke.navbarHideable,!d&&Ke.navbarHidden],{"navbar--dark":"dark"===a,"navbar--primary":"primary"===a,"navbar-sidebar--show":i.shown}),children:[t,(0,u.jsx)(Qe,{onClick:i.toggle}),(0,u.jsx)(We,{})]})}var Xe=n(8780);const Je={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};function et(e){return(0,u.jsx)("button",{type:"button",...e,children:(0,u.jsx)(l.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error",children:"Try again"})})}function tt(e){let{error:t}=e;const n=(0,Xe.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,u.jsx)("p",{className:Je.errorBoundaryError,children:n})}class nt extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const rt="right";function ot(e){let{width:t=30,height:n=30,className:r,...o}=e;return(0,u.jsx)("svg",{className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...o,children:(0,u.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function at(){const{toggle:e,shown:t}=(0,A.e)();return(0,u.jsx)("button",{onClick:e,"aria-label":(0,l.I)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button",children:(0,u.jsx)(ot,{})})}const it={colorModeToggle:"colorModeToggle_DEke"};function st(e){let{items:t}=e;return(0,u.jsx)(u.Fragment,{children:t.map(((e,t)=>(0,u.jsx)(nt,{onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t}),children:(0,u.jsx)(He,{...e})},t)))})}function lt(e){let{left:t,right:n}=e;return(0,u.jsxs)("div",{className:"navbar__inner",children:[(0,u.jsx)("div",{className:"navbar__items",children:t}),(0,u.jsx)("div",{className:"navbar__items navbar__items--right",children:n})]})}function ct(){const e=(0,A.e)(),t=(0,w.L)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??rt)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return(0,u.jsx)(lt,{left:(0,u.jsxs)(u.Fragment,{children:[!e.disabled&&(0,u.jsx)(at,{}),(0,u.jsx)(W,{}),(0,u.jsx)(st,{items:n})]}),right:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(st,{items:r}),(0,u.jsx)(G,{className:it.colorModeToggle}),!o&&(0,u.jsx)(Fe,{children:(0,u.jsx)(De,{})})]})})}function ut(){return(0,u.jsx)(Ye,{children:(0,u.jsx)(ct,{})})}function dt(e){let{item:t}=e;const{to:n,href:r,label:o,prependBaseUrlToHref:a,...i}=t,s=(0,X.Z)(n),l=(0,X.Z)(r,{forcePrependBaseUrl:!0});return(0,u.jsxs)(Y.Z,{className:"footer__link-item",...r?{href:a?l:r}:{to:s},...i,children:[o,r&&!(0,J.Z)(r)&&(0,u.jsx)(te.Z,{})]})}function pt(e){let{item:t}=e;return t.html?(0,u.jsx)("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)("li",{className:"footer__item",children:(0,u.jsx)(dt,{item:t})},t.href??t.to)}function ft(e){let{column:t}=e;return(0,u.jsxs)("div",{className:"col footer__col",children:[(0,u.jsx)("div",{className:"footer__title",children:t.title}),(0,u.jsx)("ul",{className:"footer__items clean-list",children:t.items.map(((e,t)=>(0,u.jsx)(pt,{item:e},t)))})]})}function mt(e){let{columns:t}=e;return(0,u.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,u.jsx)(ft,{column:e},t)))})}function ht(){return(0,u.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function bt(e){let{item:t}=e;return t.html?(0,u.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)(dt,{item:t})}function gt(e){let{links:t}=e;return(0,u.jsx)("div",{className:"footer__links text--center",children:(0,u.jsx)("div",{className:"footer__links",children:t.map(((e,n)=>(0,u.jsxs)(r.Fragment,{children:[(0,u.jsx)(bt,{item:e}),t.length!==n+1&&(0,u.jsx)(ht,{})]},n)))})})}function yt(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,u.jsx)(mt,{columns:t}):(0,u.jsx)(gt,{links:t})}var vt=n(9965);const wt={footerLogoLink:"footerLogoLink_BH7S"};function kt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.C)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,u.jsx)(vt.Z,{className:(0,o.Z)("footer__logo",t.className),alt:t.alt,sources:r,width:t.width,height:t.height,style:t.style})}function xt(e){let{logo:t}=e;return t.href?(0,u.jsx)(Y.Z,{href:t.href,className:wt.footerLogoLink,target:t.target,children:(0,u.jsx)(kt,{logo:t})}):(0,u.jsx)(kt,{logo:t})}function St(e){let{copyright:t}=e;return(0,u.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function _t(e){let{style:t,links:n,logo:r,copyright:a}=e;return(0,u.jsx)("footer",{className:(0,o.Z)("footer",{"footer--dark":"dark"===t}),children:(0,u.jsxs)("div",{className:"container container-fluid",children:[n,(r||a)&&(0,u.jsxs)("div",{className:"footer__bottom text--center",children:[r&&(0,u.jsx)("div",{className:"margin-bottom--sm",children:r}),a]})]})})}function Et(){const{footer:e}=(0,w.L)();if(!e)return null;const{copyright:t,links:n,logo:r,style:o}=e;return(0,u.jsx)(_t,{style:o,links:n&&n.length>0&&(0,u.jsx)(yt,{links:n}),logo:r&&(0,u.jsx)(xt,{logo:r}),copyright:t&&(0,u.jsx)(St,{copyright:t})})}const Ct=r.memo(Et),Tt=(0,R.Qc)([F.S,k.pl,L.OC,Ue.L5,i.VC,function(e){let{children:t}=e;return(0,u.jsx)(N.n2,{children:(0,u.jsx)(A.M,{children:(0,u.jsx)(O,{children:t})})})}]);function jt(e){let{children:t}=e;return(0,u.jsx)(Tt,{children:t})}var At=n(2503);function Lt(e){let{error:t,tryAgain:n}=e;return(0,u.jsx)("main",{className:"container margin-vert--xl",children:(0,u.jsx)("div",{className:"row",children:(0,u.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,u.jsx)(At.Z,{as:"h1",className:"hero__title",children:(0,u.jsx)(l.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,u.jsx)("div",{className:"margin-vert--lg",children:(0,u.jsx)(et,{onClick:n,className:"button button--primary shadow--lw"})}),(0,u.jsx)("hr",{}),(0,u.jsx)("div",{className:"margin-vert--md",children:(0,u.jsx)(tt,{error:t})})]})})})}const Rt={mainWrapper:"mainWrapper_z2l0"};function Nt(e){const{children:t,noFooter:n,wrapperClassName:r,title:s,description:l}=e;return(0,g.t)(),(0,u.jsxs)(jt,{children:[(0,u.jsx)(i.d,{title:s,description:l}),(0,u.jsx)(v,{}),(0,u.jsx)(j,{}),(0,u.jsx)(ut,{}),(0,u.jsx)("div",{id:d,className:(0,o.Z)(b.k.wrapper.main,Rt.mainWrapper,r),children:(0,u.jsx)(a.Z,{fallback:e=>(0,u.jsx)(Lt,{...e}),children:t})}),!n&&(0,u.jsx)(Ct,{})]})}},1327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});n(7294);var r=n(3692),o=n(4996),a=n(2263),i=n(6668),s=n(9965),l=n(5893);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const a={light:(0,o.Z)(t.src),dark:(0,o.Z)(t.srcDark||t.src)},i=(0,l.jsx)(s.Z,{className:t.className,sources:a,height:t.height,width:t.width,alt:n,style:t.style});return r?(0,l.jsx)("div",{className:r,children:i}):i}function u(e){const{siteConfig:{title:t}}=(0,a.Z)(),{navbar:{title:n,logo:s}}=(0,i.L)(),{imageClassName:u,titleClassName:d,...p}=e,f=(0,o.Z)(s?.href||"/"),m=n?"":t,h=s?.alt??m;return(0,l.jsxs)(r.Z,{to:f,...p,...s?.target&&{target:s.target},children:[s&&(0,l.jsx)(c,{logo:s,alt:h,imageClassName:u}),null!=n&&(0,l.jsx)("b",{className:d,children:n})]})}},197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});n(7294);var r=n(5742),o=n(5893);function a(e){let{locale:t,version:n,tag:a}=e;const i=t;return(0,o.jsxs)(r.Z,{children:[t&&(0,o.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,o.jsx)("meta",{name:"docusaurus_version",content:n}),a&&(0,o.jsx)("meta",{name:"docusaurus_tag",content:a}),i&&(0,o.jsx)("meta",{name:"docsearch:language",content:i}),n&&(0,o.jsx)("meta",{name:"docsearch:version",content:n}),a&&(0,o.jsx)("meta",{name:"docsearch:docusaurus_tag",content:a})]})}},9965:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var r=n(7294),o=n(512),a=n(2389),i=n(2949);const s={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var l=n(5893);function c(e){let{className:t,children:n}=e;const c=(0,a.Z)(),{colorMode:u}=(0,i.I)();return(0,l.jsx)(l.Fragment,{children:(c?"dark"===u?["dark"]:["light"]:["light","dark"]).map((e=>{const a=n({theme:e,className:(0,o.Z)(t,s.themedComponent,s[`themedComponent--${e}`])});return(0,l.jsx)(r.Fragment,{children:a},e)}))})}function u(e){const{sources:t,className:n,alt:r,...o}=e;return(0,l.jsx)(c,{className:n,children:e=>{let{theme:n,className:a}=e;return(0,l.jsx)("img",{src:t[n],alt:r,className:a,...o})}})}},6043:(e,t,n)=>{"use strict";n.d(t,{u:()=>c,z:()=>g});var r=n(7294),o=n(412),a=n(469),i=n(1442),s=n(5893);const l="ease-in-out";function c(e){let{initialState:t}=e;const[n,o]=(0,r.useState)(t??!1),a=(0,r.useCallback)((()=>{o((e=>!e))}),[]);return{collapsed:n,setCollapsed:o,toggleCollapsed:a}}const u={display:"none",overflow:"hidden",height:"0px"},d={display:"block",overflow:"visible",height:"auto"};function p(e,t){const n=t?u:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function f(e){let{collapsibleRef:t,collapsed:n,animation:o}=e;const a=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=o?.duration??function(e){if((0,i.n)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${o?.easing??l}`,height:`${t}px`}}function s(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!a.current)return p(e,n),void(a.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(s(),requestAnimationFrame((()=>{e.style.height=u.height,e.style.overflow=u.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{s()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,o])}function m(e){if(!o.Z.canUseDOM)return e?u:d}function h(e){let{as:t="div",collapsed:n,children:o,animation:a,onCollapseTransitionEnd:i,className:l,disableSSRStyle:c}=e;const u=(0,r.useRef)(null);return f({collapsibleRef:u,collapsed:n,animation:a}),(0,s.jsx)(t,{ref:u,style:c?void 0:m(n),onTransitionEnd:e=>{"height"===e.propertyName&&(p(u.current,n),i?.(n))},className:l,children:o})}function b(e){let{collapsed:t,...n}=e;const[o,i]=(0,r.useState)(!t),[l,c]=(0,r.useState)(t);return(0,a.Z)((()=>{t||i(!0)}),[t]),(0,a.Z)((()=>{o&&c(t)}),[o,t]),o?(0,s.jsx)(h,{...n,collapsed:l}):null}function g(e){let{lazy:t,...n}=e;const r=t?b:h;return(0,s.jsx)(r,{...n})}},9689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>h,pl:()=>m});var r=n(7294),o=n(2389),a=n(12),i=n(902),s=n(6668),l=n(5893);const c=(0,a.WA)("docusaurus.announcement.dismiss"),u=(0,a.WA)("docusaurus.announcement.id"),d=()=>"true"===c.get(),p=e=>c.set(String(e)),f=r.createContext(null);function m(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,s.L)(),t=(0,o.Z)(),[n,a]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{a(d())}),[]);const i=(0,r.useCallback)((()=>{p(!0),a(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&p(!1),!r&&d()||a(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return(0,l.jsx)(f.Provider,{value:n,children:t})}function h(){const e=(0,r.useContext)(f);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},2949:(e,t,n)=>{"use strict";n.d(t,{I:()=>g,S:()=>b});var r=n(7294),o=n(412),a=n(902),i=n(12),s=n(6668),l=n(5893);const c=r.createContext(void 0),u="theme",d=(0,i.WA)(u),p={light:"light",dark:"dark"},f=e=>e===p.dark?p.dark:p.light,m=e=>o.Z.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),h=e=>{d.set(f(e))};function b(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,s.L)(),[o,a]=(0,r.useState)(m(e));(0,r.useEffect)((()=>{t&&d.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:o=!0}=r;t?(a(t),o&&h(t)):(a(n?window.matchMedia("(prefers-color-scheme: dark)").matches?p.dark:p.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(o))}),[o]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=d.get();null!==t&&i(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const l=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||l.current?l.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:o,setColorMode:i,get isDarkTheme(){return o===p.dark},setLightTheme(){i(p.light)},setDarkTheme(){i(p.dark)}})),[o,i])}();return(0,l.jsx)(c.Provider,{value:n,children:t})}function g(){const e=(0,r.useContext)(c);if(null==e)throw new a.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},373:(e,t,n)=>{"use strict";n.d(t,{J:()=>v,L5:()=>g,Oh:()=>w});var r=n(7294),o=n(143),a=n(9935),i=n(6668),s=n(2802),l=n(902),c=n(12),u=n(5893);const d=e=>`docs-preferred-version-${e}`,p={save:(e,t,n)=>{(0,c.WA)(d(e),{persistence:t}).set(n)},read:(e,t)=>(0,c.WA)(d(e),{persistence:t}).get(),clear:(e,t)=>{(0,c.WA)(d(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const m=r.createContext(null);function h(){const e=(0,o._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[a,s]=(0,r.useState)((()=>f(n)));(0,r.useEffect)((()=>{s(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function o(e){const t=p.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(p.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,o(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[a,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){p.save(e,t,n),s((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function b(e){let{children:t}=e;const n=h();return(0,u.jsx)(m.Provider,{value:n,children:t})}function g(e){let{children:t}=e;return s.cE?(0,u.jsx)(b,{children:t}):(0,u.jsx)(u.Fragment,{children:t})}function y(){const e=(0,r.useContext)(m);if(!e)throw new l.i6("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=a.m);const t=(0,o.zh)(e),[n,i]=y(),{preferredVersionName:s}=n[e];return{preferredVersion:t.versions.find((e=>e.name===s))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}function w(){const e=(0,o._r)(),[t]=y();function n(n){const r=e[n],{preferredVersionName:o}=t[n];return r.versions.find((e=>e.name===o))??null}const r=Object.keys(e);return Object.fromEntries(r.map((e=>[e,n(e)])))}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>c,b:()=>l});var r=n(7294),o=n(902),a=n(5893);const i=Symbol("EmptyContext"),s=r.createContext(i);function l(e){let{children:t,name:n,items:o}=e;const i=(0,r.useMemo)((()=>n&&o?{name:n,items:o}:null),[n,o]);return(0,a.jsx)(s.Provider,{value:i,children:t})}function c(){const e=(0,r.useContext)(s);if(e===i)throw new o.i6("DocsSidebarProvider");return e}},4477:(e,t,n)=>{"use strict";n.d(t,{E:()=>l,q:()=>s});var r=n(7294),o=n(902),a=n(5893);const i=r.createContext(null);function s(e){let{children:t,version:n}=e;return(0,a.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(null===e)throw new o.i6("DocsVersionProvider");return e}},3163:(e,t,n)=>{"use strict";n.d(t,{M:()=>p,e:()=>f});var r=n(7294),o=n(3102),a=n(7524),i=n(1980),s=n(6668),l=n(902),c=n(5893);const u=r.createContext(void 0);function d(){const e=function(){const e=(0,o.HY)(),{items:t}=(0,s.L)().navbar;return 0===t.length&&!e.component}(),t=(0,a.i)(),n=!e&&"mobile"===t,[l,c]=(0,r.useState)(!1);(0,i.Rb)((()=>{if(l)return c(!1),!1}));const u=(0,r.useCallback)((()=>{c((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&c(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:l})),[e,n,u,l])}function p(e){let{children:t}=e;const n=d();return(0,c.jsx)(u.Provider,{value:n,children:t})}function f(){const e=r.useContext(u);if(void 0===e)throw new l.i6("NavbarMobileSidebarProvider");return e}},3102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>l,Zo:()=>c,n2:()=>s});var r=n(7294),o=n(902),a=n(5893);const i=r.createContext(null);function s(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,a.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(!e)throw new o.i6("NavbarSecondaryMenuContentProvider");return e[0]}function c(e){let{component:t,props:n}=e;const a=(0,r.useContext)(i);if(!a)throw new o.i6("NavbarSecondaryMenuContentProvider");const[,s]=a,l=(0,o.Ql)(n);return(0,r.useEffect)((()=>{s({component:t,props:l})}),[s,t,l]),(0,r.useEffect)((()=>()=>s({component:null,props:null})),[s]),null}},9727:(e,t,n)=>{"use strict";n.d(t,{h:()=>o,t:()=>a});var r=n(7294);const o="navigation-with-keyboard";function a(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(o),"mousedown"===e.type&&document.body.classList.remove(o)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(o),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},6177:(e,t,n)=>{"use strict";n.d(t,{K:()=>s,M:()=>l});var r=n(7294),o=n(2263),a=n(1980);const i="q";function s(){return(0,a.Nc)(i)}function l(){const{siteConfig:{baseUrl:e,themeConfig:t}}=(0,o.Z)(),{algolia:{searchPagePath:n}}=t;return(0,r.useCallback)((t=>`${e}${n}?${i}=${encodeURIComponent(t)}`),[e,n])}},7524:(e,t,n)=>{"use strict";n.d(t,{i:()=>s});var r=n(7294),o=n(412);const a={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function s(e){let{desktopBreakpoint:t=i}=void 0===e?{}:e;const[n,s]=(0,r.useState)((()=>"ssr"));return(0,r.useEffect)((()=>{function e(){s(function(e){if(!o.Z.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>e?a.desktop:a.mobile}(t))}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[t]),n}},5281:(e,t,n)=>{"use strict";n.d(t,{k:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",unlistedBanner:"theme-unlisted-banner",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{}}},1442:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{n:()=>r})},2802:(e,t,n)=>{"use strict";n.d(t,{LM:()=>f,_F:()=>b,cE:()=>p,SN:()=>_,lO:()=>k,vY:()=>S,oz:()=>x,s1:()=>w,f:()=>y});var r=n(7294),o=n(6550),a=n(8790),i=n(143),s=n(373),l=n(4477),c=n(1116);function u(e){return Array.from(new Set(e))}var d=n(8596);const p=!!i._r;function f(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=f(t);if(e)return e}}(e):void 0:e.href}const m=(e,t)=>void 0!==e&&(0,d.Mg)(e,t),h=(e,t)=>e.some((e=>b(e,t)));function b(e,t){return"link"===e.type?m(e.href,t):"category"===e.type&&(m(e.href,t)||h(e.items,t))}function g(e,t){switch(e.type){case"category":return b(e,t)||e.items.some((e=>g(e,t)));case"link":return!e.unlisted||b(e,t);default:return!0}}function y(e,t){return(0,r.useMemo)((()=>e.filter((e=>g(e,t)))),[e,t])}function v(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const o=[];return function e(t){for(const a of t)if("category"===a.type&&((0,d.Mg)(a.href,n)||e(a.items))||"link"===a.type&&(0,d.Mg)(a.href,n)){return r&&"category"!==a.type||o.unshift(a),!0}return!1}(t),o}function w(){const e=(0,c.V)(),{pathname:t}=(0,o.TH)(),n=(0,i.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?v({sidebarItems:e.items,pathname:t}):null}function k(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,s.J)(e),o=(0,i.yW)(e);return(0,r.useMemo)((()=>u([t,n,o].filter(Boolean))),[t,n,o])}function x(e,t){const n=k(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function S(e,t){const n=k(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${u(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function _(e){let{route:t}=e;const n=(0,o.TH)(),r=(0,l.E)(),i=t.routes,s=i.find((e=>(0,o.LX)(n.pathname,e)));if(!s)return null;const c=s.sidebar,u=c?r.docsSidebars[c]:void 0;return{docElement:(0,a.H)(i),sidebarName:c,sidebarItems:u}}},2128:(e,t,n)=>{"use strict";n.d(t,{p:()=>o});var r=n(2263);function o(e){const{siteConfig:t}=(0,r.Z)(),{title:n,titleDelimiter:o}=t;return e?.trim().length?`${e.trim()} ${o} ${n}`:n}},1980:(e,t,n)=>{"use strict";n.d(t,{Nc:()=>l,Rb:()=>i});var r=n(7294),o=n(6550),a=n(902);function i(e){!function(e){const t=(0,o.k6)(),n=(0,a.zX)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function s(e){return function(e){const t=(0,o.k6)();return(0,r.useSyncExternalStore)(t.listen,(()=>e(t)),(()=>e(t)))}((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}function l(e){const t=s(e)??"",n=function(){const e=(0,o.k6)();return(0,r.useCallback)(((t,n,r)=>{const o=new URLSearchParams(e.location.search);n?o.set(t,n):o.delete(t),(r?.push?e.push:e.replace)({search:o.toString()})}),[e])}();return[t,(0,r.useCallback)(((t,r)=>{n(e,t,r)}),[n,e])]}},833:(e,t,n)=>{"use strict";n.d(t,{FG:()=>f,d:()=>d,VC:()=>m});var r=n(7294),o=n(512),a=n(5742),i=n(226);function s(){const e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var l=n(4996),c=n(2128),u=n(5893);function d(e){let{title:t,description:n,keywords:r,image:o,children:i}=e;const s=(0,c.p)(t),{withBaseUrl:d}=(0,l.C)(),p=o?d(o,{absolute:!0}):void 0;return(0,u.jsxs)(a.Z,{children:[t&&(0,u.jsx)("title",{children:s}),t&&(0,u.jsx)("meta",{property:"og:title",content:s}),n&&(0,u.jsx)("meta",{name:"description",content:n}),n&&(0,u.jsx)("meta",{property:"og:description",content:n}),r&&(0,u.jsx)("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),p&&(0,u.jsx)("meta",{property:"og:image",content:p}),p&&(0,u.jsx)("meta",{name:"twitter:image",content:p}),i]})}const p=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=r.useContext(p),s=(0,o.Z)(i,t);return(0,u.jsxs)(p.Provider,{value:s,children:[(0,u.jsx)(a.Z,{children:(0,u.jsx)("html",{className:s})}),n]})}function m(e){let{children:t}=e;const n=s(),r=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const a=`plugin-id-${n.plugin.id}`;return(0,u.jsx)(f,{className:(0,o.Z)(r,a),children:t})}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>s,Qc:()=>u,Ql:()=>c,i6:()=>l,zX:()=>i});var r=n(7294),o=n(469),a=n(5893);function i(e){const t=(0,r.useRef)(e);return(0,o.Z)((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function s(e){const t=(0,r.useRef)();return(0,o.Z)((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function c(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return(0,a.jsx)(a.Fragment,{children:e.reduceRight(((e,t)=>(0,a.jsx)(t,{children:e})),n)})}}},8022:(e,t,n)=>{"use strict";function r(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}n.d(t,{F:()=>r})},8596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>s});var r=n(7294),o=n(723),a=n(2263);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function s(){const{baseUrl:e}=(0,a.Z)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function o(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(o).flatMap((e=>e.routes??[])))}(n)}({routes:o.Z,baseUrl:e})),[e])}},2466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>f,OC:()=>c,RF:()=>p});var r=n(7294),o=n(412),a=n(2389),i=(n(469),n(902)),s=n(5893);const l=r.createContext(void 0);function c(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return(0,s.jsx)(l.Provider,{value:n,children:t})}function u(){const e=(0,r.useContext)(l);if(null==e)throw new i.i6("ScrollControllerProvider");return e}const d=()=>o.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function p(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=u(),o=(0,r.useRef)(d()),a=(0,i.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=d();a(e,o.current),o.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[a,n,...t])}function f(){const e=(0,r.useRef)(null),t=(0,a.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const o=document.documentElement.scrollTop;(n&&o>e||!n&&ot&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},3320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>i,_q:()=>l,os:()=>s});var r=n(143),o=n(2263),a=n(373);const i="default";function s(e,t){return`docs-${e}-${t}`}function l(){const{i18n:e}=(0,o.Z)(),t=(0,r._r)(),n=(0,r.WS)(),l=(0,a.Oh)();const c=[i,...Object.keys(t).map((function(e){const r=n?.activePlugin.pluginId===e?n.activeVersion:void 0,o=l[e],a=t[e].versions.find((e=>e.isLast));return s(e,(r??o??a).name)}))];return{locale:e.currentLocale,tags:c}}},12:(e,t,n)=>{"use strict";n.d(t,{WA:()=>l});n(7294);const r="localStorage";function o(e){let{key:t,oldValue:n,newValue:r,storage:o}=e;if(n===r)return;const a=document.createEvent("StorageEvent");a.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,o),window.dispatchEvent(a)}function a(e){if(void 0===e&&(e=r),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,i||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),i=!0),null}var t}let i=!1;const s={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function l(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(e);const n=a(t?.persistence);return null===n?s:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{const r=n.getItem(e);n.setItem(e,t),o({key:e,oldValue:r,newValue:t,storage:n})}catch(r){console.error(`Docusaurus storage error, can't set ${e}=${t}`,r)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),o({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}},listen:t=>{try{const r=r=>{r.storageArea===n&&r.key===e&&t(r)};return window.addEventListener("storage",r),()=>window.removeEventListener("storage",r)}catch(r){return console.error(`Docusaurus storage error, can't listen for changes of key=${e}`,r),()=>{}}}}}},4711:(e,t,n)=>{"use strict";n.d(t,{l:()=>i});var r=n(2263),o=n(6550),a=n(8780);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:s}}=(0,r.Z)(),{pathname:l}=(0,o.TH)(),c=(0,a.applyTrailingSlash)(l,{trailingSlash:n,baseUrl:e}),u=s===i?e:e.replace(`/${s}/`,"/"),d=c.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${u}`:`${u}${e}/`}(n)}${d}`}}}},5936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(7294),o=n(6550),a=n(902);function i(e){const t=(0,o.TH)(),n=(0,a.D9)(t),i=(0,a.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6668:(e,t,n)=>{"use strict";n.d(t,{L:()=>o});var r=n(2263);function o(){return(0,r.Z)().siteConfig.themeConfig}},6278:(e,t,n)=>{"use strict";n.d(t,{L:()=>o});var r=n(2263);function o(){const{siteConfig:{themeConfig:e}}=(0,r.Z)();return e}},239:(e,t,n)=>{"use strict";n.d(t,{l:()=>s});var r=n(7294),o=n(8022),a=n(4996),i=n(6278);function s(){const{withBaseUrl:e}=(0,a.C)(),{algolia:{externalUrlRegex:t,replaceSearchResultPathname:n}}=(0,i.L)();return(0,r.useCallback)((r=>{const a=new URL(r);if((0,o.F)(t,a.href))return r;const i=`${a.pathname+a.hash}`;return e(function(e,t){return t?e.replaceAll(new RegExp(t.from,"g"),t.to):e}(i,n))}),[e,t,n])}},8802:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[o]=e.split(/[#?]/),a="/"===o||o===r?o:(i=o,n?function(e){return e.endsWith("/")?e:`${e}/`}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(o,a)}},4143:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},8780:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var o=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(o).default}});var a=n(4143);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return a.getErrorCausalChain}})},9318:(e,t,n)=>{"use strict";n.d(t,{lX:()=>w,q_:()=>C,ob:()=>f,PP:()=>j,Ep:()=>p});var r=n(7462);function o(e){return"/"===e.charAt(0)}function a(e,t){for(var n=t,r=n+1,o=e.length;r=0;p--){var f=i[p];"."===f?a(i,p):".."===f?(a(i,p),d++):d&&(a(i,p),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&o(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};var s=n(8776);function l(e){return"/"===e.charAt(0)?e:"/"+e}function c(e){return"/"===e.charAt(0)?e.substr(1):e}function u(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function p(e){var t=e.pathname,n=e.search,r=e.hash,o=t||"/";return n&&"?"!==n&&(o+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(o+="#"===r.charAt(0)?r:"#"+r),o}function f(e,t,n,o){var a;"string"==typeof e?(a=function(e){var t=e||"/",n="",r="",o=t.indexOf("#");-1!==o&&(r=t.substr(o),t=t.substr(0,o));var a=t.indexOf("?");return-1!==a&&(n=t.substr(a),t=t.substr(0,a)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),a.state=t):(void 0===(a=(0,r.Z)({},e)).pathname&&(a.pathname=""),a.search?"?"!==a.search.charAt(0)&&(a.search="?"+a.search):a.search="",a.hash?"#"!==a.hash.charAt(0)&&(a.hash="#"+a.hash):a.hash="",void 0!==t&&void 0===a.state&&(a.state=t));try{a.pathname=decodeURI(a.pathname)}catch(s){throw s instanceof URIError?new URIError('Pathname "'+a.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):s}return n&&(a.key=n),o?a.pathname?"/"!==a.pathname.charAt(0)&&(a.pathname=i(a.pathname,o.pathname)):a.pathname=o.pathname:a.pathname||(a.pathname="/"),a}function m(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,o){if(null!=e){var a="function"==typeof e?e(t,n):e;"string"==typeof a?"function"==typeof r?r(a,o):o(!0):o(!1!==a)}else o(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,o):n.push(o),d({action:r,location:o,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",o=f(e,t,h(),w.location);u.confirmTransitionTo(o,r,n,(function(e){e&&(w.entries[w.index]=o,d({action:r,location:o}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(9864),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},a={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function l(e){return r.isMemo(e)?i:s[e.$$typeof]||o}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[r.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var o=f(n);o&&o!==m&&e(t,o,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var s=l(t),h=l(n),b=0;b{"use strict";e.exports=function(e,t,n,r,o,a,i,s){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,o,a,i,s],u=0;(l=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},2497:(e,t,n)=>{"use strict";n.r(t)},2295:(e,t,n)=>{"use strict";n.r(t)},4865:function(e,t,n){var r,o;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function o(e,t,n){return en?n:e}function a(e){return 100*(-1+e)}function i(e,t,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+a(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+a(e)+"%,0)"}:{"margin-left":a(e)+"%"}).transition="all "+t+"ms "+n,o}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=o(e,r.minimum,1),n.status=1===e?null:e;var a=n.render(!t),c=a.querySelector(r.barSelector),u=r.speed,d=r.easing;return a.offsetWidth,s((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),l(c,i(e,u,d)),1===e?(l(a,{transition:"none",opacity:1}),a.offsetWidth,setTimeout((function(){l(a,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*o(Math.random()*t,.1,.95)),t=o(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var o,i=t.querySelector(r.barSelector),s=e?"-100":a(n.status||0),c=document.querySelector(r.parent);return l(i,{transition:"all 0 linear",transform:"translate3d("+s+"%,0,0)"}),r.showSpinner||(o=t.querySelector(r.spinnerSelector))&&f(o),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var s=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),l=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,o=e.length,a=t.charAt(0).toUpperCase()+t.slice(1);o--;)if((r=e[o]+a)in n)return r;return t}function o(e){return e=n(e),t[e]||(t[e]=r(e))}function a(e,t,n){t=o(t),e.style[t]=n}return function(e,t){var n,r,o=arguments;if(2==o.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&a(e,n,r);else a(e,o[1],o[2])}}();function c(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=p(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(o="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=o)},4779:(e,t,n)=>{var r=n(5826);e.exports=f,e.exports.parse=a,e.exports.compile=function(e,t){return s(a(e,t),t)},e.exports.tokensToFunction=s,e.exports.tokensToRegExp=p;var o=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function a(e,t){for(var n,r=[],a=0,i=0,s="",u=t&&t.delimiter||"/";null!=(n=o.exec(e));){var d=n[0],p=n[1],f=n.index;if(s+=e.slice(i,f),i=f+d.length,p)s+=p[1];else{var m=e[i],h=n[2],b=n[3],g=n[4],y=n[5],v=n[6],w=n[7];s&&(r.push(s),s="");var k=null!=h&&null!=m&&m!==h,x="+"===v||"*"===v,S="?"===v||"*"===v,_=n[2]||u,E=g||y;r.push({name:b||a++,prefix:h||"",delimiter:_,optional:S,repeat:x,partial:k,asterisk:!!w,pattern:E?c(E):w?".*":"[^"+l(_)+"]+?"})}}return i{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:["sh","shell"],aliasTitles:{sh:"Shell",shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bbj:{title:"BBj",owner:"hyyan"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},bqn:{title:"BQN",owner:"yewscion"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},cilkc:{title:"Cilk/C",require:"c",alias:"cilk-c",owner:"OpenCilk"},cilkcpp:{title:"Cilk/C++",require:"cpp",alias:["cilk-cpp","cilk"],owner:"OpenCilk"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},gradle:{title:"Gradle",require:"clike",owner:"zeabdelkhalek-badido18"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},metafont:{title:"METAFONT",owner:"LaeriExNihilo"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (SCSS)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wgsl:{title:"WGSL",owner:"Dr4gonthree"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to WebPlatform.org documentation. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (.comment can become .namespace--comment) or replace them with your defined ones (like .editor__comment). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the highlightAll and highlightAllUnder methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},2885:(e,t,n)=>{const r=n(9901),o=n(9642),a=new Set;function i(e){void 0===e?e=Object.keys(r.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...a,...Object.keys(Prism.languages)];o(r,e,t).load((e=>{if(!(e in r.languages))return void(i.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(6500).resolve(t)],delete Prism.languages[e],n(6500)(t),a.add(e)}))}i.silent=!1,e.exports=i},6854:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,o,a){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(o,(function(e){if("function"==typeof a&&!a(e))return e;for(var o,s=i.length;-1!==n.code.indexOf(o=t(r,s));)++s;return i[s]=e,o})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var o=0,a=Object.keys(n.tokenStack);!function i(s){for(var l=0;l=a.length);l++){var c=s[l];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=a[o],d=n.tokenStack[u],p="string"==typeof c?c:c.content,f=t(r,u),m=p.indexOf(f);if(m>-1){++o;var h=p.substring(0,m),b=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),g=p.substring(m+f.length),y=[];h&&y.push.apply(y,i([h])),y.push(b),g&&y.push.apply(y,i([g])),"string"==typeof c?s.splice.apply(s,[l,1].concat(y)):c.content=y}}else c.content&&i(c.content)}return s}(n.tokens)}}}})}(Prism)},6726:(e,t,n)=>{var r={"./":2885};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=6726},6500:(e,t,n)=>{var r={"./":2885};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=6500},9642:e=>{"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,r=e.length;n "));var s={},l=e[r];if(l){function c(t){if(!(t in e))throw new Error(r+" depends on an unknown component "+t);if(!(t in s))for(var i in o(t,a),s[t]=!0,n[t])s[i]=!0}t(l.require,c),t(l.optional,c),t(l.modify,c)}n[r]=s,a.pop()}}return function(e){var t=n[e];return t||(o(e,r),t=n[e]),t}}function o(e){for(var t in e)return!0;return!1}return function(a,i,s){var l=function(e){var t={};for(var n in e){var r=e[n];for(var o in r)if("meta"!=o){var a=r[o];t[o]="string"==typeof a?{title:a}:a}}return t}(a),c=function(e){var n;return function(r){if(r in e)return r;if(!n)for(var o in n={},e){var a=e[o];t(a&&a.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+o+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+o+" because it is a component.");n[t]=o}))}return n[r]||r}}(l);i=i.map(c),s=(s||[]).map(c);var u=n(i),d=n(s);i.forEach((function e(n){var r=l[n];t(r&&r.require,(function(t){t in d||(u[t]=!0,e(t))}))}));for(var p,f=r(l),m=u;o(m);){for(var h in p={},m){var b=l[h];t(b&&b.modify,(function(e){e in d&&(p[e]=!0)}))}for(var g in d)if(!(g in u))for(var y in f(g))if(y in u){p[g]=!0;break}for(var v in m=p)u[v]=!0}var w={getIds:function(){var e=[];return w.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,r,o){var a=o?o.series:void 0,i=o?o.parallel:e,s={},l={};function c(e){if(e in s)return s[e];l[e]=!0;var o,u=[];for(var d in t(e))d in n&&u.push(d);if(0===u.length)o=r(e);else{var p=i(u.map((function(e){var t=c(e);return delete l[e],t})));a?o=a(p,(function(){return r(e)})):r(e)}return s[e]=o}for(var u in n)c(u);var d=[];for(var p in l)d.push(s[p]);return i(d)}(f,u,t,n)}};return w}}();e.exports=t},2703:(e,t,n)=>{"use strict";var r=n(414);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,i){if(i!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return n.PropTypes=n,n}},5697:(e,t,n)=>{e.exports=n(2703)()},414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4448:(e,t,n)=>{"use strict";var r=n(7294),o=n(3840);function a(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n