Please contact the owner of the site that linked you to the original URL and let them know their link is broken.
\ No newline at end of file
diff --git a/CNAME b/CNAME
deleted file mode 100644
index 87c35431d..000000000
--- a/CNAME
+++ /dev/null
@@ -1 +0,0 @@
-komo.do
\ No newline at end of file
diff --git a/assets/css/styles.d7cba00c.css b/assets/css/styles.d7cba00c.css
deleted file mode 100644
index 2d61fd19d..000000000
--- a/assets/css/styles.d7cba00c.css
+++ /dev/null
@@ -1 +0,0 @@
-.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown li,body{word-wrap:break-word}body,ol ol,ol ul,ul ol,ul ul{margin:0}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}.clean-list,.containsTaskList_mC6p,.details_lb9f>summary,.dropdown__menu,.menu__list{list-style:none}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:#0000;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:#0000000d;--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 #0000001a;--ifm-global-shadow-md:0 5px 40px #0003;--ifm-global-shadow-tl:0 12px 28px 0 #0003,0 2px 4px 0 #0000001a;--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:#0000;--ifm-table-stripe-background:#00000008;--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem;--docusaurus-progress-bar-color:var(--ifm-color-primary);--ifm-color-primary:#2e8555;--ifm-color-primary-dark:#29784c;--ifm-color-primary-darker:#277148;--ifm-color-primary-darkest:#205d3b;--ifm-color-primary-light:#33925d;--ifm-color-primary-lighter:#359962;--ifm-color-primary-lightest:#3cad6e;--ifm-code-font-size:95%;--docusaurus-highlighted-code-line-bg:#0000001a;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300);--docusaurus-announcement-bar-height:auto;--docusaurus-collapse-button-bg:#0000;--docusaurus-collapse-button-bg-hover:#0000001a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:#0000}*{box-sizing:border-box}html{background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;-webkit-text-size-adjust:100%;text-size-adjust:100%}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none,.tabItem_LNqP{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_NmtK,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid #0000001a;border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:initial;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{max-width:100%}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul,.tabList__CuJ{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical)}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){-webkit-text-decoration:none;text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary,.wordWrapButtonEnabled_EoeP .wordWrapButtonIcon_Bwma{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.admonitionHeading_Gvgb,.alert__heading,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);overflow:hidden;width:var(--ifm-avatar-photo-size)}.card--full-height,.navbar__logo img,body,html{height:100%}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:any-link:hover,.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].breadcrumbs__link:hover{background:var(--ifm-breadcrumb-item-background-active);-webkit-text-decoration:none;text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;-webkit-user-select:none;user-select:none;white-space:nowrap}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:#0000;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.dropdown__link--active,.dropdown__link:hover,.menu__link:hover,.navbar__brand:hover,.navbar__link--active,.navbar__link:hover,.pagination-nav__link:hover,.pagination__link:hover,.tag_zVej:hover{-webkit-text-decoration:none;text-decoration:none}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column;overflow:hidden}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);-webkit-text-decoration:none;text-decoration:none}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus,.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(-1px);visibility:visible}#nprogress,.dropdown__menu,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem;white-space:nowrap}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color)}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor #0000;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:var(--ifm-footer-logo-max-width)}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.docItemContainer_Djhp article>:first-child,.docItemContainer_Djhp header+*,.footer__item{margin-top:0}.admonitionContent_BuS1>:last-child,.cardContainer_fWXF :last-child,.collapsibleContent_i85q p:last-child,.details_lb9f>summary>p:last-child,.footer__items,.tabItem_Ymn6>:last-child{margin-bottom:0}.codeBlockStandalone_MEMb,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;top:0;visibility:hidden;left:0}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color)}.menu__caret:before,.menu__link--sublist-caret:after{height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;filter:var(--ifm-menu-link-sublist-icon-filter);content:""}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color)}.announcementBarContent_xLdY,.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem;margin-right:.5rem}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center .navbar__brand{margin:0}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__items--right>:last-child{padding-right:0}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color)}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:#ffffff1a;--ifm-navbar-search-input-placeholder-color:#ffffff80;color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:#ffffff0d;--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:1rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);position:fixed;transform:translate3d(-100%,0,0);transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:#0009;position:fixed;right:0;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav{display:grid;grid-gap:var(--ifm-spacing-horizontal);gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover)}.pagination-nav__link--next{grid-column:2/3;text-align:right}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"ยซ "}.pagination-nav__link--next .pagination-nav__label:after{content:" ยป"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs,:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto}.tabs__item{border-bottom:3px solid #0000;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}[data-theme=dark]{--ifm-color-primary:#25c2a0;--ifm-color-primary-dark:#21af90;--ifm-color-primary-darker:#1fa588;--ifm-color-primary-darkest:#1a8870;--ifm-color-primary-light:#29d5b0;--ifm-color-primary-lighter:#32d8b4;--ifm-color-primary-lightest:#4fddbf;--docusaurus-highlighted-code-line-bg:#0000004d}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color)}.tagRegular_sFm0{border-radius:var(--ifm-global-radius);font-size:90%;padding:.2rem .5rem .3rem}.tagWithCount_h2kH{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_h2kH:after,.tagWithCount_h2kH:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_h2kH:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_h2kH:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_h2kH span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}.lastUpdated_JAkA{font-size:smaller;font-style:italic;margin-top:.2rem}.tocCollapsibleButton_TO0P{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.tocCollapsibleButton_TO0P:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleButtonExpanded_MG3E:after,.tocCollapsibleExpanded_sAul{transform:none}.tocCollapsible_ETCw{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.tocCollapsibleContent_vkbj a{display:block}.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.backToTopButton_sjWU:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible}.codeBlockContainer_Ckt0{border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlockContent_biex{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_Ktv7{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlock_bY9V{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockTitle_Ktv7+.codeBlockContent_biex .codeBlock_bY9V{border-top-left-radius:0;border-top-right-radius:0}.codeBlockLines_e6Vv{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_o6Pm{display:table;padding:var(--ifm-pre-padding) 0}.buttonGroup__atx{column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup__atx button{align-items:center;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;line-height:0;opacity:0;padding:.4rem;transition:opacity var(--ifm-transition-fast) ease-in-out}.buttonGroup__atx button:focus-visible,.buttonGroup__atx button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup__atx button{opacity:.4}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.codeLine_lJS_{counter-increment:a;display:table-row}.codeLineNumber_Tfdd{background:var(--ifm-pre-background);display:table-cell;left:0;overflow-wrap:normal;padding:0 var(--ifm-pre-padding);position:sticky;text-align:right;width:1%}.codeLineNumber_Tfdd:before{content:counter(a);opacity:.4}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.theme-code-block:hover .copyButtonCopied_obH4{opacity:1!important}.copyButtonIcons_eSgA{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_y97N,.copyButtonSuccessIcon_LjdS{left:0;position:absolute;top:0;fill:currentColor;height:inherit;opacity:inherit;transition:all var(--ifm-transition-fast) ease;width:inherit}.copyButtonSuccessIcon_LjdS{color:#00d600;left:50%;opacity:0;top:50%;transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_obH4 .copyButtonIcon_y97N{opacity:0;transform:scale(.33)}.copyButtonCopied_obH4 .copyButtonSuccessIcon_LjdS{opacity:1;transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.skipToContent_fXgn{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem;z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_CVFx{line-height:0;padding:0}.content_knG7{font-size:85%;padding:5px 0;text-align:center}.content_knG7 a{color:inherit;-webkit-text-decoration:underline;text-decoration:underline}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}#__docusaurus-base-url-issue-banner-container,.docSidebarContainer_YfHR,.navbarSearchContainer_Bca1:empty,.sidebarLogo_isFc,.themedComponent_mlkZ,[data-theme=dark] .lightToggleIcon_pyhR,[data-theme=light] .darkToggleIcon_wfgR,html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px}.toggle_vylO{height:2rem;width:2rem}.toggleButton_gllP{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.toggleButton_gllP:hover{background:var(--ifm-color-emphasis-200)}.toggleButtonDisabled_aARS{cursor:not-allowed}.darkNavbarColorModeToggle_X3D1:hover{background:var(--ifm-color-gray-800)}[data-theme=dark] .themedComponent--dark_xIcU,[data-theme=light] .themedComponent--light_NVdE,html:not([data-theme]) .themedComponent--light_NVdE{display:initial}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.collapseSidebarButton_PEFL{display:none;margin:0}.iconExternalLink_nPIU{margin-left:.3rem}.docMainContainer_TBSr,.docRoot_UBD9{display:flex;width:100%}.docsWrapper_hBAB{display:flex;flex:1 0 auto}.dropdownNavbarItemMobile_S0Fm{cursor:pointer}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_jGov{transform:translate3d(0,calc(-100% - 2px),0)}.errorBoundaryError_a6uf{color:red;white-space:pre-wrap}.errorBoundaryFallback_VBag{color:red;padding:.55rem}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.footerLogoLink_BH7S:hover,.hash-link:focus,:hover>.hash-link{opacity:1}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}.anchorWithStickyNavbar_LWe7{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_WYt5{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;user-select:none}.hash-link:before{content:"#"}.mainWrapper_z2l0{display:flex;flex:1 0 auto;flex-direction:column}.docusaurus-mt-lg{margin-top:3rem}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;padding-left:1rem;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{border-color:#0000 #0000 #0000 var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;transform:rotate(0);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.details_b_Ee{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}.img_ev3q{height:auto}.admonition_xJq3{margin-bottom:1em}.admonitionHeading_Gvgb{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family)}.admonitionHeading_Gvgb:not(:last-child){margin-bottom:.3rem}.admonitionHeading_Gvgb code{text-transform:none}.admonitionIcon_Rf37{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_Rf37 svg{display:inline-block;height:1.6em;width:1.6em;fill:var(--ifm-alert-foreground-color)}.breadcrumbHomeIcon_YNFT{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}.features_t9lD{align-items:center;display:flex;padding:4rem 0;width:100%}.featureSvg_GfXr{height:200px;width:200px}.heroBanner_qdFl{overflow:hidden;padding:4rem 0;position:relative;text-align:center}.buttons_AeoN{display:grid;gap:1rem;grid-template-columns:1fr 1fr;width:fit-content}.cardContainer_fWXF{--ifm-link-color:var(--ifm-color-emphasis-800);--ifm-link-hover-color:var(--ifm-color-emphasis-700);--ifm-link-hover-decoration:none;border:1px solid var(--ifm-color-emphasis-200);box-shadow:0 1.5px 3px 0 #00000026;transition:all var(--ifm-transition-fast) ease;transition-property:border,box-shadow}.cardContainer_fWXF:hover{border-color:var(--ifm-color-primary);box-shadow:0 3px 6px 0 #0003}.cardTitle_rnsV{font-size:1.2rem}.cardDescription_PWke{font-size:.8rem}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_TmdG{background-color:var(--docusaurus-collapse-button-bg)}.lastUpdated_JAkA{text-align:right}.tocMobile_ITEo{display:none}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.collapseSidebarButton_PEFL{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:sticky}.collapseSidebarButtonIcon_kv0_{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_i1dp,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_TmdG:focus,.expandButton_TmdG:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_SIkG{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_GW3s{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_njMd{display:flex;flex-direction:column;height:100%;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_wUlq{padding-top:0}.sidebarHidden_VK0M{opacity:0;visibility:hidden}.sidebarLogo_isFc{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);-webkit-text-decoration:none!important;text-decoration:none!important}.sidebarLogo_isFc img{height:2rem;margin-right:.5rem}.expandButton_TmdG{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;right:0;top:0;transition:background-color var(--ifm-transition-fast) ease;width:100%}[dir=rtl] .expandButtonIcon_i1dp{transform:rotate(180deg)}.docSidebarContainer_YfHR{border-right:1px solid var(--ifm-toc-border-color);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_DPk8{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_aRkj{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_TBSr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_lQrH{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_JWYK{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}.navbarSearchContainer_Bca1{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.docItemCol_VOVn{max-width:75%!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_DEke,.footer__link-separator,.navbar__item,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block;width:max-content}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.docItemContainer_F8PC{padding:0 .3rem}.navbarSearchContainer_Bca1{position:absolute;right:var(--ifm-navbar-padding-horizontal)}}@media screen and (max-width:996px){.heroBanner_qdFl{padding:2rem}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0ms;--ifm-transition-slow:0ms}}@media print{.announcementBar_mb4j,.footer,.menu,.navbar,.pagination-nav,.table-of-contents,.tocMobile_ITEo{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_e6Vv{white-space:pre-wrap}}
\ No newline at end of file
diff --git a/assets/css/styles.ec6293c3.css b/assets/css/styles.ec6293c3.css
new file mode 100644
index 000000000..fcecbd0f9
--- /dev/null
+++ b/assets/css/styles.ec6293c3.css
@@ -0,0 +1 @@
+.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown li,body{word-wrap:break-word}body,ol ol,ol ul,ul ol,ul ul{margin:0}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}.clean-list,.containsTaskList_mC6p,.details_lb9f>summary,.dropdown__menu,.menu__list{list-style:none}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:#0000;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:#0000000d;--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 #0000001a;--ifm-global-shadow-md:0 5px 40px #0003;--ifm-global-shadow-tl:0 12px 28px 0 #0003,0 2px 4px 0 #0000001a;--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:#0000;--ifm-table-stripe-background:#00000008;--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem;--docusaurus-progress-bar-color:var(--ifm-color-primary);--ifm-color-primary:#2e8555;--ifm-color-primary-dark:#29784c;--ifm-color-primary-darker:#277148;--ifm-color-primary-darkest:#205d3b;--ifm-color-primary-light:#33925d;--ifm-color-primary-lighter:#359962;--ifm-color-primary-lightest:#3cad6e;--ifm-code-font-size:95%;--docusaurus-highlighted-code-line-bg:#0000001a;--docusaurus-announcement-bar-height:auto;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300);--docusaurus-collapse-button-bg:#0000;--docusaurus-collapse-button-bg-hover:#0000001a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:#0000}*{box-sizing:border-box}html{background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;-webkit-text-size-adjust:100%;text-size-adjust:100%}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none,.tabItem_LNqP{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_NmtK,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid #0000001a;border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:initial;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{max-width:100%}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul,.tabList__CuJ{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical)}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){-webkit-text-decoration:none;text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary,.wordWrapButtonEnabled_uzNF .wordWrapButtonIcon_b1P5{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.admonitionHeading_Gvgb,.alert__heading,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);overflow:hidden;width:var(--ifm-avatar-photo-size)}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:any-link:hover,.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].breadcrumbs__link:hover{background:var(--ifm-breadcrumb-item-background-active);-webkit-text-decoration:none;text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;-webkit-user-select:none;user-select:none;white-space:nowrap}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:#0000;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.dropdown__link--active,.dropdown__link:hover,.menu__link:hover,.navbar__brand:hover,.navbar__link--active,.navbar__link:hover,.pagination-nav__link:hover,.pagination__link:hover,.tag_zVej:hover{-webkit-text-decoration:none;text-decoration:none}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column;overflow:hidden}.card--full-height{height:100%}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);-webkit-text-decoration:none;text-decoration:none}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus,.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(-1px);visibility:visible}#nprogress,.dropdown__menu,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem;white-space:nowrap}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color)}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor #0000;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:var(--ifm-footer-logo-max-width)}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.docItemContainer_Djhp article>:first-child,.docItemContainer_Djhp header+*,.footer__item{margin-top:0}.admonitionContent_BuS1>:last-child,.cardContainer_fWXF :last-child,.collapsibleContent_i85q p:last-child,.details_lb9f>summary>p:last-child,.footer__items,.tabItem_Ymn6>:last-child{margin-bottom:0}.codeBlockStandalone_MEMb,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color)}.menu__caret:before,.menu__link--sublist-caret:after{height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;filter:var(--ifm-menu-link-sublist-icon-filter);content:""}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;position:fixed;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;left:0;top:0;visibility:hidden}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color)}.announcementBarContent_xLdY,.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem;margin-right:.5rem}.docCardListItem_W1sv>*,.navbar__logo img,body,html{height:100%}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center .navbar__brand{margin:0}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color)}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:#ffffff1a;--ifm-navbar-search-input-placeholder-color:#ffffff80;color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:#ffffff0d;--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:1rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);transform:translate3d(-100%,0,0);transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:#0009;right:0;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav{display:grid;grid-gap:var(--ifm-spacing-horizontal);gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover)}.pagination-nav__link--next{grid-column:2/3;text-align:right}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"ยซ "}.pagination-nav__link--next .pagination-nav__label:after{content:" ยป"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs,:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto}.tabs__item{border-bottom:3px solid #0000;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}[data-theme=dark]{--ifm-color-primary:#25c2a0;--ifm-color-primary-dark:#21af90;--ifm-color-primary-darker:#1fa588;--ifm-color-primary-darkest:#1a8870;--ifm-color-primary-light:#29d5b0;--ifm-color-primary-lighter:#32d8b4;--ifm-color-primary-lightest:#4fddbf;--docusaurus-highlighted-code-line-bg:#0000004d}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}#__docusaurus-base-url-issue-banner-container,.docSidebarContainer_YfHR,.navbarSearchContainer_Bca1:empty,.sidebarLogo_isFc,.themedComponent_mlkZ,.toggleIcon_g3eP,html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.skipToContent_fXgn{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem;z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_CVFx{line-height:0;padding:0}.content_knG7{font-size:85%;padding:5px 0;text-align:center}.content_knG7 a{color:inherit;-webkit-text-decoration:underline;text-decoration:underline}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px}.toggle_vylO{height:2rem;width:2rem}.toggleButton_gllP{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.toggleButton_gllP:hover{background:var(--ifm-color-emphasis-200)}[data-theme-choice=dark] .darkToggleIcon_wfgR,[data-theme-choice=light] .lightToggleIcon_pyhR,[data-theme-choice=system] .systemToggleIcon_QzmC,[data-theme=dark] .themedComponent--dark_xIcU,[data-theme=light] .themedComponent--light_NVdE,html:not([data-theme]) .themedComponent--light_NVdE{display:initial}.toggleButtonDisabled_aARS{cursor:not-allowed}.darkNavbarColorModeToggle_X3D1:hover{background:var(--ifm-color-gray-800)}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color)}.tagRegular_sFm0{border-radius:var(--ifm-global-radius);font-size:90%;padding:.2rem .5rem .3rem}.tagWithCount_h2kH{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_h2kH:after,.tagWithCount_h2kH:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_h2kH:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_h2kH:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_h2kH span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}.lastUpdated_JAkA{font-size:smaller;font-style:italic;margin-top:.2rem}.tocCollapsibleButton_TO0P{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.tocCollapsibleButton_TO0P:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleButtonExpanded_MG3E:after,.tocCollapsibleExpanded_sAul{transform:none}.tocCollapsible_ETCw{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.tocCollapsibleContent_vkbj a{display:block}.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.backToTopButton_sjWU:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.collapseSidebarButton_PEFL{display:none;margin:0}.iconExternalLink_nPIU{margin-left:.3rem}.dropdownNavbarItemMobile_J0Sd{cursor:pointer}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_jGov{transform:translate3d(0,calc(-100% - 2px),0)}.errorBoundaryError_a6uf{color:red;white-space:pre-wrap}.errorBoundaryFallback_VBag{color:red;padding:.55rem}.buttonGroup_M5ko button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.navbar__items--right>:last-child{padding-right:0}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.footerLogoLink_BH7S:hover,.hash-link:focus,:hover>.hash-link{opacity:1}.docMainContainer_TBSr,.docRoot_UBD9{display:flex;width:100%}.docsWrapper_hBAB{display:flex;flex:1 0 auto}.anchorWithStickyNavbar_LWe7{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_WYt5{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;user-select:none}.hash-link:before{content:"#"}.mainWrapper_z2l0{display:flex;flex:1 0 auto;flex-direction:column}.docusaurus-mt-lg{margin-top:3rem}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.codeBlockContainer_Ckt0{border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlock_bY9V{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockLines_e6Vv{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_o6Pm{display:table;padding:var(--ifm-pre-padding) 0}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.codeLine_lJS_{counter-increment:a;display:table-row}.codeLineNumber_Tfdd{background:var(--ifm-pre-background);display:table-cell;left:0;overflow-wrap:normal;padding:0 var(--ifm-pre-padding);position:sticky;text-align:right;width:1%}.codeLineNumber_Tfdd:before{content:counter(a);opacity:.4}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.theme-code-block:hover .copyButtonCopied_Vdqa{opacity:1!important}.copyButtonIcons_IEyt{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_TrPX,.copyButtonSuccessIcon_cVMy{left:0;position:absolute;top:0;fill:currentColor;height:inherit;opacity:inherit;transition:all var(--ifm-transition-fast) ease;width:inherit}.copyButtonSuccessIcon_cVMy{color:#00d600;left:50%;opacity:0;top:50%;transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_Vdqa .copyButtonIcon_TrPX{opacity:0;transform:scale(.33)}.copyButtonCopied_Vdqa .copyButtonSuccessIcon_cVMy{opacity:1;transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.wordWrapButtonIcon_b1P5{height:1.2rem;width:1.2rem}.buttonGroup_M5ko{column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup_M5ko button{align-items:center;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;line-height:0;opacity:0;padding:.4rem;transition:opacity var(--ifm-transition-fast) ease-in-out}.buttonGroup_M5ko button:focus-visible,.buttonGroup_M5ko button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup_M5ko button{opacity:.4}.codeBlockContent_QJqH{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_OeMC{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlockTitle_OeMC+.codeBlockContent_QJqH .codeBlock_a8dz{border-top-left-radius:0;border-top-right-radius:0}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;padding-left:1rem;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{border-color:#0000 #0000 #0000 var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;transform:rotate(0);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.details_b_Ee{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}.img_ev3q{height:auto}.admonition_xJq3{margin-bottom:1em}.admonitionHeading_Gvgb{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family)}.admonitionHeading_Gvgb:not(:last-child){margin-bottom:.3rem}.admonitionHeading_Gvgb code{text-transform:none}.admonitionIcon_Rf37{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_Rf37 svg{display:inline-block;height:1.6em;width:1.6em;fill:var(--ifm-alert-foreground-color)}.breadcrumbHomeIcon_YNFT{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}.features_t9lD{align-items:center;display:flex;padding:4rem 0;width:100%}.featureSvg_GfXr{height:200px;width:200px}.heroBanner_qdFl{overflow:hidden;padding:4rem 0;position:relative;text-align:center}.buttons_AeoN{display:grid;gap:1rem;grid-template-columns:1fr 1fr;width:fit-content}.cardContainer_fWXF{--ifm-link-color:var(--ifm-color-emphasis-800);--ifm-link-hover-color:var(--ifm-color-emphasis-700);--ifm-link-hover-decoration:none;border:1px solid var(--ifm-color-emphasis-200);box-shadow:0 1.5px 3px 0 #00000026;transition:all var(--ifm-transition-fast) ease;transition-property:border,box-shadow}.cardContainer_fWXF:hover{border-color:var(--ifm-color-primary);box-shadow:0 3px 6px 0 #0003}.cardTitle_rnsV{font-size:1.2rem}.cardDescription_PWke{font-size:.8rem}.docCardListItem_W1sv{margin-bottom:2rem}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_TmdG{background-color:var(--docusaurus-collapse-button-bg)}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.lastUpdated_JAkA{text-align:right}.tocMobile_ITEo{display:none}.collapseSidebarButton_PEFL{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:sticky}.collapseSidebarButtonIcon_kv0_{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_i1dp,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_TmdG:focus,.expandButton_TmdG:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.navbarSearchContainer_Bca1{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_SIkG{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_GW3s{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_njMd{display:flex;flex-direction:column;height:100%;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_wUlq{padding-top:0}.sidebarHidden_VK0M{opacity:0;visibility:hidden}.sidebarLogo_isFc{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);-webkit-text-decoration:none!important;text-decoration:none!important}.sidebarLogo_isFc img{height:2rem;margin-right:.5rem}.expandButton_TmdG{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;right:0;top:0;transition:background-color var(--ifm-transition-fast) ease;width:100%}[dir=rtl] .expandButtonIcon_i1dp{transform:rotate(180deg)}.docSidebarContainer_YfHR{border-right:1px solid var(--ifm-toc-border-color);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_DPk8{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_aRkj{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_TBSr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_lQrH{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_JWYK{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}.docItemCol_VOVn{max-width:75%!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_DEke,.footer__link-separator,.navbar__item,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block;width:max-content}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.docItemContainer_F8PC{padding:0 .3rem}.navbarSearchContainer_Bca1{position:absolute;right:var(--ifm-navbar-padding-horizontal)}}@media screen and (max-width:996px){.heroBanner_qdFl{padding:2rem}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0ms;--ifm-transition-slow:0ms}}@media print{.announcementBar_mb4j,.footer,.menu,.navbar,.pagination-nav,.table-of-contents,.tocMobile_ITEo{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_e6Vv{white-space:pre-wrap}}
\ No newline at end of file
diff --git a/assets/js/0058b4c6.5b2eb54e.js b/assets/js/0058b4c6.5b2eb54e.js
deleted file mode 100644
index 405e1077d..000000000
--- a/assets/js/0058b4c6.5b2eb54e.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[849],{6164:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"docs":[{"type":"link","label":"What is Komodo?","href":"/docs/intro","docId":"intro","unlisted":false},{"type":"link","label":"Resources","href":"/docs/resources","docId":"resources","unlisted":false},{"type":"category","label":"Setup Komodo Core","items":[{"type":"link","label":"MongoDB","href":"/docs/setup/mongo","docId":"setup/mongo","unlisted":false},{"type":"link","label":"FerretDB","href":"/docs/setup/ferretdb","docId":"setup/ferretdb","unlisted":false},{"type":"link","label":"Advanced Configuration","href":"/docs/setup/advanced","docId":"setup/advanced","unlisted":false}],"collapsed":true,"collapsible":true,"href":"/docs/setup/"},{"type":"link","label":"Connect More Servers","href":"/docs/connect-servers","docId":"connect-servers","unlisted":false},{"type":"category","label":"Build Images","items":[{"type":"link","label":"Configuration","href":"/docs/build-images/configuration","docId":"build-images/configuration","unlisted":false},{"type":"link","label":"Pre-build command","href":"/docs/build-images/pre-build","docId":"build-images/pre-build","unlisted":false},{"type":"link","label":"Builders","href":"/docs/build-images/builders","docId":"build-images/builders","unlisted":false},{"type":"link","label":"Image Versioning","href":"/docs/build-images/versioning","docId":"build-images/versioning","unlisted":false}],"collapsed":true,"collapsible":true,"href":"/docs/build-images"},{"type":"category","label":"Deploy Containers","items":[{"type":"link","label":"Configuration","href":"/docs/deploy-containers/configuration","docId":"deploy-containers/configuration","unlisted":false},{"type":"link","label":"Container Management","href":"/docs/deploy-containers/lifetime-management","docId":"deploy-containers/lifetime-management","unlisted":false}],"collapsed":true,"collapsible":true,"href":"/docs/deploy-containers/"},{"type":"link","label":"Docker Compose","href":"/docs/docker-compose","docId":"docker-compose","unlisted":false},{"type":"link","label":"Variables and Secrets","href":"/docs/variables","docId":"variables","unlisted":false},{"type":"link","label":"Procedures and Actions","href":"/docs/procedures","docId":"procedures","unlisted":false},{"type":"link","label":"Permissioning","href":"/docs/permissioning","docId":"permissioning","unlisted":false},{"type":"link","label":"Sync Resources","href":"/docs/sync-resources","docId":"sync-resources","unlisted":false},{"type":"link","label":"Configuring Webhooks","href":"/docs/webhooks","docId":"webhooks","unlisted":false},{"type":"link","label":"Version Upgrades","href":"/docs/version-upgrades","docId":"version-upgrades","unlisted":false},{"type":"link","label":"API and Clients","href":"/docs/api","docId":"api","unlisted":false},{"type":"link","label":"Development","href":"/docs/development","docId":"development","unlisted":false},{"type":"link","label":"Other Resources","href":"/docs/other-resources","docId":"other-resources","unlisted":false}]},"docs":{"api":{"id":"api","title":"API and Clients","description":"Komodo Core exposes an RPC-like HTTP API to read data, write configuration, and execute actions.","sidebar":"docs"},"build-images/builders":{"id":"build-images/builders","title":"Builders","description":"A builder is a machine running the Komodo Periphery agent (and usually docker), which is able to handle a RunBuild / BuildRepo command from Komodo core. Any server connected to Komodo can be chosen as the builder for a build.","sidebar":"docs"},"build-images/configuration":{"id":"build-images/configuration","title":"Configuration","description":"Komodo just needs a bit of information in order to build your image.","sidebar":"docs"},"build-images/index":{"id":"build-images/index","title":"Building Images","description":"Komodo builds docker images by cloning the source repository from the configured git provider, running docker build,","sidebar":"docs"},"build-images/pre-build":{"id":"build-images/pre-build","title":"Pre-build command","description":"Sometimes a command needs to be run before running `docker build`, you can configure this in the pre build section.","sidebar":"docs"},"build-images/versioning":{"id":"build-images/versioning","title":"Image Versioning","description":"Komodo uses a major.minor.patch versioning scheme to Build versioning. By default, every RunBuild will auto increment the Build\'s version patch number, and push the image to docker hub with the version tag, as well as the latest tag. A tag containing the latest short commit hash at the time the repo was cloned will also be created.","sidebar":"docs"},"connect-servers":{"id":"connect-servers","title":"Connect More Servers","description":"Connecting a server to Komodo has 2 steps:","sidebar":"docs"},"deploy-containers/configuration":{"id":"deploy-containers/configuration","title":"Configuration","description":"Choose the docker image","sidebar":"docs"},"deploy-containers/index":{"id":"deploy-containers/index","title":"Deploy Containers","description":"Komodo can deploy any docker images that it can access with the configured docker accounts.","sidebar":"docs"},"deploy-containers/lifetime-management":{"id":"deploy-containers/lifetime-management","title":"Container Management","description":"The lifetime of a docker container is more like a virtual machine. They can be created, started, stopped, and destroyed. Komodo will display the state of the container and provides an API to manage all your container\'s lifetimes.","sidebar":"docs"},"development":{"id":"development","title":"Development","description":"If you are looking to contribute to Komodo, this page is a launching point for setting up your Komodo development environment.","sidebar":"docs"},"docker-compose":{"id":"docker-compose","title":"Docker Compose","description":"Komodo can deploy docker compose projects through the Stack resource.","sidebar":"docs"},"file-paths":{"id":"file-paths","title":"File Paths","description":"When working with Komodo, you might have to configure file or directory paths."},"intro":{"id":"intro","title":"What is Komodo?","description":"Komodo is a web app to provide structure for managing your servers, builds, deployments, and automated procedures.","sidebar":"docs"},"other-resources":{"id":"other-resources","title":"Other Resources","description":"Posts and Guides","sidebar":"docs"},"permissioning":{"id":"permissioning","title":"Permissioning","description":"Komodo has a granular, layer-based permissioning system to provide non-admin users access only to intended Resources.","sidebar":"docs"},"procedures":{"id":"procedures","title":"Procedures and Actions","description":"For orchestrations involving multiple Resources, Komodo offers the Procedure and Action resource types.","sidebar":"docs"},"resources":{"id":"resources","title":"Resources","description":"Komodo is extendible through the Resource abstraction. Entities like Server, Deployment, and Stack are all Komodo Resources.","sidebar":"docs"},"setup/advanced":{"id":"setup/advanced","title":"Advanced Configuration","description":"OIDC / Oauth2","sidebar":"docs"},"setup/ferretdb":{"id":"setup/ferretdb","title":"FerretDB","description":"- If you setup Komodo using Postgres or Sqlite options prior to Komodo v1.18.0, you are using FerretDB v1.","sidebar":"docs"},"setup/index":{"id":"setup/index","title":"Setup Komodo","description":"To run Komodo, you will need Docker. See the docker install docs.","sidebar":"docs"},"setup/mongo":{"id":"setup/mongo","title":"MongoDB","description":"MongoDB is the traditional database for Komodo.","sidebar":"docs"},"sync-resources":{"id":"sync-resources","title":"Sync Resources","description":"Komodo is able to create, update, delete, and deploy resources declared in TOML files by diffing them against the existing resources,","sidebar":"docs"},"variables":{"id":"variables","title":"Variables and Secrets","description":"A variable / secret in Komodo is just a key-value pair.","sidebar":"docs"},"version-upgrades":{"id":"version-upgrades","title":"Version Upgrades","description":"Most version upgrades only require a redeployment of the Core container after pulling the latest version, and are fully backward compatible with the periphery clients, which may be updated later on as convenient. This is the default, and will be the case unless specifically mentioned in the version release notes.","sidebar":"docs"},"webhooks":{"id":"webhooks","title":"Configuring Webhooks","description":"Multiple Komodo resources can take advantage of webhooks from your git provider. Komodo supports incoming webhooks using either the Github or Gitlab webhook authentication type, which is also supported by other providers like Gitea.","sidebar":"docs"}}}}')}}]);
\ No newline at end of file
diff --git a/assets/js/0058b4c6.a423bc5f.js b/assets/js/0058b4c6.a423bc5f.js
new file mode 100644
index 000000000..a5232b421
--- /dev/null
+++ b/assets/js/0058b4c6.a423bc5f.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[849],{6164:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"docs":[{"type":"link","label":"What is Komodo?","href":"/docs/intro","docId":"intro","unlisted":false},{"type":"category","label":"Setup","items":[{"type":"link","label":"MongoDB","href":"/docs/setup/mongo","docId":"setup/mongo","unlisted":false},{"type":"link","label":"FerretDB","href":"/docs/setup/ferretdb","docId":"setup/ferretdb","unlisted":false},{"type":"link","label":"Connect More Servers","href":"/docs/setup/connect-servers","docId":"setup/connect-servers","unlisted":false},{"type":"link","label":"Backup and Restore","href":"/docs/setup/backup","docId":"setup/backup","unlisted":false},{"type":"link","label":"Advanced Configuration","href":"/docs/setup/advanced","docId":"setup/advanced","unlisted":false},{"type":"link","label":"Version Upgrades","href":"/docs/setup/version-upgrades","docId":"setup/version-upgrades","unlisted":false}],"collapsed":true,"collapsible":true,"href":"/docs/setup/"},{"type":"category","label":"Resources","items":[{"type":"category","label":"Build Images","items":[{"type":"link","label":"Configuration","href":"/docs/resources/build-images/configuration","docId":"resources/build-images/configuration","unlisted":false},{"type":"link","label":"Pre-build command","href":"/docs/resources/build-images/pre-build","docId":"resources/build-images/pre-build","unlisted":false},{"type":"link","label":"Builders","href":"/docs/resources/build-images/builders","docId":"resources/build-images/builders","unlisted":false},{"type":"link","label":"Image Versioning","href":"/docs/resources/build-images/versioning","docId":"resources/build-images/versioning","unlisted":false}],"collapsed":true,"collapsible":true,"href":"/docs/build-images"},{"type":"category","label":"Deploy Containers","items":[{"type":"link","label":"Configuration","href":"/docs/resources/deploy-containers/configuration","docId":"resources/deploy-containers/configuration","unlisted":false},{"type":"link","label":"Container Management","href":"/docs/resources/deploy-containers/lifetime-management","docId":"resources/deploy-containers/lifetime-management","unlisted":false}],"collapsed":true,"collapsible":true,"href":"/docs/resources/deploy-containers/"},{"type":"link","label":"Docker Compose","href":"/docs/resources/docker-compose","docId":"resources/docker-compose","unlisted":false},{"type":"link","label":"Automatic Updates","href":"/docs/resources/auto-update","docId":"resources/auto-update","unlisted":false},{"type":"link","label":"Variables and Secrets","href":"/docs/resources/variables","docId":"resources/variables","unlisted":false},{"type":"link","label":"Procedures and Actions","href":"/docs/resources/procedures","docId":"resources/procedures","unlisted":false},{"type":"link","label":"Sync Resources","href":"/docs/resources/sync-resources","docId":"resources/sync-resources","unlisted":false},{"type":"link","label":"Configuring Webhooks","href":"/docs/resources/webhooks","docId":"resources/webhooks","unlisted":false},{"type":"link","label":"Permissioning","href":"/docs/resources/permissioning","docId":"resources/permissioning","unlisted":false}],"collapsed":true,"collapsible":true,"href":"/docs/resources/"},{"type":"category","label":"Ecosystem","items":[{"type":"link","label":"Komodo CLI","href":"/docs/ecosystem/cli","docId":"ecosystem/cli","unlisted":false},{"type":"link","label":"API and Clients","href":"/docs/ecosystem/api","docId":"ecosystem/api","unlisted":false},{"type":"link","label":"Community","href":"/docs/ecosystem/community","docId":"ecosystem/community","unlisted":false},{"type":"link","label":"Development","href":"/docs/ecosystem/development","docId":"ecosystem/development","unlisted":false}],"collapsed":true,"collapsible":true,"href":"/docs/ecosystem"}]},"docs":{"ecosystem/api":{"id":"ecosystem/api","title":"API and Clients","description":"Komodo Core exposes an RPC-like HTTP API to read data, write configuration, and execute actions.","sidebar":"docs"},"ecosystem/cli":{"id":"ecosystem/cli","title":"Komodo CLI","description":"The Komodo CLI, km, can be used to:","sidebar":"docs"},"ecosystem/community":{"id":"ecosystem/community","title":"Community","description":"3rd party tools","sidebar":"docs"},"ecosystem/development":{"id":"ecosystem/development","title":"Development","description":"If you are looking to contribute to Komodo, this page is a launching point for setting up your Komodo development environment.","sidebar":"docs"},"ecosystem/index":{"id":"ecosystem/index","title":"Ecosystem","description":"","sidebar":"docs"},"intro":{"id":"intro","title":"What is Komodo?","description":"Komodo is a web app to provide structure for managing your servers, builds, deployments, and automated procedures.","sidebar":"docs"},"resources/auto-update":{"id":"resources/auto-update","title":"Automatic Updates","description":"Starting from v1.19.0, new Komodo installs will automatically create the","sidebar":"docs"},"resources/build-images/builders":{"id":"resources/build-images/builders","title":"Builders","description":"A builder is a machine running the Komodo Periphery agent (and usually docker), which is able to handle a RunBuild / BuildRepo command from Komodo core. Any server connected to Komodo can be chosen as the builder for a build.","sidebar":"docs"},"resources/build-images/configuration":{"id":"resources/build-images/configuration","title":"Configuration","description":"Komodo just needs a bit of information in order to build your image.","sidebar":"docs"},"resources/build-images/index":{"id":"resources/build-images/index","title":"Building Images","description":"Komodo builds docker images by cloning the source repository from the configured git provider, running docker build,","sidebar":"docs"},"resources/build-images/pre-build":{"id":"resources/build-images/pre-build","title":"Pre-build command","description":"Sometimes a command needs to be run before running `docker build`, you can configure this in the pre build section.","sidebar":"docs"},"resources/build-images/versioning":{"id":"resources/build-images/versioning","title":"Image Versioning","description":"Komodo uses a major.minor.patch versioning scheme to Build versioning. By default, every RunBuild will auto increment the Build\'s version patch number, and push the image to docker hub with the version tag, as well as the latest tag. A tag containing the latest short commit hash at the time the repo was cloned will also be created.","sidebar":"docs"},"resources/deploy-containers/configuration":{"id":"resources/deploy-containers/configuration","title":"Configuration","description":"Choose the docker image","sidebar":"docs"},"resources/deploy-containers/index":{"id":"resources/deploy-containers/index","title":"Deploy Containers","description":"Komodo can deploy any docker images that it can access with the configured docker accounts.","sidebar":"docs"},"resources/deploy-containers/lifetime-management":{"id":"resources/deploy-containers/lifetime-management","title":"Container Management","description":"The lifetime of a docker container is more like a virtual machine. They can be created, started, stopped, and destroyed. Komodo will display the state of the container and provides an API to manage all your container\'s lifetimes.","sidebar":"docs"},"resources/docker-compose":{"id":"resources/docker-compose","title":"Docker Compose","description":"Komodo can deploy docker compose projects through the Stack resource.","sidebar":"docs"},"resources/index":{"id":"resources/index","title":"Resources","description":"Komodo is extendible through the Resource abstraction. Entities like Server, Deployment, and Stack are all Komodo Resources.","sidebar":"docs"},"resources/permissioning":{"id":"resources/permissioning","title":"Permissioning","description":"Komodo has a granular, layer-based permissioning system to provide non-admin users access only to intended Resources.","sidebar":"docs"},"resources/procedures":{"id":"resources/procedures","title":"Procedures and Actions","description":"For orchestrations involving multiple resources and executions,","sidebar":"docs"},"resources/sync-resources":{"id":"resources/sync-resources","title":"Sync Resources","description":"Komodo is able to create, update, delete, and deploy resources declared in TOML files by diffing them against the existing resources,","sidebar":"docs"},"resources/variables":{"id":"resources/variables","title":"Variables and Secrets","description":"A variable / secret in Komodo is just a key-value pair.","sidebar":"docs"},"resources/webhooks":{"id":"resources/webhooks","title":"Configuring Webhooks","description":"Multiple Komodo resources can take advantage of webhooks from your git provider. Komodo supports incoming webhooks using either the Github or Gitlab webhook authentication type, which is also supported by other providers like Gitea.","sidebar":"docs"},"setup/advanced":{"id":"setup/advanced","title":"Advanced Configuration","description":"OIDC / Oauth2","sidebar":"docs"},"setup/backup":{"id":"setup/backup","title":"Backup and Restore","description":"Database backup and restore is actually a function of the Komodo CLI,","sidebar":"docs"},"setup/connect-servers":{"id":"setup/connect-servers","title":"Connect More Servers","description":"Connecting a server to Komodo has 2 steps:","sidebar":"docs"},"setup/ferretdb":{"id":"setup/ferretdb","title":"FerretDB","description":"- If you setup Komodo using Postgres or Sqlite options prior to Komodo v1.18.0, you are using FerretDB v1.","sidebar":"docs"},"setup/index":{"id":"setup/index","title":"Setup Komodo Core","description":"To run Komodo, you will need Docker. See the docker install docs.","sidebar":"docs"},"setup/mongo":{"id":"setup/mongo","title":"MongoDB","description":"MongoDB is the standard database for Komodo.","sidebar":"docs"},"setup/version-upgrades":{"id":"setup/version-upgrades","title":"Version Upgrades","description":"Most version upgrades only require a redeployment of the Core container after pulling the latest version, and are fully backward compatible with the periphery clients, which may be updated later on as convenient. This is the default, and will be the case unless specifically mentioned in the version release notes.","sidebar":"docs"}}}}')}}]);
\ No newline at end of file
diff --git a/assets/js/0e384e19.27c88206.js b/assets/js/0e384e19.27c88206.js
deleted file mode 100644
index d5ecfedd7..000000000
--- a/assets/js/0e384e19.27c88206.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[976],{7879:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"intro","title":"What is Komodo?","description":"Komodo is a web app to provide structure for managing your servers, builds, deployments, and automated procedures.","source":"@site/docs/intro.md","sourceDirName":".","slug":"/intro","permalink":"/docs/intro","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/intro.md","tags":[],"version":"current","frontMatter":{"slug":"/intro"},"sidebar":"docs","next":{"title":"Resources","permalink":"/docs/resources"}}');var r=n(4848),i=n(8453);const t={slug:"/intro"},a="What is Komodo?",c={},d=[{value:"Docker",id:"docker",level:2},{value:"Architecture and Components",id:"architecture-and-components",level:2},{value:"Core",id:"core",level:3},{value:"Periphery",id:"periphery",level:3},{value:"Core API",id:"core-api",level:2},{value:"Permissioning",id:"permissioning",level:2}];function l(e){const o={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(o.header,{children:(0,r.jsx)(o.h1,{id:"what-is-komodo",children:"What is Komodo?"})}),"\n",(0,r.jsx)(o.p,{children:"Komodo is a web app to provide structure for managing your servers, builds, deployments, and automated procedures."}),"\n",(0,r.jsx)(o.p,{children:"With Komodo you can:"}),"\n",(0,r.jsxs)(o.ul,{children:["\n",(0,r.jsx)(o.li,{children:"Connect all of your servers, alert on CPU usage, memory usage, and disk usage, and connect to shell sessions."}),"\n",(0,r.jsx)(o.li,{children:"Create, start, stop, and restart Docker containers on the connected servers, view their status and logs, and connect to container shell."}),"\n",(0,r.jsx)(o.li,{children:"Deploy docker compose stacks. The file can be defined in UI, or in a git repo, with auto deploy on git push."}),"\n",(0,r.jsx)(o.li,{children:"Build application source into auto-versioned Docker images, auto built on webhook. Deploy single-use AWS instances for infinite capacity."}),"\n",(0,r.jsx)(o.li,{children:"Manage repositories on connected servers, which can perform automation via scripting / webhooks."}),"\n",(0,r.jsx)(o.li,{children:"Manage all your configuration / environment variables, with shared global variable and secret interpolation."}),"\n",(0,r.jsx)(o.li,{children:"Keep a record of all the actions that are performed and by whom."}),"\n"]}),"\n",(0,r.jsx)(o.p,{children:'There is no limit to the number of servers you can connect, and there will never be. There is no limit to what API you can use for automation, and there never will be. No "business edition" here.'}),"\n",(0,r.jsx)(o.h2,{id:"docker",children:"Docker"}),"\n",(0,r.jsxs)(o.p,{children:["Komodo is opinionated by design, and uses ",(0,r.jsx)(o.a,{href:"https://docs.docker.com/",children:"docker"})," as the container engine for building and deploying."]}),"\n",(0,r.jsx)(o.admonition,{type:"info",children:(0,r.jsxs)(o.p,{children:["Komodo also supports ",(0,r.jsx)(o.a,{href:"https://podman.io/",children:(0,r.jsx)(o.strong,{children:"podman"})})," instead of docker by utilizing the ",(0,r.jsx)(o.code,{children:"podman"})," -> ",(0,r.jsx)(o.code,{children:"docker"})," alias.\nFor Stack / docker compose support with podman, check out ",(0,r.jsx)(o.a,{href:"https://github.com/containers/podman-compose",children:(0,r.jsx)(o.strong,{children:"podman-compose"})}),". Thanks to ",(0,r.jsx)(o.code,{children:"u/pup_kit"})," for checking this."]})}),"\n",(0,r.jsx)(o.h2,{id:"architecture-and-components",children:"Architecture and Components"}),"\n",(0,r.jsx)(o.p,{children:"Komodo is composed of a single core and any amount of connected servers running the periphery application."}),"\n",(0,r.jsx)(o.h3,{id:"core",children:"Core"}),"\n",(0,r.jsx)(o.p,{children:"Komodo Core is a web server hosting the Core API and browser UI. All user interaction with the connected servers flow through the Core."}),"\n",(0,r.jsx)(o.h3,{id:"periphery",children:"Periphery"}),"\n",(0,r.jsx)(o.p,{children:"Komodo Periphery is a small stateless web server that runs on all connected servers. It exposes an API called by Komodo Core to perform actions on the server, get system usage, and container status / logs. It is only intended to be reached from the core, and has an address whitelist to limit the IPs allowed to call this API."}),"\n",(0,r.jsx)(o.h2,{id:"core-api",children:"Core API"}),"\n",(0,r.jsxs)(o.p,{children:["Komodo exposes powerful functionality over the Core's REST and Websocket API, enabling infrastructure engineers to manage their infrastructure programmatically. There is a ",(0,r.jsx)(o.a,{href:"https://crates.io/crates/komodo_client",children:"rust crate"})," and ",(0,r.jsx)(o.a,{href:"https://www.npmjs.com/package/komodo_client",children:"npm package"})," to simplify programmatic interaction with the API, but in general this can be accomplished using any programming language that can make REST requests."]}),"\n",(0,r.jsx)(o.h2,{id:"permissioning",children:"Permissioning"}),"\n",(0,r.jsxs)(o.p,{children:["Komodo is a system designed to be used by many users, whether they are developers, operations personnel, or administrators. The ability to affect an applications state is very powerful, so Komodo has a granular permissioning system to only provide this functionality to the intended users. The permissioning system is explained in detail in the ",(0,r.jsx)(o.a,{href:"/docs/permissioning",children:"permissioning"})," section."]}),"\n",(0,r.jsxs)(o.p,{children:["User sign-on is possible using username / password, or with Oauth (Github and Google). See ",(0,r.jsx)(o.a,{href:"/docs/setup/",children:"Core Setup"}),"."]})]})}function h(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,r.jsx)(o,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,o,n)=>{n.d(o,{R:()=>t,x:()=>a});var s=n(6540);const r={},i=s.createContext(r);function t(e){const o=s.useContext(i);return s.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(r):e.components||r:t(e.components),s.createElement(i.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/0e384e19.5506d43c.js b/assets/js/0e384e19.5506d43c.js
new file mode 100644
index 000000000..b26e372f7
--- /dev/null
+++ b/assets/js/0e384e19.5506d43c.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[976],{2053:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"intro","title":"What is Komodo?","description":"Komodo is a web app to provide structure for managing your servers, builds, deployments, and automated procedures.","source":"@site/docs/intro.md","sourceDirName":".","slug":"/intro","permalink":"/docs/intro","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/intro.md","tags":[],"version":"current","frontMatter":{"slug":"/intro"},"sidebar":"docs","next":{"title":"Setup Komodo Core","permalink":"/docs/setup/"}}');var r=n(4848),i=n(8453);const t={slug:"/intro"},a="What is Komodo?",c={},d=[{value:"Docker",id:"docker",level:2},{value:"Architecture and Components",id:"architecture-and-components",level:2},{value:"Core",id:"core",level:3},{value:"Periphery",id:"periphery",level:3},{value:"Core API",id:"core-api",level:2},{value:"Permissioning",id:"permissioning",level:2}];function l(e){const o={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(o.header,{children:(0,r.jsx)(o.h1,{id:"what-is-komodo",children:"What is Komodo?"})}),"\n",(0,r.jsx)(o.p,{children:"Komodo is a web app to provide structure for managing your servers, builds, deployments, and automated procedures."}),"\n",(0,r.jsx)(o.p,{children:"With Komodo you can:"}),"\n",(0,r.jsxs)(o.ul,{children:["\n",(0,r.jsx)(o.li,{children:"Connect all of your servers, alert on CPU usage, memory usage, and disk usage, and connect to shell sessions."}),"\n",(0,r.jsx)(o.li,{children:"Create, start, stop, and restart Docker containers on the connected servers, view their status and logs, and connect to container shell."}),"\n",(0,r.jsx)(o.li,{children:"Deploy docker compose stacks. The file can be defined in UI, or in a git repo, with auto deploy on git push."}),"\n",(0,r.jsx)(o.li,{children:"Build application source into auto-versioned Docker images, auto built on webhook. Deploy single-use AWS instances for infinite capacity."}),"\n",(0,r.jsx)(o.li,{children:"Manage repositories on connected servers, which can perform automation via scripting / webhooks."}),"\n",(0,r.jsx)(o.li,{children:"Manage all your configuration / environment variables, with shared global variable and secret interpolation."}),"\n",(0,r.jsx)(o.li,{children:"Keep a record of all the actions that are performed and by whom."}),"\n"]}),"\n",(0,r.jsx)(o.p,{children:'There is no limit to the number of servers you can connect, and there will never be. There is no limit to what API you can use for automation, and there never will be. No "business edition" here.'}),"\n",(0,r.jsx)(o.h2,{id:"docker",children:"Docker"}),"\n",(0,r.jsxs)(o.p,{children:["Komodo is opinionated by design, and uses ",(0,r.jsx)(o.a,{href:"https://docs.docker.com/",children:"docker"})," as the container engine for building and deploying."]}),"\n",(0,r.jsx)(o.admonition,{type:"info",children:(0,r.jsxs)(o.p,{children:["Komodo also supports ",(0,r.jsx)(o.a,{href:"https://podman.io/",children:(0,r.jsx)(o.strong,{children:"podman"})})," instead of docker by utilizing the ",(0,r.jsx)(o.code,{children:"podman"})," -> ",(0,r.jsx)(o.code,{children:"docker"})," alias.\nFor Stack / docker compose support with podman, check out ",(0,r.jsx)(o.a,{href:"https://github.com/containers/podman-compose",children:(0,r.jsx)(o.strong,{children:"podman-compose"})}),". Thanks to ",(0,r.jsx)(o.code,{children:"u/pup_kit"})," for checking this."]})}),"\n",(0,r.jsx)(o.h2,{id:"architecture-and-components",children:"Architecture and Components"}),"\n",(0,r.jsx)(o.p,{children:"Komodo is composed of a single core and any amount of connected servers running the periphery application."}),"\n",(0,r.jsx)(o.h3,{id:"core",children:"Core"}),"\n",(0,r.jsx)(o.p,{children:"Komodo Core is a web server hosting the Core API and browser UI. All user interaction with the connected servers flow through the Core."}),"\n",(0,r.jsx)(o.h3,{id:"periphery",children:"Periphery"}),"\n",(0,r.jsx)(o.p,{children:"Komodo Periphery is a small stateless web server that runs on all connected servers. It exposes an API called by Komodo Core to perform actions on the server, get system usage, and container status / logs. It is only intended to be reached from the core, and has an address whitelist to limit the IPs allowed to call this API."}),"\n",(0,r.jsx)(o.h2,{id:"core-api",children:"Core API"}),"\n",(0,r.jsxs)(o.p,{children:["Komodo exposes powerful functionality over the Core's REST and Websocket API, enabling infrastructure engineers to manage their infrastructure programmatically. There is a ",(0,r.jsx)(o.a,{href:"https://crates.io/crates/komodo_client",children:"rust crate"})," and ",(0,r.jsx)(o.a,{href:"https://www.npmjs.com/package/komodo_client",children:"npm package"})," to simplify programmatic interaction with the API, but in general this can be accomplished using any programming language that can make REST requests."]}),"\n",(0,r.jsx)(o.h2,{id:"permissioning",children:"Permissioning"}),"\n",(0,r.jsxs)(o.p,{children:["Komodo is a system designed to be used by many users, whether they are developers, operations personnel, or administrators. The ability to affect an applications state is very powerful, so Komodo has a granular permissioning system to only provide this functionality to the intended users. The permissioning system is explained in detail in the ",(0,r.jsx)(o.a,{href:"/docs/resources/permissioning",children:"permissioning"})," section."]}),"\n",(0,r.jsxs)(o.p,{children:["User sign-on is possible using username / password, or with Oauth (Github and Google). See ",(0,r.jsx)(o.a,{href:"/docs/setup/",children:"Core Setup"}),"."]})]})}function h(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,r.jsx)(o,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,o,n)=>{n.d(o,{R:()=>t,x:()=>a});var s=n(6540);const r={},i=s.createContext(r);function t(e){const o=s.useContext(i);return s.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(r):e.components||r:t(e.components),s.createElement(i.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/0e38c797.c960b06f.js b/assets/js/0e38c797.c960b06f.js
new file mode 100644
index 000000000..3bb036b63
--- /dev/null
+++ b/assets/js/0e38c797.c960b06f.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[493],{4269:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"resources/deploy-containers/configuration","title":"Configuration","description":"Choose the docker image","source":"@site/docs/resources/deploy-containers/configuration.md","sourceDirName":"resources/deploy-containers","slug":"/resources/deploy-containers/configuration","permalink":"/docs/resources/deploy-containers/configuration","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/resources/deploy-containers/configuration.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Deploy Containers","permalink":"/docs/resources/deploy-containers/"},"next":{"title":"Container Management","permalink":"/docs/resources/deploy-containers/lifetime-management"}}');var i=n(4848),r=n(8453);const s={},a="Configuration",c={},d=[{value:"Choose the docker image",id:"choose-the-docker-image",level:2},{value:"Attaching a Komodo build",id:"attaching-a-komodo-build",level:3},{value:"Using a custom image",id:"using-a-custom-image",level:3},{value:"Configuring the network",id:"configuring-the-network",level:2},{value:"Configuring restart behavior",id:"configuring-restart-behavior",level:2},{value:"Configuring environment variables",id:"configuring-environment-variables",level:2},{value:"Configuring volumes",id:"configuring-volumes",level:2},{value:"Extra args",id:"extra-args",level:2},{value:"Command",id:"command",level:2}];function l(e){const o={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.header,{children:(0,i.jsx)(o.h1,{id:"configuration",children:"Configuration"})}),"\n",(0,i.jsx)(o.h2,{id:"choose-the-docker-image",children:"Choose the docker image"}),"\n",(0,i.jsx)(o.p,{children:"There are two options to configure the docker image to deploy."}),"\n",(0,i.jsx)(o.h3,{id:"attaching-a-komodo-build",children:"Attaching a Komodo build"}),"\n",(0,i.jsx)(o.p,{children:"If the software you want to deploy is built by Komodo, you can attach the build directly to the deployment."}),"\n",(0,i.jsx)(o.p,{children:"By default, Komodo will deploy the latest available version of the build, or you can specify a specific version using the version dropdown."}),"\n",(0,i.jsx)(o.p,{children:"Also by default, Komodo will use the same docker account that is attached to the build in order to pull the image on the periphery server. If that account is not available on the server, you can specify another available account to use instead, this account just needs to have read access to the docker repository."}),"\n",(0,i.jsx)(o.h3,{id:"using-a-custom-image",children:"Using a custom image"}),"\n",(0,i.jsxs)(o.p,{children:["You can also manually specify an image name, like ",(0,i.jsx)(o.code,{children:"mongo"})," or ",(0,i.jsx)(o.code,{children:"ghcr.io/mbecker20/random_image:0.1.1"}),"."]}),"\n",(0,i.jsx)(o.p,{children:"If the image repository is private, you can still select an available docker account to use to pull the image."}),"\n",(0,i.jsx)(o.h2,{id:"configuring-the-network",children:"Configuring the network"}),"\n",(0,i.jsxs)(o.p,{children:["One feature of docker is that it allows for the creation of ",(0,i.jsx)(o.a,{href:"https://docs.docker.com/network/",children:"virtual networks between containers"}),". Komodo allows you to specify a docker virtual network to connect the container to, or to use the host system networking to bypass the docker virtual network."]}),"\n",(0,i.jsxs)(o.p,{children:["The default selection is ",(0,i.jsx)(o.code,{children:"host"}),", which bypasses the docker virtual network layer."]}),"\n",(0,i.jsx)(o.p,{children:"If you do select select a network other than host, you can specify port bindings with the GUI. For example, if you are running mongo (which defaults to port 27017), you could use the mapping:"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"27018 : 27017\n"})}),"\n",(0,i.jsxs)(o.p,{children:["In this case, you would access mongo from outside of the container on port ",(0,i.jsx)(o.code,{children:"27018"}),"."]}),"\n",(0,i.jsxs)(o.p,{children:["Note that this is not the only affect of using a network other than ",(0,i.jsx)(o.code,{children:"host"}),". For example, containers running on different networks can not communicate, and ones on the same network can not reach other containers on ",(0,i.jsx)(o.code,{children:"localhost"})," even when they are running on the same system. This behavior can be a bit confusing if you are not familiar with it, and it can be bypassed entirely by just using ",(0,i.jsx)(o.code,{children:"host"})," network."]}),"\n",(0,i.jsx)(o.h2,{id:"configuring-restart-behavior",children:"Configuring restart behavior"}),"\n",(0,i.jsxs)(o.p,{children:["Docker, like systemd, has a couple options for handling when a container exits. See ",(0,i.jsx)(o.a,{href:"https://docs.docker.com/config/containers/start-containers-automatically/",children:"docker restart policies"}),". Komodo allows you to select the appropriate restart behavior from these options."]}),"\n",(0,i.jsx)(o.h2,{id:"configuring-environment-variables",children:"Configuring environment variables"}),"\n",(0,i.jsx)(o.p,{children:"Komodo enables you to easily manage environment variables passed to the container.\nIn the GUI, navigate to the environment tab of the configuration on the deployment page."}),"\n",(0,i.jsxs)(o.p,{children:["You pass environment variables just as you would with a ",(0,i.jsx)(o.code,{children:".env"})," file:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"ENV_VAR_1=some_value\nENV_VAR_2=some_other_value\n"})}),"\n",(0,i.jsx)(o.h2,{id:"configuring-volumes",children:"Configuring volumes"}),"\n",(0,i.jsxs)(o.p,{children:["A docker container's filesystem is segregated from that of the host. However, it is still possible for a container to access system files and directories, this is accomplished by using ",(0,i.jsx)(o.a,{href:"https://docs.docker.com/storage/bind-mounts/",children:"bind mounts"}),"."]}),"\n",(0,i.jsxs)(o.p,{children:["Say your container needs to read a config file located on the system at ",(0,i.jsx)(o.code,{children:"/home/ubuntu/config.toml"}),". You can specify the bind mount to be:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"/home/ubuntu/config.toml : /config/config.toml\n"})}),"\n",(0,i.jsxs)(o.p,{children:["The first path is the one on the system, the second is the path in the container. Your application would then read the file at ",(0,i.jsx)(o.code,{children:"/config/config.toml"})," in order to load its contents."]}),"\n",(0,i.jsx)(o.p,{children:"These can be configured easily with the GUI in the 'volumes' card. You can configure as many bind mounts as you need."}),"\n",(0,i.jsx)(o.h2,{id:"extra-args",children:"Extra args"}),"\n",(0,i.jsxs)(o.p,{children:["Not all features of docker are mapped directly by Komodo, only the most common. You can still specify any custom flags for Komodo to include in the ",(0,i.jsx)(o.code,{children:"docker run"})," command by utilizing 'extra args'. For example, you can enable log rotation using these two extra args:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"--log-opt max-size=10M\n"})}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"--log-opt max-file=3\n"})}),"\n",(0,i.jsx)(o.h2,{id:"command",children:"Command"}),"\n",(0,i.jsxs)(o.p,{children:["Sometimes you need to override the default command in the image, or specify some flags to be passed directly to the application. What is put here is inserted into the docker run command after the image. For example, to pass the ",(0,i.jsx)(o.code,{children:"--quiet"})," flag to MongoDB, the docker run command would be:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"docker run -d --name mongo-db mongo:6.0.3 --quiet\n"})}),"\n",(0,i.jsxs)(o.p,{children:["In order to achieve this with Komodo, just pass ",(0,i.jsx)(o.code,{children:"--quiet"})," to 'command'."]})]})}function h(e={}){const{wrapper:o}={...(0,r.R)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},8453:(e,o,n)=>{n.d(o,{R:()=>s,x:()=>a});var t=n(6540);const i={},r=t.createContext(i);function s(e){const o=t.useContext(r);return t.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(i):e.components||i:s(e.components),t.createElement(r.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/0f079b47.6650f8e8.js b/assets/js/0f079b47.6650f8e8.js
new file mode 100644
index 000000000..6668fe34c
--- /dev/null
+++ b/assets/js/0f079b47.6650f8e8.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[72],{4476:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>t,default:()=>a,frontMatter:()=>d,metadata:()=>o,toc:()=>l});const o=JSON.parse('{"id":"ecosystem/development","title":"Development","description":"If you are looking to contribute to Komodo, this page is a launching point for setting up your Komodo development environment.","source":"@site/docs/ecosystem/development.md","sourceDirName":"ecosystem","slug":"/ecosystem/development","permalink":"/docs/ecosystem/development","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/ecosystem/development.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Community","permalink":"/docs/ecosystem/community"}}');var r=s(4848),i=s(8453);const d={},t="Development",c={},l=[{value:"Dependencies",id:"dependencies",level:2},{value:"runnables-cli",id:"runnables-cli",level:3},{value:"Docker",id:"docker",level:2},{value:"Devcontainer",id:"devcontainer",level:2},{value:"Local",id:"local",level:2},{value:"Docsite Development",id:"docsite-development",level:2}];function h(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"development",children:"Development"})}),"\n",(0,r.jsx)(n.p,{children:"If you are looking to contribute to Komodo, this page is a launching point for setting up your Komodo development environment."}),"\n",(0,r.jsx)(n.h2,{id:"dependencies",children:"Dependencies"}),"\n",(0,r.jsxs)(n.p,{children:["Running Komodo from ",(0,r.jsx)(n.a,{href:"https://github.com/moghtech/komodo",children:"source"})," requires either ",(0,r.jsx)(n.a,{href:"https://www.docker.com/",children:"Docker"})," (and can use the included ",(0,r.jsx)(n.a,{href:"https://code.visualstudio.com/docs/devcontainers/containers",children:"devcontainer"}),"), or can have the development dependencies installed locally:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Backend (Core / Periphery APIs)","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"https://www.rust-lang.org/",children:"Rust"})," stable via ",(0,r.jsx)(n.a,{href:"https://rustup.rs/",children:"rustup installer"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"https://www.mongodb.com/",children:"MongoDB"})," or ",(0,r.jsx)(n.a,{href:"https://www.ferretdb.com/",children:"FerretDB"})," available locally."]}),"\n",(0,r.jsxs)(n.li,{children:["On Debian/Ubuntu: ",(0,r.jsx)(n.code,{children:"apt install build-essential pkg-config libssl-dev"})," required to build the rust source."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["Frontend (Web UI)","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"https://nodejs.org/en",children:"Node"})," >= 18.18 + NPM","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"https://yarnpkg.com/",children:"Yarn"})," - (Tip: use ",(0,r.jsx)(n.code,{children:"corepack enable"})," after installing ",(0,r.jsx)(n.code,{children:"node"})," to use ",(0,r.jsx)(n.code,{children:"yarn"}),")"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/1password/typeshare",children:"typeshare"})}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"https://deno.com/",children:"Deno"})," >= 2.0.2"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"runnables-cli",children:"runnables-cli"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://github.com/mbecker20/runnables-cli",children:"mbecker20/runnables-cli"})," can be used as a convience CLI for running common project tasks found in ",(0,r.jsx)(n.code,{children:"runfile.toml"}),". Otherwise, you can create your own project tasks by references the ",(0,r.jsx)(n.code,{children:"cmd"}),"s found in ",(0,r.jsx)(n.code,{children:"runfile.toml"}),". All instructions below will use runnables-cli v1.3.7+."]}),"\n",(0,r.jsx)(n.h2,{id:"docker",children:"Docker"}),"\n",(0,r.jsxs)(n.p,{children:["After making changes to the project, run ",(0,r.jsx)(n.code,{children:"run dev-compose-build"})," to rebuild Komodo and then ",(0,r.jsx)(n.code,{children:"run dev-compose-exposed"})," to start a Komodo container with the UI accessible at ",(0,r.jsx)(n.code,{children:"localhost:9120"}),". Any changes made to source files will require re-running the ",(0,r.jsx)(n.code,{children:"dev-compose-build"})," and ",(0,r.jsx)(n.code,{children:"dev-compose-exposed"})," commands."]}),"\n",(0,r.jsx)(n.h2,{id:"devcontainer",children:"Devcontainer"}),"\n",(0,r.jsxs)(n.p,{children:["Use the included ",(0,r.jsx)(n.code,{children:".devcontainer.json"})," with VSCode or other compatible IDE to stand-up a full environment, including database, with one click."]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://code.visualstudio.com/Docs/editor/tasks",children:"VSCode Tasks"})," are provided for building and running Komodo."]}),"\n",(0,r.jsxs)(n.p,{children:["After opening the repository with the devcontainer run the task ",(0,r.jsx)(n.code,{children:"Init"})," to build the frontend/backend. Then, the task ",(0,r.jsx)(n.code,{children:"Run Komodo"})," can be used to run frontend/backend. Other tasks for rebuilding/running just one component of the stack (Core API, Periphery API, Frontend) are also provided."]}),"\n",(0,r.jsx)(n.h2,{id:"local",children:"Local"}),"\n",(0,r.jsx)(n.p,{children:"To run a full Komodo instance from a non-container environment run commands in this order:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Ensure dependencies are up to date","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"rustup update"})," -- ensure rust toolchain is up to date"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["Build and Run backend","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"run dev-core"})," -- Build and run Core API"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"run dev-periphery"})," -- Build and run Periphery API"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["Build Frontend","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Install ",(0,r.jsx)(n.strong,{children:"typeshare-cli"}),": ",(0,r.jsx)(n.code,{children:"cargo install typeshare-cli"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Run this once"})," -- ",(0,r.jsx)(n.code,{children:"run link-client"})," -- generates TS client and links to the frontend"]}),"\n",(0,r.jsxs)(n.li,{children:["After running the above once:","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"run gen-client"})," -- Rebuild client"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"run dev-frontend"})," -- Start in dev (watch) mode"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"run build-frontend"})," -- Typecheck and build"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"docsite-development",children:"Docsite Development"}),"\n",(0,r.jsxs)(n.p,{children:["Use ",(0,r.jsx)(n.code,{children:"run dev-docsite"})," to start the ",(0,r.jsx)(n.a,{href:"https://docusaurus.io/",children:"Docusaurus"})," Komodo docs site in development mode. Changes made to files in ",(0,r.jsx)(n.code,{children:"./docsite"})," will be automatically reloaded by the server."]})]})}function a(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>d,x:()=>t});var o=s(6540);const r={},i=o.createContext(r);function d(e){const n=o.useContext(i);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function t(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/12d1b99a.f8f0588e.js b/assets/js/12d1b99a.f8f0588e.js
new file mode 100644
index 000000000..2c333472a
--- /dev/null
+++ b/assets/js/12d1b99a.f8f0588e.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[154],{7163:(e,o,s)=>{s.r(o),s.d(o,{assets:()=>a,contentTitle:()=>c,default:()=>h,frontMatter:()=>i,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"resources/docker-compose","title":"Docker Compose","description":"Komodo can deploy docker compose projects through the Stack resource.","source":"@site/docs/resources/docker-compose.md","sourceDirName":"resources","slug":"/resources/docker-compose","permalink":"/docs/resources/docker-compose","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/resources/docker-compose.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Container Management","permalink":"/docs/resources/deploy-containers/lifetime-management"},"next":{"title":"Automatic Updates","permalink":"/docs/resources/auto-update"}}');var t=s(4848),r=s(8453);const i={},c="Docker Compose",a={},l=[{value:"Define the compose file/s",id:"define-the-compose-files",level:2},{value:"Importing Existing Compose projects",id:"importing-existing-compose-projects",level:2},{value:"Pass Environment Variables",id:"pass-environment-variables",level:2}];function d(e){const o={admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(o.header,{children:(0,t.jsx)(o.h1,{id:"docker-compose",children:"Docker Compose"})}),"\n",(0,t.jsxs)(o.p,{children:["Komodo can deploy docker compose projects through the ",(0,t.jsx)(o.code,{children:"Stack"})," resource."]}),"\n",(0,t.jsx)(o.h2,{id:"define-the-compose-files",children:"Define the compose file/s"}),"\n",(0,t.jsx)(o.p,{children:"Komodo supports 3 ways of defining the compose files:"}),"\n",(0,t.jsxs)(o.ol,{children:["\n",(0,t.jsxs)(o.li,{children:[(0,t.jsx)(o.strong,{children:"Write them in the UI"}),", and Komodo will write them to your host at deploy-time."]}),"\n",(0,t.jsxs)(o.li,{children:[(0,t.jsx)(o.strong,{children:"Store the files anywhere on the host"}),", and Komodo will just run the compose commands on the existing files."]}),"\n",(0,t.jsxs)(o.li,{children:[(0,t.jsx)(o.strong,{children:"Store them in a git repo"}),", and have Komodo clone it on the host to deploy."]}),"\n"]}),"\n",(0,t.jsx)(o.p,{children:"If you manage your compose files in git repos:"}),"\n",(0,t.jsxs)(o.ul,{children:["\n",(0,t.jsx)(o.li,{children:"All your files, across all servers, are available locally to edit in your favorite text editor."}),"\n",(0,t.jsx)(o.li,{children:"All of your changes are tracked, and can be reverted."}),"\n",(0,t.jsxs)(o.li,{children:["You can use the git webhooks to do other automations when you change the compose file contents. Redeploying will be as easy as ",(0,t.jsx)(o.code,{children:"git push"}),"."]}),"\n"]}),"\n",(0,t.jsx)(o.admonition,{type:"info",children:(0,t.jsx)(o.p,{children:"Many Komodo resources need access to git repos. There is an in-built token management system (managed in UI or in config file) to give resources access to credentials.\nAll resources which depend on git repos are able to use these credentials to access private repos."})}),"\n",(0,t.jsx)(o.h2,{id:"importing-existing-compose-projects",children:"Importing Existing Compose projects"}),"\n",(0,t.jsx)(o.p,{children:"First create the Stack in Komodo, and ensure it has access to the compose files using one\nof the three methods above. Make sure to attach the server you wish to deploy on."}),"\n",(0,t.jsxs)(o.p,{children:['In order for Komodo to pick up a running project, it has to know the compose "project name".\nYou can find the project name by running ',(0,t.jsx)(o.code,{children:"docker compose ls"})," on the host."]}),"\n",(0,t.jsx)(o.p,{children:'By default, Komodo will assume the Stack name is the compose project name.\nIf this is different than the project name on the host, you can configure a custom "Project Name" in the config.'}),"\n",(0,t.jsx)(o.h2,{id:"pass-environment-variables",children:"Pass Environment Variables"}),"\n",(0,t.jsx)(o.p,{children:"Komodo is able to pass custom environment variables to the docker compose process.\nThis works by:"}),"\n",(0,t.jsxs)(o.ol,{children:["\n",(0,t.jsx)(o.li,{children:'Write the variables to a ".env" file on the host at deploy-time.'}),"\n",(0,t.jsxs)(o.li,{children:["Pass the file to docker compose using the ",(0,t.jsx)(o.code,{children:"--env-file"})," flag."]}),"\n"]}),"\n",(0,t.jsx)(o.admonition,{type:"info",children:(0,t.jsxs)(o.p,{children:["Just like all other resources with Environments (Deployments, Repos, Builds),\nStack Environments support ",(0,t.jsx)(o.strong,{children:"Variable and Secret interpolation"}),". Define global variables\nin the UI and share the values across environments."]})})]})}function h(e={}){const{wrapper:o}={...(0,r.R)(),...e.components};return o?(0,t.jsx)(o,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,o,s)=>{s.d(o,{R:()=>i,x:()=>c});var n=s(6540);const t={},r=n.createContext(t);function i(e){const o=n.useContext(r);return n.useMemo(function(){return"function"==typeof e?e(o):{...o,...e}},[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),n.createElement(r.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/16c99604.c59787aa.js b/assets/js/16c99604.c59787aa.js
new file mode 100644
index 000000000..894b05075
--- /dev/null
+++ b/assets/js/16c99604.c59787aa.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[51],{5453:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>p,frontMatter:()=>c,metadata:()=>t,toc:()=>h});const t=JSON.parse('{"id":"setup/connect-servers","title":"Connect More Servers","description":"Connecting a server to Komodo has 2 steps:","source":"@site/docs/setup/connect-servers.mdx","sourceDirName":"setup","slug":"/setup/connect-servers","permalink":"/docs/setup/connect-servers","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/setup/connect-servers.mdx","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"FerretDB","permalink":"/docs/setup/ferretdb"},"next":{"title":"Backup and Restore","permalink":"/docs/setup/backup"}}');var o=i(4848),r=i(8453),s=i(6695);const c={},l="Connect More Servers",a={},h=[{value:"Install Periphery",id:"install-periphery",level:2},{value:"Install the Periphery agent - systemd",id:"install-the-periphery-agent---systemd",level:3},{value:"Install the Periphery agent - container",id:"install-the-periphery-agent---container",level:3},{value:"Manual install steps - binaries",id:"manual-install-steps---binaries",level:3},{value:"Example periphery start command",id:"example-periphery-start-command",level:3},{value:"Passing config files",id:"passing-config-files",level:3},{value:"Configuration",id:"configuration",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"connect-more-servers",children:"Connect More Servers"})}),"\n","\n",(0,o.jsx)(n.p,{children:"Connecting a server to Komodo has 2 steps:"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsx)(n.li,{children:"Install the Periphery agent on the server (either binary or container)."}),"\n",(0,o.jsx)(n.li,{children:"Add the server to Komodo via the Core API / UI."}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"install-periphery",children:"Install Periphery"}),"\n",(0,o.jsxs)(n.p,{children:["You can install Periphery as a systemd managed process, run it as a ",(0,o.jsx)(n.a,{href:"https://github.com/moghtech/komodo/pkgs/container/komodo-periphery",children:"docker container"}),", or do whatever you want with the binary."]}),"\n",(0,o.jsx)(n.admonition,{type:"warning",children:(0,o.jsxs)(n.p,{children:["Allowing unintended access to the Periphery agent API is a security risk.\nEnsure to take appropriate measures to block access to the Periphery API, such as firewall rules on port ",(0,o.jsx)(n.code,{children:"8120"}),".\nAdditionally, you can whitelist your Komodo Core IP address in the ",(0,o.jsx)(n.a,{href:"https://github.com/moghtech/komodo/blob/main/config/periphery.config.toml#L46",children:"Periphery config"}),",\nand configure it to ",(0,o.jsx)(n.a,{href:"https://github.com/moghtech/komodo/blob/main/config/periphery.config.toml#L51",children:"only accept requests including your Core passkey"}),"."]})}),"\n",(0,o.jsx)(n.h3,{id:"install-the-periphery-agent---systemd",children:"Install the Periphery agent - systemd"}),"\n",(0,o.jsx)(n.p,{children:"As root user:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"curl -sSL https://raw.githubusercontent.com/moghtech/komodo/main/scripts/setup-periphery.py | python3\n"})}),"\n",(0,o.jsx)(n.p,{children:"Periphery can also be installed to run as the calling user, just note this comes with some additional configuration."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"curl -sSL https://raw.githubusercontent.com/moghtech/komodo/main/scripts/setup-periphery.py | python3 - --user\n"})}),"\n",(0,o.jsxs)(n.p,{children:["You can find more information (and view the script) in the ",(0,o.jsx)(n.a,{href:"https://github.com/moghtech/komodo/tree/main/scripts",children:"readme"}),"."]}),"\n",(0,o.jsx)(n.admonition,{type:"info",children:(0,o.jsx)(n.p,{children:"This script can be run multiple times without issue, and it won't change existing config after the first run. Just run it again after a Komodo version release, and it will update the periphery version."})}),"\n",(0,o.jsx)(n.admonition,{type:"tip",children:(0,o.jsxs)(n.p,{children:["For deployment to many servers, a tool like ",(0,o.jsx)(n.a,{href:"https://docs.ansible.com/",children:"Ansible"})," should be used.\nAn example of such a setup can be found here: ",(0,o.jsx)(n.a,{href:"https://github.com/bpbradley/ansible-role-komodo",children:"https://github.com/bpbradley/ansible-role-komodo"})]})}),"\n",(0,o.jsx)(n.h3,{id:"install-the-periphery-agent---container",children:"Install the Periphery agent - container"}),"\n",(0,o.jsx)(n.p,{children:"You can use a docker compose file:"}),"\n",(0,o.jsx)(s.A,{title:"https://github.com/moghtech/komodo/blob/main/compose/periphery.compose.yaml",url:"https://raw.githubusercontent.com/moghtech/komodo/main/compose/periphery.compose.yaml",language:"yaml"}),"\n",(0,o.jsx)(n.h3,{id:"manual-install-steps---binaries",children:"Manual install steps - binaries"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Download the periphery binary from the latest ",(0,o.jsx)(n.a,{href:"https://github.com/moghtech/komodo/releases",children:"release"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Create and edit your config files, following the ",(0,o.jsx)(n.a,{href:"https://github.com/moghtech/komodo/blob/main/config/periphery.config.toml",children:"config example"}),"."]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.admonition,{type:"note",children:(0,o.jsxs)(n.p,{children:["See the ",(0,o.jsx)(n.a,{href:"https://docs.rs/komodo_client/latest/komodo_client/entities/config/periphery/index.html",children:"periphery config docs"}),"\nfor more information on configuring periphery."]})}),"\n",(0,o.jsxs)(n.ol,{start:"3",children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Ensure that inbound connectivity is allowed on the port specified in periphery.config.toml (default 8120)."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Install docker. See the ",(0,o.jsx)(n.a,{href:"https://docs.docker.com/engine/install/",children:"docker install docs"}),"."]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.admonition,{type:"note",children:(0,o.jsx)(n.p,{children:"Ensure that the user which periphery is run as has access to the docker group without sudo."})}),"\n",(0,o.jsxs)(n.ol,{start:"5",children:["\n",(0,o.jsx)(n.li,{children:"Start the periphery binary with your preferred process manager, like systemd."}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"example-periphery-start-command",children:"Example periphery start command"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"periphery \\\n\t--config-path /path/to/periphery.config.base.toml \\\n\t--config-path /other_path/to/override-periphery-config-directory \\\n\t--config-keyword periphery \\\n\t--config-keyword config \\\n\t--merge-nested-config true\n"})}),"\n",(0,o.jsx)(n.admonition,{type:"info",children:(0,o.jsxs)(n.p,{children:["You can run ",(0,o.jsx)(n.code,{children:"periphery --help"})," to see the manual."]})}),"\n",(0,o.jsxs)(n.p,{children:["When running periphery in docker, use ",(0,o.jsx)(n.a,{href:"https://docs.docker.com/reference/compose-file/services/#command",children:"command"})," to pass in additional arguments."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"command: periphery --config-path /path/in/container/to/periphery.config.base.toml\n"})}),"\n",(0,o.jsx)(n.h3,{id:"passing-config-files",children:"Passing config files"}),"\n",(0,o.jsxs)(n.p,{children:["Either file paths or directory paths can be passed to ",(0,o.jsx)(n.code,{children:"--config-path"})," (alias: ",(0,o.jsx)(n.code,{children:"-c"}),"). By default, no paths will be used, meaning the configuration is entirely\nloaded via environment variables."]}),"\n",(0,o.jsxs)(n.p,{children:["When using directories, the file entries can be filtered by name with the ",(0,o.jsx)(n.code,{children:"--config-keyword"})," argument, which can be passed multiple times to add more keywords.\nThese are each wildcard patterns to match file names.\nOnly config files with file names that contain a keyword will be merged, with files matching later defined keywords having higher priority on field conflicts.\nBy default, the only keyword is ",(0,o.jsx)(n.code,{children:"*config*.*"}),". This matches files like ",(0,o.jsx)(n.code,{children:"config.toml"}),", ",(0,o.jsx)(n.code,{children:"periphery.config.yaml"}),", etc."]}),"\n",(0,o.jsxs)(n.p,{children:["When passing multiple config files, later --config-path given in the command will always override previous ones.\nDirectory config files are merged in alphabetical order by name, so ",(0,o.jsx)(n.code,{children:"config_b.toml"})," will override ",(0,o.jsx)(n.code,{children:"config_a.toml"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["There are two ways to merge config files.\nThe default behavior is to completely replace any base fields with whatever fields are present in the override config.\nSo if you pass ",(0,o.jsx)(n.code,{children:"allowed_ips = []"})," in your override config, the final allowed_ips will be an empty list as well."]}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"--merge-nested-config true"})," will merge config fields recursively and extend config array fields."]}),"\n",(0,o.jsxs)(n.p,{children:["For example, with ",(0,o.jsx)(n.code,{children:"--merge-nested-config true"})," you can specify an allowed ip in the base config, and another in the override config, they will both be present in the final config."]}),"\n",(0,o.jsx)(n.p,{children:"Similarly, you can specify a base docker / github account pair, and extend them with additional accounts in the override config."}),"\n",(0,o.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,o.jsxs)(n.p,{children:["The configuration can also be passed as ",(0,o.jsx)(n.strong,{children:"YAML"})," or ",(0,o.jsx)(n.strong,{children:"JSON"}),".\nYou can use the it-tools to convert this TOML file to your preferred format:"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["YAML: ",(0,o.jsx)(n.a,{href:"https://it-tools.tech/toml-to-yaml",children:"https://it-tools.tech/toml-to-yaml"})]}),"\n",(0,o.jsxs)(n.li,{children:["JSON: ",(0,o.jsx)(n.a,{href:"https://it-tools.tech/toml-to-json",children:"https://it-tools.tech/toml-to-json"})]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["Quick download to ",(0,o.jsx)(n.code,{children:"./komodo/periphery.config.toml"}),":"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"wget -P komodo https://raw.githubusercontent.com/moghtech/komodo/main/config/periphery.config.toml\n"})}),"\n",(0,o.jsx)(s.A,{title:"https://github.com/moghtech/komodo/blob/main/config/periphery.config.toml",url:"https://raw.githubusercontent.com/moghtech/komodo/main/config/periphery.config.toml",language:"toml"})]})}function p(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},6695:(e,n,i)=>{i.d(n,{A:()=>s});var t=i(6540),o=i(1028),r=i(4848);function s({url:e,language:n,title:i}){const[s,c]=(0,t.useState)("");return(0,t.useEffect)(()=>{!async function(e,n){const i=await fetch(e);n(await i.text())}(e,c)},[]),(0,r.jsx)(o.A,{title:i??e,language:n,showLineNumbers:!0,children:s})}}}]);
\ No newline at end of file
diff --git a/assets/js/17896441.ca4d3cf2.js b/assets/js/17896441.ca4d3cf2.js
new file mode 100644
index 000000000..f0cf06b46
--- /dev/null
+++ b/assets/js/17896441.ca4d3cf2.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[401],{7279:(e,n,t)=>{t.r(n),t.d(n,{default:()=>wn});var s=t(6540),i=t(5500),a=t(9532),l=t(4848);const o=s.createContext(null);function r({children:e,content:n}){const t=function(e){return(0,s.useMemo)(()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc}),[e])}(n);return(0,l.jsx)(o.Provider,{value:t,children:e})}function c(){const e=(0,s.useContext)(o);if(null===e)throw new a.dV("DocProvider");return e}function d(){const{metadata:e,frontMatter:n,assets:t}=c();return(0,l.jsx)(i.be,{title:e.title,description:e.description,keywords:n.keywords,image:t.image??n.image})}var u=t(4164),m=t(4581),h=t(1312),x=t(8774);function f(e){const{permalink:n,title:t,subLabel:s,isNext:i}=e;return(0,l.jsxs)(x.A,{className:(0,u.A)("pagination-nav__link",i?"pagination-nav__link--next":"pagination-nav__link--prev"),to:n,children:[s&&(0,l.jsx)("div",{className:"pagination-nav__sublabel",children:s}),(0,l.jsx)("div",{className:"pagination-nav__label",children:t})]})}function p(e){const{className:n,previous:t,next:s}=e;return(0,l.jsxs)("nav",{className:(0,u.A)(n,"pagination-nav"),"aria-label":(0,h.T)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[t&&(0,l.jsx)(f,{...t,subLabel:(0,l.jsx)(h.A,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})}),s&&(0,l.jsx)(f,{...s,subLabel:(0,l.jsx)(h.A,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0})]})}function j(){const{metadata:e}=c();return(0,l.jsx)(p,{className:"docusaurus-mt-lg",previous:e.previous,next:e.next})}var v=t(4586),b=t(4070),g=t(7559),A=t(3886),N=t(3025);const C={unreleased:function({siteTitle:e,versionMetadata:n}){return(0,l.jsx)(h.A,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:e,versionLabel:(0,l.jsx)("b",{children:n.label})},children:"This is unreleased documentation for {siteTitle} {versionLabel} version."})},unmaintained:function({siteTitle:e,versionMetadata:n}){return(0,l.jsx)(h.A,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:e,versionLabel:(0,l.jsx)("b",{children:n.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function L(e){const n=C[e.versionMetadata.banner];return(0,l.jsx)(n,{...e})}function _({versionLabel:e,to:n,onClick:t}){return(0,l.jsx)(h.A,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:e,latestVersionLink:(0,l.jsx)("b",{children:(0,l.jsx)(x.A,{to:n,onClick:t,children:(0,l.jsx)(h.A,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label",children:"latest version"})})})},children:"For up-to-date documentation, see the {latestVersionLink} ({versionLabel})."})}function y({className:e,versionMetadata:n}){const{siteConfig:{title:t}}=(0,v.A)(),{pluginId:s}=(0,b.vT)({failfast:!0}),{savePreferredVersionName:i}=(0,A.g1)(s),{latestDocSuggestion:a,latestVersionSuggestion:o}=(0,b.HW)(s),r=a??(c=o).docs.find(e=>e.id===c.mainDocId);var c;return(0,l.jsxs)("div",{className:(0,u.A)(e,g.G.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,l.jsx)("div",{children:(0,l.jsx)(L,{siteTitle:t,versionMetadata:n})}),(0,l.jsx)("div",{className:"margin-top--md",children:(0,l.jsx)(_,{versionLabel:o.label,to:r.path,onClick:()=>i(o.name)})})]})}function T({className:e}){const n=(0,N.r)();return n.banner?(0,l.jsx)(y,{className:e,versionMetadata:n}):null}function k({className:e}){const n=(0,N.r)();return n.badge?(0,l.jsx)("span",{className:(0,u.A)(e,g.G.docs.docVersionBadge,"badge badge--secondary"),children:(0,l.jsx)(h.A,{id:"theme.docs.versionBadge.label",values:{versionLabel:n.label},children:"Version: {versionLabel}"})}):null}const w={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};function H({permalink:e,label:n,count:t,description:s}){return(0,l.jsxs)(x.A,{rel:"tag",href:e,title:s,className:(0,u.A)(w.tag,t?w.tagWithCount:w.tagRegular),children:[n,t&&(0,l.jsx)("span",{children:t})]})}const M={tags:"tags_jXut",tag:"tag_QGVx"};function B({tags:e}){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("b",{children:(0,l.jsx)(h.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,l.jsx)("ul",{className:(0,u.A)(M.tags,"padding--none","margin-left--sm"),children:e.map(e=>(0,l.jsx)("li",{className:M.tag,children:(0,l.jsx)(H,{...e})},e.permalink))})]})}const U={iconEdit:"iconEdit_Z9Sw"};function E({className:e,...n}){return(0,l.jsx)("svg",{fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,u.A)(U.iconEdit,e),"aria-hidden":"true",...n,children:(0,l.jsx)("g",{children:(0,l.jsx)("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})})})}function I({editUrl:e}){return(0,l.jsxs)(x.A,{to:e,className:g.G.common.editThisPage,children:[(0,l.jsx)(E,{}),(0,l.jsx)(h.A,{id:"theme.common.editThisPage",description:"The link label to edit the current page",children:"Edit this page"})]})}function V(e={}){const{i18n:{currentLocale:n}}=(0,v.A)(),t=function(){const{i18n:{currentLocale:e,localeConfigs:n}}=(0,v.A)();return n[e].calendar}();return new Intl.DateTimeFormat(n,{calendar:t,...e})}function z({lastUpdatedAt:e}){const n=new Date(e),t=V({day:"numeric",month:"short",year:"numeric",timeZone:"UTC"}).format(n);return(0,l.jsx)(h.A,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:(0,l.jsx)("b",{children:(0,l.jsx)("time",{dateTime:n.toISOString(),itemProp:"dateModified",children:t})})},children:" on {date}"})}function R({lastUpdatedBy:e}){return(0,l.jsx)(h.A,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:(0,l.jsx)("b",{children:e})},children:" by {user}"})}function D({lastUpdatedAt:e,lastUpdatedBy:n}){return(0,l.jsxs)("span",{className:g.G.common.lastUpdated,children:[(0,l.jsx)(h.A,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:e?(0,l.jsx)(z,{lastUpdatedAt:e}):"",byUser:n?(0,l.jsx)(R,{lastUpdatedBy:n}):""},children:"Last updated{atDate}{byUser}"}),!1]})}const G={lastUpdated:"lastUpdated_JAkA"};function O({className:e,editUrl:n,lastUpdatedAt:t,lastUpdatedBy:s}){return(0,l.jsxs)("div",{className:(0,u.A)("row",e),children:[(0,l.jsx)("div",{className:"col",children:n&&(0,l.jsx)(I,{editUrl:n})}),(0,l.jsx)("div",{className:(0,u.A)("col",G.lastUpdated),children:(t||s)&&(0,l.jsx)(D,{lastUpdatedAt:t,lastUpdatedBy:s})})]})}function S(){const{metadata:e}=c(),{editUrl:n,lastUpdatedAt:t,lastUpdatedBy:s,tags:i}=e,a=i.length>0,o=!!(n||t||s);return a||o?(0,l.jsxs)("footer",{className:(0,u.A)(g.G.docs.docFooter,"docusaurus-mt-lg"),children:[a&&(0,l.jsx)("div",{className:(0,u.A)("row margin-top--sm",g.G.docs.docFooterTagsRow),children:(0,l.jsx)("div",{className:"col",children:(0,l.jsx)(B,{tags:i})})}),o&&(0,l.jsx)(O,{className:(0,u.A)("margin-top--sm",g.G.docs.docFooterEditMetaRow),editUrl:n,lastUpdatedAt:t,lastUpdatedBy:s})]}):null}var F=t(1422),P=t(6342);function q(e){const n=e.map(e=>({...e,parentIndex:-1,children:[]})),t=Array(7).fill(-1);n.forEach((e,n)=>{const s=t.slice(2,e.level);e.parentIndex=Math.max(...s),t[e.level]=n});const s=[];return n.forEach(e=>{const{parentIndex:t,...i}=e;t>=0?n[t].children.push(i):s.push(i)}),s}function $({toc:e,minHeadingLevel:n,maxHeadingLevel:t}){return e.flatMap(e=>{const s=$({toc:e.children,minHeadingLevel:n,maxHeadingLevel:t});return function(e){return e.level>=n&&e.level<=t}(e)?[{...e,children:s}]:s})}function W(e){const n=e.getBoundingClientRect();return n.top===n.bottom?W(e.parentNode):n}function J(e,{anchorTopOffset:n}){const t=e.find(e=>W(e).top>=n);if(t){return function(e){return e.top>0&&e.bottom{e.current=n?0:document.querySelector(".navbar").clientHeight},[n]),e}function Y(e){const n=(0,s.useRef)(void 0),t=Z();(0,s.useEffect)(()=>{if(!e)return()=>{};const{linkClassName:s,linkActiveClassName:i,minHeadingLevel:a,maxHeadingLevel:l}=e;function o(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(s),o=function({minHeadingLevel:e,maxHeadingLevel:n}){const t=[];for(let s=e;s<=n;s+=1)t.push(`h${s}.anchor`);return Array.from(document.querySelectorAll(t.join()))}({minHeadingLevel:a,maxHeadingLevel:l}),r=J(o,{anchorTopOffset:t.current}),c=e.find(e=>r&&r.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e));e.forEach(e=>{!function(e,t){t?(n.current&&n.current!==e&&n.current.classList.remove(i),e.classList.add(i),n.current=e):e.classList.remove(i)}(e,e===c)})}return document.addEventListener("scroll",o),document.addEventListener("resize",o),o(),()=>{document.removeEventListener("scroll",o),document.removeEventListener("resize",o)}},[e,t])}function Q({toc:e,className:n,linkClassName:t,isChild:s}){return e.length?(0,l.jsx)("ul",{className:s?void 0:n,children:e.map(e=>(0,l.jsxs)("li",{children:[(0,l.jsx)(x.A,{to:`#${e.id}`,className:t??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,l.jsx)(Q,{isChild:!0,toc:e.children,className:n,linkClassName:t})]},e.id))}):null}const X=s.memo(Q);function K({toc:e,className:n="table-of-contents table-of-contents__left-border",linkClassName:t="table-of-contents__link",linkActiveClassName:i,minHeadingLevel:a,maxHeadingLevel:o,...r}){const c=(0,P.p)(),d=a??c.tableOfContents.minHeadingLevel,u=o??c.tableOfContents.maxHeadingLevel,m=function({toc:e,minHeadingLevel:n,maxHeadingLevel:t}){return(0,s.useMemo)(()=>$({toc:q(e),minHeadingLevel:n,maxHeadingLevel:t}),[e,n,t])}({toc:e,minHeadingLevel:d,maxHeadingLevel:u});return Y((0,s.useMemo)(()=>{if(t&&i)return{linkClassName:t,linkActiveClassName:i,minHeadingLevel:d,maxHeadingLevel:u}},[t,i,d,u])),(0,l.jsx)(X,{toc:m,className:n,linkClassName:t,...r})}const ee={tocCollapsibleButton:"tocCollapsibleButton_TO0P",tocCollapsibleButtonExpanded:"tocCollapsibleButtonExpanded_MG3E"};function ne({collapsed:e,...n}){return(0,l.jsx)("button",{type:"button",...n,className:(0,u.A)("clean-btn",ee.tocCollapsibleButton,!e&&ee.tocCollapsibleButtonExpanded,n.className),children:(0,l.jsx)(h.A,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component",children:"On this page"})})}const te={tocCollapsible:"tocCollapsible_ETCw",tocCollapsibleContent:"tocCollapsibleContent_vkbj",tocCollapsibleExpanded:"tocCollapsibleExpanded_sAul"};function se({toc:e,className:n,minHeadingLevel:t,maxHeadingLevel:s}){const{collapsed:i,toggleCollapsed:a}=(0,F.u)({initialState:!0});return(0,l.jsxs)("div",{className:(0,u.A)(te.tocCollapsible,!i&&te.tocCollapsibleExpanded,n),children:[(0,l.jsx)(ne,{collapsed:i,onClick:a}),(0,l.jsx)(F.N,{lazy:!0,className:te.tocCollapsibleContent,collapsed:i,children:(0,l.jsx)(K,{toc:e,minHeadingLevel:t,maxHeadingLevel:s})})]})}const ie={tocMobile:"tocMobile_ITEo"};function ae(){const{toc:e,frontMatter:n}=c();return(0,l.jsx)(se,{toc:e,minHeadingLevel:n.toc_min_heading_level,maxHeadingLevel:n.toc_max_heading_level,className:(0,u.A)(g.G.docs.docTocMobile,ie.tocMobile)})}const le={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"},oe="table-of-contents__link toc-highlight",re="table-of-contents__link--active";function ce({className:e,...n}){return(0,l.jsx)("div",{className:(0,u.A)(le.tableOfContents,"thin-scrollbar",e),children:(0,l.jsx)(K,{...n,linkClassName:oe,linkActiveClassName:re})})}function de(){const{toc:e,frontMatter:n}=c();return(0,l.jsx)(ce,{toc:e,minHeadingLevel:n.toc_min_heading_level,maxHeadingLevel:n.toc_max_heading_level,className:g.G.docs.docTocDesktop})}var ue=t(1107),me=t(8453),he=t(5260),xe=t(1028);function fe(e){return(0,l.jsx)("code",{...e})}var pe=t(3427),je=t(2303);const ve="details_lb9f",be="isBrowser_bmU9",ge="collapsibleContent_i85q";function Ae(e){return!!e&&("SUMMARY"===e.tagName||Ae(e.parentElement))}function Ne(e,n){return!!e&&(e===n||Ne(e.parentElement,n))}function Ce({summary:e,children:n,...t}){(0,pe.A)().collectAnchor(t.id);const i=(0,je.A)(),a=(0,s.useRef)(null),{collapsed:o,setCollapsed:r}=(0,F.u)({initialState:!t.open}),[c,d]=(0,s.useState)(t.open),m=s.isValidElement(e)?e:(0,l.jsx)("summary",{children:e??"Details"});return(0,l.jsxs)("details",{...t,ref:a,open:c,"data-collapsed":o,className:(0,u.A)(ve,i&&be,t.className),onMouseDown:e=>{Ae(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const n=e.target;Ae(n)&&Ne(n,a.current)&&(e.preventDefault(),o?(r(!1),d(!0)):r(!0))},children:[m,(0,l.jsx)(F.N,{lazy:!1,collapsed:o,onCollapseTransitionEnd:e=>{r(e),d(!e)},children:(0,l.jsx)("div",{className:ge,children:n})})]})}const Le="details_b_Ee";function _e({...e}){return(0,l.jsx)(Ce,{...e,className:(0,u.A)("alert alert--info",Le,e.className)})}function ye(e){const n=s.Children.toArray(e.children),t=n.find(e=>s.isValidElement(e)&&"summary"===e.type),i=(0,l.jsx)(l.Fragment,{children:n.filter(e=>e!==t)});return(0,l.jsx)(_e,{...e,summary:t,children:i})}function Te(e){return(0,l.jsx)(ue.A,{...e})}const ke="containsTaskList_mC6p";function we(e){if(void 0!==e)return(0,u.A)(e,e?.includes("contains-task-list")&&ke)}const He="img_ev3q";function Me(e){const{mdxAdmonitionTitle:n,rest:t}=function(e){const n=s.Children.toArray(e),t=n.find(e=>s.isValidElement(e)&&"mdxAdmonitionTitle"===e.type),i=n.filter(e=>e!==t),a=t?.props.children;return{mdxAdmonitionTitle:a,rest:i.length>0?(0,l.jsx)(l.Fragment,{children:i}):null}}(e.children),i=e.title??n;return{...e,...i&&{title:i},children:t}}const Be="admonition_xJq3",Ue="admonitionHeading_Gvgb",Ee="admonitionIcon_Rf37",Ie="admonitionContent_BuS1";function Ve({type:e,className:n,children:t}){return(0,l.jsx)("div",{className:(0,u.A)(g.G.common.admonition,g.G.common.admonitionType(e),Be,n),children:t})}function ze({icon:e,title:n}){return(0,l.jsxs)("div",{className:Ue,children:[(0,l.jsx)("span",{className:Ee,children:e}),n]})}function Re({children:e}){return e?(0,l.jsx)("div",{className:Ie,children:e}):null}function De(e){const{type:n,icon:t,title:s,children:i,className:a}=e;return(0,l.jsxs)(Ve,{type:n,className:a,children:[s||t?(0,l.jsx)(ze,{title:s,icon:t}):null,(0,l.jsx)(Re,{children:i})]})}function Ge(e){return(0,l.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,l.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const Oe={icon:(0,l.jsx)(Ge,{}),title:(0,l.jsx)(h.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function Se(e){return(0,l.jsx)(De,{...Oe,...e,className:(0,u.A)("alert alert--secondary",e.className),children:e.children})}function Fe(e){return(0,l.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,l.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const Pe={icon:(0,l.jsx)(Fe,{}),title:(0,l.jsx)(h.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function qe(e){return(0,l.jsx)(De,{...Pe,...e,className:(0,u.A)("alert alert--success",e.className),children:e.children})}function $e(e){return(0,l.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,l.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const We={icon:(0,l.jsx)($e,{}),title:(0,l.jsx)(h.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function Je(e){return(0,l.jsx)(De,{...We,...e,className:(0,u.A)("alert alert--info",e.className),children:e.children})}function Ze(e){return(0,l.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,l.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const Ye={icon:(0,l.jsx)(Ze,{}),title:(0,l.jsx)(h.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function Qe(e){return(0,l.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,l.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const Xe={icon:(0,l.jsx)(Qe,{}),title:(0,l.jsx)(h.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const Ke={icon:(0,l.jsx)(Ze,{}),title:(0,l.jsx)(h.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const en={...{note:Se,tip:qe,info:Je,warning:function(e){return(0,l.jsx)(De,{...Ye,...e,className:(0,u.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,l.jsx)(De,{...Xe,...e,className:(0,u.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,l.jsx)(Se,{title:"secondary",...e}),important:e=>(0,l.jsx)(Je,{title:"important",...e}),success:e=>(0,l.jsx)(qe,{title:"success",...e}),caution:function(e){return(0,l.jsx)(De,{...Ke,...e,className:(0,u.A)("alert alert--warning",e.className),children:e.children})}}};function nn(e){const n=Me(e),t=(s=n.type,en[s]||(console.warn(`No admonition component found for admonition type "${s}". Using Info as fallback.`),en.info));var s;return(0,l.jsx)(t,{...n})}var tn=t(418);const sn={Head:he.A,details:ye,Details:ye,code:function(e){return function(e){return void 0!==e.children&&s.Children.toArray(e.children).every(e=>"string"==typeof e&&!e.includes("\n"))}(e)?(0,l.jsx)(fe,{...e}):(0,l.jsx)(xe.A,{...e})},a:function(e){return(0,l.jsx)(x.A,{...e})},pre:function(e){return(0,l.jsx)(l.Fragment,{children:e.children})},ul:function(e){return(0,l.jsx)("ul",{...e,className:we(e.className)})},li:function(e){return(0,pe.A)().collectAnchor(e.id),(0,l.jsx)("li",{...e})},img:function(e){return(0,l.jsx)("img",{decoding:"async",loading:"lazy",...e,className:(n=e.className,(0,u.A)(n,He))});var n},h1:e=>(0,l.jsx)(Te,{as:"h1",...e}),h2:e=>(0,l.jsx)(Te,{as:"h2",...e}),h3:e=>(0,l.jsx)(Te,{as:"h3",...e}),h4:e=>(0,l.jsx)(Te,{as:"h4",...e}),h5:e=>(0,l.jsx)(Te,{as:"h5",...e}),h6:e=>(0,l.jsx)(Te,{as:"h6",...e}),admonition:nn,mermaid:tn.A};function an({children:e}){return(0,l.jsx)(me.x,{components:sn,children:e})}function ln({children:e}){const n=function(){const{metadata:e,frontMatter:n,contentTitle:t}=c();return n.hide_title||void 0!==t?null:e.title}();return(0,l.jsxs)("div",{className:(0,u.A)(g.G.docs.docMarkdown,"markdown"),children:[n&&(0,l.jsx)("header",{children:(0,l.jsx)(ue.A,{as:"h1",children:n})}),(0,l.jsx)(an,{children:e})]})}var on=t(6972),rn=t(9169),cn=t(6025);function dn(e){return(0,l.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,l.jsx)("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"})})}const un={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function mn(){const e=(0,cn.Ay)("/");return(0,l.jsx)("li",{className:"breadcrumbs__item",children:(0,l.jsx)(x.A,{"aria-label":(0,h.T)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e,children:(0,l.jsx)(dn,{className:un.breadcrumbHomeIcon})})})}function hn(e){const n=function({breadcrumbs:e}){const{siteConfig:n}=(0,v.A)();return{"@context":"https://schema.org","@type":"BreadcrumbList",itemListElement:e.filter(e=>e.href).map((e,t)=>({"@type":"ListItem",position:t+1,name:e.label,item:`${n.url}${e.href}`}))}}({breadcrumbs:e.breadcrumbs});return(0,l.jsx)(he.A,{children:(0,l.jsx)("script",{type:"application/ld+json",children:JSON.stringify(n)})})}const xn={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function fn({children:e,href:n,isLast:t}){const s="breadcrumbs__link";return t?(0,l.jsx)("span",{className:s,children:e}):n?(0,l.jsx)(x.A,{className:s,href:n,children:(0,l.jsx)("span",{children:e})}):(0,l.jsx)("span",{className:s,children:e})}function pn({children:e,active:n}){return(0,l.jsx)("li",{className:(0,u.A)("breadcrumbs__item",{"breadcrumbs__item--active":n}),children:e})}function jn(){const e=(0,on.OF)(),n=(0,rn.Dt)();return e?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(hn,{breadcrumbs:e}),(0,l.jsx)("nav",{className:(0,u.A)(g.G.docs.docBreadcrumbs,xn.breadcrumbsContainer),"aria-label":(0,h.T)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,l.jsxs)("ul",{className:"breadcrumbs",children:[n&&(0,l.jsx)(mn,{}),e.map((n,t)=>{const s=t===e.length-1,i="category"===n.type&&n.linkUnlisted?void 0:n.href;return(0,l.jsx)(pn,{active:s,children:(0,l.jsx)(fn,{href:i,isLast:s,children:n.label})},t)})]})})]}):null}function vn(){return(0,l.jsx)(h.A,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function bn(){return(0,l.jsx)(h.A,{id:"theme.contentVisibility.unlistedBanner.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function gn(){return(0,l.jsx)(he.A,{children:(0,l.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function An(){return(0,l.jsx)(h.A,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function Nn(){return(0,l.jsx)(h.A,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}function Cn({className:e}){return(0,l.jsx)(nn,{type:"caution",title:(0,l.jsx)(An,{}),className:(0,u.A)(e,g.G.common.draftBanner),children:(0,l.jsx)(Nn,{})})}function Ln({className:e}){return(0,l.jsx)(nn,{type:"caution",title:(0,l.jsx)(vn,{}),className:(0,u.A)(e,g.G.common.unlistedBanner),children:(0,l.jsx)(bn,{})})}function _n(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(gn,{}),(0,l.jsx)(Ln,{...e})]})}function yn({metadata:e}){const{unlisted:n,frontMatter:t}=e;return(0,l.jsxs)(l.Fragment,{children:[(n||t.unlisted)&&(0,l.jsx)(_n,{}),t.draft&&(0,l.jsx)(Cn,{})]})}const Tn={docItemContainer:"docItemContainer_Djhp",docItemCol:"docItemCol_VOVn"};function kn({children:e}){const n=function(){const{frontMatter:e,toc:n}=c(),t=(0,m.l)(),s=e.hide_table_of_contents,i=!s&&n.length>0;return{hidden:s,mobile:i?(0,l.jsx)(ae,{}):void 0,desktop:!i||"desktop"!==t&&"ssr"!==t?void 0:(0,l.jsx)(de,{})}}(),{metadata:t}=c();return(0,l.jsxs)("div",{className:"row",children:[(0,l.jsxs)("div",{className:(0,u.A)("col",!n.hidden&&Tn.docItemCol),children:[(0,l.jsx)(yn,{metadata:t}),(0,l.jsx)(T,{}),(0,l.jsxs)("div",{className:Tn.docItemContainer,children:[(0,l.jsxs)("article",{children:[(0,l.jsx)(jn,{}),(0,l.jsx)(k,{}),n.mobile,(0,l.jsx)(ln,{children:e}),(0,l.jsx)(S,{})]}),(0,l.jsx)(j,{})]})]}),n.desktop&&(0,l.jsx)("div",{className:"col col--3",children:n.desktop})]})}function wn(e){const n=`docs-doc-id-${e.content.metadata.id}`,t=e.content;return(0,l.jsx)(r,{content:e.content,children:(0,l.jsxs)(i.e3,{className:n,children:[(0,l.jsx)(d,{}),(0,l.jsx)(kn,{children:(0,l.jsx)(t,{})})]})})}}}]);
\ No newline at end of file
diff --git a/assets/js/17896441.f6596e76.js b/assets/js/17896441.f6596e76.js
deleted file mode 100644
index 7c6feb267..000000000
--- a/assets/js/17896441.f6596e76.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[401],{1113:(e,n,t)=>{t.r(n),t.d(n,{default:()=>kn});var s=t(6540),i=t(1769),a=t(6849),l=t(4848);const o=s.createContext(null);function r(e){let{children:n,content:t}=e;const i=function(e){return(0,s.useMemo)((()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc})),[e])}(t);return(0,l.jsx)(o.Provider,{value:i,children:n})}function c(){const e=(0,s.useContext)(o);if(null===e)throw new a.dV("DocProvider");return e}function d(){const{metadata:e,frontMatter:n,assets:t}=c();return(0,l.jsx)(i.be,{title:e.title,description:e.description,keywords:n.keywords,image:t.image??n.image})}var u=t(4164),m=t(6682),h=t(539),x=t(6289);function f(e){const{permalink:n,title:t,subLabel:s,isNext:i}=e;return(0,l.jsxs)(x.A,{className:(0,u.A)("pagination-nav__link",i?"pagination-nav__link--next":"pagination-nav__link--prev"),to:n,children:[s&&(0,l.jsx)("div",{className:"pagination-nav__sublabel",children:s}),(0,l.jsx)("div",{className:"pagination-nav__label",children:t})]})}function p(e){const{previous:n,next:t}=e;return(0,l.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,h.T)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[n&&(0,l.jsx)(f,{...n,subLabel:(0,l.jsx)(h.A,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})}),t&&(0,l.jsx)(f,{...t,subLabel:(0,l.jsx)(h.A,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0})]})}function v(){const{metadata:e}=c();return(0,l.jsx)(p,{previous:e.previous,next:e.next})}var j=t(797),g=t(6942),b=t(204),A=t(6351),N=t(1858);const C={unreleased:function(e){let{siteTitle:n,versionMetadata:t}=e;return(0,l.jsx)(h.A,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:n,versionLabel:(0,l.jsx)("b",{children:t.label})},children:"This is unreleased documentation for {siteTitle} {versionLabel} version."})},unmaintained:function(e){let{siteTitle:n,versionMetadata:t}=e;return(0,l.jsx)(h.A,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:n,versionLabel:(0,l.jsx)("b",{children:t.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function L(e){const n=C[e.versionMetadata.banner];return(0,l.jsx)(n,{...e})}function _(e){let{versionLabel:n,to:t,onClick:s}=e;return(0,l.jsx)(h.A,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:n,latestVersionLink:(0,l.jsx)("b",{children:(0,l.jsx)(x.A,{to:t,onClick:s,children:(0,l.jsx)(h.A,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label",children:"latest version"})})})},children:"For up-to-date documentation, see the {latestVersionLink} ({versionLabel})."})}function T(e){let{className:n,versionMetadata:t}=e;const{siteConfig:{title:s}}=(0,j.A)(),{pluginId:i}=(0,g.vT)({failfast:!0}),{savePreferredVersionName:a}=(0,A.g1)(i),{latestDocSuggestion:o,latestVersionSuggestion:r}=(0,g.HW)(i),c=o??(d=r).docs.find((e=>e.id===d.mainDocId));var d;return(0,l.jsxs)("div",{className:(0,u.A)(n,b.G.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,l.jsx)("div",{children:(0,l.jsx)(L,{siteTitle:s,versionMetadata:t})}),(0,l.jsx)("div",{className:"margin-top--md",children:(0,l.jsx)(_,{versionLabel:r.label,to:c.path,onClick:()=>a(r.name)})})]})}function y(e){let{className:n}=e;const t=(0,N.r)();return t.banner?(0,l.jsx)(T,{className:n,versionMetadata:t}):null}function k(e){let{className:n}=e;const t=(0,N.r)();return t.badge?(0,l.jsx)("span",{className:(0,u.A)(n,b.G.docs.docVersionBadge,"badge badge--secondary"),children:(0,l.jsx)(h.A,{id:"theme.docs.versionBadge.label",values:{versionLabel:t.label},children:"Version: {versionLabel}"})}):null}const w={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};function H(e){let{permalink:n,label:t,count:s,description:i}=e;return(0,l.jsxs)(x.A,{href:n,title:i,className:(0,u.A)(w.tag,s?w.tagWithCount:w.tagRegular),children:[t,s&&(0,l.jsx)("span",{children:s})]})}const M={tags:"tags_jXut",tag:"tag_QGVx"};function B(e){let{tags:n}=e;return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("b",{children:(0,l.jsx)(h.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,l.jsx)("ul",{className:(0,u.A)(M.tags,"padding--none","margin-left--sm"),children:n.map((e=>(0,l.jsx)("li",{className:M.tag,children:(0,l.jsx)(H,{...e})},e.permalink)))})]})}const U={iconEdit:"iconEdit_Z9Sw"};function E(e){let{className:n,...t}=e;return(0,l.jsx)("svg",{fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,u.A)(U.iconEdit,n),"aria-hidden":"true",...t,children:(0,l.jsx)("g",{children:(0,l.jsx)("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})})})}function I(e){let{editUrl:n}=e;return(0,l.jsxs)(x.A,{to:n,className:b.G.common.editThisPage,children:[(0,l.jsx)(E,{}),(0,l.jsx)(h.A,{id:"theme.common.editThisPage",description:"The link label to edit the current page",children:"Edit this page"})]})}function V(e){void 0===e&&(e={});const{i18n:{currentLocale:n}}=(0,j.A)(),t=function(){const{i18n:{currentLocale:e,localeConfigs:n}}=(0,j.A)();return n[e].calendar}();return new Intl.DateTimeFormat(n,{calendar:t,...e})}function z(e){let{lastUpdatedAt:n}=e;const t=new Date(n),s=V({day:"numeric",month:"short",year:"numeric",timeZone:"UTC"}).format(t);return(0,l.jsx)(h.A,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:(0,l.jsx)("b",{children:(0,l.jsx)("time",{dateTime:t.toISOString(),itemProp:"dateModified",children:s})})},children:" on {date}"})}function S(e){let{lastUpdatedBy:n}=e;return(0,l.jsx)(h.A,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:(0,l.jsx)("b",{children:n})},children:" by {user}"})}function R(e){let{lastUpdatedAt:n,lastUpdatedBy:t}=e;return(0,l.jsxs)("span",{className:b.G.common.lastUpdated,children:[(0,l.jsx)(h.A,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:n?(0,l.jsx)(z,{lastUpdatedAt:n}):"",byUser:t?(0,l.jsx)(S,{lastUpdatedBy:t}):""},children:"Last updated{atDate}{byUser}"}),!1]})}const D={lastUpdated:"lastUpdated_JAkA"};function G(e){let{className:n,editUrl:t,lastUpdatedAt:s,lastUpdatedBy:i}=e;return(0,l.jsxs)("div",{className:(0,u.A)("row",n),children:[(0,l.jsx)("div",{className:"col",children:t&&(0,l.jsx)(I,{editUrl:t})}),(0,l.jsx)("div",{className:(0,u.A)("col",D.lastUpdated),children:(s||i)&&(0,l.jsx)(R,{lastUpdatedAt:s,lastUpdatedBy:i})})]})}function O(){const{metadata:e}=c(),{editUrl:n,lastUpdatedAt:t,lastUpdatedBy:s,tags:i}=e,a=i.length>0,o=!!(n||t||s);return a||o?(0,l.jsxs)("footer",{className:(0,u.A)(b.G.docs.docFooter,"docusaurus-mt-lg"),children:[a&&(0,l.jsx)("div",{className:(0,u.A)("row margin-top--sm",b.G.docs.docFooterTagsRow),children:(0,l.jsx)("div",{className:"col",children:(0,l.jsx)(B,{tags:i})})}),o&&(0,l.jsx)(G,{className:(0,u.A)("margin-top--sm",b.G.docs.docFooterEditMetaRow),editUrl:n,lastUpdatedAt:t,lastUpdatedBy:s})]}):null}var F=t(3535),P=t(3115);function q(e){const n=e.map((e=>({...e,parentIndex:-1,children:[]}))),t=Array(7).fill(-1);n.forEach(((e,n)=>{const s=t.slice(2,e.level);e.parentIndex=Math.max(...s),t[e.level]=n}));const s=[];return n.forEach((e=>{const{parentIndex:t,...i}=e;t>=0?n[t].children.push(i):s.push(i)})),s}function W(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:s}=e;return n.flatMap((e=>{const n=W({toc:e.children,minHeadingLevel:t,maxHeadingLevel:s});return function(e){return e.level>=t&&e.level<=s}(e)?[{...e,children:n}]:n}))}function $(e){const n=e.getBoundingClientRect();return n.top===n.bottom?$(e.parentNode):n}function Z(e,n){let{anchorTopOffset:t}=n;const s=e.find((e=>$(e).top>=t));if(s){return function(e){return e.top>0&&e.bottom{e.current=n?0:document.querySelector(".navbar").clientHeight}),[n]),e}function Y(e){const n=(0,s.useRef)(void 0),t=J();(0,s.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:s,linkActiveClassName:i,minHeadingLevel:a,maxHeadingLevel:l}=e;function o(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(s),o=function(e){let{minHeadingLevel:n,maxHeadingLevel:t}=e;const s=[];for(let i=n;i<=t;i+=1)s.push(`h${i}.anchor`);return Array.from(document.querySelectorAll(s.join()))}({minHeadingLevel:a,maxHeadingLevel:l}),r=Z(o,{anchorTopOffset:t.current}),c=e.find((e=>r&&r.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,t){t?(n.current&&n.current!==e&&n.current.classList.remove(i),e.classList.add(i),n.current=e):e.classList.remove(i)}(e,e===c)}))}return document.addEventListener("scroll",o),document.addEventListener("resize",o),o(),()=>{document.removeEventListener("scroll",o),document.removeEventListener("resize",o)}}),[e,t])}function Q(e){let{toc:n,className:t,linkClassName:s,isChild:i}=e;return n.length?(0,l.jsx)("ul",{className:i?void 0:t,children:n.map((e=>(0,l.jsxs)("li",{children:[(0,l.jsx)(x.A,{to:`#${e.id}`,className:s??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,l.jsx)(Q,{isChild:!0,toc:e.children,className:t,linkClassName:s})]},e.id)))}):null}const X=s.memo(Q);function K(e){let{toc:n,className:t="table-of-contents table-of-contents__left-border",linkClassName:i="table-of-contents__link",linkActiveClassName:a,minHeadingLevel:o,maxHeadingLevel:r,...c}=e;const d=(0,P.p)(),u=o??d.tableOfContents.minHeadingLevel,m=r??d.tableOfContents.maxHeadingLevel,h=function(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:i}=e;return(0,s.useMemo)((()=>W({toc:q(n),minHeadingLevel:t,maxHeadingLevel:i})),[n,t,i])}({toc:n,minHeadingLevel:u,maxHeadingLevel:m});return Y((0,s.useMemo)((()=>{if(i&&a)return{linkClassName:i,linkActiveClassName:a,minHeadingLevel:u,maxHeadingLevel:m}}),[i,a,u,m])),(0,l.jsx)(X,{toc:h,className:t,linkClassName:i,...c})}const ee={tocCollapsibleButton:"tocCollapsibleButton_TO0P",tocCollapsibleButtonExpanded:"tocCollapsibleButtonExpanded_MG3E"};function ne(e){let{collapsed:n,...t}=e;return(0,l.jsx)("button",{type:"button",...t,className:(0,u.A)("clean-btn",ee.tocCollapsibleButton,!n&&ee.tocCollapsibleButtonExpanded,t.className),children:(0,l.jsx)(h.A,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component",children:"On this page"})})}const te={tocCollapsible:"tocCollapsible_ETCw",tocCollapsibleContent:"tocCollapsibleContent_vkbj",tocCollapsibleExpanded:"tocCollapsibleExpanded_sAul"};function se(e){let{toc:n,className:t,minHeadingLevel:s,maxHeadingLevel:i}=e;const{collapsed:a,toggleCollapsed:o}=(0,F.u)({initialState:!0});return(0,l.jsxs)("div",{className:(0,u.A)(te.tocCollapsible,!a&&te.tocCollapsibleExpanded,t),children:[(0,l.jsx)(ne,{collapsed:a,onClick:o}),(0,l.jsx)(F.N,{lazy:!0,className:te.tocCollapsibleContent,collapsed:a,children:(0,l.jsx)(K,{toc:n,minHeadingLevel:s,maxHeadingLevel:i})})]})}const ie={tocMobile:"tocMobile_ITEo"};function ae(){const{toc:e,frontMatter:n}=c();return(0,l.jsx)(se,{toc:e,minHeadingLevel:n.toc_min_heading_level,maxHeadingLevel:n.toc_max_heading_level,className:(0,u.A)(b.G.docs.docTocMobile,ie.tocMobile)})}const le={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"},oe="table-of-contents__link toc-highlight",re="table-of-contents__link--active";function ce(e){let{className:n,...t}=e;return(0,l.jsx)("div",{className:(0,u.A)(le.tableOfContents,"thin-scrollbar",n),children:(0,l.jsx)(K,{...t,linkClassName:oe,linkActiveClassName:re})})}function de(){const{toc:e,frontMatter:n}=c();return(0,l.jsx)(ce,{toc:e,minHeadingLevel:n.toc_min_heading_level,maxHeadingLevel:n.toc_max_heading_level,className:b.G.docs.docTocDesktop})}var ue=t(9303),me=t(8453),he=t(7143),xe=t(8069);function fe(e){return(0,l.jsx)("code",{...e})}var pe=t(5246),ve=t(9136);const je="details_lb9f",ge="isBrowser_bmU9",be="collapsibleContent_i85q";function Ae(e){return!!e&&("SUMMARY"===e.tagName||Ae(e.parentElement))}function Ne(e,n){return!!e&&(e===n||Ne(e.parentElement,n))}function Ce(e){let{summary:n,children:t,...i}=e;(0,pe.A)().collectAnchor(i.id);const a=(0,ve.A)(),o=(0,s.useRef)(null),{collapsed:r,setCollapsed:c}=(0,F.u)({initialState:!i.open}),[d,m]=(0,s.useState)(i.open),h=s.isValidElement(n)?n:(0,l.jsx)("summary",{children:n??"Details"});return(0,l.jsxs)("details",{...i,ref:o,open:d,"data-collapsed":r,className:(0,u.A)(je,a&&ge,i.className),onMouseDown:e=>{Ae(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const n=e.target;Ae(n)&&Ne(n,o.current)&&(e.preventDefault(),r?(c(!1),m(!0)):c(!0))},children:[h,(0,l.jsx)(F.N,{lazy:!1,collapsed:r,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{c(e),m(!e)},children:(0,l.jsx)("div",{className:be,children:t})})]})}const Le="details_b_Ee";function _e(e){let{...n}=e;return(0,l.jsx)(Ce,{...n,className:(0,u.A)("alert alert--info",Le,n.className)})}function Te(e){const n=s.Children.toArray(e.children),t=n.find((e=>s.isValidElement(e)&&"summary"===e.type)),i=(0,l.jsx)(l.Fragment,{children:n.filter((e=>e!==t))});return(0,l.jsx)(_e,{...e,summary:t,children:i})}function ye(e){return(0,l.jsx)(ue.A,{...e})}const ke="containsTaskList_mC6p";function we(e){if(void 0!==e)return(0,u.A)(e,e?.includes("contains-task-list")&&ke)}const He="img_ev3q";function Me(e){const{mdxAdmonitionTitle:n,rest:t}=function(e){const n=s.Children.toArray(e),t=n.find((e=>s.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),i=n.filter((e=>e!==t)),a=t?.props.children;return{mdxAdmonitionTitle:a,rest:i.length>0?(0,l.jsx)(l.Fragment,{children:i}):null}}(e.children),i=e.title??n;return{...e,...i&&{title:i},children:t}}const Be="admonition_xJq3",Ue="admonitionHeading_Gvgb",Ee="admonitionIcon_Rf37",Ie="admonitionContent_BuS1";function Ve(e){let{type:n,className:t,children:s}=e;return(0,l.jsx)("div",{className:(0,u.A)(b.G.common.admonition,b.G.common.admonitionType(n),Be,t),children:s})}function ze(e){let{icon:n,title:t}=e;return(0,l.jsxs)("div",{className:Ue,children:[(0,l.jsx)("span",{className:Ee,children:n}),t]})}function Se(e){let{children:n}=e;return n?(0,l.jsx)("div",{className:Ie,children:n}):null}function Re(e){const{type:n,icon:t,title:s,children:i,className:a}=e;return(0,l.jsxs)(Ve,{type:n,className:a,children:[s||t?(0,l.jsx)(ze,{title:s,icon:t}):null,(0,l.jsx)(Se,{children:i})]})}function De(e){return(0,l.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,l.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const Ge={icon:(0,l.jsx)(De,{}),title:(0,l.jsx)(h.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function Oe(e){return(0,l.jsx)(Re,{...Ge,...e,className:(0,u.A)("alert alert--secondary",e.className),children:e.children})}function Fe(e){return(0,l.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,l.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const Pe={icon:(0,l.jsx)(Fe,{}),title:(0,l.jsx)(h.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function qe(e){return(0,l.jsx)(Re,{...Pe,...e,className:(0,u.A)("alert alert--success",e.className),children:e.children})}function We(e){return(0,l.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,l.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const $e={icon:(0,l.jsx)(We,{}),title:(0,l.jsx)(h.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function Ze(e){return(0,l.jsx)(Re,{...$e,...e,className:(0,u.A)("alert alert--info",e.className),children:e.children})}function Je(e){return(0,l.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,l.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const Ye={icon:(0,l.jsx)(Je,{}),title:(0,l.jsx)(h.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function Qe(e){return(0,l.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,l.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const Xe={icon:(0,l.jsx)(Qe,{}),title:(0,l.jsx)(h.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const Ke={icon:(0,l.jsx)(Je,{}),title:(0,l.jsx)(h.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const en={...{note:Oe,tip:qe,info:Ze,warning:function(e){return(0,l.jsx)(Re,{...Ye,...e,className:(0,u.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,l.jsx)(Re,{...Xe,...e,className:(0,u.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,l.jsx)(Oe,{title:"secondary",...e}),important:e=>(0,l.jsx)(Ze,{title:"important",...e}),success:e=>(0,l.jsx)(qe,{title:"success",...e}),caution:function(e){return(0,l.jsx)(Re,{...Ke,...e,className:(0,u.A)("alert alert--warning",e.className),children:e.children})}}};function nn(e){const n=Me(e),t=(s=n.type,en[s]||(console.warn(`No admonition component found for admonition type "${s}". Using Info as fallback.`),en.info));var s;return(0,l.jsx)(t,{...n})}var tn=t(205);const sn={Head:he.A,details:Te,Details:Te,code:function(e){return function(e){return void 0!==e.children&&s.Children.toArray(e.children).every((e=>"string"==typeof e&&!e.includes("\n")))}(e)?(0,l.jsx)(fe,{...e}):(0,l.jsx)(xe.A,{...e})},a:function(e){return(0,l.jsx)(x.A,{...e})},pre:function(e){return(0,l.jsx)(l.Fragment,{children:e.children})},ul:function(e){return(0,l.jsx)("ul",{...e,className:we(e.className)})},li:function(e){return(0,pe.A)().collectAnchor(e.id),(0,l.jsx)("li",{...e})},img:function(e){return(0,l.jsx)("img",{decoding:"async",loading:"lazy",...e,className:(n=e.className,(0,u.A)(n,He))});var n},h1:e=>(0,l.jsx)(ye,{as:"h1",...e}),h2:e=>(0,l.jsx)(ye,{as:"h2",...e}),h3:e=>(0,l.jsx)(ye,{as:"h3",...e}),h4:e=>(0,l.jsx)(ye,{as:"h4",...e}),h5:e=>(0,l.jsx)(ye,{as:"h5",...e}),h6:e=>(0,l.jsx)(ye,{as:"h6",...e}),admonition:nn,mermaid:tn.A};function an(e){let{children:n}=e;return(0,l.jsx)(me.x,{components:sn,children:n})}function ln(e){let{children:n}=e;const t=function(){const{metadata:e,frontMatter:n,contentTitle:t}=c();return n.hide_title||void 0!==t?null:e.title}();return(0,l.jsxs)("div",{className:(0,u.A)(b.G.docs.docMarkdown,"markdown"),children:[t&&(0,l.jsx)("header",{children:(0,l.jsx)(ue.A,{as:"h1",children:t})}),(0,l.jsx)(an,{children:n})]})}var on=t(3751),rn=t(214),cn=t(9030);function dn(e){return(0,l.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,l.jsx)("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"})})}const un={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function mn(){const e=(0,cn.Ay)("/");return(0,l.jsx)("li",{className:"breadcrumbs__item",children:(0,l.jsx)(x.A,{"aria-label":(0,h.T)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e,children:(0,l.jsx)(dn,{className:un.breadcrumbHomeIcon})})})}const hn={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function xn(e){let{children:n,href:t,isLast:s}=e;const i="breadcrumbs__link";return s?(0,l.jsx)("span",{className:i,itemProp:"name",children:n}):t?(0,l.jsx)(x.A,{className:i,href:t,itemProp:"item",children:(0,l.jsx)("span",{itemProp:"name",children:n})}):(0,l.jsx)("span",{className:i,children:n})}function fn(e){let{children:n,active:t,index:s,addMicrodata:i}=e;return(0,l.jsxs)("li",{...i&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},className:(0,u.A)("breadcrumbs__item",{"breadcrumbs__item--active":t}),children:[n,(0,l.jsx)("meta",{itemProp:"position",content:String(s+1)})]})}function pn(){const e=(0,on.OF)(),n=(0,rn.Dt)();return e?(0,l.jsx)("nav",{className:(0,u.A)(b.G.docs.docBreadcrumbs,hn.breadcrumbsContainer),"aria-label":(0,h.T)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,l.jsxs)("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList",children:[n&&(0,l.jsx)(mn,{}),e.map(((n,t)=>{const s=t===e.length-1,i="category"===n.type&&n.linkUnlisted?void 0:n.href;return(0,l.jsx)(fn,{active:s,index:t,addMicrodata:!!i,children:(0,l.jsx)(xn,{href:i,isLast:s,children:n.label})},t)}))]})}):null}function vn(){return(0,l.jsx)(h.A,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function jn(){return(0,l.jsx)(h.A,{id:"theme.contentVisibility.unlistedBanner.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function gn(){return(0,l.jsx)(he.A,{children:(0,l.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function bn(){return(0,l.jsx)(h.A,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function An(){return(0,l.jsx)(h.A,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}function Nn(e){let{className:n}=e;return(0,l.jsx)(nn,{type:"caution",title:(0,l.jsx)(bn,{}),className:(0,u.A)(n,b.G.common.draftBanner),children:(0,l.jsx)(An,{})})}function Cn(e){let{className:n}=e;return(0,l.jsx)(nn,{type:"caution",title:(0,l.jsx)(vn,{}),className:(0,u.A)(n,b.G.common.unlistedBanner),children:(0,l.jsx)(jn,{})})}function Ln(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(gn,{}),(0,l.jsx)(Cn,{...e})]})}function _n(e){let{metadata:n}=e;const{unlisted:t,frontMatter:s}=n;return(0,l.jsxs)(l.Fragment,{children:[(t||s.unlisted)&&(0,l.jsx)(Ln,{}),s.draft&&(0,l.jsx)(Nn,{})]})}const Tn={docItemContainer:"docItemContainer_Djhp",docItemCol:"docItemCol_VOVn"};function yn(e){let{children:n}=e;const t=function(){const{frontMatter:e,toc:n}=c(),t=(0,m.l)(),s=e.hide_table_of_contents,i=!s&&n.length>0;return{hidden:s,mobile:i?(0,l.jsx)(ae,{}):void 0,desktop:!i||"desktop"!==t&&"ssr"!==t?void 0:(0,l.jsx)(de,{})}}(),{metadata:s}=c();return(0,l.jsxs)("div",{className:"row",children:[(0,l.jsxs)("div",{className:(0,u.A)("col",!t.hidden&&Tn.docItemCol),children:[(0,l.jsx)(_n,{metadata:s}),(0,l.jsx)(y,{}),(0,l.jsxs)("div",{className:Tn.docItemContainer,children:[(0,l.jsxs)("article",{children:[(0,l.jsx)(pn,{}),(0,l.jsx)(k,{}),t.mobile,(0,l.jsx)(ln,{children:n}),(0,l.jsx)(O,{})]}),(0,l.jsx)(v,{})]})]}),t.desktop&&(0,l.jsx)("div",{className:"col col--3",children:t.desktop})]})}function kn(e){const n=`docs-doc-id-${e.content.metadata.id}`,t=e.content;return(0,l.jsx)(r,{content:e.content,children:(0,l.jsxs)(i.e3,{className:n,children:[(0,l.jsx)(d,{}),(0,l.jsx)(yn,{children:(0,l.jsx)(t,{})})]})})}}}]);
\ No newline at end of file
diff --git a/assets/js/19608e5d.eae1ce51.js b/assets/js/19608e5d.eae1ce51.js
new file mode 100644
index 000000000..3b06b33b3
--- /dev/null
+++ b/assets/js/19608e5d.eae1ce51.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[257],{1814:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>i,contentTitle:()=>c,default:()=>u,frontMatter:()=>r,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"setup/backup","title":"Backup and Restore","description":"Database backup and restore is actually a function of the Komodo CLI,","source":"@site/docs/setup/backup.md","sourceDirName":"setup","slug":"/setup/backup","permalink":"/docs/setup/backup","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/setup/backup.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Connect More Servers","permalink":"/docs/setup/connect-servers"},"next":{"title":"Advanced Configuration","permalink":"/docs/setup/advanced"}}');var s=o(4848),a=o(8453);const r={},c="Backup and Restore",i={},d=[{value:"Backups",id:"backups",level:2},{value:"Remote Backups",id:"remote-backups",level:2},{value:"Restore",id:"restore",level:2},{value:"Consistency",id:"consistency",level:2}];function l(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",strong:"strong",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"backup-and-restore",children:"Backup and Restore"})}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsxs)(n.p,{children:["Database backup and restore is actually a function of the ",(0,s.jsx)(n.a,{href:"../ecosystem/cli",children:"Komodo CLI"}),",\nwhich is packaged in with the Komodo Core image for convenience."]})}),"\n",(0,s.jsxs)(n.p,{children:["Starting from ",(0,s.jsx)(n.strong,{children:"v1.19.0"}),", new Komodo installs will automatically create the\n",(0,s.jsx)(n.strong,{children:"Backup Core Database"})," ",(0,s.jsx)(n.a,{href:"../resources/procedures#procedures",children:"Procedure"}),", scheduled daily.\nIf you don't have it, this is the Toml:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-toml",children:'[[procedure]]\nname = "Backup Core Database"\ndescription = "Triggers the Core database backup at the scheduled time."\ntags = ["system"]\nconfig.schedule = "Every day at 01:00"\n\n[[procedure.config.stage]]\nname = "Stage 1"\nenabled = true\nexecutions = [\n { execution.type = "BackupCoreDatabase", execution.params = {}, enabled = true }\n]\n'})}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsxs)(n.p,{children:["You are also able to integrate ",(0,s.jsx)(n.code,{children:"BackupCoreDatabase"})," into other Procedures, for example to trigger\nthis process before launching a backup container. There is nothing special about this Procedure,\nit's just created by default for guidance / convenience."]})}),"\n",(0,s.jsx)(n.h2,{id:"backups",children:"Backups"}),"\n",(0,s.jsxs)(n.p,{children:["When Komodo takes a database backup, it creates a ",(0,s.jsx)(n.strong,{children:"folder named for the time the backup was taken"}),",\nand dumps the gzip-compressed documents to files in this folder.\nIn order to store the backups to disk, ",(0,s.jsxs)(n.strong,{children:["mount a host path to ",(0,s.jsx)(n.code,{children:"/backups"})]})," in the Komodo Core container."]}),"\n",(0,s.jsxs)(n.p,{children:["Due to its larger size and relative unimportance, the ",(0,s.jsx)(n.code,{children:"Stats"})," collection (containing historical server cpu / mem / disk usage)\nis not included in dated backups. Just latest Stats are maintained at the top level of the backup folder."]}),"\n",(0,s.jsxs)(n.p,{children:["In order to prevent unbounded growth, the backup process implements a pruning feature which will ensure\nonly the most recent 14 backup folders are kept. To change this number, set ",(0,s.jsx)(n.code,{children:"max_backups"})," (",(0,s.jsx)(n.code,{children:"KOMODO_CLI_MAX_BACKUPS"}),")\nin ",(0,s.jsx)(n.code,{children:"core.config.toml"}),", ",(0,s.jsx)(n.code,{children:"komodo.cli.toml"}),", or in the Core container environment."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"# Folder structure\n/backups\n| 2025-08-12_03-00-01\n| | Action.gz\n| | Alerter.gz\n| | ...\n| 2025-08-13_03-00-01\n| 2025-08-14_03-00-01\n| ...\n| Stats.gz\n"})}),"\n",(0,s.jsx)(n.admonition,{type:"warning",children:(0,s.jsx)(n.p,{children:"Currently no encryption is supported,\nso you may want to encrypt the files before backing up remotely if your backup solution doesn't support that natively."})}),"\n",(0,s.jsx)(n.h2,{id:"remote-backups",children:"Remote Backups"}),"\n",(0,s.jsxs)(n.p,{children:["Since database backup is actually a function of the ",(0,s.jsx)(n.a,{href:"../ecosystem/cli",children:"Komodo CLI"}),", you can also backup directly to\na remote server using the ",(0,s.jsx)(n.code,{children:"ghcr.io/moghtech/komodo-cli"})," image. This service will backup once and then exit, so the scheduled deployment should still happen using a Procedure or Action:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"services:\n cli:\n image: ghcr.io/moghtech/komodo-cli\n command: km database backup -y\n volumes:\n - /path/to/komodo/backups:/backups\n environment:\n ## Database port must be reachable.\n KOMODO_DATABASE_ADDRESS: komodo.example.com:27017\n KOMODO_DATABASE_USERNAME: \n KOMODO_DATABASE_PASSWORD: \n KOMODO_DATABASE_DB_NAME: komodo\n KOMODO_CLI_MAX_BACKUPS: 30 # set to your preference\n"})}),"\n",(0,s.jsx)(n.h2,{id:"restore",children:"Restore"}),"\n",(0,s.jsx)(n.p,{children:"The Komodo CLI handles database restores as well."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"services:\n cli:\n image: ghcr.io/moghtech/komodo-cli\n ## Optionally specify a specific folder with `--restore-folder`,\n ## otherwise restores the most recent backup.\n command: km database restore -y # --restore-folder 2025-08-14_03-00-01\n volumes:\n # Same mount to backup files as above\n - /path/to/komodo/backups:/backups\n environment:\n ## Database port must be reachable.\n ## Note the different env vars needed compared to backup.\n ## This is to prevent any accidental restores.\n KOMODO_CLI_DATABASE_TARGET_ADDRESS: komodo.example.com:27017\n KOMODO_CLI_DATABASE_TARGET_USERNAME: \n KOMODO_CLI_DATABASE_TARGET_PASSWORD: \n KOMODO_CLI_DATABASE_TARGET_DB_NAME: komodo-restore\n"})}),"\n",(0,s.jsx)(n.admonition,{type:"warning",children:(0,s.jsx)(n.p,{children:'The restore process can be run multiple times with same backup files, and won\'t create any extra copies.\nHOWEVER it will not "clear" the target database beforehand. If the restore database is already populated,\nthose old documents will also remain. You may want to drop / delete the target database\nbefore restoring to it in this case.'})}),"\n",(0,s.jsx)(n.h2,{id:"consistency",children:"Consistency"}),"\n",(0,s.jsx)(n.p,{children:"So long as the backup process completes successfully, the files produces can always be restored\nno matter how active the Komodo instance is at the time of backup. However writes that happen during\nthe backup process, such as updates to the resource configuration, may or may not be included in the backup\ndepending on the timing."}),"\n",(0,s.jsxs)(n.p,{children:["While it should be rare that this causes any kind of issue when it comes to restoring, if your\nKomodo undergoes a lot of usage at all hours and you are worried about consistency,\nyou could consider ",(0,s.jsx)(n.a,{href:"https://www.mongodb.com/docs/manual/reference/method/db.fsyncLock/#mongodb-method-db.fsyncLock",children:"locking"}),"\nMongo before the backup. Just make sure to ",(0,s.jsx)(n.a,{href:"https://www.mongodb.com/docs/manual/reference/method/db.fsyncUnlock/",children:"unlock"}),"\nthe database afterwards."]})]})}function u(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>r,x:()=>c});var t=o(6540);const s={},a=t.createContext(s);function r(e){const n=t.useContext(a);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(a.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/1bd19f0c.45db0185.js b/assets/js/1bd19f0c.45db0185.js
new file mode 100644
index 000000000..38ec6a72e
--- /dev/null
+++ b/assets/js/1bd19f0c.45db0185.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[469],{4110:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>d,contentTitle:()=>r,default:()=>u,frontMatter:()=>l,metadata:()=>t,toc:()=>a});const t=JSON.parse('{"id":"setup/advanced","title":"Advanced Configuration","description":"OIDC / Oauth2","source":"@site/docs/setup/advanced.mdx","sourceDirName":"setup","slug":"/setup/advanced","permalink":"/docs/setup/advanced","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/setup/advanced.mdx","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Backup and Restore","permalink":"/docs/setup/backup"},"next":{"title":"Version Upgrades","permalink":"/docs/setup/version-upgrades"}}');var i=n(4848),s=n(8453),c=n(6695);const l={},r="Advanced Configuration",d={},a=[{value:"OIDC / Oauth2",id:"oidc--oauth2",level:3},{value:"Keycloak",id:"keycloak",level:3},{value:"Mount a config file",id:"mount-a-config-file",level:3}];function h(e){const o={a:"a",admonition:"admonition",code:"code",h1:"h1",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.header,{children:(0,i.jsx)(o.h1,{id:"advanced-configuration",children:"Advanced Configuration"})}),"\n",(0,i.jsx)(o.h3,{id:"oidc--oauth2",children:"OIDC / Oauth2"}),"\n",(0,i.jsxs)(o.p,{children:["To enable OAuth2 login, you must create a client on the respective OAuth provider,\nfor example ",(0,i.jsx)(o.a,{href:"https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/creating-an-oauth-app",children:"Github"}),"\nor ",(0,i.jsx)(o.a,{href:"https://developers.google.com/identity/protocols/oauth2",children:"Google"}),"."]}),"\n",(0,i.jsxs)(o.p,{children:["Komodo also supports self hosted Oauth2 providers like ",(0,i.jsx)(o.a,{href:"https://docs.goauthentik.io/docs/providers/oauth2/",children:"Authentik"}),", ",(0,i.jsx)(o.a,{href:"https://docs.gitea.com/development/oauth2-provider",children:"Gitea"})," and ",(0,i.jsx)(o.a,{href:"https://www.keycloak.org",children:"Keycloak"}),"."]}),"\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsxs)(o.li,{children:["Komodo uses the ",(0,i.jsx)(o.code,{children:"web application"})," login flow."]}),"\n",(0,i.jsxs)(o.li,{children:["The redirect uri is:","\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsxs)(o.li,{children:[(0,i.jsx)(o.code,{children:"/auth/github/callback"})," for Github."]}),"\n",(0,i.jsxs)(o.li,{children:[(0,i.jsx)(o.code,{children:"/auth/google/callback"})," for Google."]}),"\n",(0,i.jsxs)(o.li,{children:[(0,i.jsx)(o.code,{children:"/auth/oidc/callback"})," for OIDC."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(o.h3,{id:"keycloak",children:"Keycloak"}),"\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsxs)(o.li,{children:["Create an ",(0,i.jsx)(o.a,{href:"https://www.keycloak.org/docs/latest/server_admin/index.html#proc-creating-oidc-client_server_administration_guide",children:"OIDC client"})," in Keycloak.","\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsxs)(o.li,{children:["Note down the ",(0,i.jsx)(o.code,{children:"Client ID"}),' that you enter (e.g.: "komodo"), you will need it for Komodo configuration']}),"\n",(0,i.jsxs)(o.li,{children:[(0,i.jsx)(o.code,{children:"Valid Redirect URIs"}),": use ",(0,i.jsx)(o.code,{children:"/auth/oidc/callback"})," and substitute ",(0,i.jsx)(o.code,{children:""})," with your Komodo url."]}),"\n",(0,i.jsxs)(o.li,{children:["Turn ",(0,i.jsx)(o.code,{children:"Client authentication"})," to ",(0,i.jsx)(o.code,{children:"On"}),"."]}),"\n",(0,i.jsxs)(o.li,{children:["After you finished creating the client, open it and go to ",(0,i.jsx)(o.code,{children:"Credentials"})," tab and copy the ",(0,i.jsx)(o.code,{children:"Client Secret"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(o.li,{children:["Edit your environment variables for komodo core docker container and set the following:","\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsx)(o.li,{children:(0,i.jsx)(o.code,{children:"KOMODO_OIDC_ENABLED=true"})}),"\n",(0,i.jsxs)(o.li,{children:[(0,i.jsx)(o.code,{children:"KOMODO_OIDC_PROVIDER=https:///realms/master"})," or replace ",(0,i.jsx)(o.code,{children:"master"})," with another realm if you don't want to use the default one"]}),"\n",(0,i.jsxs)(o.li,{children:[(0,i.jsx)(o.code,{children:"KOMODO_OIDC_CLIENT_ID=..."})," what you specified as ",(0,i.jsx)(o.code,{children:"Client ID"})]}),"\n",(0,i.jsxs)(o.li,{children:[(0,i.jsx)(o.code,{children:"KOMODO_OIDC_CLIENT_SECRET=..."})," that you copied from Keycloak"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(o.h3,{id:"mount-a-config-file",children:"Mount a config file"}),"\n",(0,i.jsxs)(o.p,{children:["If you prefer to keep sensitive information out of environment variables, you can optionally\nwrite a config file on your host, and mount it to ",(0,i.jsx)(o.code,{children:"/config/config.toml"})," in the Komodo core container."]}),"\n",(0,i.jsxs)(o.p,{children:["The configuration can also be passed as ",(0,i.jsx)(o.strong,{children:"YAML"})," or ",(0,i.jsx)(o.strong,{children:"JSON"}),".\nYou can use the it-tools to convert this TOML file to your preferred format:"]}),"\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsxs)(o.li,{children:["YAML: ",(0,i.jsx)(o.a,{href:"https://it-tools.tech/toml-to-yaml",children:"https://it-tools.tech/toml-to-yaml"})]}),"\n",(0,i.jsxs)(o.li,{children:["JSON: ",(0,i.jsx)(o.a,{href:"https://it-tools.tech/toml-to-json",children:"https://it-tools.tech/toml-to-json"})]}),"\n"]}),"\n",(0,i.jsx)(o.admonition,{type:"info",children:(0,i.jsx)(o.p,{children:"Configuration can still be passed in environment variables, and will take precedent over what is passed in the file."})}),"\n",(0,i.jsxs)(o.p,{children:["Quick download to ",(0,i.jsx)(o.code,{children:"./komodo/core.config.toml"}),":"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"wget -P komodo https://raw.githubusercontent.com/moghtech/komodo/main/config/core.config.toml\n"})}),"\n","\n",(0,i.jsx)(c.A,{title:"https://github.com/moghtech/komodo/blob/main/config/core.config.toml",url:"https://raw.githubusercontent.com/moghtech/komodo/main/config/core.config.toml",language:"toml"})]})}function u(e={}){const{wrapper:o}={...(0,s.R)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},6695:(e,o,n)=>{n.d(o,{A:()=>c});var t=n(6540),i=n(1028),s=n(4848);function c({url:e,language:o,title:n}){const[c,l]=(0,t.useState)("");return(0,t.useEffect)(()=>{!async function(e,o){const n=await fetch(e);o(await n.text())}(e,l)},[]),(0,s.jsx)(i.A,{title:n??e,language:o,showLineNumbers:!0,children:c})}}}]);
\ No newline at end of file
diff --git a/assets/js/1bd19f0c.ccd64c66.js b/assets/js/1bd19f0c.ccd64c66.js
deleted file mode 100644
index 77578079b..000000000
--- a/assets/js/1bd19f0c.ccd64c66.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[469],{850:(e,n,o)=>{o.d(n,{A:()=>s});var i=o(6540),t=o(8069),c=o(4848);function s(e){let{url:n,language:o,title:s}=e;const[r,l]=(0,i.useState)("");return(0,i.useEffect)((()=>{!async function(e,n){const o=await fetch(e);n(await o.text())}(n,l)}),[]),(0,c.jsx)(t.A,{title:s??n,language:o,showLineNumbers:!0,children:r})}},9805:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>d,contentTitle:()=>l,default:()=>u,frontMatter:()=>r,metadata:()=>i,toc:()=>a});const i=JSON.parse('{"id":"setup/advanced","title":"Advanced Configuration","description":"OIDC / Oauth2","source":"@site/docs/setup/advanced.mdx","sourceDirName":"setup","slug":"/setup/advanced","permalink":"/docs/setup/advanced","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/setup/advanced.mdx","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"FerretDB","permalink":"/docs/setup/ferretdb"},"next":{"title":"Connect More Servers","permalink":"/docs/connect-servers"}}');var t=o(4848),c=o(8453),s=o(850);const r={},l="Advanced Configuration",d={},a=[{value:"OIDC / Oauth2",id:"oidc--oauth2",level:3},{value:"Keycloak",id:"keycloak",level:3},{value:"Mount a config file",id:"mount-a-config-file",level:3}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,c.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"advanced-configuration",children:"Advanced Configuration"})}),"\n",(0,t.jsx)(n.h3,{id:"oidc--oauth2",children:"OIDC / Oauth2"}),"\n",(0,t.jsxs)(n.p,{children:["To enable OAuth2 login, you must create a client on the respective OAuth provider,\nfor example ",(0,t.jsx)(n.a,{href:"https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/creating-an-oauth-app",children:"Github"}),"\nor ",(0,t.jsx)(n.a,{href:"https://developers.google.com/identity/protocols/oauth2",children:"Google"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["Komodo also supports self hosted Oauth2 providers like ",(0,t.jsx)(n.a,{href:"https://docs.goauthentik.io/docs/providers/oauth2/",children:"Authentik"}),", ",(0,t.jsx)(n.a,{href:"https://docs.gitea.com/development/oauth2-provider",children:"Gitea"})," and ",(0,t.jsx)(n.a,{href:"https://www.keycloak.org",children:"Keycloak"}),"."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Komodo uses the ",(0,t.jsx)(n.code,{children:"web application"})," login flow."]}),"\n",(0,t.jsxs)(n.li,{children:["The redirect uri is:","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"/auth/github/callback"})," for Github."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"/auth/google/callback"})," for Google."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"/auth/oidc/callback"})," for OIDC."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"keycloak",children:"Keycloak"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Create an ",(0,t.jsx)(n.a,{href:"https://www.keycloak.org/docs/latest/server_admin/index.html#proc-creating-oidc-client_server_administration_guide",children:"OIDC client"})," in Keycloak.","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Note down the ",(0,t.jsx)(n.code,{children:"Client ID"}),' that you enter (e.g.: "komodo"), you will need it for Komodo configuration']}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"Valid Redirect URIs"}),": use ",(0,t.jsx)(n.code,{children:"/auth/oidc/callback"})," and substitute ",(0,t.jsx)(n.code,{children:""})," with your Komodo url."]}),"\n",(0,t.jsxs)(n.li,{children:["Turn ",(0,t.jsx)(n.code,{children:"Client authentication"})," to ",(0,t.jsx)(n.code,{children:"On"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["After you finished creating the client, open it and go to ",(0,t.jsx)(n.code,{children:"Credentials"})," tab and copy the ",(0,t.jsx)(n.code,{children:"Client Secret"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["Edit your environment variables for komodo core docker container and set the following:","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"KOMODO_OIDC_ENABLED=true"})}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"KOMODO_OIDC_PROVIDER=https:///realms/master"})," or replace ",(0,t.jsx)(n.code,{children:"master"})," with another realm if you don't want to use the default one"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"KOMODO_OIDC_CLIENT_ID=..."})," what you specified as ",(0,t.jsx)(n.code,{children:"Client ID"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"KOMODO_OIDC_CLIENT_SECRET=..."})," that you copied from Keycloak"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"mount-a-config-file",children:"Mount a config file"}),"\n",(0,t.jsxs)(n.p,{children:["If you prefer to keep sensitive information out of environment variables, you can optionally\nwrite a config file on your host, and mount it to ",(0,t.jsx)(n.code,{children:"/config/config.toml"})," in the Komodo core container."]}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsx)(n.p,{children:"Configuration can still be passed in environment variables, and will take precedent over what is passed in the file."})}),"\n",(0,t.jsxs)(n.p,{children:["Quick download to ",(0,t.jsx)(n.code,{children:"./komodo/core.config.toml"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"wget -P komodo https://raw.githubusercontent.com/moghtech/komodo/main/config/core.config.toml\n"})}),"\n","\n",(0,t.jsx)(s.A,{title:"https://github.com/moghtech/komodo/blob/main/config/core.config.toml",url:"https://raw.githubusercontent.com/moghtech/komodo/main/config/core.config.toml",language:"toml"})]})}function u(e={}){const{wrapper:n}={...(0,c.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}}}]);
\ No newline at end of file
diff --git a/assets/js/1d94002d.83781e3b.js b/assets/js/1d94002d.83781e3b.js
deleted file mode 100644
index 342c43261..000000000
--- a/assets/js/1d94002d.83781e3b.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[937],{7429:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>h,default:()=>a,frontMatter:()=>i,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"other-resources","title":"Other Resources","description":"Posts and Guides","source":"@site/docs/other-resources.md","sourceDirName":".","slug":"/other-resources","permalink":"/docs/other-resources","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/other-resources.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Development","permalink":"/docs/development"}}');var r=o(4848),n=o(8453);const i={},h="Other Resources",c={},d=[{value:"Posts and Guides",id:"posts-and-guides",level:3},{value:"Community Alerters",id:"community-alerters",level:3}];function l(e){const t={a:"a",code:"code",h1:"h1",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,n.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"other-resources",children:"Other Resources"})}),"\n",(0,r.jsx)(t.h3,{id:"posts-and-guides",children:"Posts and Guides"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.a,{href:"https://blog.foxxmd.dev/posts/migrating-to-komodo",children:"Migrating to Komodo"})," by ",(0,r.jsx)(t.a,{href:"https://github.com/FoxxMD",children:"FoxxMD"})]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.a,{href:"https://blog.foxxmd.dev/posts/komodo-tips-tricks",children:"FAQ, Tips, and Tricks"})," by ",(0,r.jsx)(t.a,{href:"https://github.com/FoxxMD",children:"FoxxMD"})]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.a,{href:"https://blog.foxxmd.dev/posts/compose-envs-explained",children:"Compose Environments Explained"})," by ",(0,r.jsx)(t.a,{href:"https://github.com/FoxxMD",children:"FoxxMD"})]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.a,{href:"https://nickcunningh.am/blog/how-to-automate-version-updates-for-your-self-hosted-docker-containers-with-gitea-renovate-and-komodo",children:"How To: Automate version updates for your self-hosted Docker containers with Gitea, Renovate, and Komodo"})," by ",(0,r.jsx)(t.a,{href:"https://github.com/TheNickOfTime",children:"TheNickOfTime"})]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.a,{href:"https://skyblog.one/komodo-the-better-alternative-to-portainer-for-container-management",children:"Setting up Komodo, comparison to Portainer, and FAQ"})," by ",(0,r.jsx)(t.a,{href:"https://skyblog.one/authors/",children:"Skyfay"})]}),"\n"]}),"\n",(0,r.jsx)(t.h3,{id:"community-alerters",children:"Community Alerters"}),"\n",(0,r.jsxs)(t.p,{children:["These provide alerting implementations which can be used with the ",(0,r.jsx)(t.code,{children:"Custom"})," Alerter type."]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.a,{href:"https://github.com/FoxxMD/deploy-discord-alerter",children:"Discord"})," by ",(0,r.jsx)(t.a,{href:"https://github.com/FoxxMD",children:"FoxxMD"})]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.a,{href:"https://github.com/mattsmallman/komodo-alert-to-telgram",children:"Telegram"})," by ",(0,r.jsx)(t.a,{href:"https://github.com/mattsmallman",children:"mattsmallman"})]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.a,{href:"https://github.com/FoxxMD/deploy-ntfy-alerter",children:"Ntfy"})," by ",(0,r.jsx)(t.a,{href:"https://github.com/FoxxMD",children:"FoxxMD"})]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.a,{href:"https://github.com/FoxxMD/deploy-gotify-alerter",children:"Gotify"})," by ",(0,r.jsx)(t.a,{href:"https://github.com/FoxxMD",children:"FoxxMD"})]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.a,{href:"https://github.com/FoxxMD/deploy-apprise-alerter",children:"Apprise"})," by ",(0,r.jsx)(t.a,{href:"https://github.com/FoxxMD",children:"FoxxMD"})]}),"\n"]})]})}function a(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>i,x:()=>h});var s=o(6540);const r={},n=s.createContext(r);function i(e){const t=s.useContext(n);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function h(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),s.createElement(n.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/1df93b7f.5dc032ff.js b/assets/js/1df93b7f.5dc032ff.js
deleted file mode 100644
index fcdbfeaf3..000000000
--- a/assets/js/1df93b7f.5dc032ff.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[583],{8812:(e,t,s)=>{s.r(t),s.d(t,{default:()=>g});var n=s(4164),o=s(6289),i=s(797),r=s(1410),l=s(9303);const c={features:"features_t9lD",featureSvg:"featureSvg_GfXr"};var a=s(4848);const d=[{title:"Automated builds \ud83d\udee0\ufe0f",description:(0,a.jsx)(a.Fragment,{children:"Build auto versioned docker images from git repos, trigger builds on git push"})},{title:"Deploy docker containers \ud83d\ude80",description:(0,a.jsx)(a.Fragment,{children:"Deploy containers, deploy docker compose, see uptime and logs across all your servers"})},{title:"Powered by Rust \ud83e\udd80",description:(0,a.jsx)(a.Fragment,{children:"The core API and periphery agent are written in Rust"})}];function h(e){let{title:t,description:s}=e;return(0,a.jsx)("div",{className:(0,n.A)("col col--4"),children:(0,a.jsxs)("div",{className:"text--center padding-horiz--md",children:[(0,a.jsx)(l.A,{as:"h3",children:t}),(0,a.jsx)("p",{children:s})]})})}function u(){return(0,a.jsx)("section",{className:c.features,children:(0,a.jsx)("div",{className:"container",children:(0,a.jsx)("div",{className:"row",children:d.map(((e,t)=>(0,a.jsx)(h,{...e},t)))})})})}const m={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"};s(6540);function x(e){let{width:t="4rem"}=e;return(0,a.jsx)("img",{style:{width:t,height:"auto",opacity:.7},src:"img/monitor-lizard.png",alt:"monitor-lizard"})}function p(){const{siteConfig:e}=(0,i.A)();return(0,a.jsx)("header",{className:(0,n.A)("hero hero--primary",m.heroBanner),children:(0,a.jsxs)("div",{className:"container",children:[(0,a.jsx)("div",{style:{display:"flex",gap:"1rem",justifyContent:"center"},children:(0,a.jsxs)("div",{style:{position:"relative"},children:[(0,a.jsx)(x,{width:"600px"}),(0,a.jsx)("h1",{className:"hero__title",style:{margin:0,position:"absolute",top:"40%",left:"50%",transform:"translate(-50%, -50%)"},children:"Komodo"})]})}),(0,a.jsx)("p",{className:"hero__subtitle",children:e.tagline}),(0,a.jsx)("div",{style:{display:"flex",justifyContent:"center"},children:(0,a.jsxs)("div",{className:m.buttons,children:[(0,a.jsx)(o.A,{className:"button button--secondary button--lg",to:"/docs/intro",children:"Docs"}),(0,a.jsx)(o.A,{className:"button button--secondary button--lg",to:"https://github.com/moghtech/komodo",children:"Github"}),(0,a.jsx)(o.A,{className:"button button--secondary button--lg",to:"https://github.com/moghtech/komodo#screenshots",style:{width:"100%",boxSizing:"border-box",gridColumn:"span 2"},children:"Screenshots"}),(0,a.jsx)(o.A,{className:"button button--secondary button--lg",to:"https://demo.komo.do",style:{width:"100%",boxSizing:"border-box",gridColumn:"span 2"},children:"Demo"})]})})]})})}function g(){const{siteConfig:e}=(0,i.A)();return(0,a.jsxs)(r.A,{title:"Home",description:e.tagline,children:[(0,a.jsx)(p,{}),(0,a.jsx)("main",{children:(0,a.jsx)(u,{})})]})}}}]);
\ No newline at end of file
diff --git a/assets/js/1df93b7f.683b1542.js b/assets/js/1df93b7f.683b1542.js
new file mode 100644
index 000000000..745aa3de4
--- /dev/null
+++ b/assets/js/1df93b7f.683b1542.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[583],{7143:(e,t,s)=>{s.r(t),s.d(t,{default:()=>g});var n=s(4164),o=s(8774),i=s(4586),r=s(1656),c=s(1107);const l={features:"features_t9lD",featureSvg:"featureSvg_GfXr"};var a=s(4848);const d=[{title:"Automated builds \ud83d\udee0\ufe0f",description:(0,a.jsx)(a.Fragment,{children:"Build auto versioned docker images from git repos, trigger builds on git push"})},{title:"Deploy docker containers \ud83d\ude80",description:(0,a.jsx)(a.Fragment,{children:"Deploy containers, deploy docker compose, see uptime and logs across all your servers"})},{title:"Powered by Rust \ud83e\udd80",description:(0,a.jsx)(a.Fragment,{children:"The core API and periphery agent are written in Rust"})}];function h({title:e,description:t}){return(0,a.jsx)("div",{className:(0,n.A)("col col--4"),children:(0,a.jsxs)("div",{className:"text--center padding-horiz--md",children:[(0,a.jsx)(c.A,{as:"h3",children:e}),(0,a.jsx)("p",{children:t})]})})}function u(){return(0,a.jsx)("section",{className:l.features,children:(0,a.jsx)("div",{className:"container",children:(0,a.jsx)("div",{className:"row",children:d.map((e,t)=>(0,a.jsx)(h,{...e},t))})})})}const m={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"};s(6540);function x({width:e="4rem"}){return(0,a.jsx)("img",{style:{width:e,height:"auto",opacity:.7},src:"img/monitor-lizard.png",alt:"monitor-lizard"})}function p(){const{siteConfig:e}=(0,i.A)();return(0,a.jsx)("header",{className:(0,n.A)("hero hero--primary",m.heroBanner),children:(0,a.jsxs)("div",{className:"container",children:[(0,a.jsx)("div",{style:{display:"flex",gap:"1rem",justifyContent:"center"},children:(0,a.jsxs)("div",{style:{position:"relative"},children:[(0,a.jsx)(x,{width:"600px"}),(0,a.jsx)("h1",{className:"hero__title",style:{margin:0,position:"absolute",top:"40%",left:"50%",transform:"translate(-50%, -50%)"},children:"Komodo"})]})}),(0,a.jsx)("p",{className:"hero__subtitle",children:e.tagline}),(0,a.jsx)("div",{style:{display:"flex",justifyContent:"center"},children:(0,a.jsxs)("div",{className:m.buttons,children:[(0,a.jsx)(o.A,{className:"button button--secondary button--lg",to:"/docs/intro",children:"Docs"}),(0,a.jsx)(o.A,{className:"button button--secondary button--lg",to:"https://github.com/moghtech/komodo",children:"Github"}),(0,a.jsx)(o.A,{className:"button button--secondary button--lg",to:"https://github.com/moghtech/komodo#screenshots",style:{width:"100%",boxSizing:"border-box",gridColumn:"span 2"},children:"Screenshots"}),(0,a.jsx)(o.A,{className:"button button--secondary button--lg",to:"https://demo.komo.do",style:{width:"100%",boxSizing:"border-box",gridColumn:"span 2"},children:"Demo"})]})})]})})}function g(){const{siteConfig:e}=(0,i.A)();return(0,a.jsxs)(r.A,{title:"Home",description:e.tagline,children:[(0,a.jsx)(p,{}),(0,a.jsx)("main",{children:(0,a.jsx)(u,{})})]})}}}]);
\ No newline at end of file
diff --git a/assets/js/209736a1.d85f8544.js b/assets/js/209736a1.d85f8544.js
deleted file mode 100644
index f1d588b8d..000000000
--- a/assets/js/209736a1.d85f8544.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[580],{2974:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>i,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"variables","title":"Variables and Secrets","description":"A variable / secret in Komodo is just a key-value pair.","source":"@site/docs/variables.md","sourceDirName":".","slug":"/variables","permalink":"/docs/variables","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/variables.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Docker Compose","permalink":"/docs/docker-compose"},"next":{"title":"Procedures and Actions","permalink":"/docs/procedures"}}');var r=s(4848),t=s(8453);const i={},a="Variables and Secrets",l={},c=[{value:"Defining Variables and Secrets",id:"defining-variables-and-secrets",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"variables-and-secrets",children:"Variables and Secrets"})}),"\n",(0,r.jsx)(n.p,{children:"A variable / secret in Komodo is just a key-value pair."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:'KEY_1 = "value_1"\n'})}),"\n",(0,r.jsxs)(n.p,{children:["You can interpolate the value into any Environment (and most other user configurable inputs, such as Repo ",(0,r.jsx)(n.code,{children:"On Clone"})," and ",(0,r.jsx)(n.code,{children:"On Pull"}),", or Stack ",(0,r.jsx)(n.code,{children:"Extra Args"}),") using double brackets around the key to trigger interpolation:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-toml",children:"# Before interpolation\nSOME_ENV_VAR = [[KEY_1]] # <- wrap the key in double brackets '[[]]'\n\n# After iterpolation:\nSOME_ENV_VAR = value_1\n"})}),"\n",(0,r.jsx)(n.h2,{id:"defining-variables-and-secrets",children:"Defining Variables and Secrets"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"In the UI"}),", you can go to ",(0,r.jsx)(n.code,{children:"Settings"})," page, ",(0,r.jsx)(n.code,{children:"Variables"})," tab. Here, you can create some Variables to store in the Komodo database."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:['There is a "secret" option you can check, this will ',(0,r.jsx)(n.strong,{children:"prevent the value from exposure in any updates / logs"}),", as well as prevent access to the value to any ",(0,r.jsx)(n.strong,{children:"non-admin"})," Komodo users."]}),"\n",(0,r.jsxs)(n.li,{children:["Variables can also be managed in ResourceSyncs (see ",(0,r.jsx)(n.a,{href:"/docs/sync-resources#deployments",children:"example"}),") but should only be done for non-secret variables, to avoid committing sensitive data. You should manage secrets using one of the following options."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Mount a config file to Core"}),": ",(0,r.jsx)(n.a,{href:"https://komo.do/docs/setup/advanced#mount-a-config-file",children:"https://komo.do/docs/setup/advanced#mount-a-config-file"})]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["In the Komodo Core config file, you can configure ",(0,r.jsx)(n.code,{children:"secrets"})," using a block like:","\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-toml",children:'# in core.config.toml\n[secrets]\nKEY_1 = "value_1"\nKEY_2 = "value_2"\n'})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"KEY_1"})," and ",(0,r.jsx)(n.code,{children:"KEY_2"})," will be available for interpolation on all your resources, as if they were Variables set up in the UI."]}),"\n",(0,r.jsxs)(n.li,{children:["They keys are queryable and show up on the variable page (so you know they are available for use),\nbut ",(0,r.jsx)(n.strong,{children:"the values are not exposed by API for ANY user"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Mount a config file to Periphery agent"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["In the Komodo Periphery config file, you can also configure ",(0,r.jsx)(n.code,{children:"secrets"})," using the same syntax as the Core config file."]}),"\n",(0,r.jsxs)(n.li,{children:["The variable ",(0,r.jsx)(n.strong,{children:"WILL NOT be available globally to all Komodo resources"}),", it will only be available to the resources on the associated Server resource on which that single Periphery agent is running."]}),"\n",(0,r.jsx)(n.li,{children:"This effectively distributes your secret locations, can be good or bad depending on your security requirements. It does avoid the need to send the secret over network from Core to Periphery, Periphery based secrets are never exposed to the network."}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Use a dedicated secret management tool"})," such as Hashicorp Vault, alongside Komodo"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Ultimately Komodo variable / secret features ",(0,r.jsx)(n.strong,{children:"may not fill enterprise level secret management requirements"}),", organizations of this level should use still a dedicated secret management solution. At this point Komodo is not intended as an enterprise level secret management solution."]}),"\n",(0,r.jsxs)(n.li,{children:["These solutions do require application level integrations, your applications should only receive credentials to access the secret management API. ",(0,r.jsx)(n.strong,{children:"Your applications will pull the actual secret values from the dedicated secret management tool, they stay out of Komodo entirely"}),"."]}),"\n"]}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>i,x:()=>a});var o=s(6540);const r={},t=o.createContext(r);function i(e){const n=o.useContext(t);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),o.createElement(t.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/237.0bd7ad3c.js b/assets/js/237.0bd7ad3c.js
new file mode 100644
index 000000000..88210a160
--- /dev/null
+++ b/assets/js/237.0bd7ad3c.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[237],{2237:(e,t,i)=>{i.r(t),i.d(t,{default:()=>d});i(6540);var n=i(1312),o=i(5500),s=i(1656),r=i(3363),a=i(4848);function d(){const e=(0,n.T)({id:"theme.NotFound.title",message:"Page Not Found"});return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(o.be,{title:e}),(0,a.jsx)(s.A,{children:(0,a.jsx)(r.A,{})})]})}},3363:(e,t,i)=>{i.d(t,{A:()=>a});i(6540);var n=i(4164),o=i(1312),s=i(1107),r=i(4848);function a({className:e}){return(0,r.jsx)("main",{className:(0,n.A)("container margin-vert--xl",e),children:(0,r.jsx)("div",{className:"row",children:(0,r.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,r.jsx)(s.A,{as:"h1",className:"hero__title",children:(0,r.jsx)(o.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,r.jsx)("p",{children:(0,r.jsx)(o.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,r.jsx)("p",{children:(0,r.jsx)(o.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}}}]);
\ No newline at end of file
diff --git a/assets/js/2e7f2839.322f45ad.js b/assets/js/2e7f2839.322f45ad.js
new file mode 100644
index 000000000..cfa7e9a3e
--- /dev/null
+++ b/assets/js/2e7f2839.322f45ad.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[345],{4689:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>r,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"resources/build-images/versioning","title":"Image Versioning","description":"Komodo uses a major.minor.patch versioning scheme to Build versioning. By default, every RunBuild will auto increment the Build\'s version patch number, and push the image to docker hub with the version tag, as well as the latest tag. A tag containing the latest short commit hash at the time the repo was cloned will also be created.","source":"@site/docs/resources/build-images/versioning.md","sourceDirName":"resources/build-images","slug":"/resources/build-images/versioning","permalink":"/docs/resources/build-images/versioning","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/resources/build-images/versioning.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Builders","permalink":"/docs/resources/build-images/builders"},"next":{"title":"Deploy Containers","permalink":"/docs/resources/deploy-containers/"}}');var i=n(4848),o=n(8453);const r={},a="Image Versioning",c={},d=[];function l(e){const t={code:"code",h1:"h1",header:"header",p:"p",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"image-versioning",children:"Image Versioning"})}),"\n",(0,i.jsxs)(t.p,{children:["Komodo uses a major.minor.patch versioning scheme to Build versioning. By default, every RunBuild will auto increment the Build's version patch number, and push the image to docker hub with the version tag, as well as the ",(0,i.jsx)(t.code,{children:"latest"})," tag. A tag containing the latest short commit hash at the time the repo was cloned will also be created."]}),"\n",(0,i.jsxs)(t.p,{children:['You can also turn off the auto incrementing feature, and manage the version yourself. In addition, you can configure a "version tag" on the build. This will postfix the version tag / commit hash tag with a custom label. For example, an image tag of ',(0,i.jsx)(t.code,{children:"dev"})," will produce tags like ",(0,i.jsx)(t.code,{children:"image_name:1.1.1-dev"})," and ",(0,i.jsx)(t.code,{children:"image_name:h3c87c-dev"}),"."]})]})}function u(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>a});var s=n(6540);const i={},o=s.createContext(i);function r(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(i):e.components||i:r(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/2f7566f9.ccfad0e3.js b/assets/js/2f7566f9.ccfad0e3.js
deleted file mode 100644
index 9ad736261..000000000
--- a/assets/js/2f7566f9.ccfad0e3.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[464],{850:(e,n,i)=>{i.d(n,{A:()=>s});var r=i(6540),o=i(8069),t=i(4848);function s(e){let{url:n,language:i,title:s}=e;const[c,a]=(0,r.useState)("");return(0,r.useEffect)((()=>{!async function(e,n){const i=await fetch(e);n(await i.text())}(n,a)}),[]),(0,t.jsx)(o.A,{title:s??n,language:i,showLineNumbers:!0,children:c})}},3158:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>p,frontMatter:()=>c,metadata:()=>r,toc:()=>h});const r=JSON.parse('{"id":"connect-servers","title":"Connect More Servers","description":"Connecting a server to Komodo has 2 steps:","source":"@site/docs/connect-servers.mdx","sourceDirName":".","slug":"/connect-servers","permalink":"/docs/connect-servers","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/connect-servers.mdx","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Advanced Configuration","permalink":"/docs/setup/advanced"},"next":{"title":"Building Images","permalink":"/docs/build-images"}}');var o=i(4848),t=i(8453),s=i(850);const c={},a="Connect More Servers",l={},h=[{value:"Install Periphery",id:"install-periphery",level:2},{value:"Install the Periphery agent - systemd",id:"install-the-periphery-agent---systemd",level:3},{value:"Install the Periphery agent - container",id:"install-the-periphery-agent---container",level:3},{value:"Manual install steps - binaries",id:"manual-install-steps---binaries",level:3},{value:"Example periphery start command",id:"example-periphery-start-command",level:3},{value:"Passing config files",id:"passing-config-files",level:3},{value:"Configuration",id:"configuration",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"connect-more-servers",children:"Connect More Servers"})}),"\n","\n",(0,o.jsx)(n.p,{children:"Connecting a server to Komodo has 2 steps:"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsx)(n.li,{children:"Install the Periphery agent on the server (either binary or container)."}),"\n",(0,o.jsx)(n.li,{children:"Add the server to Komodo via the Core API / UI."}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"install-periphery",children:"Install Periphery"}),"\n",(0,o.jsxs)(n.p,{children:["You can install Periphery as a systemd managed process, run it as a ",(0,o.jsx)(n.a,{href:"https://github.com/moghtech/komodo/pkgs/container/komodo-periphery",children:"docker container"}),", or do whatever you want with the binary."]}),"\n",(0,o.jsx)(n.admonition,{type:"warning",children:(0,o.jsxs)(n.p,{children:["Allowing unintended access to the Periphery agent API is a security risk.\nEnsure to take appropriate measures to block access to the Periphery API, such as firewall rules on port ",(0,o.jsx)(n.code,{children:"8120"}),".\nAdditionally, you can whitelist your Komodo Core IP address in the ",(0,o.jsx)(n.a,{href:"https://github.com/moghtech/komodo/blob/main/config/periphery.config.toml#L46",children:"Periphery config"}),",\nand configure it to ",(0,o.jsx)(n.a,{href:"https://github.com/moghtech/komodo/blob/main/config/periphery.config.toml#L51",children:"only accept requests including your Core passkey"}),"."]})}),"\n",(0,o.jsx)(n.h3,{id:"install-the-periphery-agent---systemd",children:"Install the Periphery agent - systemd"}),"\n",(0,o.jsx)(n.p,{children:"As root user:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"curl -sSL https://raw.githubusercontent.com/moghtech/komodo/main/scripts/setup-periphery.py | python3\n"})}),"\n",(0,o.jsx)(n.p,{children:"Periphery can also be installed to run as the calling user, just note this comes with some additional configuration."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"curl -sSL https://raw.githubusercontent.com/moghtech/komodo/main/scripts/setup-periphery.py | python3 - --user\n"})}),"\n",(0,o.jsxs)(n.p,{children:["You can find more information (and view the script) in the ",(0,o.jsx)(n.a,{href:"https://github.com/moghtech/komodo/tree/main/scripts",children:"readme"}),"."]}),"\n",(0,o.jsx)(n.admonition,{type:"info",children:(0,o.jsx)(n.p,{children:"This script can be run multiple times without issue, and it won't change existing config after the first run. Just run it again after a Komodo version release, and it will update the periphery version."})}),"\n",(0,o.jsx)(n.h3,{id:"install-the-periphery-agent---container",children:"Install the Periphery agent - container"}),"\n",(0,o.jsx)(n.p,{children:"You can use a docker compose file:"}),"\n",(0,o.jsx)(s.A,{title:"https://github.com/moghtech/komodo/blob/main/compose/periphery.compose.yaml",url:"https://raw.githubusercontent.com/moghtech/komodo/main/compose/periphery.compose.yaml",language:"yaml"}),"\n",(0,o.jsx)(n.h3,{id:"manual-install-steps---binaries",children:"Manual install steps - binaries"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Download the periphery binary from the latest ",(0,o.jsx)(n.a,{href:"https://github.com/moghtech/komodo/releases",children:"release"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Create and edit your config files, following the ",(0,o.jsx)(n.a,{href:"https://github.com/moghtech/komodo/blob/main/config/periphery.config.toml",children:"config example"}),"."]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.admonition,{type:"note",children:(0,o.jsxs)(n.p,{children:["See the ",(0,o.jsx)(n.a,{href:"https://docs.rs/komodo_client/latest/komodo_client/entities/config/periphery/index.html",children:"periphery config docs"}),"\nfor more information on configuring periphery."]})}),"\n",(0,o.jsxs)(n.ol,{start:"3",children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Ensure that inbound connectivity is allowed on the port specified in periphery.config.toml (default 8120)."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Install docker. See the ",(0,o.jsx)(n.a,{href:"https://docs.docker.com/engine/install/",children:"docker install docs"}),"."]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.admonition,{type:"note",children:(0,o.jsx)(n.p,{children:"Ensure that the user which periphery is run as has access to the docker group without sudo."})}),"\n",(0,o.jsxs)(n.ol,{start:"5",children:["\n",(0,o.jsx)(n.li,{children:"Start the periphery binary with your preferred process manager, like systemd."}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"example-periphery-start-command",children:"Example periphery start command"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"periphery \\\n\t--config-path /path/to/periphery.config.base.toml \\\n\t--config-path /other_path/to/override-periphery-config-directory \\\n\t--config-keyword periphery \\\n\t--config-keyword config \\\n\t--merge-nested-config true\n"})}),"\n",(0,o.jsx)(n.admonition,{type:"info",children:(0,o.jsxs)(n.p,{children:["You can run ",(0,o.jsx)(n.code,{children:"periphery --help"})," to see the manual."]})}),"\n",(0,o.jsxs)(n.p,{children:["When running periphery in docker, use ",(0,o.jsx)(n.a,{href:"https://docs.docker.com/reference/compose-file/services/#command",children:"command"})," to pass in additional arguments."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"command: periphery --config-path /path/in/container/to/periphery.config.base.toml\n"})}),"\n",(0,o.jsx)(n.h3,{id:"passing-config-files",children:"Passing config files"}),"\n",(0,o.jsxs)(n.p,{children:["Either file paths or directory paths can be passed to ",(0,o.jsx)(n.code,{children:"--config-path"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["When using directories, the file entries can be filtered by name with the ",(0,o.jsx)(n.code,{children:"--config-keyword"})," argument, which can be passed multiple times to add more keywords. If passed, then only config files with file names that contain all keywords will be merged."]}),"\n",(0,o.jsxs)(n.p,{children:["When passing multiple config files, later --config-path given in the command will always override previous ones. Directory config files are merged in alphabetical order by name, so ",(0,o.jsx)(n.code,{children:"config_b.toml"})," will override ",(0,o.jsx)(n.code,{children:"config_a.toml"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["There are two ways to merge config files. The default behavior is to completely replace any base fields with whatever fields are present in the override config. So if you pass ",(0,o.jsx)(n.code,{children:"allowed_ips = []"})," in your override config, the final allowed_ips will be an empty list as well."]}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"--merge-nested-config true"})," will merge config fields recursively and extend config array fields."]}),"\n",(0,o.jsxs)(n.p,{children:["For example, with ",(0,o.jsx)(n.code,{children:"--merge-nested-config true"})," you can specify an allowed ip in the base config, and another in the override config, they will both be present in the final config."]}),"\n",(0,o.jsx)(n.p,{children:"Similarly, you can specify a base docker / github account pair, and extend them with additional accounts in the override config."}),"\n",(0,o.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,o.jsxs)(n.p,{children:["Quick download to ",(0,o.jsx)(n.code,{children:"./komodo/periphery.config.toml"}),":"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"wget -P komodo https://raw.githubusercontent.com/moghtech/komodo/main/config/periphery.config.toml\n"})}),"\n",(0,o.jsx)(s.A,{title:"https://github.com/moghtech/komodo/blob/main/config/periphery.config.toml",url:"https://raw.githubusercontent.com/moghtech/komodo/main/config/periphery.config.toml",language:"toml"})]})}function p(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}}}]);
\ No newline at end of file
diff --git a/assets/js/311cbe01.94b9211e.js b/assets/js/311cbe01.94b9211e.js
new file mode 100644
index 000000000..0458a6c7c
--- /dev/null
+++ b/assets/js/311cbe01.94b9211e.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[197],{4644:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>i,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"resources/variables","title":"Variables and Secrets","description":"A variable / secret in Komodo is just a key-value pair.","source":"@site/docs/resources/variables.md","sourceDirName":"resources","slug":"/resources/variables","permalink":"/docs/resources/variables","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/resources/variables.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Automatic Updates","permalink":"/docs/resources/auto-update"},"next":{"title":"Procedures and Actions","permalink":"/docs/resources/procedures"}}');var o=s(4848),t=s(8453);const i={},a="Variables and Secrets",l={},c=[{value:"Defining Variables and Secrets",id:"defining-variables-and-secrets",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"variables-and-secrets",children:"Variables and Secrets"})}),"\n",(0,o.jsx)(n.p,{children:"A variable / secret in Komodo is just a key-value pair."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:'KEY_1 = "value_1"\n'})}),"\n",(0,o.jsxs)(n.p,{children:["You can interpolate the value into any resource Environment\n(and most other user configurable inputs, such as Repo ",(0,o.jsx)(n.code,{children:"On Clone"})," and ",(0,o.jsx)(n.code,{children:"On Pull"}),", or Stack ",(0,o.jsx)(n.code,{children:"Extra Args"}),")\nusing double brackets around the key to trigger interpolation:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-toml",children:"# Before interpolation\nSOME_ENV_VAR = [[KEY_1]] # <- wrap the key in double brackets '[[]]'\n\n# After iterpolation:\nSOME_ENV_VAR = value_1\n"})}),"\n",(0,o.jsx)(n.h2,{id:"defining-variables-and-secrets",children:"Defining Variables and Secrets"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"In the UI"}),", you can go to ",(0,o.jsx)(n.code,{children:"Settings"})," page, ",(0,o.jsx)(n.code,{children:"Variables"})," tab. Here, you can create some Variables to store in the Komodo database."]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:['There is a "secret" option you can check, this will ',(0,o.jsx)(n.strong,{children:"prevent the value from exposure in any updates / logs"}),", as well as prevent access to the value to any ",(0,o.jsx)(n.strong,{children:"non-admin"})," Komodo users."]}),"\n",(0,o.jsxs)(n.li,{children:["Variables can also be managed in ResourceSyncs (see ",(0,o.jsx)(n.a,{href:"/docs/resources/sync-resources#deployments",children:"example"}),") but should only be done for non-secret variables, to avoid committing sensitive data. You should manage secrets using one of the following options."]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Mount a config file to Core"}),": ",(0,o.jsx)(n.a,{href:"https://komo.do/docs/setup/advanced#mount-a-config-file",children:"https://komo.do/docs/setup/advanced#mount-a-config-file"})]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["In the Komodo Core config file, you can configure ",(0,o.jsx)(n.code,{children:"secrets"})," using a block like:","\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-toml",children:'# in core.config.toml\n[secrets]\nKEY_1 = "value_1"\nKEY_2 = "value_2"\n'})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"KEY_1"})," and ",(0,o.jsx)(n.code,{children:"KEY_2"})," will be available for interpolation on all your resources, as if they were Variables set up in the UI."]}),"\n",(0,o.jsxs)(n.li,{children:["They keys are queryable and show up on the variable page (so you know they are available for use),\nbut ",(0,o.jsx)(n.strong,{children:"the values are not exposed by API for ANY user"}),"."]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Mount a config file to Periphery agent"}),":"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["In the Komodo Periphery config file, you can also configure ",(0,o.jsx)(n.code,{children:"secrets"})," using the same syntax as the Core config file."]}),"\n",(0,o.jsxs)(n.li,{children:["The variable ",(0,o.jsx)(n.strong,{children:"WILL NOT be available globally to all Komodo resources"}),", it will only be available to the resources on the associated Server resource on which that single Periphery agent is running."]}),"\n",(0,o.jsx)(n.li,{children:"This effectively distributes your secret locations, can be good or bad depending on your security requirements. It does avoid the need to send the secret over network from Core to Periphery, Periphery based secrets are never exposed to the network."}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Use a dedicated secret management tool"})," such as Hashicorp Vault, alongside Komodo"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Ultimately Komodo variable / secret features ",(0,o.jsx)(n.strong,{children:"may not fill enterprise level secret management requirements"}),", organizations of this level should use still a dedicated secret management solution. At this point Komodo is not intended as an enterprise level secret management solution."]}),"\n",(0,o.jsxs)(n.li,{children:["These solutions do require application level integrations, your applications should only receive credentials to access the secret management API. ",(0,o.jsx)(n.strong,{children:"Your applications will pull the actual secret values from the dedicated secret management tool, they stay out of Komodo entirely"}),"."]}),"\n"]}),"\n"]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>i,x:()=>a});var r=s(6540);const o={},t=r.createContext(o);function i(e){const n=r.useContext(t);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),r.createElement(t.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/3734296e.0ee6ad70.js b/assets/js/3734296e.0ee6ad70.js
deleted file mode 100644
index fe653fe9e..000000000
--- a/assets/js/3734296e.0ee6ad70.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[92],{3040:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>l,contentTitle:()=>h,default:()=>d,frontMatter:()=>r,metadata:()=>n,toc:()=>a});const n=JSON.parse('{"id":"file-paths","title":"File Paths","description":"When working with Komodo, you might have to configure file or directory paths.","source":"@site/docs/file-paths.md","sourceDirName":".","slug":"/file-paths","permalink":"/docs/file-paths","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/file-paths.md","tags":[],"version":"current","frontMatter":{}}');var o=s(4848),i=s(8453);const r={},h="File Paths",l={},a=[{value:"Relative Paths",id:"relative-paths",level:2},{value:"Implementation",id:"implementation",level:3},{value:"Docker Volume Paths",id:"docker-volume-paths",level:2}];function c(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"file-paths",children:"File Paths"})}),"\n",(0,o.jsx)(t.p,{children:"When working with Komodo, you might have to configure file or directory paths."}),"\n",(0,o.jsx)(t.h2,{id:"relative-paths",children:"Relative Paths"}),"\n",(0,o.jsx)(t.p,{children:"Where possible, it is better to use relative file paths. Using relative file paths removes the connection between the process being run and the particular server it runs on, making it easier to move things between servers."}),"\n",(0,o.jsx)(t.p,{children:"Where you see relative paths:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"setting the build directory and path of the Dockerfile"}),"\n",(0,o.jsx)(t.li,{children:"setting a pre build command path"}),"\n"]}),"\n",(0,o.jsx)(t.p,{children:"For all of the above, the path can be given relative to the root of the configured repo"}),"\n",(0,o.jsx)(t.p,{children:"The one exception is the Dockerfile path, which is given relative to the build directory (This is done by Docker itself, and this pattern matches usage of the Docker CLI)."}),"\n",(0,o.jsx)(t.p,{children:"There are 3 kinds of paths to pass:"}),"\n",(0,o.jsxs)(t.ol,{children:["\n",(0,o.jsxs)(t.li,{children:["to specify the root of the repo, use ",(0,o.jsx)(t.code,{children:"."})," as the path"]}),"\n",(0,o.jsxs)(t.li,{children:["to specify a folder in the repo, pass it with ",(0,o.jsx)(t.strong,{children:"no"})," preceding ",(0,o.jsx)(t.code,{children:"/"}),". For example, ",(0,o.jsx)(t.code,{children:"example_folder"})," or ",(0,o.jsx)(t.code,{children:"folder1/folder2"})]}),"\n",(0,o.jsxs)(t.li,{children:["to specify an absolute path on the servers filesystem, use a preceding slash, eg. ",(0,o.jsx)(t.code,{children:"/home/ubuntu/example"}),". This way should only be used if absolutely necessary, like when passing host paths when configuring docker volumes."]}),"\n"]}),"\n",(0,o.jsx)(t.h3,{id:"implementation",children:"Implementation"}),"\n",(0,o.jsxs)(t.p,{children:["Relative file paths are joined with the path of the repo on the system using a Rust ",(0,o.jsx)(t.a,{href:"https://doc.rust-lang.org/std/path/struct.PathBuf.html#method.push",children:"PathBuf"}),"."]}),"\n",(0,o.jsx)(t.h2,{id:"docker-volume-paths",children:"Docker Volume Paths"}),"\n",(0,o.jsxs)(t.p,{children:["These are passed directly to the Docker CLI using ",(0,o.jsx)(t.code,{children:"--volume /path/on/system:/path/in/container"}),". So for these, the same rules apply as when using Docker on the command line. Paths here should usually be given as absolute. It's also probably best to avoid usage of ",(0,o.jsx)(t.code,{children:"~"})," or environment variables like ",(0,o.jsx)(t.code,{children:"$HOME"}),", as this may lead to unexpected behavior."]})]})}function d(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>r,x:()=>h});var n=s(6540);const o={},i=n.createContext(o);function r(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function h(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/39c35b2c.99c7fad8.js b/assets/js/39c35b2c.99c7fad8.js
deleted file mode 100644
index b9105309f..000000000
--- a/assets/js/39c35b2c.99c7fad8.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[782],{3709:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>h,contentTitle:()=>c,default:()=>a,frontMatter:()=>t,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"webhooks","title":"Configuring Webhooks","description":"Multiple Komodo resources can take advantage of webhooks from your git provider. Komodo supports incoming webhooks using either the Github or Gitlab webhook authentication type, which is also supported by other providers like Gitea.","source":"@site/docs/webhooks.md","sourceDirName":".","slug":"/webhooks","permalink":"/docs/webhooks","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/webhooks.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Sync Resources","permalink":"/docs/sync-resources"},"next":{"title":"Version Upgrades","permalink":"/docs/version-upgrades"}}');var r=n(4848),s=n(8453);const t={},c="Configuring Webhooks",h={},d=[{value:"Copy the Webhook URL",id:"copy-the-webhook-url",level:2},{value:"Create the webhook on the Git Provider",id:"create-the-webhook-on-the-git-provider",level:2},{value:"When does it trigger?",id:"when-does-it-trigger",level:2}];function l(e){const o={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(o.header,{children:(0,r.jsx)(o.h1,{id:"configuring-webhooks",children:"Configuring Webhooks"})}),"\n",(0,r.jsx)(o.p,{children:"Multiple Komodo resources can take advantage of webhooks from your git provider. Komodo supports incoming webhooks using either the Github or Gitlab webhook authentication type, which is also supported by other providers like Gitea."}),"\n",(0,r.jsx)(o.admonition,{type:"note",children:(0,r.jsx)(o.p,{children:'On Gitea, the default "Gitea" webhook type works with the Github authentication type \ud83d\udc4d'})}),"\n",(0,r.jsx)(o.h2,{id:"copy-the-webhook-url",children:"Copy the Webhook URL"}),"\n",(0,r.jsxs)(o.p,{children:["Find the resource in UI, like a ",(0,r.jsx)(o.code,{children:"Build"}),", ",(0,r.jsx)(o.code,{children:"Repo"}),", or ",(0,r.jsx)(o.code,{children:"Stack"}),".\nGo to the ",(0,r.jsx)(o.code,{children:"Config"}),' section, find "Webhooks", and copy the webhook for the action you want.']}),"\n",(0,r.jsx)(o.p,{children:"The webhook URL is constructed as follows:"}),"\n",(0,r.jsx)(o.pre,{children:(0,r.jsx)(o.code,{className:"language-shell",children:"https://${HOST}/listener/${AUTH_TYPE}/${RESOURCE_TYPE}/${ID_OR_NAME}/${EXECUTION}\n"})}),"\n",(0,r.jsxs)(o.ul,{children:["\n",(0,r.jsxs)(o.li,{children:[(0,r.jsx)(o.strong,{children:(0,r.jsx)(o.code,{children:"HOST"})}),": Your Komodo endpoint to recieve webhooks.","\n",(0,r.jsxs)(o.ul,{children:["\n",(0,r.jsxs)(o.li,{children:["If your Komodo sits in a private network,\nyou will need a public proxy setup to forward ",(0,r.jsx)(o.code,{children:"/listener"})," requests to Komodo."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(o.li,{children:[(0,r.jsx)(o.strong,{children:(0,r.jsx)(o.code,{children:"AUTH_TYPE"})}),":","\n",(0,r.jsxs)(o.ul,{children:["\n",(0,r.jsxs)(o.li,{children:["options: ",(0,r.jsx)(o.code,{children:"github"})," | ",(0,r.jsx)(o.code,{children:"gitlab"})]}),"\n",(0,r.jsxs)(o.li,{children:[(0,r.jsx)(o.code,{children:"github"}),": Validates the signature attached with ",(0,r.jsx)(o.code,{children:"X-Hub-Signature-256"}),". ",(0,r.jsx)(o.a,{href:"https://docs.github.com/en/webhooks/using-webhooks/validating-webhook-deliveries",children:"reference"})]}),"\n",(0,r.jsxs)(o.li,{children:[(0,r.jsx)(o.code,{children:"gitlab"}),": Checks that the secret attached to ",(0,r.jsx)(o.code,{children:"X-Gitlab-Token"})," is valid. ",(0,r.jsx)(o.a,{href:"https://docs.gitlab.com/ee/user/project/integrations/webhooks.html#create-a-webhook",children:"reference"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(o.li,{children:[(0,r.jsx)(o.strong,{children:(0,r.jsx)(o.code,{children:"RESOURCE_TYPE"})}),":","\n",(0,r.jsxs)(o.ul,{children:["\n",(0,r.jsxs)(o.li,{children:["options: ",(0,r.jsx)(o.code,{children:"build"})," | ",(0,r.jsx)(o.code,{children:"repo"})," | ",(0,r.jsx)(o.code,{children:"stack"})," | ",(0,r.jsx)(o.code,{children:"sync"})," | ",(0,r.jsx)(o.code,{children:"procedure"})," | ",(0,r.jsx)(o.code,{children:"action"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(o.li,{children:[(0,r.jsx)(o.strong,{children:(0,r.jsx)(o.code,{children:"ID_OR_NAME"})}),":","\n",(0,r.jsxs)(o.ul,{children:["\n",(0,r.jsx)(o.li,{children:"Reference the specific resource by id or name. If the name may change, it is better to use id."}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(o.li,{children:[(0,r.jsx)(o.strong,{children:(0,r.jsx)(o.code,{children:"EXECUTION"})}),":","\n",(0,r.jsxs)(o.ul,{children:["\n",(0,r.jsxs)(o.li,{children:["Which executions are available depends on the ",(0,r.jsx)(o.code,{children:"RESOURCE_TYPE"}),". Builds only have the ",(0,r.jsx)(o.code,{children:"/build"})," action.\nRepos can select between ",(0,r.jsx)(o.code,{children:"/pull"}),", ",(0,r.jsx)(o.code,{children:"/clone"}),", or ",(0,r.jsx)(o.code,{children:"/build"}),". Stacks have ",(0,r.jsx)(o.code,{children:"/deploy"})," and ",(0,r.jsx)(o.code,{children:"/refresh"}),", and Resource Syncs have ",(0,r.jsx)(o.code,{children:"/sync"})," and ",(0,r.jsx)(o.code,{children:"/refresh"}),"."]}),"\n",(0,r.jsxs)(o.li,{children:["For ",(0,r.jsx)(o.strong,{children:"Procedures and Actions"}),", this will be the ",(0,r.jsx)(o.strong,{children:"branch to listen to for pushes"}),", or ",(0,r.jsx)(o.code,{children:"__ANY__"})," to trigger\non pushes to any branch."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(o.h2,{id:"create-the-webhook-on-the-git-provider",children:"Create the webhook on the Git Provider"}),"\n",(0,r.jsx)(o.p,{children:"Navigate to the repo page on your git provider, and go to the settings for the Repo.\nFind Webhook settings, and click to create a new webhook."}),"\n",(0,r.jsx)(o.p,{children:"You will have to input some information."}),"\n",(0,r.jsxs)(o.ol,{children:["\n",(0,r.jsxs)(o.li,{children:["The ",(0,r.jsx)(o.code,{children:"Payload URL"})," is the link that you copied in the step above, ",(0,r.jsx)(o.code,{children:"Copy the Resource Payload URL"}),"."]}),"\n",(0,r.jsxs)(o.li,{children:["For Content-type, choose ",(0,r.jsx)(o.code,{children:"application/json"})]}),"\n",(0,r.jsxs)(o.li,{children:["For Secret, input the secret you configured in the Komodo Core config (",(0,r.jsx)(o.code,{children:"KOMODO_WEBHOOK_SECRET"}),")."]}),"\n",(0,r.jsx)(o.li,{children:"Enable SSL Verification, if you have proper TLS setup to your git provider (recommended)."}),"\n",(0,r.jsx)(o.li,{children:'For "events that trigger the webhook", just the push request is what post people want.'}),"\n",(0,r.jsx)(o.li,{children:'Of course, make sure the webhook is "Active" and hit create.'}),"\n"]}),"\n",(0,r.jsx)(o.h2,{id:"when-does-it-trigger",children:"When does it trigger?"}),"\n",(0,r.jsxs)(o.p,{children:["Your git provider will now push this webhook to Komodo on ",(0,r.jsx)(o.em,{children:"every"})," push to ",(0,r.jsx)(o.em,{children:"any"})," branch. However, your ",(0,r.jsx)(o.code,{children:"Build"}),", ",(0,r.jsx)(o.code,{children:"Repo"}),",\netc. only cares about a specific branch of the repo."]}),"\n",(0,r.jsxs)(o.p,{children:["Because of this, the webhook will trigger the action ",(0,r.jsx)(o.strong,{children:"only on pushes to the branch configured on the resource"}),"."]}),"\n",(0,r.jsxs)(o.p,{children:["For example, if I make a build, I may point the build to the ",(0,r.jsx)(o.code,{children:"release"})," branch of a particular repo. If I set up a webhook, and push to the ",(0,r.jsx)(o.code,{children:"main"})," branch, the action will ",(0,r.jsx)(o.em,{children:"not trigger"}),". It will only trigger when the push is to the ",(0,r.jsx)(o.code,{children:"release"})," branch."]})]})}function a(e={}){const{wrapper:o}={...(0,s.R)(),...e.components};return o?(0,r.jsx)(o,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,o,n)=>{n.d(o,{R:()=>t,x:()=>c});var i=n(6540);const r={},s=i.createContext(r);function t(e){const o=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),i.createElement(s.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/3bb59ffd.5bcb0518.js b/assets/js/3bb59ffd.5bcb0518.js
new file mode 100644
index 000000000..892763734
--- /dev/null
+++ b/assets/js/3bb59ffd.5bcb0518.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[24],{3071:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>i,metadata:()=>r,toc:()=>u});const r=JSON.parse('{"id":"setup/ferretdb","title":"FerretDB","description":"- If you setup Komodo using Postgres or Sqlite options prior to Komodo v1.18.0, you are using FerretDB v1.","source":"@site/docs/setup/ferretdb.mdx","sourceDirName":"setup","slug":"/setup/ferretdb","permalink":"/docs/setup/ferretdb","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/setup/ferretdb.mdx","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"MongoDB","permalink":"/docs/setup/mongo"},"next":{"title":"Connect More Servers","permalink":"/docs/setup/connect-servers"}}');var n=o(4848),s=o(8453),a=o(5627);const i={},l="FerretDB",c={},u=[];function d(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"ferretdb",children:"FerretDB"})}),"\n",(0,n.jsx)(t.admonition,{type:"info",children:(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["If you setup Komodo using ",(0,n.jsx)(t.strong,{children:"Postgres"})," or ",(0,n.jsx)(t.strong,{children:"Sqlite"})," options prior to ",(0,n.jsx)(t.a,{href:"https://github.com/moghtech/komodo/releases/tag/v1.18.0",children:(0,n.jsx)(t.strong,{children:"Komodo v1.18.0"})}),", you are using ",(0,n.jsx)(t.strong,{children:"FerretDB v1"}),"."]}),"\n",(0,n.jsxs)(t.li,{children:["Komodo now uses ",(0,n.jsx)(t.strong,{children:"FerretDB v2"}),". For existing users, ",(0,n.jsx)(t.a,{href:"https://github.com/moghtech/komodo/blob/main/bin/util/docs/copy-database.md#ferretdb-v2-update-guide",children:(0,n.jsx)(t.strong,{children:"upgrading requires a migration"})}),"."]}),"\n"]})}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://www.ferretdb.com",children:(0,n.jsx)(t.strong,{children:"FerretDB"})})," is a MongoDB-compatible database backed by ",(0,n.jsx)(t.a,{href:"https://github.com/microsoft/documentdb",children:"Postgres + DocumentDB extension"}),".\nIt is a solid option with performance comparable to MongoDB, and can also be run on some systems which ",(0,n.jsx)(t.a,{href:"https://github.com/moghtech/komodo/issues/59",children:"do not support MongoDB"}),"."]}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:["Copy ",(0,n.jsx)(t.code,{children:"komodo/ferretdb.compose.yaml"})," and ",(0,n.jsx)(t.code,{children:"komodo/compose.env"})," to your host:"]}),"\n"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"wget -P komodo https://raw.githubusercontent.com/moghtech/komodo/main/compose/ferretdb.compose.yaml && \\\n wget -P komodo https://raw.githubusercontent.com/moghtech/komodo/main/compose/compose.env\n"})}),"\n",(0,n.jsxs)(t.ol,{start:"2",children:["\n",(0,n.jsxs)(t.li,{children:["Edit the variables in ",(0,n.jsx)(t.code,{children:"komodo/compose.env"}),"."]}),"\n",(0,n.jsx)(t.li,{children:"Deploy using command:"}),"\n"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"docker compose -p komodo -f komodo/ferretdb.compose.yaml --env-file komodo/compose.env up -d\n"})}),"\n","\n",(0,n.jsx)(a.A,{file_name:"ferretdb.compose.yaml"})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},5627:(e,t,o)=>{o.d(t,{A:()=>V});var r=o(6540),n=o(6695),s=o(4164),a=o(3104),i=o(6347),l=o(205),c=o(7485),u=o(1682),d=o(679);function h(e){return r.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function m(e){const{values:t,children:o}=e;return(0,r.useMemo)(()=>{const e=t??function(e){return h(e).map(({props:{value:e,label:t,attributes:o,default:r}})=>({value:e,label:t,attributes:o,default:r}))}(o);return function(e){const t=(0,u.XI)(e,(e,t)=>e.value===t.value);if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[t,o])}function p({value:e,tabValues:t}){return t.some(t=>t.value===e)}function b({queryString:e=!1,groupId:t}){const o=(0,i.W6)(),n=function({queryString:e=!1,groupId:t}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:e,groupId:t});return[(0,c.aZ)(n),(0,r.useCallback)(e=>{if(!n)return;const t=new URLSearchParams(o.location.search);t.set(n,e),o.replace({...o.location,search:t.toString()})},[n,o])]}function f(e){const{defaultValue:t,queryString:o=!1,groupId:n}=e,s=m(e),[a,i]=(0,r.useState)(()=>function({defaultValue:e,tabValues:t}){if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!p({value:e,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${t.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const o=t.find(e=>e.default)??t[0];if(!o)throw new Error("Unexpected error: 0 tabValues");return o.value}({defaultValue:t,tabValues:s})),[c,u]=b({queryString:o,groupId:n}),[h,f]=function({groupId:e}){const t=function(e){return e?`docusaurus.tab.${e}`:null}(e),[o,n]=(0,d.Dv)(t);return[o,(0,r.useCallback)(e=>{t&&n.set(e)},[t,n])]}({groupId:n}),g=(()=>{const e=c??h;return p({value:e,tabValues:s})?e:null})();(0,l.A)(()=>{g&&i(g)},[g]);return{selectedValue:a,selectValue:(0,r.useCallback)(e=>{if(!p({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);i(e),u(e),f(e)},[u,f,s]),tabValues:s}}var g=o(2303);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=o(4848);function j({className:e,block:t,selectedValue:o,selectValue:r,tabValues:n}){const i=[],{blockElementScrollPositionUntilNextRender:l}=(0,a.a_)(),c=e=>{const t=e.currentTarget,s=i.indexOf(t),a=n[s].value;a!==o&&(l(t),r(a))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const o=i.indexOf(e.currentTarget)+1;t=i[o]??i[0];break}case"ArrowLeft":{const o=i.indexOf(e.currentTarget)-1;t=i[o]??i[i.length-1];break}}t?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":t},e),children:n.map(({value:e,label:t,attributes:r})=>(0,x.jsx)("li",{role:"tab",tabIndex:o===e?0:-1,"aria-selected":o===e,ref:e=>{i.push(e)},onKeyDown:u,onClick:c,...r,className:(0,s.A)("tabs__item",v.tabItem,r?.className,{"tabs__item--active":o===e}),children:t??e},e))})}function y({lazy:e,children:t,selectedValue:o}){const n=(Array.isArray(t)?t:[t]).filter(Boolean);if(e){const e=n.find(e=>e.props.value===o);return e?(0,r.cloneElement)(e,{className:(0,s.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:n.map((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==o}))})}function k(e){const t=f(e);return(0,x.jsxs)("div",{className:(0,s.A)("tabs-container",v.tabList),children:[(0,x.jsx)(j,{...t,...e}),(0,x.jsx)(y,{...t,...e})]})}function w(e){const t=(0,g.A)();return(0,x.jsx)(k,{...e,children:h(e.children)},String(t))}const D={tabItem:"tabItem_Ymn6"};function I({children:e,hidden:t,className:o}){return(0,x.jsx)("div",{role:"tabpanel",className:(0,s.A)(D.tabItem,o),hidden:t,children:e})}function V({file_name:e}){return(0,x.jsxs)(w,{children:[(0,x.jsx)(I,{value:e,children:(0,x.jsx)(n.A,{title:`https://github.com/moghtech/komodo/blob/main/compose/${e}`,url:`https://raw.githubusercontent.com/moghtech/komodo/main/compose/${e}`,language:"yaml"})}),(0,x.jsx)(I,{value:"compose.env",children:(0,x.jsx)(n.A,{title:"https://github.com/moghtech/komodo/blob/main/compose/compose.env",url:"https://raw.githubusercontent.com/moghtech/komodo/main/compose/compose.env",language:"bash"})})]})}},6695:(e,t,o)=>{o.d(t,{A:()=>a});var r=o(6540),n=o(1028),s=o(4848);function a({url:e,language:t,title:o}){const[a,i]=(0,r.useState)("");return(0,r.useEffect)(()=>{!async function(e,t){const o=await fetch(e);t(await o.text())}(e,i)},[]),(0,s.jsx)(n.A,{title:o??e,language:t,showLineNumbers:!0,children:a})}}}]);
\ No newline at end of file
diff --git a/assets/js/3bb59ffd.828db561.js b/assets/js/3bb59ffd.828db561.js
deleted file mode 100644
index 0a705a463..000000000
--- a/assets/js/3bb59ffd.828db561.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[24],{850:(e,t,o)=>{o.d(t,{A:()=>a});var r=o(6540),n=o(8069),s=o(4848);function a(e){let{url:t,language:o,title:a}=e;const[l,i]=(0,r.useState)("");return(0,r.useEffect)((()=>{!async function(e,t){const o=await fetch(e);t(await o.text())}(t,i)}),[]),(0,s.jsx)(n.A,{title:a??t,language:o,showLineNumbers:!0,children:l})}},2780:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>h,frontMatter:()=>l,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"setup/ferretdb","title":"FerretDB","description":"- If you setup Komodo using Postgres or Sqlite options prior to Komodo v1.18.0, you are using FerretDB v1.","source":"@site/docs/setup/ferretdb.mdx","sourceDirName":"setup","slug":"/setup/ferretdb","permalink":"/docs/setup/ferretdb","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/setup/ferretdb.mdx","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"MongoDB","permalink":"/docs/setup/mongo"},"next":{"title":"Advanced Configuration","permalink":"/docs/setup/advanced"}}');var n=o(4848),s=o(8453),a=o(6049);const l={},i="FerretDB",u={},c=[];function d(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"ferretdb",children:"FerretDB"})}),"\n",(0,n.jsx)(t.admonition,{type:"info",children:(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["If you setup Komodo using ",(0,n.jsx)(t.strong,{children:"Postgres"})," or ",(0,n.jsx)(t.strong,{children:"Sqlite"})," options prior to ",(0,n.jsx)(t.a,{href:"https://github.com/moghtech/komodo/releases/tag/v1.18.0",children:(0,n.jsx)(t.strong,{children:"Komodo v1.18.0"})}),", you are using ",(0,n.jsx)(t.strong,{children:"FerretDB v1"}),"."]}),"\n",(0,n.jsxs)(t.li,{children:["Komodo now uses ",(0,n.jsx)(t.strong,{children:"FerretDB v2"}),". For existing users, ",(0,n.jsx)(t.a,{href:"https://github.com/moghtech/komodo/blob/main/bin/util/docs/copy-database.md#ferretdb-v2-update-guide",children:(0,n.jsx)(t.strong,{children:"upgrading requires a migration"})}),"."]}),"\n"]})}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://www.ferretdb.com",children:(0,n.jsx)(t.strong,{children:"FerretDB"})})," is a MongoDB-compatible database backed by ",(0,n.jsx)(t.a,{href:"https://github.com/microsoft/documentdb",children:"Postgres + DocumentDB extension"}),".\nIt is a solid option with performance comparable to MongoDB, and can also be run on some systems which ",(0,n.jsx)(t.a,{href:"https://github.com/moghtech/komodo/issues/59",children:"do not support MongoDB"}),"."]}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:["Copy ",(0,n.jsx)(t.code,{children:"komodo/ferretdb.compose.yaml"})," and ",(0,n.jsx)(t.code,{children:"komodo/compose.env"})," to your host:"]}),"\n"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"wget -P komodo https://raw.githubusercontent.com/moghtech/komodo/main/compose/ferretdb.compose.yaml && \\\n wget -P komodo https://raw.githubusercontent.com/moghtech/komodo/main/compose/compose.env\n"})}),"\n",(0,n.jsxs)(t.ol,{start:"2",children:["\n",(0,n.jsxs)(t.li,{children:["Edit the variables in ",(0,n.jsx)(t.code,{children:"komodo/compose.env"}),"."]}),"\n",(0,n.jsx)(t.li,{children:"Deploy:"}),"\n"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"docker compose -p komodo -f komodo/ferretdb.compose.yaml --env-file komodo/compose.env up -d\n"})}),"\n","\n",(0,n.jsx)(a.A,{file_name:"ferretdb.compose.yaml"})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},6049:(e,t,o)=>{o.d(t,{A:()=>A});var r=o(6540),n=o(850),s=o(4164),a=o(5627),l=o(6347),i=o(372),u=o(604),c=o(1861),d=o(8749);function h(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function m(e){const{values:t,children:o}=e;return(0,r.useMemo)((()=>{const e=t??function(e){return h(e).map((e=>{let{props:{value:t,label:o,attributes:r,default:n}}=e;return{value:t,label:o,attributes:r,default:n}}))}(o);return function(e){const t=(0,c.XI)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,o])}function p(e){let{value:t,tabValues:o}=e;return o.some((e=>e.value===t))}function b(e){let{queryString:t=!1,groupId:o}=e;const n=(0,l.W6)(),s=function(e){let{queryString:t=!1,groupId:o}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!o)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return o??null}({queryString:t,groupId:o});return[(0,u.aZ)(s),(0,r.useCallback)((e=>{if(!s)return;const t=new URLSearchParams(n.location.search);t.set(s,e),n.replace({...n.location,search:t.toString()})}),[s,n])]}function f(e){const{defaultValue:t,queryString:o=!1,groupId:n}=e,s=m(e),[a,l]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:o}=e;if(0===o.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:o}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${o.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=o.find((e=>e.default))??o[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:s}))),[u,c]=b({queryString:o,groupId:n}),[h,f]=function(e){let{groupId:t}=e;const o=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,s]=(0,d.Dv)(o);return[n,(0,r.useCallback)((e=>{o&&s.set(e)}),[o,s])]}({groupId:n}),g=(()=>{const e=u??h;return p({value:e,tabValues:s})?e:null})();(0,i.A)((()=>{g&&l(g)}),[g]);return{selectedValue:a,selectValue:(0,r.useCallback)((e=>{if(!p({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);l(e),c(e),f(e)}),[c,f,s]),tabValues:s}}var g=o(9136);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=o(4848);function j(e){let{className:t,block:o,selectedValue:r,selectValue:n,tabValues:l}=e;const i=[],{blockElementScrollPositionUntilNextRender:u}=(0,a.a_)(),c=e=>{const t=e.currentTarget,o=i.indexOf(t),s=l[o].value;s!==r&&(u(t),n(s))},d=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const o=i.indexOf(e.currentTarget)+1;t=i[o]??i[0];break}case"ArrowLeft":{const o=i.indexOf(e.currentTarget)-1;t=i[o]??i[i.length-1];break}}t?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":o},t),children:l.map((e=>{let{value:t,label:o,attributes:n}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:r===t?0:-1,"aria-selected":r===t,ref:e=>{i.push(e)},onKeyDown:d,onClick:c,...n,className:(0,s.A)("tabs__item",v.tabItem,n?.className,{"tabs__item--active":r===t}),children:o??t},t)}))})}function y(e){let{lazy:t,children:o,selectedValue:n}=e;const a=(Array.isArray(o)?o:[o]).filter(Boolean);if(t){const e=a.find((e=>e.props.value===n));return e?(0,r.cloneElement)(e,{className:(0,s.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:a.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==n})))})}function k(e){const t=f(e);return(0,x.jsxs)("div",{className:(0,s.A)("tabs-container",v.tabList),children:[(0,x.jsx)(j,{...t,...e}),(0,x.jsx)(y,{...t,...e})]})}function w(e){const t=(0,g.A)();return(0,x.jsx)(k,{...e,children:h(e.children)},String(t))}const D={tabItem:"tabItem_Ymn6"};function I(e){let{children:t,hidden:o,className:r}=e;return(0,x.jsx)("div",{role:"tabpanel",className:(0,s.A)(D.tabItem,r),hidden:o,children:t})}function A(e){let{file_name:t}=e;return(0,x.jsxs)(w,{children:[(0,x.jsx)(I,{value:t,children:(0,x.jsx)(n.A,{title:`https://github.com/moghtech/komodo/blob/main/compose/${t}`,url:`https://raw.githubusercontent.com/moghtech/komodo/main/compose/${t}`,language:"yaml"})}),(0,x.jsx)(I,{value:"compose.env",children:(0,x.jsx)(n.A,{title:"https://github.com/moghtech/komodo/blob/main/compose/compose.env",url:"https://raw.githubusercontent.com/moghtech/komodo/main/compose/compose.env",language:"bash"})})]})}}}]);
\ No newline at end of file
diff --git a/assets/js/3d2be5a4.c2a4fe01.js b/assets/js/3d2be5a4.c2a4fe01.js
new file mode 100644
index 000000000..178346ea0
--- /dev/null
+++ b/assets/js/3d2be5a4.c2a4fe01.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[771],{483:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>a,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"resources/auto-update","title":"Automatic Updates","description":"Starting from v1.19.0, new Komodo installs will automatically create the","source":"@site/docs/resources/auto-update.md","sourceDirName":"resources","slug":"/resources/auto-update","permalink":"/docs/resources/auto-update","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/resources/auto-update.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Docker Compose","permalink":"/docs/resources/docker-compose"},"next":{"title":"Variables and Secrets","permalink":"/docs/resources/variables"}}');var s=o(4848),r=o(8453);const a={},i="Automatic Updates",c={},l=[{value:"How does it work?",id:"how-does-it-work",level:3}];function d(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h3:"h3",header:"header",p:"p",pre:"pre",strong:"strong",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"automatic-updates",children:"Automatic Updates"})}),"\n",(0,s.jsxs)(t.p,{children:["Starting from ",(0,s.jsx)(t.strong,{children:"v1.19.0"}),", new Komodo installs will automatically create the\n",(0,s.jsx)(t.strong,{children:"Global Auto Update"})," ",(0,s.jsx)(t.a,{href:"../resources/procedures#procedures",children:"Procedure"}),", scheduled daily.\nIf you don't have it, this is the Toml:"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-toml",children:'[[procedure]]\nname = "Global Auto Update"\ndescription = "Pulls and auto updates Stacks and Deployments using \'poll_for_updates\' or \'auto_update\'."\ntags = ["system"]\nconfig.schedule = "Every day at 03:00"\n\n[[procedure.config.stage]]\nname = "Stage 1"\nenabled = true\nexecutions = [\n { execution.type = "GlobalAutoUpdate", execution.params = {}, enabled = true }\n]\n'})}),"\n",(0,s.jsx)(t.admonition,{type:"info",children:(0,s.jsxs)(t.p,{children:["You are also able to integrate ",(0,s.jsx)(t.code,{children:"GlobalAutoUpdate"})," into other Procedures\nto coordinate the timing with other processes, such as backup. There is\nnothing special about this Procedure, it's just created by default for\nguidance / convenience."]})}),"\n",(0,s.jsx)(t.h3,{id:"how-does-it-work",children:"How does it work?"}),"\n",(0,s.jsxs)(t.p,{children:["Both Stacks and Deployments allow you to configure ",(0,s.jsx)(t.strong,{children:"Poll for Updates"})," or ",(0,s.jsx)(t.strong,{children:"Auto Update"}),".\nWhen ",(0,s.jsx)(t.a,{href:"https://docs.rs/komodo_client/latest/komodo_client/api/execute/struct.GlobalAutoUpdate.html",children:(0,s.jsx)(t.strong,{children:"GlobalAutoUpdate"})}),"\nis run, Komodo will loop through all the resources with either of these options enabled,\nand run ",(0,s.jsx)(t.a,{href:"https://docs.rs/komodo_client/latest/komodo_client/api/execute/struct.PullStack.html",children:(0,s.jsx)(t.strong,{children:"PullStack"})})," / ",(0,s.jsx)(t.a,{href:"https://docs.rs/komodo_client/latest/komodo_client/api/execute/struct.PullDeployment.html",children:(0,s.jsx)(t.strong,{children:"PullDeployment"})}),"\nin order to pick up any newer images ",(0,s.jsx)(t.strong,{children:"at the same tag"}),'.\nNote that in order to work, it requires use of a "Rolling" image tag, such as ',(0,s.jsx)(t.code,{children:":latest"}),"."]}),"\n",(0,s.jsx)(t.admonition,{type:"info",children:(0,s.jsxs)(t.p,{children:["If you use git sources Stacks and want to automatically update image tags, check out\n",(0,s.jsx)(t.a,{href:"https://github.com/renovatebot/renovate?tab=readme-ov-file#what-is-the-mend-renovate-cli",children:"Renovate"})]})}),"\n",(0,s.jsxs)(t.p,{children:["For resources with ",(0,s.jsx)(t.strong,{children:"Poll for Updates"})," enabled and an Alerter configured, it will\nsend an alert that a newer image is available, and display the update available indicator in the UI"]}),"\n",(0,s.jsxs)(t.p,{children:["For resource with ",(0,s.jsx)(t.strong,{children:"Auto Update"})," enabled, it will go ahead and Redeploy ",(0,s.jsx)(t.em,{children:"just the services"})," with\nnewer images (by default). If an Alerter is configured, it will also send an alert that this occured."]})]})}function u(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>a,x:()=>i});var n=o(6540);const s={},r=n.createContext(s);function a(e){const t=n.useContext(r);return n.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(s):e.components||s:a(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/42.4c296993.js b/assets/js/42.4c296993.js
deleted file mode 100644
index 462686608..000000000
--- a/assets/js/42.4c296993.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[42],{3042:(e,t,i)=>{i.r(t),i.d(t,{default:()=>d});i(6540);var n=i(539),o=i(1769),s=i(1410),r=i(5932),a=i(4848);function d(){const e=(0,n.T)({id:"theme.NotFound.title",message:"Page Not Found"});return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(o.be,{title:e}),(0,a.jsx)(s.A,{children:(0,a.jsx)(r.A,{})})]})}},5932:(e,t,i)=>{i.d(t,{A:()=>a});i(6540);var n=i(4164),o=i(539),s=i(9303),r=i(4848);function a(e){let{className:t}=e;return(0,r.jsx)("main",{className:(0,n.A)("container margin-vert--xl",t),children:(0,r.jsx)("div",{className:"row",children:(0,r.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,r.jsx)(s.A,{as:"h1",className:"hero__title",children:(0,r.jsx)(o.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,r.jsx)("p",{children:(0,r.jsx)(o.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,r.jsx)("p",{children:(0,r.jsx)(o.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}}}]);
\ No newline at end of file
diff --git a/assets/js/518.a3eeed39.js b/assets/js/518.a3eeed39.js
new file mode 100644
index 000000000..af6ba4872
--- /dev/null
+++ b/assets/js/518.a3eeed39.js
@@ -0,0 +1 @@
+(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[518],{1028:(e,t,n)=>{"use strict";n.d(t,{A:()=>oe});var s=n(6540),o=n(2303),c=n(4164),a=n(5293),r=n(6342);function l(){const{prism:e}=(0,r.p)(),{colorMode:t}=(0,a.G)(),n=e.theme,s=e.darkTheme||n;return"dark"===t?s:n}var i=n(7559),u=n(8426),d=n.n(u),m=n(9532),p=n(4848);const f=/title=(?["'])(?.*?)\1/,g=/\{(?[\d,-]+)\}/,b={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}},h={...b,lua:{start:"--",end:""},wasm:{start:"\\;\\;",end:""},tex:{start:"%",end:""},vb:{start:"['\u2018\u2019]",end:""},vbnet:{start:"(?:_\\s*)?['\u2018\u2019]",end:""},rem:{start:"[Rr][Ee][Mm]\\b",end:""},f90:{start:"!",end:""},ml:{start:"\\(\\*",end:"\\*\\)"},cobol:{start:"\\*>",end:""}},N=Object.keys(b);function k(e,t){const n=e.map(e=>{const{start:n,end:s}=h[e];return`(?:${n}\\s*(${t.flatMap(e=>[e.line,e.block?.start,e.block?.end].filter(Boolean)).join("|")})\\s*${s})`}).join("|");return new RegExp(`^\\s*(?:${n})\\s*$`)}function x({showLineNumbers:e,metastring:t}){return"boolean"==typeof e?e?1:void 0:"number"==typeof e?e:function(e){const t=e?.split(" ").find(e=>e.startsWith("showLineNumbers"));if(t){if(t.startsWith("showLineNumbers=")){const e=t.replace("showLineNumbers=","");return parseInt(e,10)}return 1}}(t)}function j(e,t){const{language:n,magicComments:s}=t;if(void 0===n)return{lineClassNames:{},code:e};const o=function(e,t){switch(e){case"js":case"javascript":case"ts":case"typescript":return k(["js","jsBlock"],t);case"jsx":case"tsx":return k(["js","jsBlock","jsx"],t);case"html":return k(["js","jsBlock","html"],t);case"python":case"py":case"bash":return k(["bash"],t);case"markdown":case"md":return k(["html","jsx","bash"],t);case"tex":case"latex":case"matlab":return k(["tex"],t);case"lua":case"haskell":return k(["lua"],t);case"sql":return k(["lua","jsBlock"],t);case"wasm":return k(["wasm"],t);case"vb":case"vba":case"visual-basic":return k(["vb","rem"],t);case"vbnet":return k(["vbnet","rem"],t);case"batch":return k(["rem"],t);case"basic":return k(["rem","f90"],t);case"fsharp":return k(["js","ml"],t);case"ocaml":case"sml":return k(["ml"],t);case"fortran":return k(["f90"],t);case"cobol":return k(["cobol"],t);default:return k(N,t)}}(n,s),c=e.split(/\r?\n/),a=Object.fromEntries(s.map(e=>[e.className,{start:0,range:""}])),r=Object.fromEntries(s.filter(e=>e.line).map(({className:e,line:t})=>[t,e])),l=Object.fromEntries(s.filter(e=>e.block).map(({className:e,block:t})=>[t.start,e])),i=Object.fromEntries(s.filter(e=>e.block).map(({className:e,block:t})=>[t.end,e]));for(let d=0;dvoid 0!==e);r[t]?a[r[t]].range+=`${d},`:l[t]?a[l[t]].start=d:i[t]&&(a[i[t]].range+=`${a[i[t]].start}-${d-1},`),c.splice(d,1)}const u={};return Object.entries(a).forEach(([e,{range:t}])=>{d()(t).forEach(t=>{u[t]??=[],u[t].push(e)})}),{code:c.join("\n"),lineClassNames:u}}function y(e,t){const n=e.replace(/\r?\n$/,"");return function(e,{metastring:t,magicComments:n}){if(t&&g.test(t)){const s=t.match(g).groups.range;if(0===n.length)throw new Error(`A highlight range has been given in code block's metastring (\`\`\` ${t}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);const o=n[0].className,c=d()(s).filter(e=>e>0).map(e=>[e-1,[o]]);return{lineClassNames:Object.fromEntries(c),code:e}}return null}(n,{...t})??j(n,{...t})}function B(e){const t=function(e){return t=e.language??function(e){if(!e)return;const t=e.split(" ").find(e=>e.startsWith("language-"));return t?.replace(/language-/,"")}(e.className)??e.defaultLanguage,t?.toLowerCase()??"text";var t}({language:e.language,defaultLanguage:e.defaultLanguage,className:e.className}),{lineClassNames:n,code:s}=y(e.code,{metastring:e.metastring,magicComments:e.magicComments,language:t}),o=function({className:e,language:t}){return(0,c.A)(e,t&&!e?.includes(`language-${t}`)&&`language-${t}`)}({className:e.className,language:t}),a=(r=e.metastring,(r?.match(f)?.groups.title??"")||e.title);var r;const l=x({showLineNumbers:e.showLineNumbers,metastring:e.metastring});return{codeInput:e.code,code:s,className:o,language:t,title:a,lineNumbersStart:l,lineClassNames:n}}const C=(0,s.createContext)(null);function v({metadata:e,wordWrap:t,children:n}){const o=(0,s.useMemo)(()=>({metadata:e,wordWrap:t}),[e,t]);return(0,p.jsx)(C.Provider,{value:o,children:n})}function w(){const e=(0,s.useContext)(C);if(null===e)throw new m.dV("CodeBlockContextProvider");return e}const L={codeBlockContainer:"codeBlockContainer_Ckt0"};function E({as:e,...t}){const n=function(e){const t={color:"--prism-color",backgroundColor:"--prism-background-color"},n={};return Object.entries(e.plain).forEach(([e,s])=>{const o=t[e];o&&"string"==typeof s&&(n[o]=s)}),n}(l());return(0,p.jsx)(e,{...t,style:n,className:(0,c.A)(t.className,L.codeBlockContainer,i.G.common.codeBlock)})}const A={codeBlock:"codeBlock_bY9V",codeBlockStandalone:"codeBlockStandalone_MEMb",codeBlockLines:"codeBlockLines_e6Vv",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_o6Pm"};function S({children:e,className:t}){return(0,p.jsx)(E,{as:"pre",tabIndex:0,className:(0,c.A)(A.codeBlockStandalone,"thin-scrollbar",t),children:(0,p.jsx)("code",{className:A.codeBlockLines,children:e})})}const T={attributes:!0,characterData:!0,childList:!0,subtree:!0};function I(e,t){const[n,o]=(0,s.useState)(),c=(0,s.useCallback)(()=>{o(e.current?.closest("[role=tabpanel][hidden]"))},[e,o]);(0,s.useEffect)(()=>{c()},[c]),function(e,t,n=T){const o=(0,m._q)(t),c=(0,m.Be)(n);(0,s.useEffect)(()=>{const t=new MutationObserver(o);return e&&t.observe(e,c),()=>t.disconnect()},[e,o,c])}(n,e=>{e.forEach(e=>{"attributes"===e.type&&"hidden"===e.attributeName&&(t(),c())})},{attributes:!0,characterData:!1,childList:!1,subtree:!1})}function W({children:e}){return e}var _=n(1765);function M({line:e,token:t,...n}){return(0,p.jsx)("span",{...n})}const $={codeLine:"codeLine_lJS_",codeLineNumber:"codeLineNumber_Tfdd",codeLineContent:"codeLineContent_feaV"};function V({line:e,classNames:t,showLineNumbers:n,getLineProps:s,getTokenProps:o}){const a=function(e){const t=1===e.length&&"\n"===e[0].content?e[0]:void 0;return t?[{...t,content:""}]:e}(e),r=s({line:a,className:(0,c.A)(t,n&&$.codeLine)}),l=a.map((e,t)=>{const n=o({token:e});return(0,p.jsx)(M,{...n,line:a,token:e,children:n.children},t)});return(0,p.jsxs)("span",{...r,children:[n?(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)("span",{className:$.codeLineNumber}),(0,p.jsx)("span",{className:$.codeLineContent,children:l})]}):l,(0,p.jsx)("br",{})]})}const P=s.forwardRef((e,t)=>(0,p.jsx)("pre",{ref:t,tabIndex:0,...e,className:(0,c.A)(e.className,A.codeBlock,"thin-scrollbar")}));function R(e){const{metadata:t}=w();return(0,p.jsx)("code",{...e,className:(0,c.A)(e.className,A.codeBlockLines,void 0!==t.lineNumbersStart&&A.codeBlockLinesWithNumbering),style:{...e.style,counterReset:void 0===t.lineNumbersStart?void 0:"line-count "+(t.lineNumbersStart-1)}})}function H({className:e}){const{metadata:t,wordWrap:n}=w(),s=l(),{code:o,language:a,lineNumbersStart:r,lineClassNames:i}=t;return(0,p.jsx)(_.f4,{theme:s,code:o,language:a,children:({className:t,style:s,tokens:o,getLineProps:a,getTokenProps:l})=>(0,p.jsx)(P,{ref:n.codeBlockRef,className:(0,c.A)(e,t),style:s,children:(0,p.jsx)(R,{children:o.map((e,t)=>(0,p.jsx)(V,{line:e,getLineProps:a,getTokenProps:l,classNames:i[t],showLineNumbers:void 0!==r},t))})})})}function O({children:e,fallback:t}){return(0,o.A)()?(0,p.jsx)(p.Fragment,{children:e?.()}):t??null}var z=n(1312);function q({className:e,...t}){return(0,p.jsx)("button",{type:"button",...t,className:(0,c.A)("clean-btn",e)})}function G(e){return(0,p.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,p.jsx)("path",{fill:"currentColor",d:"M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"})})}function F(e){return(0,p.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,p.jsx)("path",{fill:"currentColor",d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"})})}const D={copyButtonCopied:"copyButtonCopied_Vdqa",copyButtonIcons:"copyButtonIcons_IEyt",copyButtonIcon:"copyButtonIcon_TrPX",copyButtonSuccessIcon:"copyButtonSuccessIcon_cVMy"};function J(e){return e?(0,z.T)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,z.T)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"})}function Z(){const{metadata:{code:e}}=w(),[t,n]=(0,s.useState)(!1),o=(0,s.useRef)(void 0),c=(0,s.useCallback)(()=>{!function(e,{target:t=document.body}={}){if("string"!=typeof e)throw new TypeError(`Expected parameter \`text\` to be a \`string\`, got \`${typeof e}\`.`);const n=document.createElement("textarea"),s=document.activeElement;n.value=e,n.setAttribute("readonly",""),n.style.contain="strict",n.style.position="absolute",n.style.left="-9999px",n.style.fontSize="12pt";const o=document.getSelection(),c=o.rangeCount>0&&o.getRangeAt(0);t.append(n),n.select(),n.selectionStart=0,n.selectionEnd=e.length;let a=!1;try{a=document.execCommand("copy")}catch{}n.remove(),c&&(o.removeAllRanges(),o.addRange(c)),s&&s.focus()}(e),n(!0),o.current=window.setTimeout(()=>{n(!1)},1e3)},[e]);return(0,s.useEffect)(()=>()=>window.clearTimeout(o.current),[]),{copyCode:c,isCopied:t}}function Q({className:e}){const{copyCode:t,isCopied:n}=Z();return(0,p.jsx)(q,{"aria-label":J(n),title:(0,z.T)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,c.A)(e,D.copyButton,n&&D.copyButtonCopied),onClick:t,children:(0,p.jsxs)("span",{className:D.copyButtonIcons,"aria-hidden":"true",children:[(0,p.jsx)(G,{className:D.copyButtonIcon}),(0,p.jsx)(F,{className:D.copyButtonSuccessIcon})]})})}function X(e){return(0,p.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,p.jsx)("path",{fill:"currentColor",d:"M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"})})}const Y={wordWrapButtonIcon:"wordWrapButtonIcon_b1P5",wordWrapButtonEnabled:"wordWrapButtonEnabled_uzNF"};function K({className:e}){const{wordWrap:t}=w();if(!(t.isEnabled||t.isCodeScrollable))return!1;const n=(0,z.T)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return(0,p.jsx)(q,{onClick:()=>t.toggle(),className:(0,c.A)(e,t.isEnabled&&Y.wordWrapButtonEnabled),"aria-label":n,title:n,children:(0,p.jsx)(X,{className:Y.wordWrapButtonIcon,"aria-hidden":"true"})})}const U={buttonGroup:"buttonGroup_M5ko"};function ee({className:e}){return(0,p.jsx)(O,{children:()=>(0,p.jsxs)("div",{className:(0,c.A)(e,U.buttonGroup),children:[(0,p.jsx)(K,{}),(0,p.jsx)(Q,{})]})})}const te={codeBlockContent:"codeBlockContent_QJqH",codeBlockTitle:"codeBlockTitle_OeMC",codeBlock:"codeBlock_a8dz"};function ne({className:e}){const{metadata:t}=w();return(0,p.jsxs)(E,{as:"div",className:(0,c.A)(e,t.className),children:[t.title&&(0,p.jsx)("div",{className:te.codeBlockTitle,children:(0,p.jsx)(W,{children:t.title})}),(0,p.jsxs)("div",{className:te.codeBlockContent,children:[(0,p.jsx)(H,{}),(0,p.jsx)(ee,{})]})]})}function se(e){const t=function(e){const{prism:t}=(0,r.p)();return B({code:e.children,className:e.className,metastring:e.metastring,magicComments:t.magicComments,defaultLanguage:t.defaultLanguage,language:e.language,title:e.title,showLineNumbers:e.showLineNumbers})}(e),n=function(){const[e,t]=(0,s.useState)(!1),[n,o]=(0,s.useState)(!1),c=(0,s.useRef)(null),a=(0,s.useCallback)(()=>{const n=c.current.querySelector("code");e?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),t(e=>!e)},[c,e]),r=(0,s.useCallback)(()=>{const{scrollWidth:e,clientWidth:t}=c.current,n=e>t||c.current.querySelector("code").hasAttribute("style");o(n)},[c]);return I(c,r),(0,s.useEffect)(()=>{r()},[e,r]),(0,s.useEffect)(()=>(window.addEventListener("resize",r,{passive:!0}),()=>{window.removeEventListener("resize",r)}),[r]),{codeBlockRef:c,isEnabled:e,isCodeScrollable:n,toggle:a}}();return(0,p.jsx)(v,{metadata:t,wordWrap:n,children:(0,p.jsx)(ne,{})})}function oe({children:e,...t}){const n=(0,o.A)(),c=function(e){return s.Children.toArray(e).some(e=>(0,s.isValidElement)(e))?e:Array.isArray(e)?e.join(""):e}(e),a="string"==typeof c?se:S;return(0,p.jsx)(a,{...t,children:c},String(n))}},8426:(e,t)=>{function n(e){let t,n=[];for(let s of e.split(",").map(e=>e.trim()))if(/^-?\d+$/.test(s))n.push(parseInt(s,10));else if(t=s.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,s,o,c]=t;if(s&&c){s=parseInt(s),c=parseInt(c);const e=s{"use strict";n.d(t,{R:()=>a,x:()=>r});var s=n(6540);const o={},c=s.createContext(o);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(o):e.components||o:a(e.components),s.createElement(c.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/5514a8d7.850b33b8.js b/assets/js/5514a8d7.850b33b8.js
new file mode 100644
index 000000000..641094719
--- /dev/null
+++ b/assets/js/5514a8d7.850b33b8.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[122],{8453:(e,s,n)=>{n.d(s,{R:()=>t,x:()=>c});var o=n(6540);const r={},i=o.createContext(r);function t(e){const s=o.useContext(i);return o.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),o.createElement(i.Provider,{value:s},e.children)}},9749:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>d,contentTitle:()=>c,default:()=>a,frontMatter:()=>t,metadata:()=>o,toc:()=>l});const o=JSON.parse('{"id":"resources/build-images/pre-build","title":"Pre-build command","description":"Sometimes a command needs to be run before running `docker build`, you can configure this in the pre build section.","source":"@site/docs/resources/build-images/pre-build.md","sourceDirName":"resources/build-images","slug":"/resources/build-images/pre-build","permalink":"/docs/resources/build-images/pre-build","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/resources/build-images/pre-build.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Configuration","permalink":"/docs/resources/build-images/configuration"},"next":{"title":"Builders","permalink":"/docs/resources/build-images/builders"}}');var r=n(4848),i=n(8453);const t={},c="Pre-build command",d={},l=[];function u(e){const s={code:"code",em:"em",h1:"h1",header:"header",p:"p",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"pre-build-command",children:"Pre-build command"})}),"\n",(0,r.jsxs)(s.p,{children:["Sometimes a command needs to be run before running ",(0,r.jsx)(s.code,{children:"docker build"}),", you can configure this in the ",(0,r.jsx)(s.em,{children:"pre build"})," section."]}),"\n",(0,r.jsxs)(s.p,{children:["There are two fields to pass for ",(0,r.jsx)(s.em,{children:"pre build"}),". the first is ",(0,r.jsx)(s.em,{children:"path"}),", which changes the working directory. To run the command in the root of the repo, just pass ",(0,r.jsx)(s.code,{children:"."}),". The second field is ",(0,r.jsx)(s.em,{children:"command"}),", this is the shell command to be executed after the repo is cloned."]}),"\n",(0,r.jsxs)(s.p,{children:["For example, say your repo had a folder in it called ",(0,r.jsx)(s.code,{children:"scripts"})," with a shell script ",(0,r.jsx)(s.code,{children:"on-clone.sh"}),". You would give ",(0,r.jsx)(s.em,{children:"path"})," as ",(0,r.jsx)(s.code,{children:"scripts"})," and command as ",(0,r.jsx)(s.code,{children:"sh on-clone.sh"}),". Or you could make ",(0,r.jsx)(s.em,{children:"path"})," just ",(0,r.jsx)(s.code,{children:"."})," and then the command would be ",(0,r.jsx)(s.code,{children:"sh scripts/on-clone.sh"}),". Either way works fine."]})]})}function a(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}}}]);
\ No newline at end of file
diff --git a/assets/js/5e95c892.2313a5ba.js b/assets/js/5e95c892.2313a5ba.js
deleted file mode 100644
index 327b6b0a7..000000000
--- a/assets/js/5e95c892.2313a5ba.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[647],{8122:(e,s,r)=>{r.r(s),r.d(s,{default:()=>i});r(6540);var c=r(4164),t=r(1769),u=r(204),a=r(2831),d=r(1410),n=r(4848);function i(e){return(0,n.jsx)(t.e3,{className:(0,c.A)(u.G.wrapper.docsPages),children:(0,n.jsx)(d.A,{children:(0,a.v)(e.route.routes)})})}}}]);
\ No newline at end of file
diff --git a/assets/js/5e95c892.e2f2095a.js b/assets/js/5e95c892.e2f2095a.js
new file mode 100644
index 000000000..72d67a64e
--- /dev/null
+++ b/assets/js/5e95c892.e2f2095a.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[647],{7121:(e,s,r)=>{r.r(s),r.d(s,{default:()=>i});r(6540);var c=r(4164),t=r(7559),u=r(5500),a=r(2831),d=r(1656),n=r(4848);function i(e){return(0,n.jsx)(u.e3,{className:(0,c.A)(t.G.wrapper.docsPages),children:(0,n.jsx)(d.A,{children:(0,a.v)(e.route.routes)})})}}}]);
\ No newline at end of file
diff --git a/assets/js/5fbc5cf1.7950cb6b.js b/assets/js/5fbc5cf1.7950cb6b.js
deleted file mode 100644
index 837158be8..000000000
--- a/assets/js/5fbc5cf1.7950cb6b.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[624],{8453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>c});var o=n(6540);const s={},i=o.createContext(s);function a(e){const t=o.useContext(i);return o.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:a(e.components),o.createElement(i.Provider,{value:t},e.children)}},9362:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>r,contentTitle:()=>c,default:()=>p,frontMatter:()=>a,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"api","title":"API and Clients","description":"Komodo Core exposes an RPC-like HTTP API to read data, write configuration, and execute actions.","source":"@site/docs/api.md","sourceDirName":".","slug":"/api","permalink":"/docs/api","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/api.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Version Upgrades","permalink":"/docs/version-upgrades"},"next":{"title":"Development","permalink":"/docs/development"}}');var s=n(4848),i=n(8453);const a={},c="API and Clients",r={},d=[{value:"Rust Client",id:"rust-client",level:2},{value:"Typescript Client",id:"typescript-client",level:2}];function l(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",strong:"strong",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"api-and-clients",children:"API and Clients"})}),"\n",(0,s.jsxs)(t.p,{children:["Komodo Core exposes an RPC-like HTTP API to read data, write configuration, and execute actions.\nThere are typesafe clients available in\n",(0,s.jsx)(t.a,{href:"/docs/api#rust-client",children:(0,s.jsx)(t.strong,{children:"Rust"})})," and ",(0,s.jsx)(t.a,{href:"/docs/api#typescript-client",children:(0,s.jsx)(t.strong,{children:"Typescript"})}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["The full API documentation is ",(0,s.jsx)(t.a,{href:"https://docs.rs/komodo_client/latest/komodo_client/api/index.html",children:(0,s.jsx)(t.strong,{children:"available here"})}),"."]}),"\n",(0,s.jsx)(t.h2,{id:"rust-client",children:"Rust Client"}),"\n",(0,s.jsxs)(t.p,{children:["The Rust client is published to crates.io at ",(0,s.jsx)(t.a,{href:"https://crates.io/crates/komodo_client",children:"komodo_client"}),"."]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-rust",children:'let komodo = KomodoClient::new("https://demo.komo.do", "your_key", "your_secret")\n .with_healthcheck()\n .await?;\n\nlet stacks = komodo.read(ListStacks::default()).await?;\n\nlet update = komodo\n .execute(DeployStack {\n stack: stacks[0].name.clone(),\n stop_time: None\n })\n .await?;\n'})}),"\n",(0,s.jsx)(t.h2,{id:"typescript-client",children:"Typescript Client"}),"\n",(0,s.jsxs)(t.p,{children:["The Typescript client is published to NPM at ",(0,s.jsx)(t.a,{href:"https://www.npmjs.com/package/komodo_client",children:"komodo_client"}),"."]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-ts",children:'import { KomodoClient, Types } from "komodo_client";\n\nconst komodo = KomodoClient("https://demo.komo.do", {\n type: "api-key",\n params: {\n key: "your_key",\n secret: "your secret",\n },\n});\n\n// Inferred as Types.StackListItem[]\nconst stacks = await komodo.read("ListStacks", {});\n\n// Inferred as Types.Update\nconst update = await komodo.execute("DeployStack", {\n stack: stacks[0].name,\n});\n'})})]})}function p(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}}}]);
\ No newline at end of file
diff --git a/assets/js/60776049.dccfd177.js b/assets/js/60776049.dccfd177.js
new file mode 100644
index 000000000..96631ecde
--- /dev/null
+++ b/assets/js/60776049.dccfd177.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[440],{6649:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>t,contentTitle:()=>l,default:()=>h,frontMatter:()=>c,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"resources/permissioning","title":"Permissioning","description":"Komodo has a granular, layer-based permissioning system to provide non-admin users access only to intended Resources.","source":"@site/docs/resources/permissioning.md","sourceDirName":"resources","slug":"/resources/permissioning","permalink":"/docs/resources/permissioning","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/resources/permissioning.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Configuring Webhooks","permalink":"/docs/resources/webhooks"},"next":{"title":"Ecosystem","permalink":"/docs/ecosystem"}}');var i=n(4848),o=n(8453);const c={},l="Permissioning",t={},d=[{value:"User Groups",id:"user-groups",level:2},{value:"Permission Levels",id:"permission-levels",level:2},{value:"Specific Permissions",id:"specific-permissions",level:2},{value:"Permissioning by Resource Type",id:"permissioning-by-resource-type",level:2},{value:"Administration",id:"administration",level:2}];function a(e){const s={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"permissioning",children:"Permissioning"})}),"\n",(0,i.jsx)(s.p,{children:"Komodo has a granular, layer-based permissioning system to provide non-admin users access only to intended Resources."}),"\n",(0,i.jsx)(s.h2,{id:"user-groups",children:"User Groups"}),"\n",(0,i.jsxs)(s.p,{children:["While Komodo can assign permissions to specific users directly, it is recommended to instead ",(0,i.jsx)(s.strong,{children:"create User Groups and assign permissions to them"}),", as if they were a user."]}),"\n",(0,i.jsxs)(s.p,{children:["Users can then be ",(0,i.jsx)(s.strong,{children:"added to multiple User Groups"})," and they ",(0,i.jsx)(s.strong,{children:"inherit the group's permissions"}),", similar to linux permissions.\nThere is also an ",(0,i.jsx)(s.code,{children:"Everyone"})," mode for User Groups, if this is enabled then ",(0,i.jsx)(s.strong,{children:"all users implicitly gain the groups permissions"}),"."]}),"\n",(0,i.jsxs)(s.p,{children:["For permissioning at scale, users can define ",(0,i.jsx)(s.a,{href:"/docs/resources/sync-resources#user-group",children:(0,i.jsx)(s.strong,{children:"User Groups in Resource Syncs"})}),"."]}),"\n",(0,i.jsx)(s.h2,{id:"permission-levels",children:"Permission Levels"}),"\n",(0,i.jsx)(s.p,{children:"There are 4 permission levels a user / group can be given on a Resource:"}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"None"}),". The user will not have any access to the resource. The user ",(0,i.jsx)(s.strong,{children:"will not see it in the GUI, and it will not show up if the user queries the Komodo API directly"}),". All attempts to view or update the resource will be blocked. This is the default for non-admins, unless using ",(0,i.jsx)(s.code,{children:"KOMODO_TRANSPARENT_MODE=true"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Read"}),". This is the first permission level that grants any access. It will enable the user to ",(0,i.jsx)(s.strong,{children:"see the resource in the GUI and read the configuration"}),". Any attempts to update configuration or trigger any action ",(0,i.jsx)(s.strong,{children:"will be blocked"}),". Using ",(0,i.jsx)(s.code,{children:"KOMODO_TRANSPARENT_MODE=true"})," will make this level the base level on all resources, for all users."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Execute"}),". This level will allow the user to execute actions on the resource, ",(0,i.jsx)(s.strong,{children:"like send a build command"})," or ",(0,i.jsx)(s.strong,{children:"trigger a redeploy"}),". The user will still be blocked from updating configuration on the resource."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Write"}),". The user has full config write access to the resource, ",(0,i.jsx)(s.strong,{children:"they can execute any actions, update the configuration, and delete the resource"}),"."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"specific-permissions",children:"Specific Permissions"}),"\n",(0,i.jsx)(s.p,{children:"Permission levels alone are not quite enough to provide granular access control.\nSome features are additionally gated behind a specific permission for that feature."}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:(0,i.jsx)(s.code,{children:"Logs"})}),": User can retrieve docker / docker compose logs on the associated resource.","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Valid on ",(0,i.jsx)(s.code,{children:"Server"}),", ",(0,i.jsx)(s.code,{children:"Stack"}),", ",(0,i.jsx)(s.code,{children:"Deployment"}),"."]}),"\n",(0,i.jsx)(s.li,{children:"For admins wanting this permission by default for all users with read permissions, see below on default user groups."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:(0,i.jsx)(s.code,{children:"Inspect"})}),': User can "inspect" docker containers.',"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Valid on ",(0,i.jsx)(s.code,{children:"Server"}),", ",(0,i.jsx)(s.code,{children:"Stack"}),", ",(0,i.jsx)(s.code,{children:"Deployment"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"On Servers"}),": Access to this api will expose all container environments on the given server,\nand can easily lead to secrets being leaked to unintended users if not protected."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:(0,i.jsx)(s.code,{children:"Terminal"})}),": User can access the associated resource's terminal.","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["If given on a ",(0,i.jsx)(s.code,{children:"Server"}),", this allows server level terminal access, and all container exec priviledges (Including attached ",(0,i.jsx)(s.code,{children:"Stacks"})," / ",(0,i.jsx)(s.code,{children:"Deployments"}),")."]}),"\n",(0,i.jsxs)(s.li,{children:["If given on a ",(0,i.jsx)(s.code,{children:"Stack"})," or ",(0,i.jsx)(s.code,{children:"Deployment"}),", this allows container exec terminal (even without ",(0,i.jsx)(s.code,{children:"Terminal"})," on ",(0,i.jsx)(s.code,{children:"Server"}),")."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:(0,i.jsx)(s.code,{children:"Attach"})}),': User can "attach" ',(0,i.jsx)(s.em,{children:"other resources"})," to the resource.","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["If given on a ",(0,i.jsx)(s.code,{children:"Server"}),", allows users to attach ",(0,i.jsx)(s.code,{children:"Stacks"}),", ",(0,i.jsx)(s.code,{children:"Deployments"}),", ",(0,i.jsx)(s.code,{children:"Repos"}),", and ",(0,i.jsx)(s.code,{children:"Builders"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["If given on a ",(0,i.jsx)(s.code,{children:"Builder"}),", allows users to attach ",(0,i.jsx)(s.code,{children:"Builds"})," and ",(0,i.jsx)(s.code,{children:"Repos"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["If given on a ",(0,i.jsx)(s.code,{children:"Build"}),", allows users to attach it to ",(0,i.jsx)(s.code,{children:"Deployments"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["If given on a ",(0,i.jsx)(s.code,{children:"Repo"}),", allows users to attach it to ",(0,i.jsx)(s.code,{children:"Stacks"}),", ",(0,i.jsx)(s.code,{children:"Builds"}),", and ",(0,i.jsx)(s.code,{children:"Resource Syncs"}),"."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:(0,i.jsx)(s.code,{children:"Processes"})}),": User can retrieve the full running process list on the ",(0,i.jsx)(s.code,{children:"Server"}),"."]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"permissioning-by-resource-type",children:"Permissioning by Resource Type"}),"\n",(0,i.jsx)(s.p,{children:"Users or User Groups can be given a base permission level on all Resources of a particular type, such as Stack.\nIn TOML form, this looks like:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-toml",children:'[[user_group]]\nname = "groupo"\nusers = ["mbecker20", "karamvirsingh98"]\nall.Build = "Execute" # <- Group members can run all builds (but not update config),\nall.Stack = { level = "Read", specific = ["Logs"] } # <- And see all Stacks / logs (no deploy / update, inspect, or terminal access).\n'})}),"\n",(0,i.jsx)(s.p,{children:"A user / group can still be given a greater permission level on select resources:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-toml",children:'permissions = [\n # Grant addition specific permission (Logs are already granted above)\n { target.type = "Stack", target.id = "my-stack", level = "Execute", specific = ["Inspect", "Terminal"] },\n # Use regex to match multiple resources, for example give john execute on all of their Stacks\n { target.type = "Stack", target.id = "\\\\^john-(.+)$\\\\", level = "Execute" },\n]\n'})}),"\n",(0,i.jsx)(s.h2,{id:"administration",children:"Administration"}),"\n",(0,i.jsxs)(s.p,{children:["Users can be given Admin priviledges by a ",(0,i.jsx)(s.code,{children:"Super Admin"})," (only the first user is given this status, set with ",(0,i.jsx)(s.code,{children:"super_admin: true"}),' on a User document in database). Super admins will see the "Make Admin" button when on a User page ',(0,i.jsx)(s.code,{children:"/users/${user_id}"}),"."]}),"\n",(0,i.jsx)(s.p,{children:"These users have unrestricted access to all Komodo Resources. Additionally, these users can update other (non-admin) user's permissions on resources."}),"\n",(0,i.jsxs)(s.p,{children:["Komodo admins are responsible for managing user accounts as well. When a user logs into Komodo for the first time, they will not immediately be granted access (this can changed with ",(0,i.jsx)(s.code,{children:"KOMODO_ENABLE_NEW_USERS=true"}),"). An admin must first ",(0,i.jsx)(s.strong,{children:"enable"})," the user, which can be done from the ",(0,i.jsx)(s.code,{children:"Users"})," tab on ",(0,i.jsx)(s.code,{children:"Settings"})," page. Users can also be ",(0,i.jsx)(s.strong,{children:"disabled"})," by an admin at any time, which blocks all their access to the GUI and API."]}),"\n",(0,i.jsx)(s.p,{children:"Users also have some configurable global permissions, these are:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"create server permission"}),"\n",(0,i.jsx)(s.li,{children:"create build permission"}),"\n"]}),"\n",(0,i.jsx)(s.p,{children:"Only users with these permissions (as well as admins) can add additional servers to Komodo, and can create additional builds, respectively."})]})}function h(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>c,x:()=>l});var r=n(6540);const i={},o=r.createContext(i);function c(e){const s=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:c(e.components),r.createElement(o.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/669fcf45.8818c13f.js b/assets/js/669fcf45.8818c13f.js
deleted file mode 100644
index baef123c3..000000000
--- a/assets/js/669fcf45.8818c13f.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[552],{1140:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>u,frontMatter:()=>i,metadata:()=>s,toc:()=>a});const s=JSON.parse('{"id":"sync-resources","title":"Sync Resources","description":"Komodo is able to create, update, delete, and deploy resources declared in TOML files by diffing them against the existing resources,","source":"@site/docs/sync-resources.md","sourceDirName":".","slug":"/sync-resources","permalink":"/docs/sync-resources","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/sync-resources.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Permissioning","permalink":"/docs/permissioning"},"next":{"title":"Configuring Webhooks","permalink":"/docs/webhooks"}}');var o=t(4848),r=t(8453);const i={},l="Sync Resources",c={},a=[{value:"Commit to Syncs",id:"commit-to-syncs",level:2},{value:"Example Declarations",id:"example-declarations",level:2},{value:"Server",id:"server",level:3},{value:"Builder and build",id:"builder-and-build",level:3},{value:"Deployments",id:"deployments",level:3},{value:"Stack",id:"stack",level:3},{value:"Procedure",id:"procedure",level:3},{value:"Repo",id:"repo",level:3},{value:"Resource sync",id:"resource-sync",level:3},{value:"User Group:",id:"user-group",level:3}];function d(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"sync-resources",children:"Sync Resources"})}),"\n",(0,o.jsx)(n.p,{children:"Komodo is able to create, update, delete, and deploy resources declared in TOML files by diffing them against the existing resources,\nand apply updates based on the diffs. Similar to Stacks, the files can be configured in UI, in a local file, or in files pushed to a remote git repo.\nThe Komodo Core backend will poll the files for for any updates, and alert about pending changes when diffs are detected."}),"\n",(0,o.jsxs)(n.p,{children:["You can spread out your resource declarations across any number of files\nand use any nesting of folders to organize resources inside a root folder.\nAdditionally, you can create multiple ",(0,o.jsx)(n.code,{children:"ResourceSyncs"})," and configure ",(0,o.jsx)(n.code,{children:"Match Tags"}),' to filter down which resources are synced,\nand each sync will be handled independently. This allows different syncs to manage resources on a "per-project" basis.']}),"\n",(0,o.jsx)(n.p,{children:"The UI will display the computed sync actions and only execute them upon manual confirmation.\nOr the sync execution git webhook may be configured on the git repo to\nautomatically execute syncs upon pushes to the configured branch."}),"\n",(0,o.jsx)(n.h2,{id:"commit-to-syncs",children:"Commit to Syncs"}),"\n",(0,o.jsxs)(n.p,{children:['If the Sync is pointing to just a single file, you can enable "Managed Mode" to allow Core to write the updates you made in UI ',(0,o.jsx)(n.em,{children:"back to the file"}),".\nThis works no matter where the files are located, and will create a commit to your git repository for repo based files."]}),"\n",(0,o.jsx)(n.h2,{id:"example-declarations",children:"Example Declarations"}),"\n",(0,o.jsx)(n.h3,{id:"server",children:"Server"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"https://docs.rs/komodo_client/latest/komodo_client/entities/server/struct.ServerConfig.html",children:"Server config schema"})}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-toml",children:'[[server]] # Declare a new server\nname = "server-prod"\ndescription = "the prod server"\ntags = ["prod"]\n[server.config]\naddress = "http://localhost:8120"\nregion = "AshburnDc1"\nenabled = true # default: false\n'})}),"\n",(0,o.jsx)(n.h3,{id:"builder-and-build",children:"Builder and build"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"https://docs.rs/komodo_client/latest/komodo_client/entities/builder/enum.BuilderConfig.html",children:"Builder config schema"})}),"\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"https://docs.rs/komodo_client/latest/komodo_client/entities/build/struct.BuildConfig.html",children:"Build config schema"})}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-toml",children:'[[builder]] # Declare a builder\nname = "builder-01"\ntags = []\nconfig.type = "Aws"\n[builder.config.params]\nregion = "us-east-2"\nami_id = "ami-0e9bd154667944680"\n# These things come from your specific setup\nsubnet_id = "subnet-xxxxxxxxxxxxxxxxxx"\nkey_pair_name = "xxxxxxxx"\nassign_public_ip = true\nuse_public_ip = true\nsecurity_group_ids = [\n "sg-xxxxxxxxxxxxxxxxxx",\n "sg-xxxxxxxxxxxxxxxxxx"\n]\n\n##\n\n[[build]]\nname = "test_logger"\ndescription = "Logs randomly at INFO, WARN, ERROR levels to test logging setups"\ntags = ["test"]\n[build.config]\nbuilder_id = "builder-01"\nrepo = "mbecker20/test_logger"\nbranch = "master"\ngit_account = "mbecker20"\nimage_registry.type = "Standard"\nimage_registry.params.domain = "github.com" # or your custom domain\nimage_registry.params.account = "your_username"\nimage_registry.params.organization = "your_organization" # optinoal\n# Set docker labels\nlabels = """\norg.opencontainers.image.source = https://github.com/mbecker20/test_logger\norg.opencontainers.image.description = Logs randomly at INFO, WARN, ERROR levels to test logging setups\norg.opencontainers.image.licenses = GPL-3.0\n"""\n'})}),"\n",(0,o.jsx)(n.h3,{id:"deployments",children:"Deployments"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"https://docs.rs/komodo_client/latest/komodo_client/entities/deployment/struct.DeploymentConfig.html",children:"Deployment config schema"})}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-toml",children:'# Declare variables\n[[variable]]\nname = "OTLP_ENDPOINT"\nvalue = "http://localhost:4317"\n\n##\n\n[[deployment]] # Declare a deployment\nname = "test-logger-01"\ndescription = "test logger deployment 1"\ntags = ["test"]\n# sync will deploy the container:\n# - if it is not running.\n# - has relevant config updates.\n# - the attached build has new version.\ndeploy = true\n[deployment.config]\nserver_id = "server-01"\nimage.type = "Build"\nimage.params.build = "test_logger"\n# set the volumes / bind mounts\nvolumes = """\n# Supports comments\n/data/logs = /etc/logs\n# And other formats (eg yaml list)\n- "/data/config:/etc/config"\n"""\n# Set the environment variables\nenvironment = """\n# Comments supported\nOTLP_ENDPOINT = [[OTLP_ENDPOINT]] # interpolate variables into the envs.\nVARIABLE_1 = value_1\nVARIABLE_2 = value_2\n"""\n# Set Docker labels\nlabels = "deployment.type = logger"\n\n##\n\n[[deployment]]\nname = "test-logger-02"\ndescription = "test logger deployment 2"\ntags = ["test"]\ndeploy = true\n# Create a dependency on test-logger-01. This deployment will only be deployed after test-logger-01 is deployed.\n# Additionally, any sync deploy of test-logger-01 will also trigger sync deploy of this deployment.\nafter = ["test-logger-01"]\n[deployment.config]\nserver_id = "server-01"\nimage.type = "Build"\nimage.params.build = "test_logger"\nvolumes = """\n/data/logs = /etc/logs\n/data/config = /etc/config"""\nenvironment = """\nVARIABLE_1 = value_1\nVARIABLE_2 = value_2\n"""\n# Set Docker labels\nlabels = "deployment.type = logger"\n'})}),"\n",(0,o.jsx)(n.h3,{id:"stack",children:"Stack"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"https://docs.rs/komodo_client/latest/komodo_client/entities/stack/struct.StackConfig.html",children:"Stack config schema"})}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-toml",children:'[[stack]]\nname = "test-stack"\ndescription = "stack test"\ndeploy = true\nafter = ["test-logger-01"] # Stacks can depend on deployments, and vice versa.\ntags = ["test"]\n[stack.config]\nserver_id = "server-prod"\nfile_paths = ["mongo.yaml", "redis.yaml"]\ngit_provider = "git.mogh.tech"\ngit_account = "mbecker20" # clone private repo by specifying account\nrepo = "mbecker20/stack_test"\n'})}),"\n",(0,o.jsx)(n.h3,{id:"procedure",children:"Procedure"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"https://docs.rs/komodo_client/latest/komodo_client/entities/procedure/struct.ProcedureConfig.html",children:"Procedure config schema"})}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-toml",children:'[[procedure]]\nname = "test-procedure"\ndescription = "Do some things in a specific order"\ntags = ["test"]\n\n[[procedure.config.stage]]\nname = "Build stuff"\nexecutions = [\n { execution.type = "RunBuild", execution.params.build = "test_logger" },\n # Uses the Batch version, witch matches many builds by pattern\n # This one matches all builds prefixed with `foo-` (wildcard) and `bar-` (regex).\n { execution.type = "BatchRunBuild", execution.params.pattern = "foo-* , \\\\^bar-.*$\\\\" },\n { execution.type = "PullRepo", execution.params.repo = "komodo-periphery" },\n]\n\n[[procedure.config.stage]]\nname = "Deploy test logger 1"\nexecutions = [\n { execution.type = "Deploy", execution.params.deployment = "test-logger-01" },\n { execution.type = "Deploy", execution.params.deployment = "test-logger-03", enabled = false },\n]\n\n[[procedure.config.stage]]\nname = "Deploy test logger 2"\nenabled = false\nexecutions = [\n { execution.type = "Deploy", execution.params.deployment = "test-logger-02" }\n]\n'})}),"\n",(0,o.jsx)(n.h3,{id:"repo",children:"Repo"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"https://docs.rs/komodo_client/latest/komodo_client/entities/repo/struct.RepoConfig.html",children:"Repo config schema"})}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-toml",children:'[[repo]]\nname = "komodo-periphery"\ndescription = "Builds new versions of the periphery binary. Requires Rust installed on the host."\ntags = ["komodo"]\n[repo.config]\nserver_id = "server-01"\ngit_provider = "git.mogh.tech" # use an alternate git provider (default is github.com)\ngit_account = "mbecker20"\nrepo = "moghtech/komodo"\n# Run an action after the repo is pulled\non_pull.path = "."\non_pull.command = """\n# Supports comments\n/root/.cargo/bin/cargo build -p komodo_periphery --release\n# Multiple lines will be combined together using \'&&\'\ncp ./target/release/periphery /root/periphery\n"""\n'})}),"\n",(0,o.jsx)(n.h3,{id:"resource-sync",children:"Resource sync"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"https://docs.rs/komodo_client/latest/komodo_client/entities/sync/type.ResourceSync.html",children:"Resource sync config schema"})}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-toml",children:'[[resource_sync]]\nname = "resource-sync"\n[resource_sync.config]\ngit_provider = "git.mogh.tech" # use an alternate git provider (default is github.com)\ngit_account = "mbecker20"\nrepo = "moghtech/komodo"\nresource_path = ["stacks.toml", "repos.toml"]\n'})}),"\n",(0,o.jsx)(n.h3,{id:"user-group",children:"User Group:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"https://docs.rs/komodo_client/latest/komodo_client/entities/toml/struct.UserGroupToml.html",children:"UserGroup schema"})}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-toml",children:'[[user_group]]\nname = "groupo"\neveryone = false # Set to true to give these permission to all users.\nusers = ["mbecker20", "karamvirsingh98"]\n# Configure write access with all specific permissions\nall.Server = { level = "Write", specific = ["Attach", "Logs", "Inspect", "Terminal", "Processes"] }\n# Attach base level of Execute on all builds\nall.Build = "Execute"\n# Allow users to see all Builders, and attach builds to them.\nall.Builder = { level = "Read", specific = ["Attach"] }\npermissions = [\n # Attach permissions to specific resources by name\n { target.type = "Repo", target.id = "komodo-periphery", level = "Execute" },\n # Attach permissions to many resources with name matching regex (this uses \'^(.+)-(.+)$\' as regex expression)\n { target.type = "Server", target.id = "\\\\^(.+)-(.+)$\\\\", level = "Read" },\n { target.type = "Deployment", target.id = "\\\\^immich\\\\", level = "Execute" },\n]\n'})})]})}function u(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>l});var s=t(6540);const o={},r=s.createContext(o);function i(e){const n=s.useContext(r);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(o):e.components||o:i(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/6aab5236.1d0d71d8.js b/assets/js/6aab5236.1d0d71d8.js
deleted file mode 100644
index 2afaa8a17..000000000
--- a/assets/js/6aab5236.1d0d71d8.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[663],{535:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>i,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"version-upgrades","title":"Version Upgrades","description":"Most version upgrades only require a redeployment of the Core container after pulling the latest version, and are fully backward compatible with the periphery clients, which may be updated later on as convenient. This is the default, and will be the case unless specifically mentioned in the version release notes.","source":"@site/docs/version-upgrades.md","sourceDirName":".","slug":"/version-upgrades","permalink":"/docs/version-upgrades","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/version-upgrades.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Configuring Webhooks","permalink":"/docs/webhooks"},"next":{"title":"API and Clients","permalink":"/docs/api"}}');var r=t(4848),o=t(8453);const i={},a="Version Upgrades",c={},d=[];function l(e){const n={a:"a",h1:"h1",header:"header",p:"p",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"version-upgrades",children:"Version Upgrades"})}),"\n",(0,r.jsxs)(n.p,{children:["Most version upgrades only require a redeployment of the Core container after pulling the latest version, and are fully backward compatible with the periphery clients, which may be updated later on as convenient. This is the default, and will be the case unless specifically mentioned in the ",(0,r.jsx)(n.a,{href:"https://github.com/moghtech/komodo/releases",children:"version release notes"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"Some Core API upgrades may change behavior such as building / cloning, and require updating the Periphery binaries to match the Core version before this functionality can be restored. This will be specifically mentioned in the release notes."})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>a});var s=t(6540);const r={},o=s.createContext(r);function i(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/6f5dae22.71b315c2.js b/assets/js/6f5dae22.71b315c2.js
new file mode 100644
index 000000000..e897bee7f
--- /dev/null
+++ b/assets/js/6f5dae22.71b315c2.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[326],{3021:(e,t,n)=>{n.d(t,{A:()=>A});var r=n(6540),s=n(4164),i=n(6972),o=n(8774),c=n(4586);const a=["zero","one","two","few","many","other"];function l(e){return a.filter(t=>e.includes(t))}const u={locale:"en",pluralForms:l(["one","other"]),select:e=>1===e?"one":"other"};function d(){const{i18n:{currentLocale:e}}=(0,c.A)();return(0,r.useMemo)(()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:l(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),u}},[e])}function m(){const e=d();return{selectMessage:(t,n)=>function(e,t,n){const r=e.split("|");if(1===r.length)return r[0];r.length>n.pluralForms.length&&console.error(`For locale=${n.locale}, a maximum of ${n.pluralForms.length} plural forms are expected (${n.pluralForms.join(",")}), but the message contains ${r.length}: ${e}`);const s=n.select(t),i=n.pluralForms.indexOf(s);return r[Math.min(i,r.length-1)]}(n,t,e)}}var h=n(6654),g=n(1312),f=n(1107);const p={cardContainer:"cardContainer_fWXF",cardTitle:"cardTitle_rnsV",cardDescription:"cardDescription_PWke"};var x=n(4848);function b({className:e,href:t,children:n}){return(0,x.jsx)(o.A,{href:t,className:(0,s.A)("card padding--lg",p.cardContainer,e),children:n})}function j({className:e,href:t,icon:n,title:r,description:i}){return(0,x.jsxs)(b,{href:t,className:e,children:[(0,x.jsxs)(f.A,{as:"h2",className:(0,s.A)("text--truncate",p.cardTitle),title:r,children:[n," ",r]}),i&&(0,x.jsx)("p",{className:(0,s.A)("text--truncate",p.cardDescription),title:i,children:i})]})}function N({item:e}){const t=(0,i.Nr)(e),n=function(){const{selectMessage:e}=m();return t=>e(t,(0,g.T)({message:"1 item|{count} items",id:"theme.docs.DocCard.categoryDescription.plurals",description:"The default description for a category card in the generated index about how many items this category includes"},{count:t}))}();return t?(0,x.jsx)(j,{className:e.className,href:t,icon:"\ud83d\uddc3\ufe0f",title:e.label,description:e.description??n(e.items.length)}):null}function k({item:e}){const t=(0,h.A)(e.href)?"\ud83d\udcc4\ufe0f":"\ud83d\udd17",n=(0,i.cC)(e.docId??void 0);return(0,x.jsx)(j,{className:e.className,href:e.href,icon:t,title:e.label,description:e.description??n?.description})}function y({item:e}){switch(e.type){case"link":return(0,x.jsx)(k,{item:e});case"category":return(0,x.jsx)(N,{item:e});default:throw new Error(`unknown item type ${JSON.stringify(e)}`)}}const C={docCardListItem:"docCardListItem_W1sv"};function v({className:e}){const t=(0,i.a4)();return(0,x.jsx)(A,{items:t,className:e})}function w({item:e}){return(0,x.jsx)("article",{className:(0,s.A)(C.docCardListItem,"col col--6"),children:(0,x.jsx)(y,{item:e})})}function A(e){const{items:t,className:n}=e;if(!t)return(0,x.jsx)(v,{...e});const r=(0,i.d1)(t);return(0,x.jsx)("section",{className:(0,s.A)("row",n),children:r.map((e,t)=>(0,x.jsx)(w,{item:e},t))})}},5748:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>m,frontMatter:()=>c,metadata:()=>r,toc:()=>u});const r=JSON.parse('{"id":"resources/build-images/index","title":"Building Images","description":"Komodo builds docker images by cloning the source repository from the configured git provider, running docker build,","source":"@site/docs/resources/build-images/index.mdx","sourceDirName":"resources/build-images","slug":"/build-images","permalink":"/docs/build-images","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/resources/build-images/index.mdx","tags":[],"version":"current","frontMatter":{"slug":"/build-images"},"sidebar":"docs","previous":{"title":"Resources","permalink":"/docs/resources/"},"next":{"title":"Configuration","permalink":"/docs/resources/build-images/configuration"}}');var s=n(4848),i=n(8453),o=n(3021);const c={slug:"/build-images"},a="Building Images",l={},u=[];function d(e){const t={code:"code",h1:"h1",header:"header",p:"p",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"building-images",children:"Building Images"})}),"\n",(0,s.jsxs)(t.p,{children:["Komodo builds docker images by cloning the source repository from the configured git provider, running ",(0,s.jsx)(t.code,{children:"docker build"}),",\nand pushing the resulting image to the configured docker registry. Any repo containing a ",(0,s.jsx)(t.code,{children:"Dockerfile"})," is buildable using this method."]}),"\n","\n",(0,s.jsx)(o.A,{})]})}function m(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>c});var r=n(6540);const s={},i=r.createContext(s);function o(e){const t=r.useContext(i);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(s):e.components||s:o(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/71bdbf70.15cfdf7d.js b/assets/js/71bdbf70.15cfdf7d.js
new file mode 100644
index 000000000..203c37f3a
--- /dev/null
+++ b/assets/js/71bdbf70.15cfdf7d.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[464],{185:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>p,frontMatter:()=>r,metadata:()=>o,toc:()=>l});const o=JSON.parse('{"id":"resources/deploy-containers/lifetime-management","title":"Container Management","description":"The lifetime of a docker container is more like a virtual machine. They can be created, started, stopped, and destroyed. Komodo will display the state of the container and provides an API to manage all your container\'s lifetimes.","source":"@site/docs/resources/deploy-containers/lifetime-management.md","sourceDirName":"resources/deploy-containers","slug":"/resources/deploy-containers/lifetime-management","permalink":"/docs/resources/deploy-containers/lifetime-management","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/resources/deploy-containers/lifetime-management.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Configuration","permalink":"/docs/resources/deploy-containers/configuration"},"next":{"title":"Docker Compose","permalink":"/docs/resources/docker-compose"}}');var i=n(4848),a=n(8453);const r={},s="Container Management",c={},l=[{value:"Stopping a Container",id:"stopping-a-container",level:3},{value:"Container Redeploy",id:"container-redeploy",level:3}];function d(e){const t={em:"em",h1:"h1",h3:"h3",header:"header",p:"p",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"container-management",children:"Container Management"})}),"\n",(0,i.jsx)(t.p,{children:"The lifetime of a docker container is more like a virtual machine. They can be created, started, stopped, and destroyed. Komodo will display the state of the container and provides an API to manage all your container's lifetimes."}),"\n",(0,i.jsx)(t.p,{children:"This is achieved internally by running the appropriate docker command for the requested action (docker stop, docker start, etc)."}),"\n",(0,i.jsx)(t.h3,{id:"stopping-a-container",children:"Stopping a Container"}),"\n",(0,i.jsxs)(t.p,{children:["Sometimes you want to stop a running application but preserve its logs and configuration, either to be restarted later or to view the logs at a later time. It is more like ",(0,i.jsx)(t.em,{children:"pausing"})," the application with its current config, as no configuration (like environment variable, volume mounts, etc.) will be changed when the container is started again."]}),"\n",(0,i.jsxs)(t.p,{children:["Note that in order to restart an application with updated configuration, it must be ",(0,i.jsx)(t.em,{children:"redeployed"}),". stopping and starting a container again will keep all configuration as it was when the container was initially created."]}),"\n",(0,i.jsx)(t.h3,{id:"container-redeploy",children:"Container Redeploy"}),"\n",(0,i.jsx)(t.p,{children:"Redeploying is the action of destroying a container and recreating it. If you update deployment config, these changes will not take effect until the container is redeployed. Just note this will destroy the previous containers logs along with the container itself."})]})}function p(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>s});var o=n(6540);const i={},a=o.createContext(i);function r(e){const t=o.useContext(a);return o.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),o.createElement(a.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/75245258.ce7ddfc0.js b/assets/js/75245258.ce7ddfc0.js
deleted file mode 100644
index 6073d98f8..000000000
--- a/assets/js/75245258.ce7ddfc0.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[531],{2087:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>m,frontMatter:()=>i,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"deploy-containers/index","title":"Deploy Containers","description":"Komodo can deploy any docker images that it can access with the configured docker accounts.","source":"@site/docs/deploy-containers/index.mdx","sourceDirName":"deploy-containers","slug":"/deploy-containers/","permalink":"/docs/deploy-containers/","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/deploy-containers/index.mdx","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Image Versioning","permalink":"/docs/build-images/versioning"},"next":{"title":"Configuration","permalink":"/docs/deploy-containers/configuration"}}');var r=n(4848),s=n(8453),c=n(7473);const i={},a="Deploy Containers",l={},d=[];function u(e){const t={code:"code",h1:"h1",header:"header",p:"p",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"deploy-containers",children:"Deploy Containers"})}),"\n",(0,r.jsxs)(t.p,{children:["Komodo can deploy any docker images that it can access with the configured docker accounts.\nIt works by parsing the deployment configuration into a ",(0,r.jsx)(t.code,{children:"docker run"})," command, which is then run on the target system.\nThe configuration is stored on MongoDB, and records of all actions (update config, deploy, stop, etc.) are stored as well."]}),"\n","\n",(0,r.jsx)(c.A,{})]})}function m(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},7473:(e,t,n)=>{n.d(t,{A:()=>v});var o=n(6540),r=n(4164),s=n(3751),c=n(6289),i=n(797);const a=["zero","one","two","few","many","other"];function l(e){return a.filter((t=>e.includes(t)))}const d={locale:"en",pluralForms:l(["one","other"]),select:e=>1===e?"one":"other"};function u(){const{i18n:{currentLocale:e}}=(0,i.A)();return(0,o.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:l(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),d}}),[e])}function m(){const e=u();return{selectMessage:(t,n)=>function(e,t,n){const o=e.split("|");if(1===o.length)return o[0];o.length>n.pluralForms.length&&console.error(`For locale=${n.locale}, a maximum of ${n.pluralForms.length} plural forms are expected (${n.pluralForms.join(",")}), but the message contains ${o.length}: ${e}`);const r=n.select(t),s=n.pluralForms.indexOf(r);return o[Math.min(s,o.length-1)]}(n,t,e)}}var p=n(2887),h=n(539),f=n(9303);const g={cardContainer:"cardContainer_fWXF",cardTitle:"cardTitle_rnsV",cardDescription:"cardDescription_PWke"};var x=n(4848);function y(e){let{href:t,children:n}=e;return(0,x.jsx)(c.A,{href:t,className:(0,r.A)("card padding--lg",g.cardContainer),children:n})}function j(e){let{href:t,icon:n,title:o,description:s}=e;return(0,x.jsxs)(y,{href:t,children:[(0,x.jsxs)(f.A,{as:"h2",className:(0,r.A)("text--truncate",g.cardTitle),title:o,children:[n," ",o]}),s&&(0,x.jsx)("p",{className:(0,r.A)("text--truncate",g.cardDescription),title:s,children:s})]})}function k(e){let{item:t}=e;const n=(0,s.Nr)(t),o=function(){const{selectMessage:e}=m();return t=>e(t,(0,h.T)({message:"1 item|{count} items",id:"theme.docs.DocCard.categoryDescription.plurals",description:"The default description for a category card in the generated index about how many items this category includes"},{count:t}))}();return n?(0,x.jsx)(j,{href:n,icon:"\ud83d\uddc3\ufe0f",title:t.label,description:t.description??o(t.items.length)}):null}function w(e){let{item:t}=e;const n=(0,p.A)(t.href)?"\ud83d\udcc4\ufe0f":"\ud83d\udd17",o=(0,s.cC)(t.docId??void 0);return(0,x.jsx)(j,{href:t.href,icon:n,title:t.label,description:t.description??o?.description})}function C(e){let{item:t}=e;switch(t.type){case"link":return(0,x.jsx)(w,{item:t});case"category":return(0,x.jsx)(k,{item:t});default:throw new Error(`unknown item type ${JSON.stringify(t)}`)}}function b(e){let{className:t}=e;const n=(0,s.$S)();return(0,x.jsx)(v,{items:n.items,className:t})}function v(e){const{items:t,className:n}=e;if(!t)return(0,x.jsx)(b,{...e});const o=(0,s.d1)(t);return(0,x.jsx)("section",{className:(0,r.A)("row",n),children:o.map(((e,t)=>(0,x.jsx)("article",{className:"col col--6 margin-bottom--lg",children:(0,x.jsx)(C,{item:e})},t)))})}},8453:(e,t,n)=>{n.d(t,{R:()=>c,x:()=>i});var o=n(6540);const r={},s=o.createContext(r);function c(e){const t=o.useContext(s);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:c(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/790a1910.e617f9f2.js b/assets/js/790a1910.e617f9f2.js
new file mode 100644
index 000000000..9d60df9f1
--- /dev/null
+++ b/assets/js/790a1910.e617f9f2.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[339],{4191:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>r,contentTitle:()=>a,default:()=>p,frontMatter:()=>i,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"ecosystem/api","title":"API and Clients","description":"Komodo Core exposes an RPC-like HTTP API to read data, write configuration, and execute actions.","source":"@site/docs/ecosystem/api.md","sourceDirName":"ecosystem","slug":"/ecosystem/api","permalink":"/docs/ecosystem/api","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/ecosystem/api.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Komodo CLI","permalink":"/docs/ecosystem/cli"},"next":{"title":"Community","permalink":"/docs/ecosystem/community"}}');var o=n(4848),c=n(8453);const i={},a="API and Clients",r={},d=[{value:"Rust Client",id:"rust-client",level:2},{value:"Typescript Client",id:"typescript-client",level:2}];function l(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",strong:"strong",...(0,c.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"api-and-clients",children:"API and Clients"})}),"\n",(0,o.jsxs)(t.p,{children:["Komodo Core exposes an RPC-like HTTP API to read data, write configuration, and execute actions.\nThere are typesafe clients available in\n",(0,o.jsx)(t.a,{href:"/docs/ecosystem/api#rust-client",children:(0,o.jsx)(t.strong,{children:"Rust"})})," and ",(0,o.jsx)(t.a,{href:"/docs/ecosystem/api#typescript-client",children:(0,o.jsx)(t.strong,{children:"Typescript"})}),"."]}),"\n",(0,o.jsxs)(t.p,{children:["The full API documentation is ",(0,o.jsx)(t.a,{href:"https://docs.rs/komodo_client/latest/komodo_client/api/index.html",children:(0,o.jsx)(t.strong,{children:"available here"})}),"."]}),"\n",(0,o.jsx)(t.h2,{id:"rust-client",children:"Rust Client"}),"\n",(0,o.jsxs)(t.p,{children:["The Rust client is published to crates.io at ",(0,o.jsx)(t.a,{href:"https://crates.io/crates/komodo_client",children:"komodo_client"}),"."]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-rust",children:'let komodo = KomodoClient::new("https://demo.komo.do", "your_key", "your_secret")\n .with_healthcheck()\n .await?;\n\nlet stacks = komodo.read(ListStacks::default()).await?;\n\nlet update = komodo\n .execute(DeployStack {\n stack: stacks[0].name.clone(),\n stop_time: None\n })\n .await?;\n'})}),"\n",(0,o.jsx)(t.h2,{id:"typescript-client",children:"Typescript Client"}),"\n",(0,o.jsxs)(t.p,{children:["The Typescript client is published to NPM at ",(0,o.jsx)(t.a,{href:"https://www.npmjs.com/package/komodo_client",children:"komodo_client"}),"."]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-ts",children:'import { KomodoClient, Types } from "komodo_client";\n\nconst komodo = KomodoClient("https://demo.komo.do", {\n type: "api-key",\n params: {\n key: "your_key",\n secret: "your secret",\n },\n});\n\n// Inferred as Types.StackListItem[]\nconst stacks = await komodo.read("ListStacks", {});\n\n// Inferred as Types.Update\nconst update = await komodo.execute("DeployStack", {\n stack: stacks[0].name,\n});\n'})})]})}function p(e={}){const{wrapper:t}={...(0,c.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>a});var s=n(6540);const o={},c=s.createContext(o);function i(e){const t=s.useContext(c);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(o):e.components||o:i(e.components),s.createElement(c.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/79c522c5.6be6dc40.js b/assets/js/79c522c5.6be6dc40.js
deleted file mode 100644
index e8fc02888..000000000
--- a/assets/js/79c522c5.6be6dc40.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[943],{3691:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>i,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"procedures","title":"Procedures and Actions","description":"For orchestrations involving multiple Resources, Komodo offers the Procedure and Action resource types.","source":"@site/docs/procedures.md","sourceDirName":".","slug":"/procedures","permalink":"/docs/procedures","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/procedures.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Variables and Secrets","permalink":"/docs/variables"},"next":{"title":"Permissioning","permalink":"/docs/permissioning"}}');var t=o(4848),c=o(8453);const r={},a="Procedures and Actions",i={},d=[{value:"Procedures",id:"procedures",level:2},{value:"Batch Executions",id:"batch-executions",level:3},{value:"TOML Example",id:"toml-example",level:3},{value:"Actions",id:"actions",level:2}];function l(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",strong:"strong",...(0,c.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"procedures-and-actions",children:"Procedures and Actions"})}),"\n",(0,t.jsxs)(n.p,{children:["For orchestrations involving multiple Resources, Komodo offers the ",(0,t.jsx)(n.code,{children:"Procedure"})," and ",(0,t.jsx)(n.code,{children:"Action"})," resource types."]}),"\n",(0,t.jsx)(n.h2,{id:"procedures",children:"Procedures"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"Procedures"})," are compositions of many executions, such as ",(0,t.jsx)(n.code,{children:"RunBuild"})," and ",(0,t.jsx)(n.code,{children:"DeployStack"}),".\nThe executions are grouped into a series of ",(0,t.jsx)(n.code,{children:"Stages"}),", where each ",(0,t.jsx)(n.code,{children:"Stage"})," contains one or more executions\nto run ",(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.em,{children:"all at once"})}),". The Procedure will wait until all of the executions in a ",(0,t.jsx)(n.code,{children:"Stage"})," are complete before moving\non to the next stage. In short, the executions in a ",(0,t.jsx)(n.code,{children:"Stage"})," are run ",(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.em,{children:"in parallel"})}),", and the stages themselves are\nexecuted ",(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.em,{children:"sequentially"})}),"."]}),"\n",(0,t.jsx)(n.h3,{id:"batch-executions",children:"Batch Executions"}),"\n",(0,t.jsxs)(n.p,{children:["Many executions have a ",(0,t.jsx)(n.code,{children:"Batch"})," version you can select, for example ",(0,t.jsx)(n.a,{href:"https://docs.rs/komodo_client/latest/komodo_client/api/execute/struct.BatchDeployStackIfChanged.html",children:(0,t.jsx)(n.strong,{children:"BatchDeployStackIfChanged"})}),". With this, you can match multiple Stacks by name\nusing ",(0,t.jsx)(n.a,{href:"https://docs.rs/wildcard/latest/wildcard",children:(0,t.jsx)(n.strong,{children:"wildcard syntax"})})," and ",(0,t.jsx)(n.a,{href:"https://docs.rs/regex/latest/regex",children:(0,t.jsx)(n.strong,{children:"regex"})}),"."]}),"\n",(0,t.jsx)(n.h3,{id:"toml-example",children:"TOML Example"}),"\n",(0,t.jsxs)(n.p,{children:["Like all Resources, ",(0,t.jsx)(n.code,{children:"Procedures"})," have a TOML representation, and can be managed in ",(0,t.jsx)(n.code,{children:"ResourceSyncs"}),"."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-toml",children:'[[procedure]]\nname = "pull-deploy"\ndescription = "Pulls stack-repo, deploys stacks"\n\n[[procedure.config.stage]]\nname = "Pull Repo"\nexecutions = [\n { execution.type = "PullRepo", execution.params.pattern = "stack-repo" },\n]\n\n[[procedure.config.stage]]\nname = "Deploy if changed"\nexecutions = [\n # Uses the Batch version, witch matches many stacks by pattern\n # This one matches all stacks prefixed with `foo-` (wildcard) and `bar-` (regex).\n { execution.type = "BatchDeployStackIfChanged", execution.params.pattern = "foo-* , \\\\^bar-.*$\\\\" },\n]\n'})}),"\n",(0,t.jsx)(n.h2,{id:"actions",children:"Actions"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"Actions"})," give users the power of Typescript to write calls to the Komodo API."]}),"\n",(0,t.jsxs)(n.p,{children:["For example, an ",(0,t.jsx)(n.code,{children:"Action"})," script like this will align the versions and branches of many ",(0,t.jsx)(n.code,{children:"Builds"}),"."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-ts",children:'const VERSION = "1.16.5";\nconst BRANCH = "dev/" + VERSION;\nconst APPS = ["core", "periphery"];\nconst ARCHS = ["x86", "aarch64"];\n\nawait komodo.write("UpdateVariableValue", {\n name: "KOMODO_DEV_VERSION",\n value: VERSION,\n});\nconsole.log("Updated KOMODO_DEV_VERSION to " + VERSION);\n\nfor (const app of APPS) {\n for (const arch of ARCHS) {\n const name = `komodo-${app}-${arch}-dev`;\n await komodo.write("UpdateBuild", {\n id: name,\n config: {\n version: VERSION as any,\n branch: BRANCH,\n },\n });\n console.log(\n `Updated Build ${name} to version ${VERSION} and branch ${BRANCH}`,\n );\n }\n}\n\nfor (const arch of ARCHS) {\n const name = `periphery-bin-${arch}-dev`;\n await komodo.write("UpdateRepo", {\n id: name,\n config: {\n branch: BRANCH,\n },\n });\n console.log(`Updated Repo ${name} to branch ${BRANCH}`);\n}\n'})})]})}function h(e={}){const{wrapper:n}={...(0,c.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>r,x:()=>a});var s=o(6540);const t={},c=s.createContext(t);function r(e){const n=s.useContext(c);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(c.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/8a531d56.2fb05e93.js b/assets/js/8a531d56.2fb05e93.js
new file mode 100644
index 000000000..a4ba3043d
--- /dev/null
+++ b/assets/js/8a531d56.2fb05e93.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[296],{3021:(e,t,n)=>{n.d(t,{A:()=>A});var r=n(6540),o=n(4164),s=n(6972),c=n(8774),i=n(4586);const a=["zero","one","two","few","many","other"];function l(e){return a.filter(t=>e.includes(t))}const d={locale:"en",pluralForms:l(["one","other"]),select:e=>1===e?"one":"other"};function u(){const{i18n:{currentLocale:e}}=(0,i.A)();return(0,r.useMemo)(()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:l(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),d}},[e])}function m(){const e=u();return{selectMessage:(t,n)=>function(e,t,n){const r=e.split("|");if(1===r.length)return r[0];r.length>n.pluralForms.length&&console.error(`For locale=${n.locale}, a maximum of ${n.pluralForms.length} plural forms are expected (${n.pluralForms.join(",")}), but the message contains ${r.length}: ${e}`);const o=n.select(t),s=n.pluralForms.indexOf(o);return r[Math.min(s,r.length-1)]}(n,t,e)}}var p=n(6654),h=n(1312),f=n(1107);const g={cardContainer:"cardContainer_fWXF",cardTitle:"cardTitle_rnsV",cardDescription:"cardDescription_PWke"};var x=n(4848);function y({className:e,href:t,children:n}){return(0,x.jsx)(c.A,{href:t,className:(0,o.A)("card padding--lg",g.cardContainer,e),children:n})}function j({className:e,href:t,icon:n,title:r,description:s}){return(0,x.jsxs)(y,{href:t,className:e,children:[(0,x.jsxs)(f.A,{as:"h2",className:(0,o.A)("text--truncate",g.cardTitle),title:r,children:[n," ",r]}),s&&(0,x.jsx)("p",{className:(0,o.A)("text--truncate",g.cardDescription),title:s,children:s})]})}function N({item:e}){const t=(0,s.Nr)(e),n=function(){const{selectMessage:e}=m();return t=>e(t,(0,h.T)({message:"1 item|{count} items",id:"theme.docs.DocCard.categoryDescription.plurals",description:"The default description for a category card in the generated index about how many items this category includes"},{count:t}))}();return t?(0,x.jsx)(j,{className:e.className,href:t,icon:"\ud83d\uddc3\ufe0f",title:e.label,description:e.description??n(e.items.length)}):null}function k({item:e}){const t=(0,p.A)(e.href)?"\ud83d\udcc4\ufe0f":"\ud83d\udd17",n=(0,s.cC)(e.docId??void 0);return(0,x.jsx)(j,{className:e.className,href:e.href,icon:t,title:e.label,description:e.description??n?.description})}function w({item:e}){switch(e.type){case"link":return(0,x.jsx)(k,{item:e});case"category":return(0,x.jsx)(N,{item:e});default:throw new Error(`unknown item type ${JSON.stringify(e)}`)}}const C={docCardListItem:"docCardListItem_W1sv"};function v({className:e}){const t=(0,s.a4)();return(0,x.jsx)(A,{items:t,className:e})}function b({item:e}){return(0,x.jsx)("article",{className:(0,o.A)(C.docCardListItem,"col col--6"),children:(0,x.jsx)(w,{item:e})})}function A(e){const{items:t,className:n}=e;if(!t)return(0,x.jsx)(v,{...e});const r=(0,s.d1)(t);return(0,x.jsx)("section",{className:(0,o.A)("row",n),children:r.map((e,t)=>(0,x.jsx)(b,{item:e},t))})}},6396:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>m,frontMatter:()=>i,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"resources/deploy-containers/index","title":"Deploy Containers","description":"Komodo can deploy any docker images that it can access with the configured docker accounts.","source":"@site/docs/resources/deploy-containers/index.mdx","sourceDirName":"resources/deploy-containers","slug":"/resources/deploy-containers/","permalink":"/docs/resources/deploy-containers/","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/resources/deploy-containers/index.mdx","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Image Versioning","permalink":"/docs/resources/build-images/versioning"},"next":{"title":"Configuration","permalink":"/docs/resources/deploy-containers/configuration"}}');var o=n(4848),s=n(8453),c=n(3021);const i={},a="Deploy Containers",l={},d=[];function u(e){const t={code:"code",h1:"h1",header:"header",p:"p",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"deploy-containers",children:"Deploy Containers"})}),"\n",(0,o.jsxs)(t.p,{children:["Komodo can deploy any docker images that it can access with the configured docker accounts.\nIt works by parsing the deployment configuration into a ",(0,o.jsx)(t.code,{children:"docker run"})," command, which is then run on the target system.\nThe configuration is stored on MongoDB, and records of all actions (update config, deploy, stop, etc.) are stored as well."]}),"\n","\n",(0,o.jsx)(c.A,{})]})}function m(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>c,x:()=>i});var r=n(6540);const o={},s=r.createContext(o);function c(e){const t=r.useContext(s);return r.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(o):e.components||o:c(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/8b13a4b4.02e69508.js b/assets/js/8b13a4b4.02e69508.js
deleted file mode 100644
index 00e1bb184..000000000
--- a/assets/js/8b13a4b4.02e69508.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[848],{7473:(e,t,n)=>{n.d(t,{A:()=>C});var r=n(6540),i=n(4164),o=n(3751),s=n(6289),c=n(797);const l=["zero","one","two","few","many","other"];function a(e){return l.filter((t=>e.includes(t)))}const u={locale:"en",pluralForms:a(["one","other"]),select:e=>1===e?"one":"other"};function d(){const{i18n:{currentLocale:e}}=(0,c.A)();return(0,r.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:a(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),u}}),[e])}function m(){const e=d();return{selectMessage:(t,n)=>function(e,t,n){const r=e.split("|");if(1===r.length)return r[0];r.length>n.pluralForms.length&&console.error(`For locale=${n.locale}, a maximum of ${n.pluralForms.length} plural forms are expected (${n.pluralForms.join(",")}), but the message contains ${r.length}: ${e}`);const i=n.select(t),o=n.pluralForms.indexOf(i);return r[Math.min(o,r.length-1)]}(n,t,e)}}var h=n(2887),g=n(539),f=n(9303);const p={cardContainer:"cardContainer_fWXF",cardTitle:"cardTitle_rnsV",cardDescription:"cardDescription_PWke"};var x=n(4848);function b(e){let{href:t,children:n}=e;return(0,x.jsx)(s.A,{href:t,className:(0,i.A)("card padding--lg",p.cardContainer),children:n})}function j(e){let{href:t,icon:n,title:r,description:o}=e;return(0,x.jsxs)(b,{href:t,children:[(0,x.jsxs)(f.A,{as:"h2",className:(0,i.A)("text--truncate",p.cardTitle),title:r,children:[n," ",r]}),o&&(0,x.jsx)("p",{className:(0,i.A)("text--truncate",p.cardDescription),title:o,children:o})]})}function k(e){let{item:t}=e;const n=(0,o.Nr)(t),r=function(){const{selectMessage:e}=m();return t=>e(t,(0,g.T)({message:"1 item|{count} items",id:"theme.docs.DocCard.categoryDescription.plurals",description:"The default description for a category card in the generated index about how many items this category includes"},{count:t}))}();return n?(0,x.jsx)(j,{href:n,icon:"\ud83d\uddc3\ufe0f",title:t.label,description:t.description??r(t.items.length)}):null}function y(e){let{item:t}=e;const n=(0,h.A)(t.href)?"\ud83d\udcc4\ufe0f":"\ud83d\udd17",r=(0,o.cC)(t.docId??void 0);return(0,x.jsx)(j,{href:t.href,icon:n,title:t.label,description:t.description??r?.description})}function v(e){let{item:t}=e;switch(t.type){case"link":return(0,x.jsx)(y,{item:t});case"category":return(0,x.jsx)(k,{item:t});default:throw new Error(`unknown item type ${JSON.stringify(t)}`)}}function w(e){let{className:t}=e;const n=(0,o.$S)();return(0,x.jsx)(C,{items:n.items,className:t})}function C(e){const{items:t,className:n}=e;if(!t)return(0,x.jsx)(w,{...e});const r=(0,o.d1)(t);return(0,x.jsx)("section",{className:(0,i.A)("row",n),children:r.map(((e,t)=>(0,x.jsx)("article",{className:"col col--6 margin-bottom--lg",children:(0,x.jsx)(v,{item:e})},t)))})}},7786:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>l,default:()=>m,frontMatter:()=>c,metadata:()=>r,toc:()=>u});const r=JSON.parse('{"id":"build-images/index","title":"Building Images","description":"Komodo builds docker images by cloning the source repository from the configured git provider, running docker build,","source":"@site/docs/build-images/index.mdx","sourceDirName":"build-images","slug":"/build-images","permalink":"/docs/build-images","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/build-images/index.mdx","tags":[],"version":"current","frontMatter":{"slug":"/build-images"},"sidebar":"docs","previous":{"title":"Connect More Servers","permalink":"/docs/connect-servers"},"next":{"title":"Configuration","permalink":"/docs/build-images/configuration"}}');var i=n(4848),o=n(8453),s=n(7473);const c={slug:"/build-images"},l="Building Images",a={},u=[];function d(e){const t={code:"code",h1:"h1",header:"header",p:"p",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"building-images",children:"Building Images"})}),"\n",(0,i.jsxs)(t.p,{children:["Komodo builds docker images by cloning the source repository from the configured git provider, running ",(0,i.jsx)(t.code,{children:"docker build"}),",\nand pushing the resulting image to the configured docker registry. Any repo containing a ",(0,i.jsx)(t.code,{children:"Dockerfile"})," is buildable using this method."]}),"\n","\n",(0,i.jsx)(s.A,{})]})}function m(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>c});var r=n(6540);const i={},o=r.createContext(i);function s(e){const t=r.useContext(o);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(i):e.components||i:s(e.components),r.createElement(o.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/8f030830.33a3d5e0.js b/assets/js/8f030830.33a3d5e0.js
deleted file mode 100644
index d24845626..000000000
--- a/assets/js/8f030830.33a3d5e0.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[423],{4952:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>c,contentTitle:()=>t,default:()=>a,frontMatter:()=>d,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"development","title":"Development","description":"If you are looking to contribute to Komodo, this page is a launching point for setting up your Komodo development environment.","source":"@site/docs/development.md","sourceDirName":".","slug":"/development","permalink":"/docs/development","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/development.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"API and Clients","permalink":"/docs/api"},"next":{"title":"Other Resources","permalink":"/docs/other-resources"}}');var o=r(4848),i=r(8453);const d={},t="Development",c={},l=[{value:"Dependencies",id:"dependencies",level:2},{value:"runnables-cli",id:"runnables-cli",level:3},{value:"Docker",id:"docker",level:2},{value:"Devcontainer",id:"devcontainer",level:2},{value:"Local",id:"local",level:2},{value:"Docsite Development",id:"docsite-development",level:2}];function h(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"development",children:"Development"})}),"\n",(0,o.jsx)(n.p,{children:"If you are looking to contribute to Komodo, this page is a launching point for setting up your Komodo development environment."}),"\n",(0,o.jsx)(n.h2,{id:"dependencies",children:"Dependencies"}),"\n",(0,o.jsxs)(n.p,{children:["Running Komodo from ",(0,o.jsx)(n.a,{href:"https://github.com/moghtech/komodo",children:"source"})," requires either ",(0,o.jsx)(n.a,{href:"https://www.docker.com/",children:"Docker"})," (and can use the included ",(0,o.jsx)(n.a,{href:"https://code.visualstudio.com/docs/devcontainers/containers",children:"devcontainer"}),"), or can have the development dependencies installed locally:"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Backend (Core / Periphery APIs)","\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.a,{href:"https://www.rust-lang.org/",children:"Rust"})," stable via ",(0,o.jsx)(n.a,{href:"https://rustup.rs/",children:"rustup installer"})]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.a,{href:"https://www.mongodb.com/",children:"MongoDB"})," or ",(0,o.jsx)(n.a,{href:"https://www.ferretdb.com/",children:"FerretDB"})," available locally."]}),"\n",(0,o.jsxs)(n.li,{children:["On Debian/Ubuntu: ",(0,o.jsx)(n.code,{children:"apt install build-essential pkg-config libssl-dev"})," required to build the rust source."]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["Frontend (Web UI)","\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.a,{href:"https://nodejs.org/en",children:"Node"})," >= 18.18 + NPM","\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.a,{href:"https://yarnpkg.com/",children:"Yarn"})," - (Tip: use ",(0,o.jsx)(n.code,{children:"corepack enable"})," after installing ",(0,o.jsx)(n.code,{children:"node"})," to use ",(0,o.jsx)(n.code,{children:"yarn"}),")"]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"https://github.com/1password/typeshare",children:"typeshare"})}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.a,{href:"https://deno.com/",children:"Deno"})," >= 2.0.2"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"runnables-cli",children:"runnables-cli"}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.a,{href:"https://github.com/mbecker20/runnables-cli",children:"mbecker20/runnables-cli"})," can be used as a convience CLI for running common project tasks found in ",(0,o.jsx)(n.code,{children:"runfile.toml"}),". Otherwise, you can create your own project tasks by references the ",(0,o.jsx)(n.code,{children:"cmd"}),"s found in ",(0,o.jsx)(n.code,{children:"runfile.toml"}),". All instructions below will use runnables-cli v1.3.7+."]}),"\n",(0,o.jsx)(n.h2,{id:"docker",children:"Docker"}),"\n",(0,o.jsxs)(n.p,{children:["After making changes to the project, run ",(0,o.jsx)(n.code,{children:"run -r dev-compose-build"})," to rebuild Komodo and then ",(0,o.jsx)(n.code,{children:"run -r dev-compose-exposed"})," to start a Komodo container with the UI accessible at ",(0,o.jsx)(n.code,{children:"localhost:9120"}),". Any changes made to source files will require re-running the ",(0,o.jsx)(n.code,{children:"dev-compose-build"})," and ",(0,o.jsx)(n.code,{children:"dev-compose-exposed"})," commands."]}),"\n",(0,o.jsx)(n.h2,{id:"devcontainer",children:"Devcontainer"}),"\n",(0,o.jsxs)(n.p,{children:["Use the included ",(0,o.jsx)(n.code,{children:".devcontainer.json"})," with VSCode or other compatible IDE to stand-up a full environment, including database, with one click."]}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.a,{href:"https://code.visualstudio.com/Docs/editor/tasks",children:"VSCode Tasks"})," are provided for building and running Komodo."]}),"\n",(0,o.jsxs)(n.p,{children:["After opening the repository with the devcontainer run the task ",(0,o.jsx)(n.code,{children:"Init"})," to build the frontend/backend. Then, the task ",(0,o.jsx)(n.code,{children:"Run Komodo"})," can be used to run frontend/backend. Other tasks for rebuilding/running just one component of the stack (Core API, Periphery API, Frontend) are also provided."]}),"\n",(0,o.jsx)(n.h2,{id:"local",children:"Local"}),"\n",(0,o.jsx)(n.p,{children:"To run a full Komodo instance from a non-container environment run commands in this order:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Ensure dependencies are up to date","\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"rustup update"})," -- ensure rust toolchain is up to date"]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["Build and Run backend","\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"run -r dev-core"})," -- Build and run Core API"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"run -r dev-periphery"})," -- Build and run Periphery API"]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["Build Frontend","\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Install ",(0,o.jsx)(n.strong,{children:"typeshare-cli"}),": ",(0,o.jsx)(n.code,{children:"cargo install typeshare-cli"})]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Run this once"})," -- ",(0,o.jsx)(n.code,{children:"run -r link-client"})," -- generates TS client and links to the frontend"]}),"\n",(0,o.jsxs)(n.li,{children:["After running the above once:","\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"run -r gen-client"})," -- Rebuild client"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"run -r dev-frontend"})," -- Start in dev (watch) mode"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"run -r build-frontend"})," -- Typecheck and build"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"docsite-development",children:"Docsite Development"}),"\n",(0,o.jsxs)(n.p,{children:["Use ",(0,o.jsx)(n.code,{children:"run -r dev-docsite"})," to start the ",(0,o.jsx)(n.a,{href:"https://docusaurus.io/",children:"Docusaurus"})," Komodo docs site in development mode. Changes made to files in ",(0,o.jsx)(n.code,{children:"./docsite"})," will be automatically reloaded by the server."]})]})}function a(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>d,x:()=>t});var s=r(6540);const o={},i=s.createContext(o);function d(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function t(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:d(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/913.052ab8b9.js b/assets/js/913.052ab8b9.js
deleted file mode 100644
index b479635f4..000000000
--- a/assets/js/913.052ab8b9.js
+++ /dev/null
@@ -1 +0,0 @@
-(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[913],{8069:(e,t,n)=>{"use strict";n.d(t,{A:()=>V});var o=n(6540),s=n(9136),c=n(4164),r=n(8532),a=n(3115);function l(){const{prism:e}=(0,a.p)(),{colorMode:t}=(0,r.G)(),n=e.theme,o=e.darkTheme||n;return"dark"===t?o:n}var i=n(204),u=n(8426),d=n.n(u);const m=/title=(?["'])(?.*?)\1/,p=/\{(?[\d,-]+)\}/,b={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}},f={...b,lua:{start:"--",end:""},wasm:{start:"\\;\\;",end:""},tex:{start:"%",end:""},vb:{start:"['\u2018\u2019]",end:""},vbnet:{start:"(?:_\\s*)?['\u2018\u2019]",end:""},rem:{start:"[Rr][Ee][Mm]\\b",end:""},f90:{start:"!",end:""},ml:{start:"\\(\\*",end:"\\*\\)"},cobol:{start:"\\*>",end:""}},h=Object.keys(b);function g(e,t){const n=e.map((e=>{const{start:n,end:o}=f[e];return`(?:${n}\\s*(${t.flatMap((e=>[e.line,e.block?.start,e.block?.end].filter(Boolean))).join("|")})\\s*${o})`})).join("|");return new RegExp(`^\\s*(?:${n})\\s*$`)}function k(e,t){let n=e.replace(/\n$/,"");const{language:o,magicComments:s,metastring:c}=t;if(c&&p.test(c)){const e=c.match(p).groups.range;if(0===s.length)throw new Error(`A highlight range has been given in code block's metastring (\`\`\` ${c}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);const t=s[0].className,o=d()(e).filter((e=>e>0)).map((e=>[e-1,[t]]));return{lineClassNames:Object.fromEntries(o),code:n}}if(void 0===o)return{lineClassNames:{},code:n};const r=function(e,t){switch(e){case"js":case"javascript":case"ts":case"typescript":return g(["js","jsBlock"],t);case"jsx":case"tsx":return g(["js","jsBlock","jsx"],t);case"html":return g(["js","jsBlock","html"],t);case"python":case"py":case"bash":return g(["bash"],t);case"markdown":case"md":return g(["html","jsx","bash"],t);case"tex":case"latex":case"matlab":return g(["tex"],t);case"lua":case"haskell":return g(["lua"],t);case"sql":return g(["lua","jsBlock"],t);case"wasm":return g(["wasm"],t);case"vb":case"vba":case"visual-basic":return g(["vb","rem"],t);case"vbnet":return g(["vbnet","rem"],t);case"batch":return g(["rem"],t);case"basic":return g(["rem","f90"],t);case"fsharp":return g(["js","ml"],t);case"ocaml":case"sml":return g(["ml"],t);case"fortran":return g(["f90"],t);case"cobol":return g(["cobol"],t);default:return g(h,t)}}(o,s),a=n.split("\n"),l=Object.fromEntries(s.map((e=>[e.className,{start:0,range:""}]))),i=Object.fromEntries(s.filter((e=>e.line)).map((e=>{let{className:t,line:n}=e;return[n,t]}))),u=Object.fromEntries(s.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.start,t]}))),m=Object.fromEntries(s.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.end,t]})));for(let d=0;dvoid 0!==e));i[t]?l[i[t]].range+=`${d},`:u[t]?l[u[t]].start=d:m[t]&&(l[m[t]].range+=`${l[m[t]].start}-${d-1},`),a.splice(d,1)}n=a.join("\n");const b={};return Object.entries(l).forEach((e=>{let[t,{range:n}]=e;d()(n).forEach((e=>{b[e]??=[],b[e].push(t)}))})),{lineClassNames:b,code:n}}const B={codeBlockContainer:"codeBlockContainer_Ckt0"};var x=n(4848);function j(e){let{as:t,...n}=e;const o=function(e){const t={color:"--prism-color",backgroundColor:"--prism-background-color"},n={};return Object.entries(e.plain).forEach((e=>{let[o,s]=e;const c=t[o];c&&"string"==typeof s&&(n[c]=s)})),n}(l());return(0,x.jsx)(t,{...n,style:o,className:(0,c.A)(n.className,B.codeBlockContainer,i.G.common.codeBlock)})}const y={codeBlockContent:"codeBlockContent_biex",codeBlockTitle:"codeBlockTitle_Ktv7",codeBlock:"codeBlock_bY9V",codeBlockStandalone:"codeBlockStandalone_MEMb",codeBlockLines:"codeBlockLines_e6Vv",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_o6Pm",buttonGroup:"buttonGroup__atx"};function v(e){let{children:t,className:n}=e;return(0,x.jsx)(j,{as:"pre",tabIndex:0,className:(0,c.A)(y.codeBlockStandalone,"thin-scrollbar",n),children:(0,x.jsx)("code",{className:y.codeBlockLines,children:t})})}var C=n(6849);const N={attributes:!0,characterData:!0,childList:!0,subtree:!0};function w(e,t){const[n,s]=(0,o.useState)(),c=(0,o.useCallback)((()=>{s(e.current?.closest("[role=tabpanel][hidden]"))}),[e,s]);(0,o.useEffect)((()=>{c()}),[c]),function(e,t,n){void 0===n&&(n=N);const s=(0,C._q)(t),c=(0,C.Be)(n);(0,o.useEffect)((()=>{const t=new MutationObserver(s);return e&&t.observe(e,c),()=>t.disconnect()}),[e,s,c])}(n,(e=>{e.forEach((e=>{"attributes"===e.type&&"hidden"===e.attributeName&&(t(),c())}))}),{attributes:!0,characterData:!1,childList:!1,subtree:!1})}var E=n(1765);const L={codeLine:"codeLine_lJS_",codeLineNumber:"codeLineNumber_Tfdd",codeLineContent:"codeLineContent_feaV"};function A(e){let{line:t,classNames:n,showLineNumbers:o,getLineProps:s,getTokenProps:r}=e;1===t.length&&"\n"===t[0].content&&(t[0].content="");const a=s({line:t,className:(0,c.A)(n,o&&L.codeLine)}),l=t.map(((e,t)=>(0,x.jsx)("span",{...r({token:e})},t)));return(0,x.jsxs)("span",{...a,children:[o?(0,x.jsxs)(x.Fragment,{children:[(0,x.jsx)("span",{className:L.codeLineNumber}),(0,x.jsx)("span",{className:L.codeLineContent,children:l})]}):l,(0,x.jsx)("br",{})]})}var S=n(539);function T(e){return(0,x.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,x.jsx)("path",{fill:"currentColor",d:"M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"})})}function _(e){return(0,x.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,x.jsx)("path",{fill:"currentColor",d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"})})}const I={copyButtonCopied:"copyButtonCopied_obH4",copyButtonIcons:"copyButtonIcons_eSgA",copyButtonIcon:"copyButtonIcon_y97N",copyButtonSuccessIcon:"copyButtonSuccessIcon_LjdS"};function $(e){let{code:t,className:n}=e;const[s,r]=(0,o.useState)(!1),a=(0,o.useRef)(void 0),l=(0,o.useCallback)((()=>{!function(e,t){let{target:n=document.body}=void 0===t?{}:t;if("string"!=typeof e)throw new TypeError(`Expected parameter \`text\` to be a \`string\`, got \`${typeof e}\`.`);const o=document.createElement("textarea"),s=document.activeElement;o.value=e,o.setAttribute("readonly",""),o.style.contain="strict",o.style.position="absolute",o.style.left="-9999px",o.style.fontSize="12pt";const c=document.getSelection(),r=c.rangeCount>0&&c.getRangeAt(0);n.append(o),o.select(),o.selectionStart=0,o.selectionEnd=e.length;let a=!1;try{a=document.execCommand("copy")}catch{}o.remove(),r&&(c.removeAllRanges(),c.addRange(r)),s&&s.focus()}(t),r(!0),a.current=window.setTimeout((()=>{r(!1)}),1e3)}),[t]);return(0,o.useEffect)((()=>()=>window.clearTimeout(a.current)),[]),(0,x.jsx)("button",{type:"button","aria-label":s?(0,S.T)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,S.T)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,S.T)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,c.A)("clean-btn",n,I.copyButton,s&&I.copyButtonCopied),onClick:l,children:(0,x.jsxs)("span",{className:I.copyButtonIcons,"aria-hidden":"true",children:[(0,x.jsx)(T,{className:I.copyButtonIcon}),(0,x.jsx)(_,{className:I.copyButtonSuccessIcon})]})})}function W(e){return(0,x.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,x.jsx)("path",{fill:"currentColor",d:"M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"})})}const M={wordWrapButtonIcon:"wordWrapButtonIcon_Bwma",wordWrapButtonEnabled:"wordWrapButtonEnabled_EoeP"};function H(e){let{className:t,onClick:n,isEnabled:o}=e;const s=(0,S.T)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return(0,x.jsx)("button",{type:"button",onClick:n,className:(0,c.A)("clean-btn",t,o&&M.wordWrapButtonEnabled),"aria-label":s,title:s,children:(0,x.jsx)(W,{className:M.wordWrapButtonIcon,"aria-hidden":"true"})})}function R(e){let{children:t,className:n="",metastring:s,title:r,showLineNumbers:i,language:u}=e;const{prism:{defaultLanguage:d,magicComments:p}}=(0,a.p)(),b=function(e){return e?.toLowerCase()}(u??function(e){const t=e.split(" ").find((e=>e.startsWith("language-")));return t?.replace(/language-/,"")}(n)??d),f=l(),h=function(){const[e,t]=(0,o.useState)(!1),[n,s]=(0,o.useState)(!1),c=(0,o.useRef)(null),r=(0,o.useCallback)((()=>{const n=c.current.querySelector("code");e?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),t((e=>!e))}),[c,e]),a=(0,o.useCallback)((()=>{const{scrollWidth:e,clientWidth:t}=c.current,n=e>t||c.current.querySelector("code").hasAttribute("style");s(n)}),[c]);return w(c,a),(0,o.useEffect)((()=>{a()}),[e,a]),(0,o.useEffect)((()=>(window.addEventListener("resize",a,{passive:!0}),()=>{window.removeEventListener("resize",a)})),[a]),{codeBlockRef:c,isEnabled:e,isCodeScrollable:n,toggle:r}}(),g=function(e){return e?.match(m)?.groups.title??""}(s)||r,{lineClassNames:B,code:v}=k(t,{metastring:s,language:b,magicComments:p}),C=i??function(e){return Boolean(e?.includes("showLineNumbers"))}(s);return(0,x.jsxs)(j,{as:"div",className:(0,c.A)(n,b&&!n.includes(`language-${b}`)&&`language-${b}`),children:[g&&(0,x.jsx)("div",{className:y.codeBlockTitle,children:g}),(0,x.jsxs)("div",{className:y.codeBlockContent,children:[(0,x.jsx)(E.f4,{theme:f,code:v,language:b??"text",children:e=>{let{className:t,style:n,tokens:o,getLineProps:s,getTokenProps:r}=e;return(0,x.jsx)("pre",{tabIndex:0,ref:h.codeBlockRef,className:(0,c.A)(t,y.codeBlock,"thin-scrollbar"),style:n,children:(0,x.jsx)("code",{className:(0,c.A)(y.codeBlockLines,C&&y.codeBlockLinesWithNumbering),children:o.map(((e,t)=>(0,x.jsx)(A,{line:e,getLineProps:s,getTokenProps:r,classNames:B[t],showLineNumbers:C},t)))})})}}),(0,x.jsxs)("div",{className:y.buttonGroup,children:[(h.isEnabled||h.isCodeScrollable)&&(0,x.jsx)(H,{className:y.codeButton,onClick:()=>h.toggle(),isEnabled:h.isEnabled}),(0,x.jsx)($,{className:y.codeButton,code:v})]})]})]})}function V(e){let{children:t,...n}=e;const c=(0,s.A)(),r=function(e){return o.Children.toArray(e).some((e=>(0,o.isValidElement)(e)))?e:Array.isArray(e)?e.join(""):e}(t),a="string"==typeof r?R:v;return(0,x.jsx)(a,{...n,children:r},String(c))}},8426:(e,t)=>{function n(e){let t,n=[];for(let o of e.split(",").map((e=>e.trim())))if(/^-?\d+$/.test(o))n.push(parseInt(o,10));else if(t=o.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,o,s,c]=t;if(o&&c){o=parseInt(o),c=parseInt(c);const e=o{"use strict";n.d(t,{R:()=>r,x:()=>a});var o=n(6540);const s={},c=o.createContext(s);function r(e){const t=o.useContext(c);return o.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),o.createElement(c.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/92207a6b.58c67a86.js b/assets/js/92207a6b.58c67a86.js
new file mode 100644
index 000000000..b3c3bef79
--- /dev/null
+++ b/assets/js/92207a6b.58c67a86.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[484],{799:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>u,frontMatter:()=>i,metadata:()=>s,toc:()=>a});const s=JSON.parse('{"id":"resources/sync-resources","title":"Sync Resources","description":"Komodo is able to create, update, delete, and deploy resources declared in TOML files by diffing them against the existing resources,","source":"@site/docs/resources/sync-resources.md","sourceDirName":"resources","slug":"/resources/sync-resources","permalink":"/docs/resources/sync-resources","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/resources/sync-resources.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Procedures and Actions","permalink":"/docs/resources/procedures"},"next":{"title":"Configuring Webhooks","permalink":"/docs/resources/webhooks"}}');var o=t(4848),r=t(8453);const i={},l="Sync Resources",c={},a=[{value:"Commit to Syncs",id:"commit-to-syncs",level:2},{value:"Example Declarations",id:"example-declarations",level:2},{value:"Server",id:"server",level:3},{value:"Builder and build",id:"builder-and-build",level:3},{value:"Deployments",id:"deployments",level:3},{value:"Stack",id:"stack",level:3},{value:"Procedure",id:"procedure",level:3},{value:"Repo",id:"repo",level:3},{value:"Resource sync",id:"resource-sync",level:3},{value:"User Group:",id:"user-group",level:3}];function d(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"sync-resources",children:"Sync Resources"})}),"\n",(0,o.jsx)(n.p,{children:"Komodo is able to create, update, delete, and deploy resources declared in TOML files by diffing them against the existing resources,\nand apply updates based on the diffs. Similar to Stacks, the files can be configured in UI, in a local file, or in files pushed to a remote git repo.\nThe Komodo Core backend will poll the files for for any updates, and alert about pending changes when diffs are detected."}),"\n",(0,o.jsxs)(n.p,{children:["You can spread out your resource declarations across any number of files\nand use any nesting of folders to organize resources inside a root folder.\nAdditionally, you can create multiple ",(0,o.jsx)(n.code,{children:"ResourceSyncs"})," and configure ",(0,o.jsx)(n.code,{children:"Match Tags"}),' to filter down which resources are synced,\nand each sync will be handled independently. This allows different syncs to manage resources on a "per-project" basis.']}),"\n",(0,o.jsx)(n.p,{children:"The UI will display the computed sync actions and only execute them upon manual confirmation.\nOr the sync execution git webhook may be configured on the git repo to\nautomatically execute syncs upon pushes to the configured branch."}),"\n",(0,o.jsx)(n.h2,{id:"commit-to-syncs",children:"Commit to Syncs"}),"\n",(0,o.jsxs)(n.p,{children:['If the Sync is pointing to just a single file, you can enable "Managed Mode" to allow Core to write the updates you made in UI ',(0,o.jsx)(n.em,{children:"back to the file"}),".\nThis works no matter where the files are located, and will create a commit to your git repository for repo based files."]}),"\n",(0,o.jsx)(n.h2,{id:"example-declarations",children:"Example Declarations"}),"\n",(0,o.jsx)(n.h3,{id:"server",children:"Server"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"https://docs.rs/komodo_client/latest/komodo_client/entities/server/struct.ServerConfig.html",children:"Server config schema"})}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-toml",children:'[[server]] # Declare a new server\nname = "server-prod"\ndescription = "the prod server"\ntags = ["prod"]\n[server.config]\naddress = "http://localhost:8120"\nregion = "AshburnDc1"\nenabled = true # default: false\n'})}),"\n",(0,o.jsx)(n.h3,{id:"builder-and-build",children:"Builder and build"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"https://docs.rs/komodo_client/latest/komodo_client/entities/builder/enum.BuilderConfig.html",children:"Builder config schema"})}),"\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"https://docs.rs/komodo_client/latest/komodo_client/entities/build/struct.BuildConfig.html",children:"Build config schema"})}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-toml",children:'[[builder]] # Declare a builder\nname = "builder-01"\ntags = []\nconfig.type = "Aws"\n[builder.config.params]\nregion = "us-east-2"\nami_id = "ami-0e9bd154667944680"\n# These things come from your specific setup\nsubnet_id = "subnet-xxxxxxxxxxxxxxxxxx"\nkey_pair_name = "xxxxxxxx"\nassign_public_ip = true\nuse_public_ip = true\nsecurity_group_ids = [\n "sg-xxxxxxxxxxxxxxxxxx",\n "sg-xxxxxxxxxxxxxxxxxx"\n]\n\n##\n\n[[build]]\nname = "test_logger"\ndescription = "Logs randomly at INFO, WARN, ERROR levels to test logging setups"\ntags = ["test"]\n[build.config]\nbuilder_id = "builder-01"\nrepo = "mbecker20/test_logger"\nbranch = "master"\ngit_account = "mbecker20"\nimage_registry.type = "Standard"\nimage_registry.params.domain = "github.com" # or your custom domain\nimage_registry.params.account = "your_username"\nimage_registry.params.organization = "your_organization" # optinoal\n# Set docker labels\nlabels = """\norg.opencontainers.image.source = https://github.com/mbecker20/test_logger\norg.opencontainers.image.description = Logs randomly at INFO, WARN, ERROR levels to test logging setups\norg.opencontainers.image.licenses = GPL-3.0\n"""\n'})}),"\n",(0,o.jsx)(n.h3,{id:"deployments",children:"Deployments"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"https://docs.rs/komodo_client/latest/komodo_client/entities/deployment/struct.DeploymentConfig.html",children:"Deployment config schema"})}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-toml",children:'# Declare variables\n[[variable]]\nname = "OTLP_ENDPOINT"\nvalue = "http://localhost:4317"\n\n##\n\n[[deployment]] # Declare a deployment\nname = "test-logger-01"\ndescription = "test logger deployment 1"\ntags = ["test"]\n# sync will deploy the container:\n# - if it is not running.\n# - has relevant config updates.\n# - the attached build has new version.\ndeploy = true\n[deployment.config]\nserver_id = "server-01"\nimage.type = "Build"\nimage.params.build = "test_logger"\n# set the volumes / bind mounts\nvolumes = """\n# Supports comments\n/data/logs = /etc/logs\n# And other formats (eg yaml list)\n- "/data/config:/etc/config"\n"""\n# Set the environment variables\nenvironment = """\n# Comments supported\nOTLP_ENDPOINT = [[OTLP_ENDPOINT]] # interpolate variables into the envs.\nVARIABLE_1 = value_1\nVARIABLE_2 = value_2\n"""\n# Set Docker labels\nlabels = "deployment.type = logger"\n\n##\n\n[[deployment]]\nname = "test-logger-02"\ndescription = "test logger deployment 2"\ntags = ["test"]\ndeploy = true\n# Create a dependency on test-logger-01. This deployment will only be deployed after test-logger-01 is deployed.\n# Additionally, any sync deploy of test-logger-01 will also trigger sync deploy of this deployment.\nafter = ["test-logger-01"]\n[deployment.config]\nserver_id = "server-01"\nimage.type = "Build"\nimage.params.build = "test_logger"\nvolumes = """\n/data/logs = /etc/logs\n/data/config = /etc/config"""\nenvironment = """\nVARIABLE_1 = value_1\nVARIABLE_2 = value_2\n"""\n# Set Docker labels\nlabels = "deployment.type = logger"\n'})}),"\n",(0,o.jsx)(n.h3,{id:"stack",children:"Stack"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"https://docs.rs/komodo_client/latest/komodo_client/entities/stack/struct.StackConfig.html",children:"Stack config schema"})}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-toml",children:'[[stack]]\nname = "test-stack"\ndescription = "stack test"\ndeploy = true\nafter = ["test-logger-01"] # Stacks can depend on deployments, and vice versa.\ntags = ["test"]\n[stack.config]\nserver_id = "server-prod"\nfile_paths = ["mongo.yaml", "redis.yaml"]\ngit_provider = "git.mogh.tech"\ngit_account = "mbecker20" # clone private repo by specifying account\nrepo = "mbecker20/stack_test"\n'})}),"\n",(0,o.jsx)(n.h3,{id:"procedure",children:"Procedure"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"https://docs.rs/komodo_client/latest/komodo_client/entities/procedure/struct.ProcedureConfig.html",children:"Procedure config schema"})}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-toml",children:'[[procedure]]\nname = "test-procedure"\ndescription = "Do some things in a specific order"\ntags = ["test"]\n\n[[procedure.config.stage]]\nname = "Build stuff"\nexecutions = [\n { execution.type = "RunBuild", execution.params.build = "test_logger" },\n # Uses the Batch version, witch matches many builds by pattern\n # This one matches all builds prefixed with `foo-` (wildcard) and `bar-` (regex).\n { execution.type = "BatchRunBuild", execution.params.pattern = "foo-* , \\\\^bar-.*$\\\\" },\n { execution.type = "PullRepo", execution.params.repo = "komodo-periphery" },\n]\n\n[[procedure.config.stage]]\nname = "Deploy test logger 1"\nexecutions = [\n { execution.type = "Deploy", execution.params.deployment = "test-logger-01" },\n { execution.type = "Deploy", execution.params.deployment = "test-logger-03", enabled = false },\n]\n\n[[procedure.config.stage]]\nname = "Deploy test logger 2"\nenabled = false\nexecutions = [\n { execution.type = "Deploy", execution.params.deployment = "test-logger-02" }\n]\n'})}),"\n",(0,o.jsx)(n.h3,{id:"repo",children:"Repo"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"https://docs.rs/komodo_client/latest/komodo_client/entities/repo/struct.RepoConfig.html",children:"Repo config schema"})}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-toml",children:'[[repo]]\nname = "komodo-periphery"\ndescription = "Builds new versions of the periphery binary. Requires Rust installed on the host."\ntags = ["komodo"]\n[repo.config]\nserver_id = "server-01"\ngit_provider = "git.mogh.tech" # use an alternate git provider (default is github.com)\ngit_account = "mbecker20"\nrepo = "moghtech/komodo"\n# Run an action after the repo is pulled\non_pull.path = "."\non_pull.command = """\n# Supports comments\n/root/.cargo/bin/cargo build -p komodo_periphery --release\n# Multiple lines will be combined together using \'&&\'\ncp ./target/release/periphery /root/periphery\n"""\n'})}),"\n",(0,o.jsx)(n.h3,{id:"resource-sync",children:"Resource sync"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"https://docs.rs/komodo_client/latest/komodo_client/entities/sync/type.ResourceSync.html",children:"Resource sync config schema"})}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-toml",children:'[[resource_sync]]\nname = "resource-sync"\n[resource_sync.config]\ngit_provider = "git.mogh.tech" # use an alternate git provider (default is github.com)\ngit_account = "mbecker20"\nrepo = "moghtech/komodo"\nresource_path = ["stacks.toml", "repos.toml"]\n'})}),"\n",(0,o.jsx)(n.h3,{id:"user-group",children:"User Group:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"https://docs.rs/komodo_client/latest/komodo_client/entities/toml/struct.UserGroupToml.html",children:"UserGroup schema"})}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-toml",children:'[[user_group]]\nname = "groupo"\neveryone = false # Set to true to give these permission to all users.\nusers = ["mbecker20", "karamvirsingh98"]\n# Configure write access with all specific permissions\nall.Server = { level = "Write", specific = ["Attach", "Logs", "Inspect", "Terminal", "Processes"] }\n# Attach base level of Execute on all builds\nall.Build = "Execute"\n# Allow users to see all Builders, and attach builds to them.\nall.Builder = { level = "Read", specific = ["Attach"] }\npermissions = [\n # Attach permissions to specific resources by name\n { target.type = "Repo", target.id = "komodo-periphery", level = "Execute" },\n # Attach permissions to many resources with name matching regex (this uses \'^(.+)-(.+)$\' as regex expression)\n { target.type = "Server", target.id = "\\\\^(.+)-(.+)$\\\\", level = "Read" },\n { target.type = "Deployment", target.id = "\\\\^immich\\\\", level = "Execute" },\n]\n'})})]})}function u(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>l});var s=t(6540);const o={},r=s.createContext(o);function i(e){const n=s.useContext(r);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(o):e.components||o:i(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/9aae726d.def35305.js b/assets/js/9aae726d.def35305.js
new file mode 100644
index 000000000..4cceb2562
--- /dev/null
+++ b/assets/js/9aae726d.def35305.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[106],{4957:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>o,contentTitle:()=>d,default:()=>u,frontMatter:()=>a,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"resources/build-images/builders","title":"Builders","description":"A builder is a machine running the Komodo Periphery agent (and usually docker), which is able to handle a RunBuild / BuildRepo command from Komodo core. Any server connected to Komodo can be chosen as the builder for a build.","source":"@site/docs/resources/build-images/builders.md","sourceDirName":"resources/build-images","slug":"/resources/build-images/builders","permalink":"/docs/resources/build-images/builders","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/resources/build-images/builders.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Pre-build command","permalink":"/docs/resources/build-images/pre-build"},"next":{"title":"Image Versioning","permalink":"/docs/resources/build-images/versioning"}}');var s=n(4848),t=n(8453);const a={},d="Builders",o={},l=[{value:"AWS builder",id:"aws-builder",level:2},{value:"Setup the instance",id:"setup-the-instance",level:3},{value:"Make an AMI from the instance",id:"make-an-ami-from-the-instance",level:3},{value:"Configure security groups / firewall",id:"configure-security-groups--firewall",level:3},{value:"Multi-Platform Builds with Docker Buildx",id:"multi-platform-builds-with-docker-buildx",level:2},{value:"1. Create and use a Buildx builder instance",id:"1-create-and-use-a-buildx-builder-instance",level:3},{value:"2. Make Buildx the default for docker build",id:"2-make-buildx-the-default-for-docker-build",level:3},{value:"3. (Optional) View available builders",id:"3-optional-view-available-builders",level:3},{value:"Platform selection in Komodo",id:"platform-selection-in-komodo",level:3}];function c(e){const i={admonition:"admonition",br:"br",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",p:"p",pre:"pre",strong:"strong",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"builders",children:"Builders"})}),"\n",(0,s.jsx)(i.p,{children:"A builder is a machine running the Komodo Periphery agent (and usually docker), which is able to handle a RunBuild / BuildRepo command from Komodo core. Any server connected to Komodo can be chosen as the builder for a build."}),"\n",(0,s.jsx)(i.p,{children:"Building on a machine running production software is usually not a great idea, as this process can use a lot of system resources. It is better to start up a temporary cloud machine dedicated for the build, then shut it down when the build is finished. Komodo supports AWS EC2 for this task."}),"\n",(0,s.jsx)(i.h2,{id:"aws-builder",children:"AWS builder"}),"\n",(0,s.jsx)(i.p,{children:"Builders are now Komodo resources, and are managed via the core API / can be updated using the UI.\nTo use this feature, you need an AWS EC2 AMI with docker and Komodo Periphery configured to run on system start.\nOnce you create your builder and add the necessary configuration, it will be available to attach to builds."}),"\n",(0,s.jsx)(i.h3,{id:"setup-the-instance",children:"Setup the instance"}),"\n",(0,s.jsx)(i.p,{children:"Create an EC2 instance, and install Docker and Periphery on it."}),"\n",(0,s.jsx)(i.p,{children:"The following script is an example of installing Docker and Periphery onto a Ubuntu/Debian instance:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-sh",children:"#!/bin/bash\napt update\napt upgrade -y\ncurl -fsSL https://get.docker.com | sh\nsystemctl enable docker.service\nsystemctl enable containerd.service\ncurl -sSL https://raw.githubusercontent.com/moghtech/komodo/main/scripts/setup-periphery.py | HOME=/root python3\nsystemctl enable periphery.service\n"})}),"\n",(0,s.jsx)(i.admonition,{type:"note",children:(0,s.jsx)(i.p,{children:'AWS provides a "user data" feature, which will run a provided script as root. The above can be used with AWS user data\nto provide a hands free setup.'})}),"\n",(0,s.jsx)(i.h3,{id:"make-an-ami-from-the-instance",children:"Make an AMI from the instance"}),"\n",(0,s.jsx)(i.p,{children:"Once the instance is up and running, ssh in and confirm Periphery is running using:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-sh",children:"sudo systemctl status periphery.service\n"})}),"\n",(0,s.jsx)(i.p,{children:"If it is not, the install hasn't finished and you should wait a bit. It may take 5 minutes or more (all in updating / installing Docker, Periphery is just a 12 MB binary to download)."}),"\n",(0,s.jsxs)(i.p,{children:["Once Periphery is running, you can navigate to the instance in the AWS UI and choose ",(0,s.jsx)(i.code,{children:"Actions"})," -> ",(0,s.jsx)(i.code,{children:"Image and templates"})," -> ",(0,s.jsx)(i.code,{children:"Create image"}),". Just name the image and hit create."]}),"\n",(0,s.jsxs)(i.p,{children:["The AMI will provide a unique id starting with ",(0,s.jsx)(i.code,{children:"ami-"}),", use this with the builder configuration."]}),"\n",(0,s.jsx)(i.h3,{id:"configure-security-groups--firewall",children:"Configure security groups / firewall"}),"\n",(0,s.jsx)(i.p,{children:"The builders will need inbound access on port 8120 from Komodo Core, be sure to add a security group with this rule to the Builder configuration."}),"\n",(0,s.jsx)(i.h2,{id:"multi-platform-builds-with-docker-buildx",children:"Multi-Platform Builds with Docker Buildx"}),"\n",(0,s.jsx)(i.p,{children:"If you need to build Docker images for multiple platforms (such as ARM and x86), Docker Buildx provides an easy way to do this."}),"\n",(0,s.jsxs)(i.p,{children:["Multi-platform builds can take significantly longer than single-platform builds.",(0,s.jsx)(i.br,{}),"\n","When emulating a different architecture (e.g., building ARM images on an x86 host), expect additional time due to QEMU-based emulation."]}),"\n",(0,s.jsx)(i.h3,{id:"1-create-and-use-a-buildx-builder-instance",children:"1. Create and use a Buildx builder instance"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-sh",children:"docker buildx create --name builder --use --bootstrap\n"})}),"\n",(0,s.jsxs)(i.p,{children:["This command creates a new builder named ",(0,s.jsx)(i.code,{children:"builder"})," and sets it as the active builder for the current Docker context."]}),"\n",(0,s.jsx)(i.hr,{}),"\n",(0,s.jsxs)(i.h3,{id:"2-make-buildx-the-default-for-docker-build",children:["2. Make Buildx the default for ",(0,s.jsx)(i.code,{children:"docker build"})]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-sh",children:"docker buildx install\n"})}),"\n",(0,s.jsxs)(i.p,{children:["This replaces the default ",(0,s.jsx)(i.code,{children:"docker build"})," command with Buildx, so all builds automatically use the current builder instance."]}),"\n",(0,s.jsx)(i.hr,{}),"\n",(0,s.jsx)(i.h3,{id:"3-optional-view-available-builders",children:"3. (Optional) View available builders"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-sh",children:"docker buildx ls\n"})}),"\n",(0,s.jsx)(i.p,{children:"Use this to list all builder instances and check which one is active."}),"\n",(0,s.jsx)(i.hr,{}),"\n",(0,s.jsxs)(i.p,{children:["After these steps, any ",(0,s.jsx)(i.code,{children:"docker build"})," command will use Buildx by default, making it straightforward to create multi-platform images."]}),"\n",(0,s.jsx)(i.hr,{}),"\n",(0,s.jsx)(i.h3,{id:"platform-selection-in-komodo",children:"Platform selection in Komodo"}),"\n",(0,s.jsxs)(i.p,{children:["When building inside ",(0,s.jsx)(i.strong,{children:"Komodo"}),", you can specify the target platforms (e.g., ",(0,s.jsx)(i.code,{children:"linux/amd64"}),", ",(0,s.jsx)(i.code,{children:"linux/arm64"}),') directly in the Komodo UI during build configuration in the build "Extra Args" field.']}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"Example platform string for Extra Args:"})}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{children:"--platform linux/amd64,linux/arm64\n"})})]})}function u(e={}){const{wrapper:i}={...(0,t.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>a,x:()=>d});var r=n(6540);const s={},t=r.createContext(s);function a(e){const i=r.useContext(t);return r.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function d(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),r.createElement(t.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/a2604291.495ad41f.js b/assets/js/a2604291.495ad41f.js
new file mode 100644
index 000000000..382f652ba
--- /dev/null
+++ b/assets/js/a2604291.495ad41f.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[748],{3759:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>m,frontMatter:()=>t,metadata:()=>i,toc:()=>a});const i=JSON.parse('{"id":"ecosystem/cli","title":"Komodo CLI","description":"The Komodo CLI, km, can be used to:","source":"@site/docs/ecosystem/cli.mdx","sourceDirName":"ecosystem","slug":"/ecosystem/cli","permalink":"/docs/ecosystem/cli","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/ecosystem/cli.mdx","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Ecosystem","permalink":"/docs/ecosystem"},"next":{"title":"API and Clients","permalink":"/docs/ecosystem/api"}}');var s=o(4848),l=o(8453),r=o(6695);const t={},c="Komodo CLI",d={},a=[{value:"Examples",id:"examples",level:3},{value:"Install",id:"install",level:3},{value:"Linux",id:"linux",level:4},{value:"MacOS (Homebrew)",id:"macos-homebrew",level:4},{value:"Container",id:"container",level:4},{value:"Configure",id:"configure",level:3},{value:"File detection",id:"file-detection",level:4},{value:"Profiles",id:"profiles",level:4},{value:"Example File",id:"example-file",level:4}];function h(e){const n={a:"a",code:"code",h1:"h1",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,l.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"komodo-cli",children:"Komodo CLI"})}),"\n",(0,s.jsxs)(n.p,{children:["The Komodo CLI, ",(0,s.jsx)(n.code,{children:"km"}),", can be used to:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Quickly ",(0,s.jsx)(n.strong,{children:"run executions"})," and update ",(0,s.jsx)(n.strong,{children:"resources"})," and ",(0,s.jsx)(n.strong,{children:"variables"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Reset user passwords"})," and elevate users to ",(0,s.jsx)(n.strong,{children:"Super Admin"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Perform Database ",(0,s.jsx)(n.strong,{children:"backup"}),", ",(0,s.jsx)(n.strong,{children:"restore"}),", and ",(0,s.jsx)(n.strong,{children:"copy"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["The Komodo Core image comes packaged with the Komodo CLI,\nand is available for usage inside running container with ",(0,s.jsx)(n.code,{children:"docker exec -it komodo-core km ..."}),".\nThis way, it inherits the Core database config in order to easily perform backups with ",(0,s.jsx)(n.code,{children:"km db backup -y"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"examples",children:"Examples"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"km --help"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"km deploy stack my-stack"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"km run action my-action -y"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"km database backup"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"km db restore"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"km set var MY_VAR my_value -y"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:'km update build my-build "version=1.19.0&branch=release"'})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"km x commit my-sync"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"km set user mbecks super-admin true"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:'km set user mbecks password "temp-password"'})}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"install",children:"Install"}),"\n",(0,s.jsxs)(n.p,{children:["There are binaries available for ",(0,s.jsx)(n.strong,{children:"Linux"})," (x86_64 / aarch64), ",(0,s.jsx)(n.strong,{children:"MacOS"})," (apple silicon), as\nwell as a distroless image: ",(0,s.jsx)(n.strong,{children:(0,s.jsx)(n.code,{children:"ghcr.io/moghtech/komodo-cli"})}),"."]}),"\n",(0,s.jsx)(n.h4,{id:"linux",children:"Linux"}),"\n",(0,s.jsx)(n.p,{children:"You can install the binary using the following command:"}),"\n",(0,s.jsxs)(n.p,{children:["System-wide, as root, to ",(0,s.jsx)(n.code,{children:"/usr/local/bin/km"}),":"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"curl -sSL https://raw.githubusercontent.com/moghtech/komodo/main/scripts/install-cli.py | python3\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Or as non-root, to ",(0,s.jsx)(n.code,{children:"${HOME}/.local/bin/km"}),":"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"curl -sSL https://raw.githubusercontent.com/moghtech/komodo/main/scripts/install-cli.py | python3 - --user\n"})}),"\n",(0,s.jsx)(n.h4,{id:"macos-homebrew",children:"MacOS (Homebrew)"}),"\n",(0,s.jsxs)(n.p,{children:["Add the ",(0,s.jsx)(n.code,{children:"moghtech/komodo"})," tap, then install ",(0,s.jsx)(n.code,{children:"km"}),":"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"brew tap moghtech/komodo && \\\n brew install km\n"})}),"\n",(0,s.jsx)(n.h4,{id:"container",children:"Container"}),"\n",(0,s.jsx)(n.p,{children:"You can alias a docker run command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"alias km='docker run --rm -v $HOME/.config/komodo:/config ghcr.io/moghtech/komodo-cli km'\nkm config\n"})}),"\n",(0,s.jsx)(n.h3,{id:"configure",children:"Configure"}),"\n",(0,s.jsxs)(n.p,{children:["The CLI uses a configuration file to pass the Komodo host / api keys, database address and credentials,\nand configure some other behaviors. Additionally, all configuration fields can be individually overridden\nusing ",(0,s.jsx)(n.strong,{children:"CLI arguments"})," or ",(0,s.jsx)(n.strong,{children:"environment variables"}),", with CLI arguments having top priority."]}),"\n",(0,s.jsxs)(n.p,{children:["Whenever you want to check how config will be loaded, you can use the ",(0,s.jsx)(n.code,{children:"km config"})," command\nto print it out."]}),"\n",(0,s.jsx)(n.h4,{id:"file-detection",children:"File detection"}),"\n",(0,s.jsxs)(n.p,{children:["When run, CLI will scan the ",(0,s.jsx)(n.strong,{children:"current working directory"})," in addition to ",(0,s.jsx)(n.code,{children:"${HOME}/.config/komodo"})," for any files matching the wildcard pattern ",(0,s.jsx)(n.strong,{children:(0,s.jsx)(n.code,{children:"*komodo.cli*.*"})}),",\nparse them into a general representation, and then merge them together. Files which are detected later are merged later,\nmeaning they will override on conflicting fields. By default, files in ",(0,s.jsx)(n.code,{children:"${HOME}/.config/komodo"})," come first\nin the merge ordering, meaning they are ",(0,s.jsx)(n.strong,{children:"lower priority"})," than those detected in the current working directory.\nYou can also override these default paths by passing ",(0,s.jsx)(n.code,{children:"km -c /path/to/1/base.config.yaml -c ./overrides ..."}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["If you want ",(0,s.jsx)(n.code,{children:"km"})," to find configuration files in another directory,\nyou can use make ",(0,s.jsx)(n.code,{children:".kminclude"})," file inside one of the configured directories."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"# Supports comments\n\n./.komodo # relative to directory containing `kmignore`\n\n/etc/komodo/komodo.cli.toml\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Note that wildcards in these paths are ",(0,s.jsx)(n.strong,{children:"not supported"}),"."]}),"\n",(0,s.jsx)(n.h4,{id:"profiles",children:"Profiles"}),"\n",(0,s.jsxs)(n.p,{children:["In the files, you can configure multiple profiles, each with a name / aliases. Then you\nchoose which config profile to use with ",(0,s.jsx)(n.code,{children:"km -p ..."}),". This allows you to easily switch between\nmultiple Cores you want to connect to, or different database backup / restore options."]}),"\n",(0,s.jsxs)(n.p,{children:["In order to avoid passing ",(0,s.jsx)(n.code,{children:"-p "})," every time, you can set a\n",(0,s.jsx)(n.code,{children:"default_profile"}),' at the top level of the configuration file. Additionally,\nany fields you would like to be the "default" across all profiles can be\nset at the top level of the file.']}),"\n",(0,s.jsx)(n.h4,{id:"example-file",children:"Example File"}),"\n",(0,s.jsxs)(n.p,{children:["The configuration can also be passed as ",(0,s.jsx)(n.strong,{children:"YAML"})," or ",(0,s.jsx)(n.strong,{children:"JSON"}),".\nYou can use the it-tools to convert this TOML file to your preferred format:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["YAML: ",(0,s.jsx)(n.a,{href:"https://it-tools.tech/toml-to-yaml",children:"https://it-tools.tech/toml-to-yaml"})]}),"\n",(0,s.jsxs)(n.li,{children:["JSON: ",(0,s.jsx)(n.a,{href:"https://it-tools.tech/toml-to-json",children:"https://it-tools.tech/toml-to-json"})]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Quick download to ",(0,s.jsx)(n.code,{children:"./komodo/komodo.cli.toml"}),":"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"wget -P komodo https://raw.githubusercontent.com/moghtech/komodo/main/config/komodo.cli.toml\n"})}),"\n","\n",(0,s.jsx)(r.A,{title:"https://github.com/moghtech/komodo/blob/main/config/komodo.cli.toml",url:"https://raw.githubusercontent.com/moghtech/komodo/main/config/komodo.cli.toml",language:"toml"})]})}function m(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},6695:(e,n,o)=>{o.d(n,{A:()=>r});var i=o(6540),s=o(1028),l=o(4848);function r({url:e,language:n,title:o}){const[r,t]=(0,i.useState)("");return(0,i.useEffect)(()=>{!async function(e,n){const o=await fetch(e);n(await o.text())}(e,t)},[]),(0,l.jsx)(s.A,{title:o??e,language:n,showLineNumbers:!0,children:r})}}}]);
\ No newline at end of file
diff --git a/assets/js/a5389256.74ddb32b.js b/assets/js/a5389256.74ddb32b.js
new file mode 100644
index 000000000..edda166fb
--- /dev/null
+++ b/assets/js/a5389256.74ddb32b.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[68],{1421:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>h,default:()=>a,frontMatter:()=>i,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"ecosystem/community","title":"Community","description":"3rd party tools","source":"@site/docs/ecosystem/community.md","sourceDirName":"ecosystem","slug":"/ecosystem/community","permalink":"/docs/ecosystem/community","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/ecosystem/community.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"API and Clients","permalink":"/docs/ecosystem/api"},"next":{"title":"Development","permalink":"/docs/ecosystem/development"}}');var n=o(4848),r=o(8453);const i={},h="Community",l={},c=[{value:"3rd party tools",id:"3rd-party-tools",level:3},{value:"Posts and Guides",id:"posts-and-guides",level:3},{value:"Community Alerters",id:"community-alerters",level:3}];function d(e){const t={a:"a",code:"code",h1:"h1",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"community",children:"Community"})}),"\n",(0,n.jsx)(t.h3,{id:"3rd-party-tools",children:"3rd party tools"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.a,{href:"https://github.com/bpbradley/ansible-role-komodo",children:"Ansible Role Komodo"})," by ",(0,n.jsx)(t.a,{href:"https://github.com/bpbradley",children:"bpbradley"})]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.a,{href:"https://foxxmd.github.io/komodo-import/docs/quickstart/",children:"Komodo Import"})," by ",(0,n.jsx)(t.a,{href:"https://github.com/FoxxMD",children:"FoxxMD"})]}),"\n"]}),"\n",(0,n.jsx)(t.h3,{id:"posts-and-guides",children:"Posts and Guides"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.a,{href:"https://blog.foxxmd.dev/posts/migrating-to-komodo",children:"Migrating to Komodo"})," by ",(0,n.jsx)(t.a,{href:"https://github.com/FoxxMD",children:"FoxxMD"})]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.a,{href:"https://blog.foxxmd.dev/posts/komodo-tips-tricks",children:"FAQ, Tips, and Tricks"})," by ",(0,n.jsx)(t.a,{href:"https://github.com/FoxxMD",children:"FoxxMD"})]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.a,{href:"https://blog.foxxmd.dev/posts/compose-envs-explained",children:"Compose Environments Explained"})," by ",(0,n.jsx)(t.a,{href:"https://github.com/FoxxMD",children:"FoxxMD"})]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.a,{href:"https://nickcunningh.am/blog/how-to-automate-version-updates-for-your-self-hosted-docker-containers-with-gitea-renovate-and-komodo",children:"How To: Automate version updates for your self-hosted Docker containers with Gitea, Renovate, and Komodo"})," by ",(0,n.jsx)(t.a,{href:"https://github.com/TheNickOfTime",children:"TheNickOfTime"})]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.a,{href:"https://skyblog.one/komodo-the-better-alternative-to-portainer-for-container-management",children:"Setting up Komodo, comparison to Portainer, and FAQ"})," by ",(0,n.jsx)(t.a,{href:"https://skyblog.one/authors/",children:"Skyfay"})]}),"\n"]}),"\n",(0,n.jsx)(t.h3,{id:"community-alerters",children:"Community Alerters"}),"\n",(0,n.jsxs)(t.p,{children:["These provide alerting implementations which can be used with the ",(0,n.jsx)(t.code,{children:"Custom"})," Alerter type."]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.a,{href:"https://github.com/FoxxMD/deploy-discord-alerter",children:"Discord"})," by ",(0,n.jsx)(t.a,{href:"https://github.com/FoxxMD",children:"FoxxMD"})]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.a,{href:"https://github.com/mattsmallman/komodo-alert-to-telgram",children:"Telegram"})," by ",(0,n.jsx)(t.a,{href:"https://github.com/mattsmallman",children:"mattsmallman"})]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.a,{href:"https://github.com/FoxxMD/deploy-ntfy-alerter",children:"Ntfy"})," by ",(0,n.jsx)(t.a,{href:"https://github.com/FoxxMD",children:"FoxxMD"})]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.a,{href:"https://github.com/FoxxMD/deploy-gotify-alerter",children:"Gotify"})," by ",(0,n.jsx)(t.a,{href:"https://github.com/FoxxMD",children:"FoxxMD"})]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.a,{href:"https://github.com/FoxxMD/deploy-apprise-alerter",children:"Apprise"})," by ",(0,n.jsx)(t.a,{href:"https://github.com/FoxxMD",children:"FoxxMD"})]}),"\n"]})]})}function a(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>i,x:()=>h});var s=o(6540);const n={},r=s.createContext(n);function i(e){const t=s.useContext(r);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function h(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/a5a01e01.1b599af5.js b/assets/js/a5a01e01.1b599af5.js
deleted file mode 100644
index 85c64651d..000000000
--- a/assets/js/a5a01e01.1b599af5.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[549],{6231:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"build-images/versioning","title":"Image Versioning","description":"Komodo uses a major.minor.patch versioning scheme to Build versioning. By default, every RunBuild will auto increment the Build\'s version patch number, and push the image to docker hub with the version tag, as well as the latest tag. A tag containing the latest short commit hash at the time the repo was cloned will also be created.","source":"@site/docs/build-images/versioning.md","sourceDirName":"build-images","slug":"/build-images/versioning","permalink":"/docs/build-images/versioning","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/build-images/versioning.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Builders","permalink":"/docs/build-images/builders"},"next":{"title":"Deploy Containers","permalink":"/docs/deploy-containers/"}}');var o=n(4848),s=n(8453);const a={},r="Image Versioning",c={},d=[];function l(e){const t={code:"code",h1:"h1",header:"header",p:"p",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"image-versioning",children:"Image Versioning"})}),"\n",(0,o.jsxs)(t.p,{children:["Komodo uses a major.minor.patch versioning scheme to Build versioning. By default, every RunBuild will auto increment the Build's version patch number, and push the image to docker hub with the version tag, as well as the ",(0,o.jsx)(t.code,{children:"latest"})," tag. A tag containing the latest short commit hash at the time the repo was cloned will also be created."]}),"\n",(0,o.jsxs)(t.p,{children:['You can also turn off the auto incrementing feature, and manage the version yourself. In addition, you can configure a "version tag" on the build. This will postfix the version tag / commit hash tag with a custom label. For example, an image tag of ',(0,o.jsx)(t.code,{children:"dev"})," will produce tags like ",(0,o.jsx)(t.code,{children:"image_name:1.1.1-dev"})," and ",(0,o.jsx)(t.code,{children:"image_name:h3c87c-dev"}),"."]})]})}function u(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>r});var i=n(6540);const o={},s=i.createContext(o);function a(e){const t=i.useContext(s);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(o):e.components||o:a(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/a5c9d4c4.a3c66062.js b/assets/js/a5c9d4c4.a3c66062.js
deleted file mode 100644
index 2bdfd69d2..000000000
--- a/assets/js/a5c9d4c4.a3c66062.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[636],{7700:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>a,contentTitle:()=>c,default:()=>h,frontMatter:()=>r,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"docker-compose","title":"Docker Compose","description":"Komodo can deploy docker compose projects through the Stack resource.","source":"@site/docs/docker-compose.md","sourceDirName":".","slug":"/docker-compose","permalink":"/docs/docker-compose","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/docker-compose.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Container Management","permalink":"/docs/deploy-containers/lifetime-management"},"next":{"title":"Variables and Secrets","permalink":"/docs/variables"}}');var t=n(4848),i=n(8453);const r={},c="Docker Compose",a={},l=[{value:"Define the compose file/s",id:"define-the-compose-files",level:2},{value:"Importing Existing Compose projects",id:"importing-existing-compose-projects",level:2},{value:"Pass Environment Variables",id:"pass-environment-variables",level:2}];function d(e){const o={admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(o.header,{children:(0,t.jsx)(o.h1,{id:"docker-compose",children:"Docker Compose"})}),"\n",(0,t.jsxs)(o.p,{children:["Komodo can deploy docker compose projects through the ",(0,t.jsx)(o.code,{children:"Stack"})," resource."]}),"\n",(0,t.jsx)(o.h2,{id:"define-the-compose-files",children:"Define the compose file/s"}),"\n",(0,t.jsx)(o.p,{children:"Komodo supports 3 ways of defining the compose files:"}),"\n",(0,t.jsxs)(o.ol,{children:["\n",(0,t.jsxs)(o.li,{children:[(0,t.jsx)(o.strong,{children:"Write them in the UI"}),", and Komodo will write them to your host at deploy-time."]}),"\n",(0,t.jsxs)(o.li,{children:[(0,t.jsx)(o.strong,{children:"Store the files anywhere on the host"}),", and Komodo will just run the compose commands on the existing files."]}),"\n",(0,t.jsxs)(o.li,{children:[(0,t.jsx)(o.strong,{children:"Store them in a git repo"}),", and have Komodo clone it on the host to deploy."]}),"\n"]}),"\n",(0,t.jsx)(o.p,{children:"If you manage your compose files in git repos:"}),"\n",(0,t.jsxs)(o.ul,{children:["\n",(0,t.jsx)(o.li,{children:"All your files, across all servers, are available locally to edit in your favorite text editor."}),"\n",(0,t.jsx)(o.li,{children:"All of your changes are tracked, and can be reverted."}),"\n",(0,t.jsxs)(o.li,{children:["You can use the git webhooks to do other automations when you change the compose file contents. Redeploying will be as easy as ",(0,t.jsx)(o.code,{children:"git push"}),"."]}),"\n"]}),"\n",(0,t.jsx)(o.admonition,{type:"info",children:(0,t.jsx)(o.p,{children:"Many Komodo resources need access to git repos. There is an in-built token management system (managed in UI or in config file) to give resources access to credentials.\nAll resources which depend on git repos are able to use these credentials to access private repos."})}),"\n",(0,t.jsx)(o.h2,{id:"importing-existing-compose-projects",children:"Importing Existing Compose projects"}),"\n",(0,t.jsx)(o.p,{children:"First create the Stack in Komodo, and ensure it has access to the compose files using one\nof the three methods above. Make sure to attach the server you wish to deploy on."}),"\n",(0,t.jsxs)(o.p,{children:['In order for Komodo to pick up a running project, it has to know the compose "project name".\nYou can find the project name by running ',(0,t.jsx)(o.code,{children:"docker compose ls"})," on the host."]}),"\n",(0,t.jsx)(o.p,{children:'By default, Komodo will assume the Stack name is the compose project name.\nIf this is different than the project name on the host, you can configure a custom "Project Name" in the config.'}),"\n",(0,t.jsx)(o.h2,{id:"pass-environment-variables",children:"Pass Environment Variables"}),"\n",(0,t.jsx)(o.p,{children:"Komodo is able to pass custom environment variables to the docker compose process.\nThis works by:"}),"\n",(0,t.jsxs)(o.ol,{children:["\n",(0,t.jsx)(o.li,{children:'Write the variables to a ".env" file on the host at deploy-time.'}),"\n",(0,t.jsxs)(o.li,{children:["Pass the file to docker compose using the ",(0,t.jsx)(o.code,{children:"--env-file"})," flag."]}),"\n"]}),"\n",(0,t.jsx)(o.admonition,{type:"info",children:(0,t.jsxs)(o.p,{children:["Just like all other resources with Environments (Deployments, Repos, Builds),\nStack Environments support ",(0,t.jsx)(o.strong,{children:"Variable and Secret interpolation"}),". Define global variables\nin the UI and share the values across environments."]})})]})}function h(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,t.jsx)(o,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,o,n)=>{n.d(o,{R:()=>r,x:()=>c});var s=n(6540);const t={},i=s.createContext(t);function r(e){const o=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(i.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/a65cf3b8.4e1ce655.js b/assets/js/a65cf3b8.4e1ce655.js
new file mode 100644
index 000000000..bb693664b
--- /dev/null
+++ b/assets/js/a65cf3b8.4e1ce655.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[41],{8453:(e,i,n)=>{n.d(i,{R:()=>s,x:()=>d});var o=n(6540);const r={},t=o.createContext(r);function s(e){const i=o.useContext(t);return o.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function d(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),o.createElement(t.Provider,{value:i},e.children)}},9793:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>c,contentTitle:()=>d,default:()=>h,frontMatter:()=>s,metadata:()=>o,toc:()=>a});const o=JSON.parse('{"id":"resources/build-images/configuration","title":"Configuration","description":"Komodo just needs a bit of information in order to build your image.","source":"@site/docs/resources/build-images/configuration.md","sourceDirName":"resources/build-images","slug":"/resources/build-images/configuration","permalink":"/docs/resources/build-images/configuration","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/resources/build-images/configuration.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Building Images","permalink":"/docs/build-images"},"next":{"title":"Pre-build command","permalink":"/docs/resources/build-images/pre-build"}}');var r=n(4848),t=n(8453);const s={},d="Configuration",c={},a=[{value:"Provider configuration",id:"provider-configuration",level:3},{value:"Repo configuration",id:"repo-configuration",level:3},{value:"Docker build configuration",id:"docker-build-configuration",level:3},{value:"Image registry",id:"image-registry",level:3},{value:"Adding build args",id:"adding-build-args",level:3},{value:"Adding build secrets",id:"adding-build-secrets",level:3}];function l(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h3:"h3",header:"header",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(i.header,{children:(0,r.jsx)(i.h1,{id:"configuration",children:"Configuration"})}),"\n",(0,r.jsx)(i.p,{children:"Komodo just needs a bit of information in order to build your image."}),"\n",(0,r.jsx)(i.h3,{id:"provider-configuration",children:"Provider configuration"}),"\n",(0,r.jsxs)(i.p,{children:["Komodo supports cloning repos over http/s, from any provider that supports cloning private repos using ",(0,r.jsx)(i.code,{children:"git clone https://@git-provider.net//"}),"."]}),"\n",(0,r.jsxs)(i.p,{children:["Accounts / access tokens can be configured in either the ",(0,r.jsx)(i.a,{href:"/docs/setup/advanced#mount-a-config-file",children:"core config"}),"\nor in the ",(0,r.jsx)(i.a,{href:"/docs/setup/connect-servers#manual-install-steps---binaries",children:"periphery config"}),"."]}),"\n",(0,r.jsx)(i.h3,{id:"repo-configuration",children:"Repo configuration"}),"\n",(0,r.jsxs)(i.p,{children:["To specify the git repo to build, just give it the name of the repo and the branch under ",(0,r.jsx)(i.em,{children:"repo config"}),". The name is given like ",(0,r.jsx)(i.code,{children:"moghtech/komodo"}),", it includes the username / organization that owns the repo."]}),"\n",(0,r.jsx)(i.p,{children:"Many repos are private, in this case an access token is needed by the building server.\nIt can either come from a provider defined in the core configuration,\nor in the periphery configuration of the building server."}),"\n",(0,r.jsx)(i.h3,{id:"docker-build-configuration",children:"Docker build configuration"}),"\n",(0,r.jsxs)(i.p,{children:["In order to docker build, Komodo just needs to know the build directory and the path of the Dockerfile relative to the repo, you can configure these in the ",(0,r.jsx)(i.em,{children:"build config"})," section."]}),"\n",(0,r.jsxs)(i.p,{children:["If the build directory is the root of the repository, you pass the build path as ",(0,r.jsx)(i.code,{children:"."}),'. If the build directory is some folder of the repo, just pass the name of the the folder. Do not pass the preceding "/". for example ',(0,r.jsx)(i.code,{children:"build/directory"})]}),"\n",(0,r.jsxs)(i.p,{children:["The dockerfile's path is given relative to the build directory. So if your build directory is ",(0,r.jsx)(i.code,{children:"build/directory"})," and the dockerfile is in ",(0,r.jsx)(i.code,{children:"build/directory/Dockerfile.example"}),", you give the dockerfile path simply as ",(0,r.jsx)(i.code,{children:"Dockerfile.example"}),"."]}),"\n",(0,r.jsx)(i.h3,{id:"image-registry",children:"Image registry"}),"\n",(0,r.jsx)(i.p,{children:"Komodo supports pushing to any docker registry.\nAny of the accounts that are specified in config for the specific registry, between the core config and builder, will be available to use for authentication against the registry.\nAdditionally, allowed organizations on the docker registry can be specified on the core config and attached to builds.\nDoing so will cause the images to be published under the organization's namespace rather than the account's."}),"\n",(0,r.jsx)(i.p,{children:"When connecting a build to a deployments, the default behavior is for the deployment to inherit the registry configuration from the build.\nIn cases where that account isn't available to the deployment, another account can be chosen in the deployment config."}),"\n",(0,r.jsx)(i.admonition,{type:"note",children:(0,r.jsxs)(i.p,{children:["In order to publish to the Github Container Registry, your Github access token must be given the ",(0,r.jsx)(i.code,{children:"write:packages"})," permission.\nSee the Github docs ",(0,r.jsx)(i.a,{href:"https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry#authenticating-with-a-personal-access-token-classic",children:"here"}),"."]})}),"\n",(0,r.jsx)(i.h3,{id:"adding-build-args",children:"Adding build args"}),"\n",(0,r.jsxs)(i.p,{children:["The Dockerfile may make use of ",(0,r.jsx)(i.a,{href:"https://docs.docker.com/engine/reference/builder/#arg",children:"build args"}),". Build args can be passed using the gui by navigating to the ",(0,r.jsx)(i.code,{children:"Build Args"})," tab in the config. They are passed in the menu just like in the would in a .env file:"]}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"BUILD_ARG1=some_value\nBUILD_ARG2=some_other_value\n"})}),"\n",(0,r.jsxs)(i.p,{children:["Note that these values are visible in the final image using ",(0,r.jsx)(i.code,{children:"docker history"}),", so shouldn't be used to pass build time secrets. Use ",(0,r.jsx)(i.a,{href:"https://docs.docker.com/engine/reference/builder/#run---mounttypesecret",children:"secret mounts"})," for this instead."]}),"\n",(0,r.jsx)(i.h3,{id:"adding-build-secrets",children:"Adding build secrets"}),"\n",(0,r.jsxs)(i.p,{children:["The Dockerfile may also make use of ",(0,r.jsx)(i.a,{href:"https://docs.docker.com/build/building/secrets",children:"build secrets"}),"."]}),"\n",(0,r.jsx)(i.p,{children:"They are configured in the GUI the same way as build args. The values passed here can be used in RUN commands in the Dockerfile:"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"RUN --mount=type=secret,id=SECRET_KEY \\\n SECRET_KEY=$(cat /run/secrets/SECRET_KEY) ...\n"})}),"\n",(0,r.jsxs)(i.p,{children:["These values will not be visible with ",(0,r.jsx)(i.code,{children:"docker history"})," command."]})]})}function h(e={}){const{wrapper:i}={...(0,t.R)(),...e.components};return i?(0,r.jsx)(i,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}}}]);
\ No newline at end of file
diff --git a/assets/js/a7bd4aaa.b6fc302d.js b/assets/js/a7bd4aaa.9eafbbe0.js
similarity index 73%
rename from assets/js/a7bd4aaa.b6fc302d.js
rename to assets/js/a7bd4aaa.9eafbbe0.js
index 337b6ebbf..265507cc4 100644
--- a/assets/js/a7bd4aaa.b6fc302d.js
+++ b/assets/js/a7bd4aaa.9eafbbe0.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[98],{7419:(n,e,s)=>{s.r(e),s.d(e,{default:()=>l});s(6540);var r=s(1769);function o(n,e){return`docs-${n}-${e}`}var t=s(1858),c=s(2831),i=s(7220),u=s(4848);function a(n){const{version:e}=n;return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(i.A,{version:e.version,tag:o(e.pluginId,e.version)}),(0,u.jsx)(r.be,{children:e.noIndex&&(0,u.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})]})}function d(n){const{version:e,route:s}=n;return(0,u.jsx)(r.e3,{className:e.className,children:(0,u.jsx)(t.n,{version:e,children:(0,c.v)(s.routes)})})}function l(n){return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(a,{...n}),(0,u.jsx)(d,{...n})]})}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[98],{1723:(n,e,s)=>{s.r(e),s.d(e,{default:()=>l});s(6540);var r=s(5500);function o(n,e){return`docs-${n}-${e}`}var t=s(3025),c=s(2831),i=s(1463),u=s(4848);function a(n){const{version:e}=n;return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(i.A,{version:e.version,tag:o(e.pluginId,e.version)}),(0,u.jsx)(r.be,{children:e.noIndex&&(0,u.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})]})}function d(n){const{version:e,route:s}=n;return(0,u.jsx)(r.e3,{className:e.className,children:(0,u.jsx)(t.n,{version:e,children:(0,c.v)(s.routes)})})}function l(n){return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(a,{...n}),(0,u.jsx)(d,{...n})]})}}}]);
\ No newline at end of file
diff --git a/assets/js/a94703ab.dd58fc5e.js b/assets/js/a94703ab.dd58fc5e.js
new file mode 100644
index 000000000..301acfcf9
--- /dev/null
+++ b/assets/js/a94703ab.dd58fc5e.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[48],{1377:(e,t,n)=>{n.r(t),n.d(t,{default:()=>pe});var a=n(6540),o=n(4164),i=n(5500),s=n(7559),r=n(6972),c=n(609),l=n(1312),d=n(3104),u=n(5062);const m={backToTopButton:"backToTopButton_sjWU",backToTopButtonShow:"backToTopButtonShow_xfvO"};var b=n(4848);function h(){const{shown:e,scrollToTop:t}=function({threshold:e}){const[t,n]=(0,a.useState)(!1),o=(0,a.useRef)(!1),{startScroll:i,cancelScroll:s}=(0,d.gk)();return(0,d.Mq)(({scrollY:t},a)=>{const i=a?.scrollY;i&&(o.current?o.current=!1:t>=i?(s(),n(!1)):t{e.location.hash&&(o.current=!0,n(!1))}),{shown:t,scrollToTop:()=>i(0)}}({threshold:300});return(0,b.jsx)("button",{"aria-label":(0,l.T)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,o.A)("clean-btn",s.G.common.backToTopButton,m.backToTopButton,e&&m.backToTopButtonShow),type:"button",onClick:t})}var p=n(3109),x=n(6347),f=n(4581),j=n(6342),v=n(3465);function _(e){return(0,b.jsx)("svg",{width:"20",height:"20","aria-hidden":"true",...e,children:(0,b.jsxs)("g",{fill:"#7a7a7a",children:[(0,b.jsx)("path",{d:"M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"}),(0,b.jsx)("path",{d:"M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"})]})})}const g="collapseSidebarButton_PEFL",A="collapseSidebarButtonIcon_kv0_";function C({onClick:e}){return(0,b.jsx)("button",{type:"button",title:(0,l.T)({id:"theme.docs.sidebar.collapseButtonTitle",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),"aria-label":(0,l.T)({id:"theme.docs.sidebar.collapseButtonAriaLabel",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),className:(0,o.A)("button button--secondary button--outline",g),onClick:e,children:(0,b.jsx)(_,{className:A})})}var k=n(5041),S=n(9532);const T=Symbol("EmptyContext"),N=a.createContext(T);function I({children:e}){const[t,n]=(0,a.useState)(null),o=(0,a.useMemo)(()=>({expandedItem:t,setExpandedItem:n}),[t]);return(0,b.jsx)(N.Provider,{value:o,children:e})}var y=n(1422),B=n(9169),w=n(8774),L=n(2303);function E({collapsed:e,categoryLabel:t,onClick:n}){return(0,b.jsx)("button",{"aria-label":e?(0,l.T)({id:"theme.DocSidebarItem.expandCategoryAriaLabel",message:"Expand sidebar category '{label}'",description:"The ARIA label to expand the sidebar category"},{label:t}):(0,l.T)({id:"theme.DocSidebarItem.collapseCategoryAriaLabel",message:"Collapse sidebar category '{label}'",description:"The ARIA label to collapse the sidebar category"},{label:t}),"aria-expanded":!e,type:"button",className:"clean-btn menu__caret",onClick:n})}function M({item:e,onItemClick:t,activePath:n,level:i,index:c,...l}){const{items:d,label:u,collapsible:m,className:h,href:p}=e,{docs:{sidebar:{autoCollapseCategories:x}}}=(0,j.p)(),f=function(e){const t=(0,L.A)();return(0,a.useMemo)(()=>e.href&&!e.linkUnlisted?e.href:!t&&e.collapsible?(0,r.Nr)(e):void 0,[e,t])}(e),v=(0,r.w8)(e,n),_=(0,B.ys)(p,n),{collapsed:g,setCollapsed:A}=(0,y.u)({initialState:()=>!!m&&(!v&&e.collapsed)}),{expandedItem:C,setExpandedItem:k}=function(){const e=(0,a.useContext)(N);if(e===T)throw new S.dV("DocSidebarItemsExpandedStateProvider");return e}(),I=(e=!g)=>{k(e?null:c),A(e)};return function({isActive:e,collapsed:t,updateCollapsed:n}){const o=(0,S.ZC)(e);(0,a.useEffect)(()=>{e&&!o&&t&&n(!1)},[e,o,t,n])}({isActive:v,collapsed:g,updateCollapsed:I}),(0,a.useEffect)(()=>{m&&null!=C&&C!==c&&x&&A(!0)},[m,C,c,A,x]),(0,b.jsxs)("li",{className:(0,o.A)(s.G.docs.docSidebarItemCategory,s.G.docs.docSidebarItemCategoryLevel(i),"menu__list-item",{"menu__list-item--collapsed":g},h),children:[(0,b.jsxs)("div",{className:(0,o.A)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":_}),children:[(0,b.jsx)(w.A,{className:(0,o.A)("menu__link",{"menu__link--sublist":m,"menu__link--sublist-caret":!p&&m,"menu__link--active":v}),onClick:m?n=>{t?.(e),p?_?(n.preventDefault(),I()):I(!1):(n.preventDefault(),I())}:()=>{t?.(e)},"aria-current":_?"page":void 0,role:m&&!p?"button":void 0,"aria-expanded":m&&!p?!g:void 0,href:m?f??"#":f,...l,children:u}),p&&m&&(0,b.jsx)(E,{collapsed:g,categoryLabel:u,onClick:e=>{e.preventDefault(),I()}})]}),(0,b.jsx)(y.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:g,children:(0,b.jsx)(V,{items:d,tabIndex:g?-1:0,onItemClick:t,activePath:n,level:i+1})})]})}var H=n(6654),G=n(3186);const P="menuExternalLink_NmtK";function R({item:e,onItemClick:t,activePath:n,level:a,index:i,...c}){const{href:l,label:d,className:u,autoAddBaseUrl:m}=e,h=(0,r.w8)(e,n),p=(0,H.A)(l);return(0,b.jsx)("li",{className:(0,o.A)(s.G.docs.docSidebarItemLink,s.G.docs.docSidebarItemLinkLevel(a),"menu__list-item",u),children:(0,b.jsxs)(w.A,{className:(0,o.A)("menu__link",!p&&P,{"menu__link--active":h}),autoAddBaseUrl:m,"aria-current":h?"page":void 0,to:l,...p&&{onClick:t?()=>t(e):void 0},...c,children:[d,!p&&(0,b.jsx)(G.A,{})]})},d)}const W="menuHtmlItem_M9Kj";function D({item:e,level:t,index:n}){const{value:a,defaultStyle:i,className:r}=e;return(0,b.jsx)("li",{className:(0,o.A)(s.G.docs.docSidebarItemLink,s.G.docs.docSidebarItemLinkLevel(t),i&&[W,"menu__list-item"],r),dangerouslySetInnerHTML:{__html:a}},n)}function F({item:e,...t}){switch(e.type){case"category":return(0,b.jsx)(M,{item:e,...t});case"html":return(0,b.jsx)(D,{item:e,...t});default:return(0,b.jsx)(R,{item:e,...t})}}function U({items:e,...t}){const n=(0,r.Y)(e,t.activePath);return(0,b.jsx)(I,{children:n.map((e,n)=>(0,b.jsx)(F,{item:e,index:n,...t},n))})}const V=(0,a.memo)(U),Y="menu_SIkG",K="menuWithAnnouncementBar_GW3s";function z({path:e,sidebar:t,className:n}){const i=function(){const{isActive:e}=(0,k.M)(),[t,n]=(0,a.useState)(e);return(0,d.Mq)(({scrollY:t})=>{e&&n(0===t)},[e]),e&&t}();return(0,b.jsx)("nav",{"aria-label":(0,l.T)({id:"theme.docs.sidebar.navAriaLabel",message:"Docs sidebar",description:"The ARIA label for the sidebar navigation"}),className:(0,o.A)("menu thin-scrollbar",Y,i&&K,n),children:(0,b.jsx)("ul",{className:(0,o.A)(s.G.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(V,{items:t,activePath:e,level:1})})})}const q="sidebar_njMd",O="sidebarWithHideableNavbar_wUlq",J="sidebarHidden_VK0M",Q="sidebarLogo_isFc";function X({path:e,sidebar:t,onCollapse:n,isHidden:a}){const{navbar:{hideOnScroll:i},docs:{sidebar:{hideable:s}}}=(0,j.p)();return(0,b.jsxs)("div",{className:(0,o.A)(q,i&&O,a&&J),children:[i&&(0,b.jsx)(v.A,{tabIndex:-1,className:Q}),(0,b.jsx)(z,{path:e,sidebar:t}),s&&(0,b.jsx)(C,{onClick:n})]})}const Z=a.memo(X);var $=n(5600),ee=n(2069);const te=({sidebar:e,path:t})=>{const n=(0,ee.M)();return(0,b.jsx)("ul",{className:(0,o.A)(s.G.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(V,{items:e,activePath:t,onItemClick:e=>{"category"===e.type&&e.href&&n.toggle(),"link"===e.type&&n.toggle()},level:1})})};function ne(e){return(0,b.jsx)($.GX,{component:te,props:e})}const ae=a.memo(ne);function oe(e){const t=(0,f.l)(),n="desktop"===t||"ssr"===t,a="mobile"===t;return(0,b.jsxs)(b.Fragment,{children:[n&&(0,b.jsx)(Z,{...e}),a&&(0,b.jsx)(ae,{...e})]})}const ie={expandButton:"expandButton_TmdG",expandButtonIcon:"expandButtonIcon_i1dp"};function se({toggleSidebar:e}){return(0,b.jsx)("div",{className:ie.expandButton,title:(0,l.T)({id:"theme.docs.sidebar.expandButtonTitle",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),"aria-label":(0,l.T)({id:"theme.docs.sidebar.expandButtonAriaLabel",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),tabIndex:0,role:"button",onKeyDown:e,onClick:e,children:(0,b.jsx)(_,{className:ie.expandButtonIcon})})}const re={docSidebarContainer:"docSidebarContainer_YfHR",docSidebarContainerHidden:"docSidebarContainerHidden_DPk8",sidebarViewport:"sidebarViewport_aRkj"};function ce({children:e}){const t=(0,c.t)();return(0,b.jsx)(a.Fragment,{children:e},t?.name??"noSidebar")}function le({sidebar:e,hiddenSidebarContainer:t,setHiddenSidebarContainer:n}){const{pathname:i}=(0,x.zy)(),[r,c]=(0,a.useState)(!1),l=(0,a.useCallback)(()=>{r&&c(!1),!r&&(0,p.O)()&&c(!0),n(e=>!e)},[n,r]);return(0,b.jsx)("aside",{className:(0,o.A)(s.G.docs.docSidebarContainer,re.docSidebarContainer,t&&re.docSidebarContainerHidden),onTransitionEnd:e=>{e.currentTarget.classList.contains(re.docSidebarContainer)&&t&&c(!0)},children:(0,b.jsx)(ce,{children:(0,b.jsxs)("div",{className:(0,o.A)(re.sidebarViewport,r&&re.sidebarViewportHidden),children:[(0,b.jsx)(oe,{sidebar:e,path:i,onCollapse:l,isHidden:r}),r&&(0,b.jsx)(se,{toggleSidebar:l})]})})})}const de={docMainContainer:"docMainContainer_TBSr",docMainContainerEnhanced:"docMainContainerEnhanced_lQrH",docItemWrapperEnhanced:"docItemWrapperEnhanced_JWYK"};function ue({hiddenSidebarContainer:e,children:t}){const n=(0,c.t)();return(0,b.jsx)("main",{className:(0,o.A)(de.docMainContainer,(e||!n)&&de.docMainContainerEnhanced),children:(0,b.jsx)("div",{className:(0,o.A)("container padding-top--md padding-bottom--lg",de.docItemWrapper,e&&de.docItemWrapperEnhanced),children:t})})}const me={docRoot:"docRoot_UBD9",docsWrapper:"docsWrapper_hBAB"};function be({children:e}){const t=(0,c.t)(),[n,o]=(0,a.useState)(!1);return(0,b.jsxs)("div",{className:me.docsWrapper,children:[(0,b.jsx)(h,{}),(0,b.jsxs)("div",{className:me.docRoot,children:[t&&(0,b.jsx)(le,{sidebar:t.items,hiddenSidebarContainer:n,setHiddenSidebarContainer:o}),(0,b.jsx)(ue,{hiddenSidebarContainer:n,children:e})]})]})}var he=n(3363);function pe(e){const t=(0,r.B5)(e);if(!t)return(0,b.jsx)(he.A,{});const{docElement:n,sidebarName:a,sidebarItems:l}=t;return(0,b.jsx)(i.e3,{className:(0,o.A)(s.G.page.docsDocPage),children:(0,b.jsx)(c.V,{name:a,items:l,children:(0,b.jsx)(be,{children:n})})})}},3363:(e,t,n)=>{n.d(t,{A:()=>r});n(6540);var a=n(4164),o=n(1312),i=n(1107),s=n(4848);function r({className:e}){return(0,s.jsx)("main",{className:(0,a.A)("container margin-vert--xl",e),children:(0,s.jsx)("div",{className:"row",children:(0,s.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,s.jsx)(i.A,{as:"h1",className:"hero__title",children:(0,s.jsx)(o.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}}}]);
\ No newline at end of file
diff --git a/assets/js/a94703ab.eb6e7047.js b/assets/js/a94703ab.eb6e7047.js
deleted file mode 100644
index a926ac42c..000000000
--- a/assets/js/a94703ab.eb6e7047.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[48],{1841:(e,t,n)=>{n.r(t),n.d(t,{default:()=>pe});var a=n(6540),o=n(4164),i=n(1769),s=n(204),l=n(3751),r=n(2306),c=n(539),d=n(5627),u=n(7685);const m={backToTopButton:"backToTopButton_sjWU",backToTopButtonShow:"backToTopButtonShow_xfvO"};var b=n(4848);function h(){const{shown:e,scrollToTop:t}=function(e){let{threshold:t}=e;const[n,o]=(0,a.useState)(!1),i=(0,a.useRef)(!1),{startScroll:s,cancelScroll:l}=(0,d.gk)();return(0,d.Mq)(((e,n)=>{let{scrollY:a}=e;const s=n?.scrollY;s&&(i.current?i.current=!1:a>=s?(l(),o(!1)):a{e.location.hash&&(i.current=!0,o(!1))})),{shown:n,scrollToTop:()=>s(0)}}({threshold:300});return(0,b.jsx)("button",{"aria-label":(0,c.T)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,o.A)("clean-btn",s.G.common.backToTopButton,m.backToTopButton,e&&m.backToTopButtonShow),type:"button",onClick:t})}var p=n(4924),x=n(6347),f=n(6682),j=n(3115),v=n(2862);function _(e){return(0,b.jsx)("svg",{width:"20",height:"20","aria-hidden":"true",...e,children:(0,b.jsxs)("g",{fill:"#7a7a7a",children:[(0,b.jsx)("path",{d:"M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"}),(0,b.jsx)("path",{d:"M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"})]})})}const g="collapseSidebarButton_PEFL",A="collapseSidebarButtonIcon_kv0_";function C(e){let{onClick:t}=e;return(0,b.jsx)("button",{type:"button",title:(0,c.T)({id:"theme.docs.sidebar.collapseButtonTitle",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),"aria-label":(0,c.T)({id:"theme.docs.sidebar.collapseButtonAriaLabel",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),className:(0,o.A)("button button--secondary button--outline",g),onClick:t,children:(0,b.jsx)(_,{className:A})})}var k=n(3380),S=n(6849);const T=Symbol("EmptyContext"),N=a.createContext(T);function I(e){let{children:t}=e;const[n,o]=(0,a.useState)(null),i=(0,a.useMemo)((()=>({expandedItem:n,setExpandedItem:o})),[n]);return(0,b.jsx)(N.Provider,{value:i,children:t})}var y=n(3535),B=n(214),w=n(6289),L=n(9136);function E(e){let{collapsed:t,categoryLabel:n,onClick:a}=e;return(0,b.jsx)("button",{"aria-label":t?(0,c.T)({id:"theme.DocSidebarItem.expandCategoryAriaLabel",message:"Expand sidebar category '{label}'",description:"The ARIA label to expand the sidebar category"},{label:n}):(0,c.T)({id:"theme.DocSidebarItem.collapseCategoryAriaLabel",message:"Collapse sidebar category '{label}'",description:"The ARIA label to collapse the sidebar category"},{label:n}),"aria-expanded":!t,type:"button",className:"clean-btn menu__caret",onClick:a})}function M(e){let{item:t,onItemClick:n,activePath:i,level:r,index:c,...d}=e;const{items:u,label:m,collapsible:h,className:p,href:x}=t,{docs:{sidebar:{autoCollapseCategories:f}}}=(0,j.p)(),v=function(e){const t=(0,L.A)();return(0,a.useMemo)((()=>e.href&&!e.linkUnlisted?e.href:!t&&e.collapsible?(0,l.Nr)(e):void 0),[e,t])}(t),_=(0,l.w8)(t,i),g=(0,B.ys)(x,i),{collapsed:A,setCollapsed:C}=(0,y.u)({initialState:()=>!!h&&(!_&&t.collapsed)}),{expandedItem:k,setExpandedItem:I}=function(){const e=(0,a.useContext)(N);if(e===T)throw new S.dV("DocSidebarItemsExpandedStateProvider");return e}(),M=function(e){void 0===e&&(e=!A),I(e?null:c),C(e)};return function(e){let{isActive:t,collapsed:n,updateCollapsed:o}=e;const i=(0,S.ZC)(t);(0,a.useEffect)((()=>{t&&!i&&n&&o(!1)}),[t,i,n,o])}({isActive:_,collapsed:A,updateCollapsed:M}),(0,a.useEffect)((()=>{h&&null!=k&&k!==c&&f&&C(!0)}),[h,k,c,C,f]),(0,b.jsxs)("li",{className:(0,o.A)(s.G.docs.docSidebarItemCategory,s.G.docs.docSidebarItemCategoryLevel(r),"menu__list-item",{"menu__list-item--collapsed":A},p),children:[(0,b.jsxs)("div",{className:(0,o.A)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":g}),children:[(0,b.jsx)(w.A,{className:(0,o.A)("menu__link",{"menu__link--sublist":h,"menu__link--sublist-caret":!x&&h,"menu__link--active":_}),onClick:h?e=>{n?.(t),x?M(!1):(e.preventDefault(),M())}:()=>{n?.(t)},"aria-current":g?"page":void 0,role:h&&!x?"button":void 0,"aria-expanded":h&&!x?!A:void 0,href:h?v??"#":v,...d,children:m}),x&&h&&(0,b.jsx)(E,{collapsed:A,categoryLabel:m,onClick:e=>{e.preventDefault(),M()}})]}),(0,b.jsx)(y.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:A,children:(0,b.jsx)(V,{items:u,tabIndex:A?-1:0,onItemClick:n,activePath:i,level:r+1})})]})}var H=n(2887),G=n(5891);const P="menuExternalLink_NmtK";function R(e){let{item:t,onItemClick:n,activePath:a,level:i,index:r,...c}=e;const{href:d,label:u,className:m,autoAddBaseUrl:h}=t,p=(0,l.w8)(t,a),x=(0,H.A)(d);return(0,b.jsx)("li",{className:(0,o.A)(s.G.docs.docSidebarItemLink,s.G.docs.docSidebarItemLinkLevel(i),"menu__list-item",m),children:(0,b.jsxs)(w.A,{className:(0,o.A)("menu__link",!x&&P,{"menu__link--active":p}),autoAddBaseUrl:h,"aria-current":p?"page":void 0,to:d,...x&&{onClick:n?()=>n(t):void 0},...c,children:[u,!x&&(0,b.jsx)(G.A,{})]})},u)}const W="menuHtmlItem_M9Kj";function D(e){let{item:t,level:n,index:a}=e;const{value:i,defaultStyle:l,className:r}=t;return(0,b.jsx)("li",{className:(0,o.A)(s.G.docs.docSidebarItemLink,s.G.docs.docSidebarItemLinkLevel(n),l&&[W,"menu__list-item"],r),dangerouslySetInnerHTML:{__html:i}},a)}function F(e){let{item:t,...n}=e;switch(t.type){case"category":return(0,b.jsx)(M,{item:t,...n});case"html":return(0,b.jsx)(D,{item:t,...n});default:return(0,b.jsx)(R,{item:t,...n})}}function U(e){let{items:t,...n}=e;const a=(0,l.Y)(t,n.activePath);return(0,b.jsx)(I,{children:a.map(((e,t)=>(0,b.jsx)(F,{item:e,index:t,...n},t)))})}const V=(0,a.memo)(U),Y="menu_SIkG",K="menuWithAnnouncementBar_GW3s";function z(e){let{path:t,sidebar:n,className:i}=e;const l=function(){const{isActive:e}=(0,k.M)(),[t,n]=(0,a.useState)(e);return(0,d.Mq)((t=>{let{scrollY:a}=t;e&&n(0===a)}),[e]),e&&t}();return(0,b.jsx)("nav",{"aria-label":(0,c.T)({id:"theme.docs.sidebar.navAriaLabel",message:"Docs sidebar",description:"The ARIA label for the sidebar navigation"}),className:(0,o.A)("menu thin-scrollbar",Y,l&&K,i),children:(0,b.jsx)("ul",{className:(0,o.A)(s.G.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(V,{items:n,activePath:t,level:1})})})}const q="sidebar_njMd",O="sidebarWithHideableNavbar_wUlq",J="sidebarHidden_VK0M",Q="sidebarLogo_isFc";function X(e){let{path:t,sidebar:n,onCollapse:a,isHidden:i}=e;const{navbar:{hideOnScroll:s},docs:{sidebar:{hideable:l}}}=(0,j.p)();return(0,b.jsxs)("div",{className:(0,o.A)(q,s&&O,i&&J),children:[s&&(0,b.jsx)(v.A,{tabIndex:-1,className:Q}),(0,b.jsx)(z,{path:t,sidebar:n}),l&&(0,b.jsx)(C,{onClick:a})]})}const Z=a.memo(X);var $=n(3065),ee=n(5528);const te=e=>{let{sidebar:t,path:n}=e;const a=(0,ee.M)();return(0,b.jsx)("ul",{className:(0,o.A)(s.G.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(V,{items:t,activePath:n,onItemClick:e=>{"category"===e.type&&e.href&&a.toggle(),"link"===e.type&&a.toggle()},level:1})})};function ne(e){return(0,b.jsx)($.GX,{component:te,props:e})}const ae=a.memo(ne);function oe(e){const t=(0,f.l)(),n="desktop"===t||"ssr"===t,a="mobile"===t;return(0,b.jsxs)(b.Fragment,{children:[n&&(0,b.jsx)(Z,{...e}),a&&(0,b.jsx)(ae,{...e})]})}const ie={expandButton:"expandButton_TmdG",expandButtonIcon:"expandButtonIcon_i1dp"};function se(e){let{toggleSidebar:t}=e;return(0,b.jsx)("div",{className:ie.expandButton,title:(0,c.T)({id:"theme.docs.sidebar.expandButtonTitle",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),"aria-label":(0,c.T)({id:"theme.docs.sidebar.expandButtonAriaLabel",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),tabIndex:0,role:"button",onKeyDown:t,onClick:t,children:(0,b.jsx)(_,{className:ie.expandButtonIcon})})}const le={docSidebarContainer:"docSidebarContainer_YfHR",docSidebarContainerHidden:"docSidebarContainerHidden_DPk8",sidebarViewport:"sidebarViewport_aRkj"};function re(e){let{children:t}=e;const n=(0,r.t)();return(0,b.jsx)(a.Fragment,{children:t},n?.name??"noSidebar")}function ce(e){let{sidebar:t,hiddenSidebarContainer:n,setHiddenSidebarContainer:i}=e;const{pathname:l}=(0,x.zy)(),[r,c]=(0,a.useState)(!1),d=(0,a.useCallback)((()=>{r&&c(!1),!r&&(0,p.O)()&&c(!0),i((e=>!e))}),[i,r]);return(0,b.jsx)("aside",{className:(0,o.A)(s.G.docs.docSidebarContainer,le.docSidebarContainer,n&&le.docSidebarContainerHidden),onTransitionEnd:e=>{e.currentTarget.classList.contains(le.docSidebarContainer)&&n&&c(!0)},children:(0,b.jsx)(re,{children:(0,b.jsxs)("div",{className:(0,o.A)(le.sidebarViewport,r&&le.sidebarViewportHidden),children:[(0,b.jsx)(oe,{sidebar:t,path:l,onCollapse:d,isHidden:r}),r&&(0,b.jsx)(se,{toggleSidebar:d})]})})})}const de={docMainContainer:"docMainContainer_TBSr",docMainContainerEnhanced:"docMainContainerEnhanced_lQrH",docItemWrapperEnhanced:"docItemWrapperEnhanced_JWYK"};function ue(e){let{hiddenSidebarContainer:t,children:n}=e;const a=(0,r.t)();return(0,b.jsx)("main",{className:(0,o.A)(de.docMainContainer,(t||!a)&&de.docMainContainerEnhanced),children:(0,b.jsx)("div",{className:(0,o.A)("container padding-top--md padding-bottom--lg",de.docItemWrapper,t&&de.docItemWrapperEnhanced),children:n})})}const me={docRoot:"docRoot_UBD9",docsWrapper:"docsWrapper_hBAB"};function be(e){let{children:t}=e;const n=(0,r.t)(),[o,i]=(0,a.useState)(!1);return(0,b.jsxs)("div",{className:me.docsWrapper,children:[(0,b.jsx)(h,{}),(0,b.jsxs)("div",{className:me.docRoot,children:[n&&(0,b.jsx)(ce,{sidebar:n.items,hiddenSidebarContainer:o,setHiddenSidebarContainer:i}),(0,b.jsx)(ue,{hiddenSidebarContainer:o,children:t})]})]})}var he=n(5932);function pe(e){const t=(0,l.B5)(e);if(!t)return(0,b.jsx)(he.A,{});const{docElement:n,sidebarName:a,sidebarItems:c}=t;return(0,b.jsx)(i.e3,{className:(0,o.A)(s.G.page.docsDocPage),children:(0,b.jsx)(r.V,{name:a,items:c,children:(0,b.jsx)(be,{children:n})})})}},5932:(e,t,n)=>{n.d(t,{A:()=>l});n(6540);var a=n(4164),o=n(539),i=n(9303),s=n(4848);function l(e){let{className:t}=e;return(0,s.jsx)("main",{className:(0,a.A)("container margin-vert--xl",t),children:(0,s.jsx)("div",{className:"row",children:(0,s.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,s.jsx)(i.A,{as:"h1",className:"hero__title",children:(0,s.jsx)(o.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}}}]);
\ No newline at end of file
diff --git a/assets/js/a9cd8699.55617fe2.js b/assets/js/a9cd8699.55617fe2.js
deleted file mode 100644
index 275dd38fb..000000000
--- a/assets/js/a9cd8699.55617fe2.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[648],{2299:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>c,contentTitle:()=>d,default:()=>h,frontMatter:()=>s,metadata:()=>o,toc:()=>a});const o=JSON.parse('{"id":"build-images/configuration","title":"Configuration","description":"Komodo just needs a bit of information in order to build your image.","source":"@site/docs/build-images/configuration.md","sourceDirName":"build-images","slug":"/build-images/configuration","permalink":"/docs/build-images/configuration","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/build-images/configuration.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Building Images","permalink":"/docs/build-images"},"next":{"title":"Pre-build command","permalink":"/docs/build-images/pre-build"}}');var t=n(4848),r=n(8453);const s={},d="Configuration",c={},a=[{value:"Provider configuration",id:"provider-configuration",level:3},{value:"Repo configuration",id:"repo-configuration",level:3},{value:"Docker build configuration",id:"docker-build-configuration",level:3},{value:"Image registry",id:"image-registry",level:3},{value:"Adding build args",id:"adding-build-args",level:3},{value:"Adding build secrets",id:"adding-build-secrets",level:3}];function l(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h3:"h3",header:"header",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"configuration",children:"Configuration"})}),"\n",(0,t.jsx)(i.p,{children:"Komodo just needs a bit of information in order to build your image."}),"\n",(0,t.jsx)(i.h3,{id:"provider-configuration",children:"Provider configuration"}),"\n",(0,t.jsxs)(i.p,{children:["Komodo supports cloning repos over http/s, from any provider that supports cloning private repos using ",(0,t.jsx)(i.code,{children:"git clone https://@git-provider.net//"}),"."]}),"\n",(0,t.jsxs)(i.p,{children:["Accounts / access tokens can be configured in either the ",(0,t.jsx)(i.a,{href:"/docs/setup/advanced#mount-a-config-file",children:"core config"}),"\nor in the ",(0,t.jsx)(i.a,{href:"/docs/connect-servers#manual-install-steps---binaries",children:"periphery config"}),"."]}),"\n",(0,t.jsx)(i.h3,{id:"repo-configuration",children:"Repo configuration"}),"\n",(0,t.jsxs)(i.p,{children:["To specify the git repo to build, just give it the name of the repo and the branch under ",(0,t.jsx)(i.em,{children:"repo config"}),". The name is given like ",(0,t.jsx)(i.code,{children:"moghtech/komodo"}),", it includes the username / organization that owns the repo."]}),"\n",(0,t.jsx)(i.p,{children:"Many repos are private, in this case an access token is needed by the building server.\nIt can either come from a provider defined in the core configuration,\nor in the periphery configuration of the building server."}),"\n",(0,t.jsx)(i.h3,{id:"docker-build-configuration",children:"Docker build configuration"}),"\n",(0,t.jsxs)(i.p,{children:["In order to docker build, Komodo just needs to know the build directory and the path of the Dockerfile relative to the repo, you can configure these in the ",(0,t.jsx)(i.em,{children:"build config"})," section."]}),"\n",(0,t.jsxs)(i.p,{children:["If the build directory is the root of the repository, you pass the build path as ",(0,t.jsx)(i.code,{children:"."}),'. If the build directory is some folder of the repo, just pass the name of the the folder. Do not pass the preceding "/". for example ',(0,t.jsx)(i.code,{children:"build/directory"})]}),"\n",(0,t.jsxs)(i.p,{children:["The dockerfile's path is given relative to the build directory. So if your build directory is ",(0,t.jsx)(i.code,{children:"build/directory"})," and the dockerfile is in ",(0,t.jsx)(i.code,{children:"build/directory/Dockerfile.example"}),", you give the dockerfile path simply as ",(0,t.jsx)(i.code,{children:"Dockerfile.example"}),"."]}),"\n",(0,t.jsx)(i.h3,{id:"image-registry",children:"Image registry"}),"\n",(0,t.jsx)(i.p,{children:"Komodo supports pushing to any docker registry.\nAny of the accounts that are specified in config for the specific registry, between the core config and builder, will be available to use for authentication against the registry.\nAdditionally, allowed organizations on the docker registry can be specified on the core config and attached to builds.\nDoing so will cause the images to be published under the organization's namespace rather than the account's."}),"\n",(0,t.jsx)(i.p,{children:"When connecting a build to a deployments, the default behavior is for the deployment to inherit the registry configuration from the build.\nIn cases where that account isn't available to the deployment, another account can be chosen in the deployment config."}),"\n",(0,t.jsx)(i.admonition,{type:"note",children:(0,t.jsxs)(i.p,{children:["In order to publish to the Github Container Registry, your Github access token must be given the ",(0,t.jsx)(i.code,{children:"write:packages"})," permission.\nSee the Github docs ",(0,t.jsx)(i.a,{href:"https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry#authenticating-with-a-personal-access-token-classic",children:"here"}),"."]})}),"\n",(0,t.jsx)(i.h3,{id:"adding-build-args",children:"Adding build args"}),"\n",(0,t.jsxs)(i.p,{children:["The Dockerfile may make use of ",(0,t.jsx)(i.a,{href:"https://docs.docker.com/engine/reference/builder/#arg",children:"build args"}),". Build args can be passed using the gui by navigating to the ",(0,t.jsx)(i.code,{children:"Build Args"})," tab in the config. They are passed in the menu just like in the would in a .env file:"]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:"BUILD_ARG1=some_value\nBUILD_ARG2=some_other_value\n"})}),"\n",(0,t.jsxs)(i.p,{children:["Note that these values are visible in the final image using ",(0,t.jsx)(i.code,{children:"docker history"}),", so shouldn't be used to pass build time secrets. Use ",(0,t.jsx)(i.a,{href:"https://docs.docker.com/engine/reference/builder/#run---mounttypesecret",children:"secret mounts"})," for this instead."]}),"\n",(0,t.jsx)(i.h3,{id:"adding-build-secrets",children:"Adding build secrets"}),"\n",(0,t.jsxs)(i.p,{children:["The Dockerfile may also make use of ",(0,t.jsx)(i.a,{href:"https://docs.docker.com/build/building/secrets",children:"build secrets"}),"."]}),"\n",(0,t.jsx)(i.p,{children:"They are configured in the GUI the same way as build args. The values passed here can be used in RUN commands in the Dockerfile:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:"RUN --mount=type=secret,id=SECRET_KEY \\\n SECRET_KEY=$(cat /run/secrets/SECRET_KEY) ...\n"})}),"\n",(0,t.jsxs)(i.p,{children:["These values will not be visible with ",(0,t.jsx)(i.code,{children:"docker history"})," command."]})]})}function h(e={}){const{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>s,x:()=>d});var o=n(6540);const t={},r=o.createContext(t);function s(e){const i=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function d(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),o.createElement(r.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/ada4fe9a.a84fa910.js b/assets/js/ada4fe9a.a84fa910.js
new file mode 100644
index 000000000..edaa4d23c
--- /dev/null
+++ b/assets/js/ada4fe9a.a84fa910.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[774],{4252:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>i,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"resources/procedures","title":"Procedures and Actions","description":"For orchestrations involving multiple resources and executions,","source":"@site/docs/resources/procedures.md","sourceDirName":"resources","slug":"/resources/procedures","permalink":"/docs/resources/procedures","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/resources/procedures.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Variables and Secrets","permalink":"/docs/resources/variables"},"next":{"title":"Sync Resources","permalink":"/docs/resources/sync-resources"}}');var r=o(4848),c=o(8453);const t={},a="Procedures and Actions",i={},d=[{value:"Procedures",id:"procedures",level:2},{value:"Batch Executions",id:"batch-executions",level:3},{value:"TOML Example",id:"toml-example",level:3},{value:"Actions",id:"actions",level:2}];function l(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",strong:"strong",...(0,c.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"procedures-and-actions",children:"Procedures and Actions"})}),"\n",(0,r.jsxs)(n.p,{children:["For orchestrations involving multiple resources and executions,\nKomodo offers the ",(0,r.jsx)(n.code,{children:"Procedure"})," and ",(0,r.jsx)(n.code,{children:"Action"})," resource types."]}),"\n",(0,r.jsx)(n.h2,{id:"procedures",children:"Procedures"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"Procedures"})," are compositions of many executions, such as ",(0,r.jsx)(n.code,{children:"RunBuild"})," and ",(0,r.jsx)(n.code,{children:"DeployStack"}),".\nThe executions are grouped into a series of ",(0,r.jsx)(n.code,{children:"Stages"}),", where each ",(0,r.jsx)(n.code,{children:"Stage"})," contains one or more executions\nto run ",(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.em,{children:"all at once"})}),". The Procedure will wait until all of the executions in a ",(0,r.jsx)(n.code,{children:"Stage"})," are complete before moving\non to the next stage. In short, the executions in a ",(0,r.jsx)(n.code,{children:"Stage"})," are run ",(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.em,{children:"in parallel"})}),", and the stages themselves are\nexecuted ",(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.em,{children:"sequentially"})}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"batch-executions",children:"Batch Executions"}),"\n",(0,r.jsxs)(n.p,{children:["Many executions have a ",(0,r.jsx)(n.code,{children:"Batch"})," version you can select, for example ",(0,r.jsx)(n.a,{href:"https://docs.rs/komodo_client/latest/komodo_client/api/execute/struct.BatchDeployStackIfChanged.html",children:(0,r.jsx)(n.strong,{children:"BatchDeployStackIfChanged"})}),". With this, you can match multiple Stacks by name\nusing ",(0,r.jsx)(n.a,{href:"https://docs.rs/wildcard/latest/wildcard",children:(0,r.jsx)(n.strong,{children:"wildcard syntax"})})," and ",(0,r.jsx)(n.a,{href:"https://docs.rs/regex/latest/regex",children:(0,r.jsx)(n.strong,{children:"regex"})}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"toml-example",children:"TOML Example"}),"\n",(0,r.jsxs)(n.p,{children:["Like all Resources, ",(0,r.jsx)(n.code,{children:"Procedures"})," have a TOML representation, and can be managed in ",(0,r.jsx)(n.code,{children:"ResourceSyncs"}),"."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-toml",children:'[[procedure]]\nname = "pull-deploy"\ndescription = "Pulls stack-repo, deploys stacks"\n\n[[procedure.config.stage]]\nname = "Pull Repo"\nexecutions = [\n { execution.type = "PullRepo", execution.params.pattern = "stack-repo" },\n]\n\n[[procedure.config.stage]]\nname = "Deploy if changed"\nexecutions = [\n # Uses the Batch version, witch matches many stacks by pattern\n # This one matches all stacks prefixed with `foo-` (wildcard) and `bar-` (regex).\n { execution.type = "BatchDeployStackIfChanged", execution.params.pattern = "foo-* , \\\\^bar-.*$\\\\" },\n]\n'})}),"\n",(0,r.jsx)(n.h2,{id:"actions",children:"Actions"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"Actions"})," give users the power of Typescript to write calls to the Komodo API."]}),"\n",(0,r.jsxs)(n.p,{children:["For example, an ",(0,r.jsx)(n.code,{children:"Action"})," script like this will align the versions and branches of many ",(0,r.jsx)(n.code,{children:"Builds"}),"."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-ts",children:'const VERSION = "1.16.5";\nconst BRANCH = "dev/" + VERSION;\nconst APPS = ["core", "periphery"];\nconst ARCHS = ["x86", "aarch64"];\n\nawait komodo.write("UpdateVariableValue", {\n name: "KOMODO_DEV_VERSION",\n value: VERSION,\n});\nconsole.log("Updated KOMODO_DEV_VERSION to " + VERSION);\n\nfor (const app of APPS) {\n for (const arch of ARCHS) {\n const name = `komodo-${app}-${arch}-dev`;\n await komodo.write("UpdateBuild", {\n id: name,\n config: {\n version: VERSION as any,\n branch: BRANCH,\n },\n });\n console.log(\n `Updated Build ${name} to version ${VERSION} and branch ${BRANCH}`,\n );\n }\n}\n\nfor (const arch of ARCHS) {\n const name = `periphery-bin-${arch}-dev`;\n await komodo.write("UpdateRepo", {\n id: name,\n config: {\n branch: BRANCH,\n },\n });\n console.log(`Updated Repo ${name} to branch ${BRANCH}`);\n}\n'})})]})}function h(e={}){const{wrapper:n}={...(0,c.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>t,x:()=>a});var s=o(6540);const r={},c=s.createContext(r);function t(e){const n=s.useContext(c);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),s.createElement(c.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/b19e82df.682ff52e.js b/assets/js/b19e82df.682ff52e.js
deleted file mode 100644
index c03d61850..000000000
--- a/assets/js/b19e82df.682ff52e.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[842],{850:(e,t,o)=>{o.d(t,{A:()=>s});var n=o(6540),r=o(8069),a=o(4848);function s(e){let{url:t,language:o,title:s}=e;const[l,u]=(0,n.useState)("");return(0,n.useEffect)((()=>{!async function(e,t){const o=await fetch(e);t(await o.text())}(t,u)}),[]),(0,a.jsx)(r.A,{title:s??t,language:o,showLineNumbers:!0,children:l})}},4673:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>u,default:()=>m,frontMatter:()=>l,metadata:()=>n,toc:()=>i});const n=JSON.parse('{"id":"setup/mongo","title":"MongoDB","description":"MongoDB is the traditional database for Komodo.","source":"@site/docs/setup/mongo.mdx","sourceDirName":"setup","slug":"/setup/mongo","permalink":"/docs/setup/mongo","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/setup/mongo.mdx","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Setup Komodo","permalink":"/docs/setup/"},"next":{"title":"FerretDB","permalink":"/docs/setup/ferretdb"}}');var r=o(4848),a=o(8453),s=o(6049);const l={},u="MongoDB",c={},i=[];function d(e){const t={a:"a",code:"code",h1:"h1",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"mongodb",children:"MongoDB"})}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.a,{href:"https://www.mongodb.com",children:(0,r.jsx)(t.strong,{children:"MongoDB"})})," is the traditional database for Komodo.\nKomodo Core communicates with the database using the MongoDB driver."]}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsxs)(t.li,{children:["Copy ",(0,r.jsx)(t.code,{children:"komodo/mongo.compose.yaml"})," and ",(0,r.jsx)(t.code,{children:"komodo/compose.env"})," to your host:"]}),"\n"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"wget -P komodo https://raw.githubusercontent.com/moghtech/komodo/main/compose/mongo.compose.yaml && \\\n wget -P komodo https://raw.githubusercontent.com/moghtech/komodo/main/compose/compose.env\n"})}),"\n",(0,r.jsxs)(t.ol,{start:"2",children:["\n",(0,r.jsxs)(t.li,{children:["Edit the variables in ",(0,r.jsx)(t.code,{children:"komodo/compose.env"}),"."]}),"\n",(0,r.jsx)(t.li,{children:"Deploy:"}),"\n"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"docker compose -p komodo -f komodo/mongo.compose.yaml --env-file komodo/compose.env up -d\n"})}),"\n","\n",(0,r.jsx)(s.A,{file_name:"mongo.compose.yaml"})]})}function m(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},6049:(e,t,o)=>{o.d(t,{A:()=>A});var n=o(6540),r=o(850),a=o(4164),s=o(5627),l=o(6347),u=o(372),c=o(604),i=o(1861),d=o(8749);function m(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:o}=e;return(0,n.useMemo)((()=>{const e=t??function(e){return m(e).map((e=>{let{props:{value:t,label:o,attributes:n,default:r}}=e;return{value:t,label:o,attributes:n,default:r}}))}(o);return function(e){const t=(0,i.XI)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,o])}function p(e){let{value:t,tabValues:o}=e;return o.some((e=>e.value===t))}function b(e){let{queryString:t=!1,groupId:o}=e;const r=(0,l.W6)(),a=function(e){let{queryString:t=!1,groupId:o}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!o)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return o??null}({queryString:t,groupId:o});return[(0,c.aZ)(a),(0,n.useCallback)((e=>{if(!a)return;const t=new URLSearchParams(r.location.search);t.set(a,e),r.replace({...r.location,search:t.toString()})}),[a,r])]}function f(e){const{defaultValue:t,queryString:o=!1,groupId:r}=e,a=h(e),[s,l]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:o}=e;if(0===o.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:o}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${o.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=o.find((e=>e.default))??o[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:a}))),[c,i]=b({queryString:o,groupId:r}),[m,f]=function(e){let{groupId:t}=e;const o=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,a]=(0,d.Dv)(o);return[r,(0,n.useCallback)((e=>{o&&a.set(e)}),[o,a])]}({groupId:r}),g=(()=>{const e=c??m;return p({value:e,tabValues:a})?e:null})();(0,u.A)((()=>{g&&l(g)}),[g]);return{selectedValue:s,selectValue:(0,n.useCallback)((e=>{if(!p({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);l(e),i(e),f(e)}),[i,f,a]),tabValues:a}}var g=o(9136);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=o(4848);function j(e){let{className:t,block:o,selectedValue:n,selectValue:r,tabValues:l}=e;const u=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.a_)(),i=e=>{const t=e.currentTarget,o=u.indexOf(t),a=l[o].value;a!==n&&(c(t),r(a))},d=e=>{let t=null;switch(e.key){case"Enter":i(e);break;case"ArrowRight":{const o=u.indexOf(e.currentTarget)+1;t=u[o]??u[0];break}case"ArrowLeft":{const o=u.indexOf(e.currentTarget)-1;t=u[o]??u[u.length-1];break}}t?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":o},t),children:l.map((e=>{let{value:t,label:o,attributes:r}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:n===t?0:-1,"aria-selected":n===t,ref:e=>{u.push(e)},onKeyDown:d,onClick:i,...r,className:(0,a.A)("tabs__item",v.tabItem,r?.className,{"tabs__item--active":n===t}),children:o??t},t)}))})}function w(e){let{lazy:t,children:o,selectedValue:r}=e;const s=(Array.isArray(o)?o:[o]).filter(Boolean);if(t){const e=s.find((e=>e.props.value===r));return e?(0,n.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:s.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==r})))})}function k(e){const t=f(e);return(0,x.jsxs)("div",{className:(0,a.A)("tabs-container",v.tabList),children:[(0,x.jsx)(j,{...t,...e}),(0,x.jsx)(w,{...t,...e})]})}function y(e){const t=(0,g.A)();return(0,x.jsx)(k,{...e,children:m(e.children)},String(t))}const I={tabItem:"tabItem_Ymn6"};function V(e){let{children:t,hidden:o,className:n}=e;return(0,x.jsx)("div",{role:"tabpanel",className:(0,a.A)(I.tabItem,n),hidden:o,children:t})}function A(e){let{file_name:t}=e;return(0,x.jsxs)(y,{children:[(0,x.jsx)(V,{value:t,children:(0,x.jsx)(r.A,{title:`https://github.com/moghtech/komodo/blob/main/compose/${t}`,url:`https://raw.githubusercontent.com/moghtech/komodo/main/compose/${t}`,language:"yaml"})}),(0,x.jsx)(V,{value:"compose.env",children:(0,x.jsx)(r.A,{title:"https://github.com/moghtech/komodo/blob/main/compose/compose.env",url:"https://raw.githubusercontent.com/moghtech/komodo/main/compose/compose.env",language:"bash"})})]})}}}]);
\ No newline at end of file
diff --git a/assets/js/b19e82df.d89492b9.js b/assets/js/b19e82df.d89492b9.js
new file mode 100644
index 000000000..f4c9a3550
--- /dev/null
+++ b/assets/js/b19e82df.d89492b9.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[842],{5241:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>u,default:()=>m,frontMatter:()=>l,metadata:()=>n,toc:()=>i});const n=JSON.parse('{"id":"setup/mongo","title":"MongoDB","description":"MongoDB is the standard database for Komodo.","source":"@site/docs/setup/mongo.mdx","sourceDirName":"setup","slug":"/setup/mongo","permalink":"/docs/setup/mongo","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/setup/mongo.mdx","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Setup Komodo Core","permalink":"/docs/setup/"},"next":{"title":"FerretDB","permalink":"/docs/setup/ferretdb"}}');var r=o(4848),a=o(8453),s=o(5627);const l={},u="MongoDB",c={},i=[];function d(e){const t={a:"a",code:"code",h1:"h1",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"mongodb",children:"MongoDB"})}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.a,{href:"https://www.mongodb.com",children:(0,r.jsx)(t.strong,{children:"MongoDB"})})," is the standard database for Komodo.\nKomodo Core communicates with the database using the MongoDB driver."]}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsxs)(t.li,{children:["Copy ",(0,r.jsx)(t.code,{children:"komodo/mongo.compose.yaml"})," and ",(0,r.jsx)(t.code,{children:"komodo/compose.env"})," to your host:"]}),"\n"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"wget -P komodo https://raw.githubusercontent.com/moghtech/komodo/main/compose/mongo.compose.yaml && \\\n wget -P komodo https://raw.githubusercontent.com/moghtech/komodo/main/compose/compose.env\n"})}),"\n",(0,r.jsxs)(t.ol,{start:"2",children:["\n",(0,r.jsxs)(t.li,{children:["Edit the variables in ",(0,r.jsx)(t.code,{children:"komodo/compose.env"}),"."]}),"\n",(0,r.jsx)(t.li,{children:"Deploy using command:"}),"\n"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"docker compose -p komodo -f komodo/mongo.compose.yaml --env-file komodo/compose.env up -d\n"})}),"\n","\n",(0,r.jsx)(s.A,{file_name:"mongo.compose.yaml"})]})}function m(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},5627:(e,t,o)=>{o.d(t,{A:()=>A});var n=o(6540),r=o(6695),a=o(4164),s=o(3104),l=o(6347),u=o(205),c=o(7485),i=o(1682),d=o(679);function m(e){return n.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function h(e){const{values:t,children:o}=e;return(0,n.useMemo)(()=>{const e=t??function(e){return m(e).map(({props:{value:e,label:t,attributes:o,default:n}})=>({value:e,label:t,attributes:o,default:n}))}(o);return function(e){const t=(0,i.XI)(e,(e,t)=>e.value===t.value);if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[t,o])}function p({value:e,tabValues:t}){return t.some(t=>t.value===e)}function b({queryString:e=!1,groupId:t}){const o=(0,l.W6)(),r=function({queryString:e=!1,groupId:t}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:e,groupId:t});return[(0,c.aZ)(r),(0,n.useCallback)(e=>{if(!r)return;const t=new URLSearchParams(o.location.search);t.set(r,e),o.replace({...o.location,search:t.toString()})},[r,o])]}function g(e){const{defaultValue:t,queryString:o=!1,groupId:r}=e,a=h(e),[s,l]=(0,n.useState)(()=>function({defaultValue:e,tabValues:t}){if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!p({value:e,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${t.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const o=t.find(e=>e.default)??t[0];if(!o)throw new Error("Unexpected error: 0 tabValues");return o.value}({defaultValue:t,tabValues:a})),[c,i]=b({queryString:o,groupId:r}),[m,g]=function({groupId:e}){const t=function(e){return e?`docusaurus.tab.${e}`:null}(e),[o,r]=(0,d.Dv)(t);return[o,(0,n.useCallback)(e=>{t&&r.set(e)},[t,r])]}({groupId:r}),f=(()=>{const e=c??m;return p({value:e,tabValues:a})?e:null})();(0,u.A)(()=>{f&&l(f)},[f]);return{selectedValue:s,selectValue:(0,n.useCallback)(e=>{if(!p({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);l(e),i(e),g(e)},[i,g,a]),tabValues:a}}var f=o(2303);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=o(4848);function j({className:e,block:t,selectedValue:o,selectValue:n,tabValues:r}){const l=[],{blockElementScrollPositionUntilNextRender:u}=(0,s.a_)(),c=e=>{const t=e.currentTarget,a=l.indexOf(t),s=r[a].value;s!==o&&(u(t),n(s))},i=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const o=l.indexOf(e.currentTarget)+1;t=l[o]??l[0];break}case"ArrowLeft":{const o=l.indexOf(e.currentTarget)-1;t=l[o]??l[l.length-1];break}}t?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":t},e),children:r.map(({value:e,label:t,attributes:n})=>(0,x.jsx)("li",{role:"tab",tabIndex:o===e?0:-1,"aria-selected":o===e,ref:e=>{l.push(e)},onKeyDown:i,onClick:c,...n,className:(0,a.A)("tabs__item",v.tabItem,n?.className,{"tabs__item--active":o===e}),children:t??e},e))})}function w({lazy:e,children:t,selectedValue:o}){const r=(Array.isArray(t)?t:[t]).filter(Boolean);if(e){const e=r.find(e=>e.props.value===o);return e?(0,n.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:r.map((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==o}))})}function k(e){const t=g(e);return(0,x.jsxs)("div",{className:(0,a.A)("tabs-container",v.tabList),children:[(0,x.jsx)(j,{...t,...e}),(0,x.jsx)(w,{...t,...e})]})}function y(e){const t=(0,f.A)();return(0,x.jsx)(k,{...e,children:m(e.children)},String(t))}const I={tabItem:"tabItem_Ymn6"};function V({children:e,hidden:t,className:o}){return(0,x.jsx)("div",{role:"tabpanel",className:(0,a.A)(I.tabItem,o),hidden:t,children:e})}function A({file_name:e}){return(0,x.jsxs)(y,{children:[(0,x.jsx)(V,{value:e,children:(0,x.jsx)(r.A,{title:`https://github.com/moghtech/komodo/blob/main/compose/${e}`,url:`https://raw.githubusercontent.com/moghtech/komodo/main/compose/${e}`,language:"yaml"})}),(0,x.jsx)(V,{value:"compose.env",children:(0,x.jsx)(r.A,{title:"https://github.com/moghtech/komodo/blob/main/compose/compose.env",url:"https://raw.githubusercontent.com/moghtech/komodo/main/compose/compose.env",language:"bash"})})]})}},6695:(e,t,o)=>{o.d(t,{A:()=>s});var n=o(6540),r=o(1028),a=o(4848);function s({url:e,language:t,title:o}){const[s,l]=(0,n.useState)("");return(0,n.useEffect)(()=>{!async function(e,t){const o=await fetch(e);t(await o.text())}(e,l)},[]),(0,a.jsx)(r.A,{title:o??e,language:t,showLineNumbers:!0,children:s})}}}]);
\ No newline at end of file
diff --git a/assets/js/b9324a1b.4d8b8921.js b/assets/js/b9324a1b.4d8b8921.js
new file mode 100644
index 000000000..3d88e1f8c
--- /dev/null
+++ b/assets/js/b9324a1b.4d8b8921.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[39],{3021:(e,t,s)=>{s.d(t,{A:()=>b});var n=s(6540),r=s(4164),o=s(6972),c=s(8774),i=s(4586);const a=["zero","one","two","few","many","other"];function l(e){return a.filter(t=>e.includes(t))}const u={locale:"en",pluralForms:l(["one","other"]),select:e=>1===e?"one":"other"};function d(){const{i18n:{currentLocale:e}}=(0,i.A)();return(0,n.useMemo)(()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:l(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),u}},[e])}function m(){const e=d();return{selectMessage:(t,s)=>function(e,t,s){const n=e.split("|");if(1===n.length)return n[0];n.length>s.pluralForms.length&&console.error(`For locale=${s.locale}, a maximum of ${s.pluralForms.length} plural forms are expected (${s.pluralForms.join(",")}), but the message contains ${n.length}: ${e}`);const r=s.select(t),o=s.pluralForms.indexOf(r);return n[Math.min(o,n.length-1)]}(s,t,e)}}var h=s(6654),f=s(1312),p=s(1107);const x={cardContainer:"cardContainer_fWXF",cardTitle:"cardTitle_rnsV",cardDescription:"cardDescription_PWke"};var g=s(4848);function y({className:e,href:t,children:s}){return(0,g.jsx)(c.A,{href:t,className:(0,r.A)("card padding--lg",x.cardContainer,e),children:s})}function j({className:e,href:t,icon:s,title:n,description:o}){return(0,g.jsxs)(y,{href:t,className:e,children:[(0,g.jsxs)(p.A,{as:"h2",className:(0,r.A)("text--truncate",x.cardTitle),title:n,children:[s," ",n]}),o&&(0,g.jsx)("p",{className:(0,r.A)("text--truncate",x.cardDescription),title:o,children:o})]})}function N({item:e}){const t=(0,o.Nr)(e),s=function(){const{selectMessage:e}=m();return t=>e(t,(0,f.T)({message:"1 item|{count} items",id:"theme.docs.DocCard.categoryDescription.plurals",description:"The default description for a category card in the generated index about how many items this category includes"},{count:t}))}();return t?(0,g.jsx)(j,{className:e.className,href:t,icon:"\ud83d\uddc3\ufe0f",title:e.label,description:e.description??s(e.items.length)}):null}function C({item:e}){const t=(0,h.A)(e.href)?"\ud83d\udcc4\ufe0f":"\ud83d\udd17",s=(0,o.cC)(e.docId??void 0);return(0,g.jsx)(j,{className:e.className,href:e.href,icon:t,title:e.label,description:e.description??s?.description})}function w({item:e}){switch(e.type){case"link":return(0,g.jsx)(C,{item:e});case"category":return(0,g.jsx)(N,{item:e});default:throw new Error(`unknown item type ${JSON.stringify(e)}`)}}const k={docCardListItem:"docCardListItem_W1sv"};function v({className:e}){const t=(0,o.a4)();return(0,g.jsx)(b,{items:t,className:e})}function A({item:e}){return(0,g.jsx)("article",{className:(0,r.A)(k.docCardListItem,"col col--6"),children:(0,g.jsx)(w,{item:e})})}function b(e){const{items:t,className:s}=e;if(!t)return(0,g.jsx)(v,{...e});const n=(0,o.d1)(t);return(0,g.jsx)("section",{className:(0,r.A)("row",s),children:n.map((e,t)=>(0,g.jsx)(A,{item:e},t))})}},7350:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>m,frontMatter:()=>i,metadata:()=>n,toc:()=>u});const n=JSON.parse('{"id":"ecosystem/index","title":"Ecosystem","description":"","source":"@site/docs/ecosystem/index.mdx","sourceDirName":"ecosystem","slug":"/ecosystem","permalink":"/docs/ecosystem","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/ecosystem/index.mdx","tags":[],"version":"current","frontMatter":{"slug":"/ecosystem"},"sidebar":"docs","previous":{"title":"Permissioning","permalink":"/docs/resources/permissioning"},"next":{"title":"Komodo CLI","permalink":"/docs/ecosystem/cli"}}');var r=s(4848),o=s(8453),c=s(3021);const i={slug:"/ecosystem"},a="Ecosystem",l={},u=[];function d(e){const t={h1:"h1",header:"header",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"ecosystem",children:"Ecosystem"})}),"\n","\n",(0,r.jsx)(c.A,{})]})}function m(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>c,x:()=>i});var n=s(6540);const r={},o=n.createContext(r);function c(e){const t=n.useContext(o);return n.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:c(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/c54f4afd.3a18edbd.js b/assets/js/c54f4afd.3a18edbd.js
deleted file mode 100644
index e7336b3db..000000000
--- a/assets/js/c54f4afd.3a18edbd.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[846],{8453:(e,s,n)=>{n.d(s,{R:()=>l,x:()=>c});var r=n(6540);const i={},o=r.createContext(i);function l(e){const s=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),r.createElement(o.Provider,{value:s},e.children)}},9373:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>t,contentTitle:()=>c,default:()=>h,frontMatter:()=>l,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"permissioning","title":"Permissioning","description":"Komodo has a granular, layer-based permissioning system to provide non-admin users access only to intended Resources.","source":"@site/docs/permissioning.md","sourceDirName":".","slug":"/permissioning","permalink":"/docs/permissioning","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/permissioning.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Procedures and Actions","permalink":"/docs/procedures"},"next":{"title":"Sync Resources","permalink":"/docs/sync-resources"}}');var i=n(4848),o=n(8453);const l={},c="Permissioning",t={},d=[{value:"User Groups",id:"user-groups",level:2},{value:"Permission Levels",id:"permission-levels",level:2},{value:"Specific Permissions",id:"specific-permissions",level:2},{value:"Permissioning by Resource Type",id:"permissioning-by-resource-type",level:2},{value:"Administration",id:"administration",level:2}];function a(e){const s={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"permissioning",children:"Permissioning"})}),"\n",(0,i.jsx)(s.p,{children:"Komodo has a granular, layer-based permissioning system to provide non-admin users access only to intended Resources."}),"\n",(0,i.jsx)(s.h2,{id:"user-groups",children:"User Groups"}),"\n",(0,i.jsxs)(s.p,{children:["While Komodo can assign permissions to specific users directly, it is recommended to instead ",(0,i.jsx)(s.strong,{children:"create User Groups and assign permissions to them"}),", as if they were a user."]}),"\n",(0,i.jsxs)(s.p,{children:["Users can then be ",(0,i.jsx)(s.strong,{children:"added to multiple User Groups"})," and they ",(0,i.jsx)(s.strong,{children:"inherit the group's permissions"}),", similar to linux permissions.\nThere is also an ",(0,i.jsx)(s.code,{children:"Everyone"})," mode for User Groups, if this is enabled then ",(0,i.jsx)(s.strong,{children:"all users implicitly gain the groups permissions"}),"."]}),"\n",(0,i.jsxs)(s.p,{children:["For permissioning at scale, users can define ",(0,i.jsx)(s.a,{href:"/docs/sync-resources#user-group",children:(0,i.jsx)(s.strong,{children:"User Groups in Resource Syncs"})}),"."]}),"\n",(0,i.jsx)(s.h2,{id:"permission-levels",children:"Permission Levels"}),"\n",(0,i.jsx)(s.p,{children:"There are 4 permission levels a user / group can be given on a Resource:"}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"None"}),". The user will not have any access to the resource. The user ",(0,i.jsx)(s.strong,{children:"will not see it in the GUI, and it will not show up if the user queries the Komodo API directly"}),". All attempts to view or update the resource will be blocked. This is the default for non-admins, unless using ",(0,i.jsx)(s.code,{children:"KOMODO_TRANSPARENT_MODE=true"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Read"}),". This is the first permission level that grants any access. It will enable the user to ",(0,i.jsx)(s.strong,{children:"see the resource in the GUI and read the configuration"}),". Any attempts to update configuration or trigger any action ",(0,i.jsx)(s.strong,{children:"will be blocked"}),". Using ",(0,i.jsx)(s.code,{children:"KOMODO_TRANSPARENT_MODE=true"})," will make this level the base level on all resources, for all users."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Execute"}),". This level will allow the user to execute actions on the resource, ",(0,i.jsx)(s.strong,{children:"like send a build command"})," or ",(0,i.jsx)(s.strong,{children:"trigger a redeploy"}),". The user will still be blocked from updating configuration on the resource."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Write"}),". The user has full config write access to the resource, ",(0,i.jsx)(s.strong,{children:"they can execute any actions, update the configuration, and delete the resource"}),"."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"specific-permissions",children:"Specific Permissions"}),"\n",(0,i.jsx)(s.p,{children:"Permission levels alone are not quite enough to provide granular access control.\nSome features are additionally gated behind a specific permission for that feature."}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:(0,i.jsx)(s.code,{children:"Logs"})}),": User can retrieve docker / docker compose logs on the associated resource.","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Valid on ",(0,i.jsx)(s.code,{children:"Server"}),", ",(0,i.jsx)(s.code,{children:"Stack"}),", ",(0,i.jsx)(s.code,{children:"Deployment"}),"."]}),"\n",(0,i.jsx)(s.li,{children:"For admins wanting this permission by default for all users with read permissions, see below on default user groups."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:(0,i.jsx)(s.code,{children:"Inspect"})}),': User can "inspect" docker containers.',"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Valid on ",(0,i.jsx)(s.code,{children:"Server"}),", ",(0,i.jsx)(s.code,{children:"Stack"}),", ",(0,i.jsx)(s.code,{children:"Deployment"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"On Servers"}),": Access to this api will expose all container environments on the given server,\nand can easily lead to secrets being leaked to unintended users if not protected."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:(0,i.jsx)(s.code,{children:"Terminal"})}),": User can access the associated resource's terminal.","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["If given on a ",(0,i.jsx)(s.code,{children:"Server"}),", this allows server level terminal access, and all container exec priviledges (Including attached ",(0,i.jsx)(s.code,{children:"Stacks"})," / ",(0,i.jsx)(s.code,{children:"Deployments"}),")."]}),"\n",(0,i.jsxs)(s.li,{children:["If given on a ",(0,i.jsx)(s.code,{children:"Stack"})," or ",(0,i.jsx)(s.code,{children:"Deployment"}),", this allows container exec terminal (even without ",(0,i.jsx)(s.code,{children:"Terminal"})," on ",(0,i.jsx)(s.code,{children:"Server"}),")."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:(0,i.jsx)(s.code,{children:"Attach"})}),': User can "attach" ',(0,i.jsx)(s.em,{children:"other resources"})," to the resource.","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["If given on a ",(0,i.jsx)(s.code,{children:"Server"}),", allows users to attach ",(0,i.jsx)(s.code,{children:"Stacks"}),", ",(0,i.jsx)(s.code,{children:"Deployments"}),", ",(0,i.jsx)(s.code,{children:"Repos"}),", and ",(0,i.jsx)(s.code,{children:"Builders"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["If given on a ",(0,i.jsx)(s.code,{children:"Builder"}),", allows users to attach ",(0,i.jsx)(s.code,{children:"Builds"})," and ",(0,i.jsx)(s.code,{children:"Repos"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["If given on a ",(0,i.jsx)(s.code,{children:"Build"}),", allows users to attach it to ",(0,i.jsx)(s.code,{children:"Deployments"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["If given on a ",(0,i.jsx)(s.code,{children:"Repo"}),", allows users to attach it to ",(0,i.jsx)(s.code,{children:"Stacks"}),", ",(0,i.jsx)(s.code,{children:"Builds"}),", and ",(0,i.jsx)(s.code,{children:"Resource Syncs"}),"."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:(0,i.jsx)(s.code,{children:"Processes"})}),": User can retrieve the full running process list on the ",(0,i.jsx)(s.code,{children:"Server"}),"."]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"permissioning-by-resource-type",children:"Permissioning by Resource Type"}),"\n",(0,i.jsx)(s.p,{children:"Users or User Groups can be given a base permission level on all Resources of a particular type, such as Stack.\nIn TOML form, this looks like:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-toml",children:'[[user_group]]\nname = "groupo"\nusers = ["mbecker20", "karamvirsingh98"]\nall.Build = "Execute" # <- Group members can run all builds (but not update config),\nall.Stack = { level = "Read", specific = ["Logs"] } # <- And see all Stacks / logs (no deploy / update, inspect, or terminal access).\n'})}),"\n",(0,i.jsx)(s.p,{children:"A user / group can still be given a greater permission level on select resources:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-toml",children:'permissions = [\n # Grant addition specific permission (Logs are already granted above)\n { target.type = "Stack", target.id = "my-stack", level = "Execute", specific = ["Inspect", "Terminal"] },\n # Use regex to match multiple resources, for example give john execute on all of their Stacks\n { target.type = "Stack", target.id = "\\\\^john-(.+)$\\\\", level = "Execute" },\n]\n'})}),"\n",(0,i.jsx)(s.h2,{id:"administration",children:"Administration"}),"\n",(0,i.jsxs)(s.p,{children:["Users can be given Admin priviledges by a ",(0,i.jsx)(s.code,{children:"Super Admin"})," (only the first user is given this status, set with ",(0,i.jsx)(s.code,{children:"super_admin: true"}),' on a User document in database). Super admins will see the "Make Admin" button when on a User page ',(0,i.jsx)(s.code,{children:"/users/${user_id}"}),"."]}),"\n",(0,i.jsx)(s.p,{children:"These users have unrestricted access to all Komodo Resources. Additionally, these users can update other (non-admin) user's permissions on resources."}),"\n",(0,i.jsxs)(s.p,{children:["Komodo admins are responsible for managing user accounts as well. When a user logs into Komodo for the first time, they will not immediately be granted access (this can changed with ",(0,i.jsx)(s.code,{children:"KOMODO_ENABLE_NEW_USERS=true"}),"). An admin must first ",(0,i.jsx)(s.strong,{children:"enable"})," the user, which can be done from the ",(0,i.jsx)(s.code,{children:"Users"})," tab on ",(0,i.jsx)(s.code,{children:"Settings"})," page. Users can also be ",(0,i.jsx)(s.strong,{children:"disabled"})," by an admin at any time, which blocks all their access to the GUI and API."]}),"\n",(0,i.jsx)(s.p,{children:"Users also have some configurable global permissions, these are:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"create server permission"}),"\n",(0,i.jsx)(s.li,{children:"create build permission"}),"\n"]}),"\n",(0,i.jsx)(s.p,{children:"Only users with these permissions (as well as admins) can add additional servers to Komodo, and can create additional builds, respectively."})]})}function h(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}}}]);
\ No newline at end of file
diff --git a/assets/js/c65a6c17.d6b59eeb.js b/assets/js/c65a6c17.d6b59eeb.js
deleted file mode 100644
index 4e0db2249..000000000
--- a/assets/js/c65a6c17.d6b59eeb.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[543],{7322:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>d,default:()=>u,frontMatter:()=>r,metadata:()=>o,toc:()=>l});const o=JSON.parse('{"id":"build-images/pre-build","title":"Pre-build command","description":"Sometimes a command needs to be run before running `docker build`, you can configure this in the pre build section.","source":"@site/docs/build-images/pre-build.md","sourceDirName":"build-images","slug":"/build-images/pre-build","permalink":"/docs/build-images/pre-build","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/build-images/pre-build.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Configuration","permalink":"/docs/build-images/configuration"},"next":{"title":"Builders","permalink":"/docs/build-images/builders"}}');var s=i(4848),t=i(8453);const r={},d="Pre-build command",c={},l=[];function a(e){const n={code:"code",em:"em",h1:"h1",header:"header",p:"p",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"pre-build-command",children:"Pre-build command"})}),"\n",(0,s.jsxs)(n.p,{children:["Sometimes a command needs to be run before running ",(0,s.jsx)(n.code,{children:"docker build"}),", you can configure this in the ",(0,s.jsx)(n.em,{children:"pre build"})," section."]}),"\n",(0,s.jsxs)(n.p,{children:["There are two fields to pass for ",(0,s.jsx)(n.em,{children:"pre build"}),". the first is ",(0,s.jsx)(n.em,{children:"path"}),", which changes the working directory. To run the command in the root of the repo, just pass ",(0,s.jsx)(n.code,{children:"."}),". The second field is ",(0,s.jsx)(n.em,{children:"command"}),", this is the shell command to be executed after the repo is cloned."]}),"\n",(0,s.jsxs)(n.p,{children:["For example, say your repo had a folder in it called ",(0,s.jsx)(n.code,{children:"scripts"})," with a shell script ",(0,s.jsx)(n.code,{children:"on-clone.sh"}),". You would give ",(0,s.jsx)(n.em,{children:"path"})," as ",(0,s.jsx)(n.code,{children:"scripts"})," and command as ",(0,s.jsx)(n.code,{children:"sh on-clone.sh"}),". Or you could make ",(0,s.jsx)(n.em,{children:"path"})," just ",(0,s.jsx)(n.code,{children:"."})," and then the command would be ",(0,s.jsx)(n.code,{children:"sh scripts/on-clone.sh"}),". Either way works fine."]})]})}function u(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>d});var o=i(6540);const s={},t=o.createContext(s);function r(e){const n=o.useContext(t);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),o.createElement(t.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/c79bdf8e.dc48c77d.js b/assets/js/c79bdf8e.dc48c77d.js
new file mode 100644
index 000000000..3082d7d30
--- /dev/null
+++ b/assets/js/c79bdf8e.dc48c77d.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[847],{4817:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>i,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"setup/version-upgrades","title":"Version Upgrades","description":"Most version upgrades only require a redeployment of the Core container after pulling the latest version, and are fully backward compatible with the periphery clients, which may be updated later on as convenient. This is the default, and will be the case unless specifically mentioned in the version release notes.","source":"@site/docs/setup/version-upgrades.md","sourceDirName":"setup","slug":"/setup/version-upgrades","permalink":"/docs/setup/version-upgrades","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/setup/version-upgrades.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Advanced Configuration","permalink":"/docs/setup/advanced"},"next":{"title":"Resources","permalink":"/docs/resources/"}}');var r=n(4848),o=n(8453);const i={},a="Version Upgrades",c={},d=[];function l(e){const t={a:"a",h1:"h1",header:"header",p:"p",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"version-upgrades",children:"Version Upgrades"})}),"\n",(0,r.jsxs)(t.p,{children:["Most version upgrades only require a redeployment of the Core container after pulling the latest version, and are fully backward compatible with the periphery clients, which may be updated later on as convenient. This is the default, and will be the case unless specifically mentioned in the ",(0,r.jsx)(t.a,{href:"https://github.com/moghtech/komodo/releases",children:"version release notes"}),"."]}),"\n",(0,r.jsx)(t.p,{children:"Some Core API upgrades may change behavior such as building / cloning, and require updating the Periphery binaries to match the Core version before this functionality can be restored. This will be specifically mentioned in the release notes."})]})}function u(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>a});var s=n(6540);const r={},o=s.createContext(r);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(r):e.components||r:i(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/cd948886.42669bd3.js b/assets/js/cd948886.42669bd3.js
new file mode 100644
index 000000000..0b38ba545
--- /dev/null
+++ b/assets/js/cd948886.42669bd3.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[979],{8453:(e,s,n)=>{n.d(s,{R:()=>c,x:()=>l});var r=n(6540);const i={},o=r.createContext(i);function c(e){const s=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:c(e.components),r.createElement(o.Provider,{value:s},e.children)}},9992:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>t,contentTitle:()=>l,default:()=>h,frontMatter:()=>c,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"resources/index","title":"Resources","description":"Komodo is extendible through the Resource abstraction. Entities like Server, Deployment, and Stack are all Komodo Resources.","source":"@site/docs/resources/index.md","sourceDirName":"resources","slug":"/resources/","permalink":"/docs/resources/","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/resources/index.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Version Upgrades","permalink":"/docs/setup/version-upgrades"},"next":{"title":"Building Images","permalink":"/docs/build-images"}}');var i=n(4848),o=n(8453);const c={},l="Resources",t={},d=[{value:"Server",id:"server",level:2},{value:"Deployment",id:"deployment",level:2},{value:"Stack",id:"stack",level:2},{value:"Repo",id:"repo",level:2},{value:"Build",id:"build",level:2},{value:"Builder",id:"builder",level:2},{value:"Procedure",id:"procedure",level:2},{value:"Action",id:"action",level:2},{value:"Resource Sync",id:"resource-sync",level:2},{value:"Alerter",id:"alerter",level:2}];function a(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"resources",children:"Resources"})}),"\n",(0,i.jsxs)(s.p,{children:["Komodo is extendible through the ",(0,i.jsx)(s.strong,{children:"Resource"})," abstraction. Entities like ",(0,i.jsx)(s.code,{children:"Server"}),", ",(0,i.jsx)(s.code,{children:"Deployment"}),", and ",(0,i.jsx)(s.code,{children:"Stack"})," are all ",(0,i.jsx)(s.strong,{children:"Komodo Resources"}),"."]}),"\n",(0,i.jsxs)(s.p,{children:["All resources have common traits, such as a unique ",(0,i.jsx)(s.code,{children:"name"})," and ",(0,i.jsx)(s.code,{children:"id"})," amongst all other resources of the same resource type.\nAll resources can be assigned ",(0,i.jsx)(s.code,{children:"tags"}),", which can be used to group related resources."]}),"\n",(0,i.jsx)(s.admonition,{type:"note",children:(0,i.jsx)(s.p,{children:"Many resources need access to git repos / docker registries. There is an in-built token management system (managed in UI or in config file) to give resources access to credentials.\nAll resources which depend on git repos / docker registries are able to use these credentials to access private repos."})}),"\n",(0,i.jsx)(s.h2,{id:"server",children:(0,i.jsx)(s.a,{href:"setup/connect-servers",children:"Server"})}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Configure the connection to periphery agents."}),"\n",(0,i.jsx)(s.li,{children:"Set alerting thresholds."}),"\n",(0,i.jsxs)(s.li,{children:["Can be attached to by ",(0,i.jsx)(s.strong,{children:"Deployments"}),", ",(0,i.jsx)(s.strong,{children:"Stacks"}),", ",(0,i.jsx)(s.strong,{children:"Repos"}),", and ",(0,i.jsx)(s.strong,{children:"Builders"}),"."]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"deployment",children:(0,i.jsx)(s.a,{href:"/docs/resources/deploy-containers/",children:"Deployment"})}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Deploy a docker container on the attached Server."}),"\n",(0,i.jsxs)(s.li,{children:["Manage services at the container level, perform orchestration using ",(0,i.jsx)(s.strong,{children:"Procedures"})," and ",(0,i.jsx)(s.strong,{children:"ResourceSyncs"}),"."]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"stack",children:(0,i.jsx)(s.a,{href:"resources/docker-compose",children:"Stack"})}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Deploy with docker compose."}),"\n",(0,i.jsx)(s.li,{children:"Provide the compose file in UI, or move the files to a git repo and use a webhook for auto redeploy on push."}),"\n",(0,i.jsxs)(s.li,{children:["Supports composing multiple compose files using ",(0,i.jsx)(s.code,{children:"docker compose -f ... -f ..."}),"."]}),"\n",(0,i.jsx)(s.li,{children:"Pass environment variables usable within the compose file. Interpolate in app-wide variables / secrets."}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"repo",children:"Repo"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Put scripts in git repos, and run them on a Server, or using a Builder."}),"\n",(0,i.jsx)(s.li,{children:"Can build binaries, perform automation, really whatever you can think of."}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"build",children:(0,i.jsx)(s.a,{href:"/docs/build-images",children:"Build"})}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Build application source into docker images, and push them to the configured registry."}),"\n",(0,i.jsx)(s.li,{children:"The source can be any git repo containing a Dockerfile."}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"builder",children:(0,i.jsx)(s.a,{href:"resources/build-images/builders",children:"Builder"})}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Either points to a connected server, or holds configuration to launch a single-use AWS instance to build the image."}),"\n",(0,i.jsxs)(s.li,{children:["Can be attached to ",(0,i.jsx)(s.strong,{children:"Builds"})," and ",(0,i.jsx)(s.strong,{children:"Repos"}),"."]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"procedure",children:(0,i.jsx)(s.a,{href:"resources/procedures#procedures",children:"Procedure"})}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Compose many actions on other resource type, like ",(0,i.jsx)(s.code,{children:"RunBuild"})," or ",(0,i.jsx)(s.code,{children:"DeployStack"}),", and run it on button push (or with a webhook)."]}),"\n",(0,i.jsx)(s.li,{children:'Can run one or more actions in parallel "stages", and compose a series of parallel stages to run sequentially.'}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"action",children:(0,i.jsx)(s.a,{href:"resources/procedures#actions",children:"Action"})}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Write scripts calling the Komodo API in Typescript"}),"\n",(0,i.jsx)(s.li,{children:"Use a pre-initialized Komodo client within the script, no api keys necessary."}),"\n",(0,i.jsx)(s.li,{children:"Type aware in UI editor. Get suggestions and see in depth docs as you type."}),"\n",(0,i.jsxs)(s.li,{children:["The Typescript client is also ",(0,i.jsx)(s.a,{href:"https://www.npmjs.com/package/komodo_client",children:"published on NPM"}),"."]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"resource-sync",children:(0,i.jsx)(s.a,{href:"resources/sync-resources",children:"Resource Sync"})}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Orchestrate all your configuration declaratively by defining it in ",(0,i.jsx)(s.code,{children:"toml"})," files, which are checked into a git repo."]}),"\n",(0,i.jsxs)(s.li,{children:["Can deploy ",(0,i.jsx)(s.strong,{children:"Deployments"})," and ",(0,i.jsx)(s.strong,{children:"Stacks"})," if changes are suggested."]}),"\n",(0,i.jsxs)(s.li,{children:["Specify deploy ordering with ",(0,i.jsx)(s.code,{children:"after"})," array. (like docker compose ",(0,i.jsx)(s.code,{children:"depends_on"})," but can span across servers.)."]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"alerter",children:"Alerter"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Route alerts to various endpoints."}),"\n",(0,i.jsx)(s.li,{children:"Can configure rules on each Alerter, such as resource whitelist, blacklist, or alert type filter."}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}}}]);
\ No newline at end of file
diff --git a/assets/js/d92a3c43.df5df8e8.js b/assets/js/d92a3c43.df5df8e8.js
deleted file mode 100644
index 1244975bd..000000000
--- a/assets/js/d92a3c43.df5df8e8.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[864],{942:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>t,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"resources","title":"Resources","description":"Komodo is extendible through the Resource abstraction. Entities like Server, Deployment, and Stack are all Komodo Resources.","source":"@site/docs/resources.md","sourceDirName":".","slug":"/resources","permalink":"/docs/resources","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/resources.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"What is Komodo?","permalink":"/docs/intro"},"next":{"title":"Setup Komodo","permalink":"/docs/setup/"}}');var i=s(4848),o=s(8453);const t={},l="Resources",c={},d=[{value:"Server",id:"server",level:2},{value:"Deployment",id:"deployment",level:2},{value:"Stack",id:"stack",level:2},{value:"Repo",id:"repo",level:2},{value:"Build",id:"build",level:2},{value:"Builder",id:"builder",level:2},{value:"Procedure",id:"procedure",level:2},{value:"Action",id:"action",level:2},{value:"ResourceSync",id:"resourcesync",level:2},{value:"Alerter",id:"alerter",level:2}];function a(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"resources",children:"Resources"})}),"\n",(0,i.jsxs)(n.p,{children:["Komodo is extendible through the ",(0,i.jsx)(n.strong,{children:"Resource"})," abstraction. Entities like ",(0,i.jsx)(n.code,{children:"Server"}),", ",(0,i.jsx)(n.code,{children:"Deployment"}),", and ",(0,i.jsx)(n.code,{children:"Stack"})," are all ",(0,i.jsx)(n.strong,{children:"Komodo Resources"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["All resources have common traits, such as a unique ",(0,i.jsx)(n.code,{children:"name"})," and ",(0,i.jsx)(n.code,{children:"id"})," amongst all other resources of the same resource type.\nAll resources can be assigned ",(0,i.jsx)(n.code,{children:"tags"}),", which can be used to group related resources."]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"Many resources need access to git repos / docker registries. There is an in-built token management system (managed in UI or in config file) to give resources access to credentials.\nAll resources which depend on git repos / docker registries are able to use these credentials to access private repos."})}),"\n",(0,i.jsx)(n.h2,{id:"server",children:"Server"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Configure the connection to periphery agents."}),"\n",(0,i.jsx)(n.li,{children:"Set alerting thresholds."}),"\n",(0,i.jsxs)(n.li,{children:["Can be attached to by ",(0,i.jsx)(n.strong,{children:"Deployments"}),", ",(0,i.jsx)(n.strong,{children:"Stacks"}),", ",(0,i.jsx)(n.strong,{children:"Repos"}),", and ",(0,i.jsx)(n.strong,{children:"Builders"}),"."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"deployment",children:"Deployment"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Deploy a docker container on the attached Server."}),"\n",(0,i.jsxs)(n.li,{children:["Manage services at the container level, perform orchestration using ",(0,i.jsx)(n.strong,{children:"Procedures"})," and ",(0,i.jsx)(n.strong,{children:"ResourceSyncs"}),"."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"stack",children:"Stack"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Deploy with docker compose."}),"\n",(0,i.jsx)(n.li,{children:"Provide the compose file in UI, or move the files to a git repo and use a webhook for auto redeploy on push."}),"\n",(0,i.jsxs)(n.li,{children:["Supports composing multiple compose files using ",(0,i.jsx)(n.code,{children:"docker compose -f ... -f ..."}),"."]}),"\n",(0,i.jsx)(n.li,{children:"Pass environment variables usable within the compose file. Interpolate in app-wide variables / secrets."}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"repo",children:"Repo"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Put scripts in git repos, and run them on a Server, or using a Builder."}),"\n",(0,i.jsx)(n.li,{children:"Can build binaries, perform automation, really whatever you can think of."}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"build",children:"Build"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Build application source into docker images, and push them to the configured registry."}),"\n",(0,i.jsx)(n.li,{children:"The source can be any git repo containing a Dockerfile."}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"builder",children:"Builder"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Either points to a connected server, or holds configuration to launch a single-use AWS instance to build the image."}),"\n",(0,i.jsxs)(n.li,{children:["Can be attached to ",(0,i.jsx)(n.strong,{children:"Builds"})," and ",(0,i.jsx)(n.strong,{children:"Repos"}),"."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"procedure",children:"Procedure"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Compose many actions on other resource type, like ",(0,i.jsx)(n.code,{children:"RunBuild"})," or ",(0,i.jsx)(n.code,{children:"DeployStack"}),", and run it on button push (or with a webhook)."]}),"\n",(0,i.jsx)(n.li,{children:'Can run one or more actions in parallel "stages", and compose a series of parallel stages to run sequentially.'}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"action",children:"Action"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Write scripts calling the Komodo API in Typescript"}),"\n",(0,i.jsx)(n.li,{children:"Use a pre-initialized Komodo client within the script, no api keys necessary."}),"\n",(0,i.jsx)(n.li,{children:"Type aware in UI editor. Get suggestions and see in depth docs as you type."}),"\n",(0,i.jsxs)(n.li,{children:["The Typescript client is also ",(0,i.jsx)(n.a,{href:"https://www.npmjs.com/package/komodo_client",children:"published on NPM"}),"."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"resourcesync",children:"ResourceSync"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Orchestrate all your configuration declaratively by defining it in ",(0,i.jsx)(n.code,{children:"toml"})," files, which are checked into a git repo."]}),"\n",(0,i.jsxs)(n.li,{children:["Can deploy ",(0,i.jsx)(n.strong,{children:"Deployments"})," and ",(0,i.jsx)(n.strong,{children:"Stacks"})," if changes are suggested."]}),"\n",(0,i.jsxs)(n.li,{children:["Specify deploy ordering with ",(0,i.jsx)(n.code,{children:"after"})," array. (like docker compose ",(0,i.jsx)(n.code,{children:"depends_on"})," but can span across servers.)."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"alerter",children:"Alerter"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Route alerts to various endpoints."}),"\n",(0,i.jsx)(n.li,{children:"Can configure rules on each Alerter, such as resource whitelist, blacklist, or alert type filter."}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>t,x:()=>l});var r=s(6540);const i={},o=r.createContext(i);function t(e){const n=r.useContext(o);return r.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(i):e.components||i:t(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/ef1bbce5.764b97dc.js b/assets/js/ef1bbce5.764b97dc.js
deleted file mode 100644
index d078aaa46..000000000
--- a/assets/js/ef1bbce5.764b97dc.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[100],{1357:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"build-images/builders","title":"Builders","description":"A builder is a machine running the Komodo Periphery agent (and usually docker), which is able to handle a RunBuild / BuildRepo command from Komodo core. Any server connected to Komodo can be chosen as the builder for a build.","source":"@site/docs/build-images/builders.md","sourceDirName":"build-images","slug":"/build-images/builders","permalink":"/docs/build-images/builders","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/build-images/builders.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Pre-build command","permalink":"/docs/build-images/pre-build"},"next":{"title":"Image Versioning","permalink":"/docs/build-images/versioning"}}');var r=i(4848),s=i(8453);const o={},a="Builders",d={},c=[{value:"AWS builder",id:"aws-builder",level:2},{value:"Setup the instance",id:"setup-the-instance",level:3},{value:"Make an AMI from the instance",id:"make-an-ami-from-the-instance",level:3},{value:"Configure security groups / firewall",id:"configure-security-groups--firewall",level:3}];function l(e){const n={admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"builders",children:"Builders"})}),"\n",(0,r.jsx)(n.p,{children:"A builder is a machine running the Komodo Periphery agent (and usually docker), which is able to handle a RunBuild / BuildRepo command from Komodo core. Any server connected to Komodo can be chosen as the builder for a build."}),"\n",(0,r.jsx)(n.p,{children:"Building on a machine running production software is usually not a great idea, as this process can use a lot of system resources. It is better to start up a temporary cloud machine dedicated for the build, then shut it down when the build is finished. Komodo supports AWS EC2 for this task."}),"\n",(0,r.jsx)(n.h2,{id:"aws-builder",children:"AWS builder"}),"\n",(0,r.jsx)(n.p,{children:"Builders are now Komodo resources, and are managed via the core API / can be updated using the UI.\nTo use this feature, you need an AWS EC2 AMI with docker and Komodo Periphery configured to run on system start.\nOnce you create your builder and add the necessary configuration, it will be available to attach to builds."}),"\n",(0,r.jsx)(n.h3,{id:"setup-the-instance",children:"Setup the instance"}),"\n",(0,r.jsx)(n.p,{children:"Create an EC2 instance, and install Docker and Periphery on it."}),"\n",(0,r.jsx)(n.p,{children:"The following script is an example of installing Docker and Periphery onto a Ubuntu/Debian instance:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:"#!/bin/bash\napt update\napt upgrade -y\ncurl -fsSL https://get.docker.com | sh\nsystemctl enable docker.service\nsystemctl enable containerd.service\ncurl -sSL https://raw.githubusercontent.com/moghtech/komodo/main/scripts/setup-periphery.py | HOME=/root python3\nsystemctl enable periphery.service\n"})}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsx)(n.p,{children:'AWS provides a "user data" feature, which will run a provided script as root. The above can be used with AWS user data\nto provide a hands free setup.'})}),"\n",(0,r.jsx)(n.h3,{id:"make-an-ami-from-the-instance",children:"Make an AMI from the instance"}),"\n",(0,r.jsx)(n.p,{children:"Once the instance is up and running, ssh in and confirm Periphery is running using:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:"sudo systemctl status periphery.service\n"})}),"\n",(0,r.jsx)(n.p,{children:"If it is not, the install hasn't finished and you should wait a bit. It may take 5 minutes or more (all in updating / installing Docker, Periphery is just a 12 MB binary to download)."}),"\n",(0,r.jsxs)(n.p,{children:["Once Periphery is running, you can navigate to the instance in the AWS UI and choose ",(0,r.jsx)(n.code,{children:"Actions"})," -> ",(0,r.jsx)(n.code,{children:"Image and templates"})," -> ",(0,r.jsx)(n.code,{children:"Create image"}),". Just name the image and hit create."]}),"\n",(0,r.jsxs)(n.p,{children:["The AMI will provide a unique id starting with ",(0,r.jsx)(n.code,{children:"ami-"}),", use this with the builder configuration."]}),"\n",(0,r.jsx)(n.h3,{id:"configure-security-groups--firewall",children:"Configure security groups / firewall"}),"\n",(0,r.jsx)(n.p,{children:"The builders will need inbound access on port 8120 from Komodo Core, be sure to add a security group with this rule to the Builder configuration."})]})}function u(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>a});var t=i(6540);const r={},s=t.createContext(r);function o(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/ef526b88.5766f2a6.js b/assets/js/ef526b88.5766f2a6.js
deleted file mode 100644
index 9ffdf4318..000000000
--- a/assets/js/ef526b88.5766f2a6.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[995],{8453:(e,o,n)=>{n.d(o,{R:()=>s,x:()=>a});var t=n(6540);const i={},r=t.createContext(i);function s(e){const o=t.useContext(r);return t.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(i):e.components||i:s(e.components),t.createElement(r.Provider,{value:o},e.children)}},8550:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"deploy-containers/configuration","title":"Configuration","description":"Choose the docker image","source":"@site/docs/deploy-containers/configuration.md","sourceDirName":"deploy-containers","slug":"/deploy-containers/configuration","permalink":"/docs/deploy-containers/configuration","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/deploy-containers/configuration.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Deploy Containers","permalink":"/docs/deploy-containers/"},"next":{"title":"Container Management","permalink":"/docs/deploy-containers/lifetime-management"}}');var i=n(4848),r=n(8453);const s={},a="Configuration",c={},d=[{value:"Choose the docker image",id:"choose-the-docker-image",level:2},{value:"Attaching a Komodo build",id:"attaching-a-komodo-build",level:3},{value:"Using a custom image",id:"using-a-custom-image",level:3},{value:"Configuring the network",id:"configuring-the-network",level:2},{value:"Configuring restart behavior",id:"configuring-restart-behavior",level:2},{value:"Configuring environment variables",id:"configuring-environment-variables",level:2},{value:"Configuring volumes",id:"configuring-volumes",level:2},{value:"Extra args",id:"extra-args",level:2},{value:"Command",id:"command",level:2}];function l(e){const o={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.header,{children:(0,i.jsx)(o.h1,{id:"configuration",children:"Configuration"})}),"\n",(0,i.jsx)(o.h2,{id:"choose-the-docker-image",children:"Choose the docker image"}),"\n",(0,i.jsx)(o.p,{children:"There are two options to configure the docker image to deploy."}),"\n",(0,i.jsx)(o.h3,{id:"attaching-a-komodo-build",children:"Attaching a Komodo build"}),"\n",(0,i.jsx)(o.p,{children:"If the software you want to deploy is built by Komodo, you can attach the build directly to the deployment."}),"\n",(0,i.jsx)(o.p,{children:"By default, Komodo will deploy the latest available version of the build, or you can specify a specific version using the version dropdown."}),"\n",(0,i.jsx)(o.p,{children:"Also by default, Komodo will use the same docker account that is attached to the build in order to pull the image on the periphery server. If that account is not available on the server, you can specify another available account to use instead, this account just needs to have read access to the docker repository."}),"\n",(0,i.jsx)(o.h3,{id:"using-a-custom-image",children:"Using a custom image"}),"\n",(0,i.jsxs)(o.p,{children:["You can also manually specify an image name, like ",(0,i.jsx)(o.code,{children:"mongo"})," or ",(0,i.jsx)(o.code,{children:"ghcr.io/mbecker20/random_image:0.1.1"}),"."]}),"\n",(0,i.jsx)(o.p,{children:"If the image repository is private, you can still select an available docker account to use to pull the image."}),"\n",(0,i.jsx)(o.h2,{id:"configuring-the-network",children:"Configuring the network"}),"\n",(0,i.jsxs)(o.p,{children:["One feature of docker is that it allows for the creation of ",(0,i.jsx)(o.a,{href:"https://docs.docker.com/network/",children:"virtual networks between containers"}),". Komodo allows you to specify a docker virtual network to connect the container to, or to use the host system networking to bypass the docker virtual network."]}),"\n",(0,i.jsxs)(o.p,{children:["The default selection is ",(0,i.jsx)(o.code,{children:"host"}),", which bypasses the docker virtual network layer."]}),"\n",(0,i.jsx)(o.p,{children:"If you do select select a network other than host, you can specify port bindings with the GUI. For example, if you are running mongo (which defaults to port 27017), you could use the mapping:"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"27018 : 27017\n"})}),"\n",(0,i.jsxs)(o.p,{children:["In this case, you would access mongo from outside of the container on port ",(0,i.jsx)(o.code,{children:"27018"}),"."]}),"\n",(0,i.jsxs)(o.p,{children:["Note that this is not the only affect of using a network other than ",(0,i.jsx)(o.code,{children:"host"}),". For example, containers running on different networks can not communicate, and ones on the same network can not reach other containers on ",(0,i.jsx)(o.code,{children:"localhost"})," even when they are running on the same system. This behavior can be a bit confusing if you are not familiar with it, and it can be bypassed entirely by just using ",(0,i.jsx)(o.code,{children:"host"})," network."]}),"\n",(0,i.jsx)(o.h2,{id:"configuring-restart-behavior",children:"Configuring restart behavior"}),"\n",(0,i.jsxs)(o.p,{children:["Docker, like systemd, has a couple options for handling when a container exits. See ",(0,i.jsx)(o.a,{href:"https://docs.docker.com/config/containers/start-containers-automatically/",children:"docker restart policies"}),". Komodo allows you to select the appropriate restart behavior from these options."]}),"\n",(0,i.jsx)(o.h2,{id:"configuring-environment-variables",children:"Configuring environment variables"}),"\n",(0,i.jsx)(o.p,{children:"Komodo enables you to easily manage environment variables passed to the container.\nIn the GUI, navigate to the environment tab of the configuration on the deployment page."}),"\n",(0,i.jsxs)(o.p,{children:["You pass environment variables just as you would with a ",(0,i.jsx)(o.code,{children:".env"})," file:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"ENV_VAR_1=some_value\nENV_VAR_2=some_other_value\n"})}),"\n",(0,i.jsx)(o.h2,{id:"configuring-volumes",children:"Configuring volumes"}),"\n",(0,i.jsxs)(o.p,{children:["A docker container's filesystem is segregated from that of the host. However, it is still possible for a container to access system files and directories, this is accomplished by using ",(0,i.jsx)(o.a,{href:"https://docs.docker.com/storage/bind-mounts/",children:"bind mounts"}),"."]}),"\n",(0,i.jsxs)(o.p,{children:["Say your container needs to read a config file located on the system at ",(0,i.jsx)(o.code,{children:"/home/ubuntu/config.toml"}),". You can specify the bind mount to be:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"/home/ubuntu/config.toml : /config/config.toml\n"})}),"\n",(0,i.jsxs)(o.p,{children:["The first path is the one on the system, the second is the path in the container. Your application would then read the file at ",(0,i.jsx)(o.code,{children:"/config/config.toml"})," in order to load its contents."]}),"\n",(0,i.jsx)(o.p,{children:"These can be configured easily with the GUI in the 'volumes' card. You can configure as many bind mounts as you need."}),"\n",(0,i.jsx)(o.h2,{id:"extra-args",children:"Extra args"}),"\n",(0,i.jsxs)(o.p,{children:["Not all features of docker are mapped directly by Komodo, only the most common. You can still specify any custom flags for Komodo to include in the ",(0,i.jsx)(o.code,{children:"docker run"})," command by utilizing 'extra args'. For example, you can enable log rotation using these two extra args:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"--log-opt max-size=10M\n"})}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"--log-opt max-file=3\n"})}),"\n",(0,i.jsx)(o.h2,{id:"command",children:"Command"}),"\n",(0,i.jsxs)(o.p,{children:["Sometimes you need to override the default command in the image, or specify some flags to be passed directly to the application. What is put here is inserted into the docker run command after the image. For example, to pass the ",(0,i.jsx)(o.code,{children:"--quiet"})," flag to MongoDB, the docker run command would be:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"docker run -d --name mongo-db mongo:6.0.3 --quiet\n"})}),"\n",(0,i.jsxs)(o.p,{children:["In order to achieve this with Komodo, just pass ",(0,i.jsx)(o.code,{children:"--quiet"})," to 'command'."]})]})}function h(e={}){const{wrapper:o}={...(0,r.R)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}}}]);
\ No newline at end of file
diff --git a/assets/js/f12a0560.6ca9f47c.js b/assets/js/f12a0560.6ca9f47c.js
new file mode 100644
index 000000000..8ecf0517e
--- /dev/null
+++ b/assets/js/f12a0560.6ca9f47c.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[696],{4574:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>h,contentTitle:()=>c,default:()=>a,frontMatter:()=>t,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"resources/webhooks","title":"Configuring Webhooks","description":"Multiple Komodo resources can take advantage of webhooks from your git provider. Komodo supports incoming webhooks using either the Github or Gitlab webhook authentication type, which is also supported by other providers like Gitea.","source":"@site/docs/resources/webhooks.md","sourceDirName":"resources","slug":"/resources/webhooks","permalink":"/docs/resources/webhooks","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/resources/webhooks.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Sync Resources","permalink":"/docs/resources/sync-resources"},"next":{"title":"Permissioning","permalink":"/docs/resources/permissioning"}}');var r=n(4848),s=n(8453);const t={},c="Configuring Webhooks",h={},d=[{value:"Copy the Webhook URL",id:"copy-the-webhook-url",level:2},{value:"Create the webhook on the Git Provider",id:"create-the-webhook-on-the-git-provider",level:2},{value:"When does it trigger?",id:"when-does-it-trigger",level:2}];function l(e){const o={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(o.header,{children:(0,r.jsx)(o.h1,{id:"configuring-webhooks",children:"Configuring Webhooks"})}),"\n",(0,r.jsx)(o.p,{children:"Multiple Komodo resources can take advantage of webhooks from your git provider. Komodo supports incoming webhooks using either the Github or Gitlab webhook authentication type, which is also supported by other providers like Gitea."}),"\n",(0,r.jsx)(o.admonition,{type:"note",children:(0,r.jsx)(o.p,{children:'On Gitea, the default "Gitea" webhook type works with the Github authentication type \ud83d\udc4d'})}),"\n",(0,r.jsx)(o.h2,{id:"copy-the-webhook-url",children:"Copy the Webhook URL"}),"\n",(0,r.jsxs)(o.p,{children:["Find the resource in UI, like a ",(0,r.jsx)(o.code,{children:"Build"}),", ",(0,r.jsx)(o.code,{children:"Repo"}),", or ",(0,r.jsx)(o.code,{children:"Stack"}),".\nGo to the ",(0,r.jsx)(o.code,{children:"Config"}),' section, find "Webhooks", and copy the webhook for the action you want.']}),"\n",(0,r.jsx)(o.p,{children:"The webhook URL is constructed as follows:"}),"\n",(0,r.jsx)(o.pre,{children:(0,r.jsx)(o.code,{className:"language-shell",children:"https://${HOST}/listener/${AUTH_TYPE}/${RESOURCE_TYPE}/${ID_OR_NAME}/${EXECUTION}\n"})}),"\n",(0,r.jsxs)(o.ul,{children:["\n",(0,r.jsxs)(o.li,{children:[(0,r.jsx)(o.strong,{children:(0,r.jsx)(o.code,{children:"HOST"})}),": Your Komodo endpoint to recieve webhooks.","\n",(0,r.jsxs)(o.ul,{children:["\n",(0,r.jsxs)(o.li,{children:["If your Komodo sits in a private network,\nyou will need a public proxy setup to forward ",(0,r.jsx)(o.code,{children:"/listener"})," requests to Komodo."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(o.li,{children:[(0,r.jsx)(o.strong,{children:(0,r.jsx)(o.code,{children:"AUTH_TYPE"})}),":","\n",(0,r.jsxs)(o.ul,{children:["\n",(0,r.jsxs)(o.li,{children:["options: ",(0,r.jsx)(o.code,{children:"github"})," | ",(0,r.jsx)(o.code,{children:"gitlab"})]}),"\n",(0,r.jsxs)(o.li,{children:[(0,r.jsx)(o.code,{children:"github"}),": Validates the signature attached with ",(0,r.jsx)(o.code,{children:"X-Hub-Signature-256"}),". ",(0,r.jsx)(o.a,{href:"https://docs.github.com/en/webhooks/using-webhooks/validating-webhook-deliveries",children:"reference"})]}),"\n",(0,r.jsxs)(o.li,{children:[(0,r.jsx)(o.code,{children:"gitlab"}),": Checks that the secret attached to ",(0,r.jsx)(o.code,{children:"X-Gitlab-Token"})," is valid. ",(0,r.jsx)(o.a,{href:"https://docs.gitlab.com/ee/user/project/integrations/webhooks.html#create-a-webhook",children:"reference"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(o.li,{children:[(0,r.jsx)(o.strong,{children:(0,r.jsx)(o.code,{children:"RESOURCE_TYPE"})}),":","\n",(0,r.jsxs)(o.ul,{children:["\n",(0,r.jsxs)(o.li,{children:["options: ",(0,r.jsx)(o.code,{children:"build"})," | ",(0,r.jsx)(o.code,{children:"repo"})," | ",(0,r.jsx)(o.code,{children:"stack"})," | ",(0,r.jsx)(o.code,{children:"sync"})," | ",(0,r.jsx)(o.code,{children:"procedure"})," | ",(0,r.jsx)(o.code,{children:"action"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(o.li,{children:[(0,r.jsx)(o.strong,{children:(0,r.jsx)(o.code,{children:"ID_OR_NAME"})}),":","\n",(0,r.jsxs)(o.ul,{children:["\n",(0,r.jsx)(o.li,{children:"Reference the specific resource by id or name. If the name may change, it is better to use id."}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(o.li,{children:[(0,r.jsx)(o.strong,{children:(0,r.jsx)(o.code,{children:"EXECUTION"})}),":","\n",(0,r.jsxs)(o.ul,{children:["\n",(0,r.jsxs)(o.li,{children:["Which executions are available depends on the ",(0,r.jsx)(o.code,{children:"RESOURCE_TYPE"}),". Builds only have the ",(0,r.jsx)(o.code,{children:"/build"})," action.\nRepos can select between ",(0,r.jsx)(o.code,{children:"/pull"}),", ",(0,r.jsx)(o.code,{children:"/clone"}),", or ",(0,r.jsx)(o.code,{children:"/build"}),". Stacks have ",(0,r.jsx)(o.code,{children:"/deploy"})," and ",(0,r.jsx)(o.code,{children:"/refresh"}),", and Resource Syncs have ",(0,r.jsx)(o.code,{children:"/sync"})," and ",(0,r.jsx)(o.code,{children:"/refresh"}),"."]}),"\n",(0,r.jsxs)(o.li,{children:["For ",(0,r.jsx)(o.strong,{children:"Procedures and Actions"}),", this will be the ",(0,r.jsx)(o.strong,{children:"branch to listen to for pushes"}),", or ",(0,r.jsx)(o.code,{children:"__ANY__"})," to trigger\non pushes to any branch."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(o.h2,{id:"create-the-webhook-on-the-git-provider",children:"Create the webhook on the Git Provider"}),"\n",(0,r.jsx)(o.p,{children:"Navigate to the repo page on your git provider, and go to the settings for the Repo.\nFind Webhook settings, and click to create a new webhook."}),"\n",(0,r.jsx)(o.p,{children:"You will have to input some information."}),"\n",(0,r.jsxs)(o.ol,{children:["\n",(0,r.jsxs)(o.li,{children:["The ",(0,r.jsx)(o.code,{children:"Payload URL"})," is the link that you copied in the step above, ",(0,r.jsx)(o.code,{children:"Copy the Resource Payload URL"}),"."]}),"\n",(0,r.jsxs)(o.li,{children:["For Content-type, choose ",(0,r.jsx)(o.code,{children:"application/json"})]}),"\n",(0,r.jsxs)(o.li,{children:["For Secret, input the secret you configured in the Komodo Core config (",(0,r.jsx)(o.code,{children:"KOMODO_WEBHOOK_SECRET"}),")."]}),"\n",(0,r.jsx)(o.li,{children:"Enable SSL Verification, if you have proper TLS setup to your git provider (recommended)."}),"\n",(0,r.jsx)(o.li,{children:'For "events that trigger the webhook", just the push request is what most people want.'}),"\n",(0,r.jsx)(o.li,{children:'Of course, make sure the webhook is "Active" and hit create.'}),"\n"]}),"\n",(0,r.jsx)(o.h2,{id:"when-does-it-trigger",children:"When does it trigger?"}),"\n",(0,r.jsxs)(o.p,{children:["Your git provider will now push this webhook to Komodo on ",(0,r.jsx)(o.em,{children:"every"})," push to ",(0,r.jsx)(o.em,{children:"any"})," branch. However, your ",(0,r.jsx)(o.code,{children:"Build"}),", ",(0,r.jsx)(o.code,{children:"Repo"}),",\netc. only cares about a specific branch of the repo."]}),"\n",(0,r.jsxs)(o.p,{children:["Because of this, the webhook will trigger the action ",(0,r.jsx)(o.strong,{children:"only on pushes to the branch configured on the resource"}),"."]}),"\n",(0,r.jsxs)(o.p,{children:["For example, if I make a build, I may point the build to the ",(0,r.jsx)(o.code,{children:"release"})," branch of a particular repo. If I set up a webhook, and push to the ",(0,r.jsx)(o.code,{children:"main"})," branch, the action will ",(0,r.jsx)(o.em,{children:"not trigger"}),". It will only trigger when the push is to the ",(0,r.jsx)(o.code,{children:"release"})," branch."]})]})}function a(e={}){const{wrapper:o}={...(0,s.R)(),...e.components};return o?(0,r.jsx)(o,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,o,n)=>{n.d(o,{R:()=>t,x:()=>c});var i=n(6540);const r={},s=i.createContext(r);function t(e){const o=i.useContext(s);return i.useMemo(function(){return"function"==typeof e?e(o):{...o,...e}},[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),i.createElement(s.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/f600b847.c71cf050.js b/assets/js/f600b847.c71cf050.js
new file mode 100644
index 000000000..7cd0effb1
--- /dev/null
+++ b/assets/js/f600b847.c71cf050.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[238],{3021:(e,t,n)=>{n.d(t,{A:()=>N});var s=n(6540),o=n(4164),r=n(6972),i=n(8774),c=n(4586);const l=["zero","one","two","few","many","other"];function a(e){return l.filter(t=>e.includes(t))}const d={locale:"en",pluralForms:a(["one","other"]),select:e=>1===e?"one":"other"};function u(){const{i18n:{currentLocale:e}}=(0,c.A)();return(0,s.useMemo)(()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:a(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),d}},[e])}function h(){const e=u();return{selectMessage:(t,n)=>function(e,t,n){const s=e.split("|");if(1===s.length)return s[0];s.length>n.pluralForms.length&&console.error(`For locale=${n.locale}, a maximum of ${n.pluralForms.length} plural forms are expected (${n.pluralForms.join(",")}), but the message contains ${s.length}: ${e}`);const o=n.select(t),r=n.pluralForms.indexOf(o);return s[Math.min(r,s.length-1)]}(n,t,e)}}var m=n(6654),p=n(1312),f=n(1107);const g={cardContainer:"cardContainer_fWXF",cardTitle:"cardTitle_rnsV",cardDescription:"cardDescription_PWke"};var x=n(4848);function j({className:e,href:t,children:n}){return(0,x.jsx)(i.A,{href:t,className:(0,o.A)("card padding--lg",g.cardContainer,e),children:n})}function y({className:e,href:t,icon:n,title:s,description:r}){return(0,x.jsxs)(j,{href:t,className:e,children:[(0,x.jsxs)(f.A,{as:"h2",className:(0,o.A)("text--truncate",g.cardTitle),title:s,children:[n," ",s]}),r&&(0,x.jsx)("p",{className:(0,o.A)("text--truncate",g.cardDescription),title:r,children:r})]})}function b({item:e}){const t=(0,r.Nr)(e),n=function(){const{selectMessage:e}=h();return t=>e(t,(0,p.T)({message:"1 item|{count} items",id:"theme.docs.DocCard.categoryDescription.plurals",description:"The default description for a category card in the generated index about how many items this category includes"},{count:t}))}();return t?(0,x.jsx)(y,{className:e.className,href:t,icon:"\ud83d\uddc3\ufe0f",title:e.label,description:e.description??n(e.items.length)}):null}function k({item:e}){const t=(0,m.A)(e.href)?"\ud83d\udcc4\ufe0f":"\ud83d\udd17",n=(0,r.cC)(e.docId??void 0);return(0,x.jsx)(y,{className:e.className,href:e.href,icon:t,title:e.label,description:e.description??n?.description})}function v({item:e}){switch(e.type){case"link":return(0,x.jsx)(k,{item:e});case"category":return(0,x.jsx)(b,{item:e});default:throw new Error(`unknown item type ${JSON.stringify(e)}`)}}const w={docCardListItem:"docCardListItem_W1sv"};function C({className:e}){const t=(0,r.a4)();return(0,x.jsx)(N,{items:t,className:e})}function D({item:e}){return(0,x.jsx)("article",{className:(0,o.A)(w.docCardListItem,"col col--6"),children:(0,x.jsx)(v,{item:e})})}function N(e){const{items:t,className:n}=e;if(!t)return(0,x.jsx)(C,{...e});const s=(0,r.d1)(t);return(0,x.jsx)("section",{className:(0,o.A)("row",n),children:s.map((e,t)=>(0,x.jsx)(D,{item:e},t))})}},7860:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>l,default:()=>h,frontMatter:()=>c,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"setup/index","title":"Setup Komodo Core","description":"To run Komodo, you will need Docker. See the docker install docs.","source":"@site/docs/setup/index.mdx","sourceDirName":"setup","slug":"/setup/","permalink":"/docs/setup/","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/setup/index.mdx","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"What is Komodo?","permalink":"/docs/intro"},"next":{"title":"MongoDB","permalink":"/docs/setup/mongo"}}');var o=n(4848),r=n(8453),i=n(3021);const c={},l="Setup Komodo Core",a={},d=[{value:"Deploy with Docker Compose",id:"deploy-with-docker-compose",level:3},{value:"First login",id:"first-login",level:3},{value:"Https",id:"https",level:3}];function u(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"setup-komodo-core",children:"Setup Komodo Core"})}),"\n",(0,o.jsxs)(t.p,{children:["To run Komodo, you will need Docker. See ",(0,o.jsx)(t.a,{href:"https://docs.docker.com/engine/install/",children:"the docker install docs"}),"."]}),"\n",(0,o.jsx)(t.h3,{id:"deploy-with-docker-compose",children:"Deploy with Docker Compose"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.a,{href:"/docs/setup/mongo",children:(0,o.jsx)(t.strong,{children:"Using MongoDB"})}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Lower CPU usage, Higher RAM usage."}),"\n",(0,o.jsxs)(t.li,{children:["Some systems ",(0,o.jsx)(t.a,{href:"https://github.com/moghtech/komodo/issues/59",children:"do not support running the latest MongoDB versions"}),"."]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsxs)(t.a,{href:"/docs/setup/ferretdb",children:[(0,o.jsx)(t.strong,{children:"Using FerretDB"})," (Postgres)"]}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Lower RAM usage, Higher CPU usage."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(t.admonition,{type:"info",children:(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.strong,{children:"FerretDB v1"})," users:\nThere is an ",(0,o.jsxs)(t.a,{href:"https://github.com/moghtech/komodo/blob/main/bin/util/docs/copy-database.md#ferretdb-v2-update-guide",children:[(0,o.jsx)(t.strong,{children:"upgrade guide for FerretDB v2"})," available here"]}),"."]})}),"\n",(0,o.jsx)(t.h3,{id:"first-login",children:"First login"}),"\n",(0,o.jsxs)(t.p,{children:["Core should now be accessible on the specified port and navigating to ",(0,o.jsx)(t.code,{children:"http://:"})," will display the login page.\nEnter your preferred admin username and password, and click ",(0,o.jsx)(t.strong,{children:'"Sign Up"'}),", ",(0,o.jsx)(t.em,{children:"not"}),' "Log In", to create your admin user for Komodo.\nAny additional users to create accounts will be disabled by default, and must be enabled by an admin.']}),"\n",(0,o.jsx)(t.h3,{id:"https",children:"Https"}),"\n",(0,o.jsxs)(t.p,{children:["Komodo Core only supports http, so a reverse proxy like ",(0,o.jsx)(t.a,{href:"https://caddyserver.com/",children:"caddy"})," should be used for https."]}),"\n","\n",(0,o.jsx)(i.A,{})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>c});var s=n(6540);const o={},r=s.createContext(o);function i(e){const t=s.useContext(r);return s.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(o):e.components||o:i(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/f600b847.fbb8a2ed.js b/assets/js/f600b847.fbb8a2ed.js
deleted file mode 100644
index aadd33195..000000000
--- a/assets/js/f600b847.fbb8a2ed.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[238],{7308:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>h,frontMatter:()=>c,metadata:()=>o,toc:()=>a});const o=JSON.parse('{"id":"setup/index","title":"Setup Komodo","description":"To run Komodo, you will need Docker. See the docker install docs.","source":"@site/docs/setup/index.mdx","sourceDirName":"setup","slug":"/setup/","permalink":"/docs/setup/","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/setup/index.mdx","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Resources","permalink":"/docs/resources"},"next":{"title":"MongoDB","permalink":"/docs/setup/mongo"}}');var r=n(4848),s=n(8453),i=n(7473);const c={},l="Setup Komodo",d={},a=[{value:"Deploy with Docker Compose",id:"deploy-with-docker-compose",level:3},{value:"First login",id:"first-login",level:3},{value:"Https",id:"https",level:3}];function u(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"setup-komodo",children:"Setup Komodo"})}),"\n",(0,r.jsxs)(t.p,{children:["To run Komodo, you will need Docker. See ",(0,r.jsx)(t.a,{href:"https://docs.docker.com/engine/install/",children:"the docker install docs"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"deploy-with-docker-compose",children:"Deploy with Docker Compose"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.a,{href:"/docs/setup/mongo",children:(0,r.jsx)(t.strong,{children:"Using MongoDB"})}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"Lower CPU usage, Higher RAM usage."}),"\n",(0,r.jsxs)(t.li,{children:["Some systems ",(0,r.jsx)(t.a,{href:"https://github.com/moghtech/komodo/issues/59",children:"do not support running the latest MongoDB versions"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsxs)(t.a,{href:"/docs/setup/ferretdb",children:[(0,r.jsx)(t.strong,{children:"Using FerretDB"})," (Postgres)"]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"Lower RAM usage, Higher CPU usage."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(t.admonition,{type:"info",children:(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"FerretDB v1"})," users:\nThere is an ",(0,r.jsxs)(t.a,{href:"https://github.com/moghtech/komodo/blob/main/bin/util/docs/copy-database.md#ferretdb-v2-update-guide",children:[(0,r.jsx)(t.strong,{children:"upgrade guide for FerretDB v2"})," available here"]}),"."]})}),"\n",(0,r.jsx)(t.h3,{id:"first-login",children:"First login"}),"\n",(0,r.jsxs)(t.p,{children:["Core should now be accessible on the specified port and navigating to ",(0,r.jsx)(t.code,{children:"http://:"})," will display the login page.\nEnter your preferred admin username and password, and click ",(0,r.jsx)(t.strong,{children:'"Sign Up"'}),", ",(0,r.jsx)(t.em,{children:"not"}),' "Log In", to create your admin user for Komodo.\nAny additional users to create accounts will be disabled by default, and must be enabled by an admin.']}),"\n",(0,r.jsx)(t.h3,{id:"https",children:"Https"}),"\n",(0,r.jsxs)(t.p,{children:["Komodo Core only supports http, so a reverse proxy like ",(0,r.jsx)(t.a,{href:"https://caddyserver.com/",children:"caddy"})," should be used for https."]}),"\n","\n",(0,r.jsx)(i.A,{})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},7473:(e,t,n)=>{n.d(t,{A:()=>D});var o=n(6540),r=n(4164),s=n(3751),i=n(6289),c=n(797);const l=["zero","one","two","few","many","other"];function d(e){return l.filter((t=>e.includes(t)))}const a={locale:"en",pluralForms:d(["one","other"]),select:e=>1===e?"one":"other"};function u(){const{i18n:{currentLocale:e}}=(0,c.A)();return(0,o.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:d(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),a}}),[e])}function h(){const e=u();return{selectMessage:(t,n)=>function(e,t,n){const o=e.split("|");if(1===o.length)return o[0];o.length>n.pluralForms.length&&console.error(`For locale=${n.locale}, a maximum of ${n.pluralForms.length} plural forms are expected (${n.pluralForms.join(",")}), but the message contains ${o.length}: ${e}`);const r=n.select(t),s=n.pluralForms.indexOf(r);return o[Math.min(s,o.length-1)]}(n,t,e)}}var p=n(2887),m=n(539),f=n(9303);const g={cardContainer:"cardContainer_fWXF",cardTitle:"cardTitle_rnsV",cardDescription:"cardDescription_PWke"};var x=n(4848);function j(e){let{href:t,children:n}=e;return(0,x.jsx)(i.A,{href:t,className:(0,r.A)("card padding--lg",g.cardContainer),children:n})}function y(e){let{href:t,icon:n,title:o,description:s}=e;return(0,x.jsxs)(j,{href:t,children:[(0,x.jsxs)(f.A,{as:"h2",className:(0,r.A)("text--truncate",g.cardTitle),title:o,children:[n," ",o]}),s&&(0,x.jsx)("p",{className:(0,r.A)("text--truncate",g.cardDescription),title:s,children:s})]})}function b(e){let{item:t}=e;const n=(0,s.Nr)(t),o=function(){const{selectMessage:e}=h();return t=>e(t,(0,m.T)({message:"1 item|{count} items",id:"theme.docs.DocCard.categoryDescription.plurals",description:"The default description for a category card in the generated index about how many items this category includes"},{count:t}))}();return n?(0,x.jsx)(y,{href:n,icon:"\ud83d\uddc3\ufe0f",title:t.label,description:t.description??o(t.items.length)}):null}function k(e){let{item:t}=e;const n=(0,p.A)(t.href)?"\ud83d\udcc4\ufe0f":"\ud83d\udd17",o=(0,s.cC)(t.docId??void 0);return(0,x.jsx)(y,{href:t.href,icon:n,title:t.label,description:t.description??o?.description})}function v(e){let{item:t}=e;switch(t.type){case"link":return(0,x.jsx)(k,{item:t});case"category":return(0,x.jsx)(b,{item:t});default:throw new Error(`unknown item type ${JSON.stringify(t)}`)}}function w(e){let{className:t}=e;const n=(0,s.$S)();return(0,x.jsx)(D,{items:n.items,className:t})}function D(e){const{items:t,className:n}=e;if(!t)return(0,x.jsx)(w,{...e});const o=(0,s.d1)(t);return(0,x.jsx)("section",{className:(0,r.A)("row",n),children:o.map(((e,t)=>(0,x.jsx)("article",{className:"col col--6 margin-bottom--lg",children:(0,x.jsx)(v,{item:e})},t)))})}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>c});var o=n(6540);const r={},s=o.createContext(r);function i(e){const t=o.useContext(s);return o.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(r):e.components||r:i(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/f8238c17.97a19782.js b/assets/js/f8238c17.97a19782.js
deleted file mode 100644
index f9df75faf..000000000
--- a/assets/js/f8238c17.97a19782.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[247],{4310:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>p,frontMatter:()=>r,metadata:()=>o,toc:()=>l});const o=JSON.parse('{"id":"deploy-containers/lifetime-management","title":"Container Management","description":"The lifetime of a docker container is more like a virtual machine. They can be created, started, stopped, and destroyed. Komodo will display the state of the container and provides an API to manage all your container\'s lifetimes.","source":"@site/docs/deploy-containers/lifetime-management.md","sourceDirName":"deploy-containers","slug":"/deploy-containers/lifetime-management","permalink":"/docs/deploy-containers/lifetime-management","draft":false,"unlisted":false,"editUrl":"https://github.com/moghtech/komodo/tree/main/docsite/docs/deploy-containers/lifetime-management.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Configuration","permalink":"/docs/deploy-containers/configuration"},"next":{"title":"Docker Compose","permalink":"/docs/docker-compose"}}');var i=n(4848),a=n(8453);const r={},s="Container Management",c={},l=[{value:"Stopping a Container",id:"stopping-a-container",level:3},{value:"Container Redeploy",id:"container-redeploy",level:3}];function d(e){const t={em:"em",h1:"h1",h3:"h3",header:"header",p:"p",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"container-management",children:"Container Management"})}),"\n",(0,i.jsx)(t.p,{children:"The lifetime of a docker container is more like a virtual machine. They can be created, started, stopped, and destroyed. Komodo will display the state of the container and provides an API to manage all your container's lifetimes."}),"\n",(0,i.jsx)(t.p,{children:"This is achieved internally by running the appropriate docker command for the requested action (docker stop, docker start, etc)."}),"\n",(0,i.jsx)(t.h3,{id:"stopping-a-container",children:"Stopping a Container"}),"\n",(0,i.jsxs)(t.p,{children:["Sometimes you want to stop a running application but preserve its logs and configuration, either to be restarted later or to view the logs at a later time. It is more like ",(0,i.jsx)(t.em,{children:"pausing"})," the application with its current config, as no configuration (like environment variable, volume mounts, etc.) will be changed when the container is started again."]}),"\n",(0,i.jsxs)(t.p,{children:["Note that in order to restart an application with updated configuration, it must be ",(0,i.jsx)(t.em,{children:"redeployed"}),". stopping and starting a container again will keep all configuration as it was when the container was initially created."]}),"\n",(0,i.jsx)(t.h3,{id:"container-redeploy",children:"Container Redeploy"}),"\n",(0,i.jsx)(t.p,{children:"Redeploying is the action of destroying a container and recreating it. If you update deployment config, these changes will not take effect until the container is redeployed. Just note this will destroy the previous containers logs along with the container itself."})]})}function p(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>s});var o=n(6540);const i={},a=o.createContext(i);function r(e){const t=o.useContext(a);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),o.createElement(a.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/main.c0fc3d5e.js b/assets/js/main.c0fc3d5e.js
new file mode 100644
index 000000000..9f0cd7efe
--- /dev/null
+++ b/assets/js/main.c0fc3d5e.js
@@ -0,0 +1,2 @@
+/*! For license information please see main.c0fc3d5e.js.LICENSE.txt */
+(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[792],{83:()=>{!function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",o=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source}),a=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,function(){return r}).replace(/<>/g,function(){return e});return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,function(){return r})),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,function(){return r}).replace(/<>/g,function(){return"(?:"+o+"|"+a+")"})),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(a),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism)},115:e=>{var t="undefined"!=typeof Element,n="function"==typeof Map,r="function"==typeof Set,o="function"==typeof ArrayBuffer&&!!ArrayBuffer.isView;function a(e,i){if(e===i)return!0;if(e&&i&&"object"==typeof e&&"object"==typeof i){if(e.constructor!==i.constructor)return!1;var l,s,c,u;if(Array.isArray(e)){if((l=e.length)!=i.length)return!1;for(s=l;0!==s--;)if(!a(e[s],i[s]))return!1;return!0}if(n&&e instanceof Map&&i instanceof Map){if(e.size!==i.size)return!1;for(u=e.entries();!(s=u.next()).done;)if(!i.has(s.value[0]))return!1;for(u=e.entries();!(s=u.next()).done;)if(!a(s.value[1],i.get(s.value[0])))return!1;return!0}if(r&&e instanceof Set&&i instanceof Set){if(e.size!==i.size)return!1;for(u=e.entries();!(s=u.next()).done;)if(!i.has(s.value[0]))return!1;return!0}if(o&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(i)){if((l=e.length)!=i.length)return!1;for(s=l;0!==s--;)if(e[s]!==i[s])return!1;return!0}if(e.constructor===RegExp)return e.source===i.source&&e.flags===i.flags;if(e.valueOf!==Object.prototype.valueOf&&"function"==typeof e.valueOf&&"function"==typeof i.valueOf)return e.valueOf()===i.valueOf();if(e.toString!==Object.prototype.toString&&"function"==typeof e.toString&&"function"==typeof i.toString)return e.toString()===i.toString();if((l=(c=Object.keys(e)).length)!==Object.keys(i).length)return!1;for(s=l;0!==s--;)if(!Object.prototype.hasOwnProperty.call(i,c[s]))return!1;if(t&&e instanceof Element)return!1;for(s=l;0!==s--;)if(("_owner"!==c[s]&&"__v"!==c[s]&&"__o"!==c[s]||!e.$$typeof)&&!a(e[c[s]],i[c[s]]))return!1;return!0}return e!=e&&i!=i}e.exports=function(e,t){try{return a(e,t)}catch(n){if((n.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw n}}},119:(e,t,n)=>{"use strict";n.r(t)},132:()=>{!function(e){var t=/(?:[\w-]+|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*")/.source;function n(e){return e.replace(/__/g,function(){return t})}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n(/(^[\t ]*\[\s*(?:\[\s*)?)__(?:\s*\.\s*__)*(?=\s*\])/.source),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n(/(^[\t ]*|[{,]\s*)__(?:\s*\.\s*__)*(?=\s*=)/.source),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}}(Prism)},205:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540);const o=n(8193).A.canUseDOM?r.useLayoutEffect:r.useEffect},253:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=function e(t){if(t.cause)return[t,...e(t.cause)];return[t]}},311:e=>{"use strict";e.exports=function(e,t,n,r,o,a,i,l){if(!e){var s;if(void 0===t)s=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,l],u=0;(s=new Error(t.replace(/%s/g,function(){return c[u++]}))).name="Invariant Violation"}throw s.framesToPop=1,s}}},418:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});const r=()=>null},440:(e,t,n)=>{"use strict";t.rA=t.Ks=void 0;const r=n(1635);var o=n(2983);Object.defineProperty(t,"Ks",{enumerable:!0,get:function(){return r.__importDefault(o).default}});var a=n(2566);var i=n(253);Object.defineProperty(t,"rA",{enumerable:!0,get:function(){return i.getErrorCausalChain}})},545:(e,t,n)=>{"use strict";n.d(t,{mg:()=>J,vd:()=>W});var r=n(6540),o=n(5556),a=n.n(o),i=n(115),l=n.n(i),s=n(311),c=n.n(s),u=n(2833),d=n.n(u);function f(){return f=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}var g={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title",FRAGMENT:"Symbol(react.fragment)"},y={rel:["amphtml","canonical","alternate"]},b={type:["application/ld+json"]},v={charset:"",name:["robots","description"],property:["og:type","og:title","og:url","og:image","og:image:alt","og:description","twitter:url","twitter:title","twitter:description","twitter:image","twitter:image:alt","twitter:card","twitter:site"]},w=Object.keys(g).map(function(e){return g[e]}),k={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},x=Object.keys(k).reduce(function(e,t){return e[k[t]]=t,e},{}),S=function(e,t){for(var n=e.length-1;n>=0;n-=1){var r=e[n];if(Object.prototype.hasOwnProperty.call(r,t))return r[t]}return null},E=function(e){var t=S(e,g.TITLE),n=S(e,"titleTemplate");if(Array.isArray(t)&&(t=t.join("")),n&&t)return n.replace(/%s/g,function(){return t});var r=S(e,"defaultTitle");return t||r||void 0},_=function(e){return S(e,"onChangeClientState")||function(){}},A=function(e,t){return t.filter(function(t){return void 0!==t[e]}).map(function(t){return t[e]}).reduce(function(e,t){return f({},e,t)},{})},C=function(e,t){return t.filter(function(e){return void 0!==e[g.BASE]}).map(function(e){return e[g.BASE]}).reverse().reduce(function(t,n){if(!t.length)for(var r=Object.keys(n),o=0;o/g,">").replace(/"/g,""").replace(/'/g,"'")},I=function(e){return Object.keys(e).reduce(function(t,n){var r=void 0!==e[n]?n+'="'+e[n]+'"':""+n;return t?t+" "+r:r},"")},D=function(e,t){return void 0===t&&(t={}),Object.keys(e).reduce(function(t,n){return t[k[n]||n]=e[n],t},t)},F=function(e,t){return t.map(function(t,n){var o,a=((o={key:n})["data-rh"]=!0,o);return Object.keys(t).forEach(function(e){var n=k[e]||e;"innerHTML"===n||"cssText"===n?a.dangerouslySetInnerHTML={__html:t.innerHTML||t.cssText}:a[n]=t[e]}),r.createElement(e,a)})},M=function(e,t,n){switch(e){case g.TITLE:return{toComponent:function(){return n=t.titleAttributes,(o={key:e=t.title})["data-rh"]=!0,a=D(n,o),[r.createElement(g.TITLE,a,e)];var e,n,o,a},toString:function(){return function(e,t,n,r){var o=I(n),a=N(t);return o?"<"+e+' data-rh="true" '+o+">"+R(a,r)+""+e+">":"<"+e+' data-rh="true">'+R(a,r)+""+e+">"}(e,t.title,t.titleAttributes,n)}};case"bodyAttributes":case"htmlAttributes":return{toComponent:function(){return D(t)},toString:function(){return I(t)}};default:return{toComponent:function(){return F(e,t)},toString:function(){return function(e,t,n){return t.reduce(function(t,r){var o=Object.keys(r).filter(function(e){return!("innerHTML"===e||"cssText"===e)}).reduce(function(e,t){var o=void 0===r[t]?t:t+'="'+R(r[t],n)+'"';return e?e+" "+o:o},""),a=r.innerHTML||r.cssText||"",i=-1===L.indexOf(e);return t+"<"+e+' data-rh="true" '+o+(i?"/>":">"+a+""+e+">")},"")}(e,t,n)}}}},z=function(e){var t=e.baseTag,n=e.bodyAttributes,r=e.encode,o=e.htmlAttributes,a=e.noscriptTags,i=e.styleTags,l=e.title,s=void 0===l?"":l,c=e.titleAttributes,u=e.linkTags,d=e.metaTags,f=e.scriptTags,p={toComponent:function(){},toString:function(){return""}};if(e.prioritizeSeoTags){var m=function(e){var t=e.linkTags,n=e.scriptTags,r=e.encode,o=O(e.metaTags,v),a=O(t,y),i=O(n,b);return{priorityMethods:{toComponent:function(){return[].concat(F(g.META,o.priority),F(g.LINK,a.priority),F(g.SCRIPT,i.priority))},toString:function(){return M(g.META,o.priority,r)+" "+M(g.LINK,a.priority,r)+" "+M(g.SCRIPT,i.priority,r)}},metaTags:o.default,linkTags:a.default,scriptTags:i.default}}(e);p=m.priorityMethods,u=m.linkTags,d=m.metaTags,f=m.scriptTags}return{priority:p,base:M(g.BASE,t,r),bodyAttributes:M("bodyAttributes",n,r),htmlAttributes:M("htmlAttributes",o,r),link:M(g.LINK,u,r),meta:M(g.META,d,r),noscript:M(g.NOSCRIPT,a,r),script:M(g.SCRIPT,f,r),style:M(g.STYLE,i,r),title:M(g.TITLE,{title:s,titleAttributes:c},r)}},$=[],B=function(e,t){var n=this;void 0===t&&(t="undefined"!=typeof document),this.instances=[],this.value={setHelmet:function(e){n.context.helmet=e},helmetInstances:{get:function(){return n.canUseDOM?$:n.instances},add:function(e){(n.canUseDOM?$:n.instances).push(e)},remove:function(e){var t=(n.canUseDOM?$:n.instances).indexOf(e);(n.canUseDOM?$:n.instances).splice(t,1)}}},this.context=e,this.canUseDOM=t,t||(e.helmet=z({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}}))},U=r.createContext({}),H=a().shape({setHelmet:a().func,helmetInstances:a().shape({get:a().func,add:a().func,remove:a().func})}),V="undefined"!=typeof document,W=function(e){function t(n){var r;return(r=e.call(this,n)||this).helmetData=new B(r.props.context,t.canUseDOM),r}return p(t,e),t.prototype.render=function(){return r.createElement(U.Provider,{value:this.helmetData.value},this.props.children)},t}(r.Component);W.canUseDOM=V,W.propTypes={context:a().shape({helmet:a().shape()}),children:a().node.isRequired},W.defaultProps={context:{}},W.displayName="HelmetProvider";var G=function(e,t){var n,r=document.head||document.querySelector(g.HEAD),o=r.querySelectorAll(e+"[data-rh]"),a=[].slice.call(o),i=[];return t&&t.length&&t.forEach(function(t){var r=document.createElement(e);for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&("innerHTML"===o?r.innerHTML=t.innerHTML:"cssText"===o?r.styleSheet?r.styleSheet.cssText=t.cssText:r.appendChild(document.createTextNode(t.cssText)):r.setAttribute(o,void 0===t[o]?"":t[o]));r.setAttribute("data-rh","true"),a.some(function(e,t){return n=t,r.isEqualNode(e)})?a.splice(n,1):i.push(r)}),a.forEach(function(e){return e.parentNode.removeChild(e)}),i.forEach(function(e){return r.appendChild(e)}),{oldTags:a,newTags:i}},q=function(e,t){var n=document.getElementsByTagName(e)[0];if(n){for(var r=n.getAttribute("data-rh"),o=r?r.split(","):[],a=[].concat(o),i=Object.keys(t),l=0;l=0;d-=1)n.removeAttribute(a[d]);o.length===a.length?n.removeAttribute("data-rh"):n.getAttribute("data-rh")!==i.join(",")&&n.setAttribute("data-rh",i.join(","))}},Y=function(e,t){var n=e.baseTag,r=e.htmlAttributes,o=e.linkTags,a=e.metaTags,i=e.noscriptTags,l=e.onChangeClientState,s=e.scriptTags,c=e.styleTags,u=e.title,d=e.titleAttributes;q(g.BODY,e.bodyAttributes),q(g.HTML,r),function(e,t){void 0!==e&&document.title!==e&&(document.title=N(e)),q(g.TITLE,t)}(u,d);var f={baseTag:G(g.BASE,n),linkTags:G(g.LINK,o),metaTags:G(g.META,a),noscriptTags:G(g.NOSCRIPT,i),scriptTags:G(g.SCRIPT,s),styleTags:G(g.STYLE,c)},p={},m={};Object.keys(f).forEach(function(e){var t=f[e],n=t.newTags,r=t.oldTags;n.length&&(p[e]=n),r.length&&(m[e]=f[e].oldTags)}),t&&t(),l(e,p,m)},K=null,Q=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o elements are self-closing and can not contain children. Refer to our API for more information.")}},n.flattenArrayTypeChildren=function(e){var t,n=e.child,r=e.arrayTypeChildren;return f({},r,((t={})[n.type]=[].concat(r[n.type]||[],[f({},e.newChildProps,this.mapNestedChildrenToProps(n,e.nestedChildren))]),t))},n.mapObjectTypeChildren=function(e){var t,n,r=e.child,o=e.newProps,a=e.newChildProps,i=e.nestedChildren;switch(r.type){case g.TITLE:return f({},o,((t={})[r.type]=i,t.titleAttributes=f({},a),t));case g.BODY:return f({},o,{bodyAttributes:f({},a)});case g.HTML:return f({},o,{htmlAttributes:f({},a)});default:return f({},o,((n={})[r.type]=f({},a),n))}},n.mapArrayTypeChildrenToProps=function(e,t){var n=f({},t);return Object.keys(e).forEach(function(t){var r;n=f({},n,((r={})[t]=e[t],r))}),n},n.warnOnInvalidChildren=function(e,t){return c()(w.some(function(t){return e.type===t}),"function"==typeof e.type?"You may be attempting to nest components within each other, which is not allowed. Refer to our API for more information.":"Only elements types "+w.join(", ")+" are allowed. Helmet does not support rendering <"+e.type+"> elements. Refer to our API for more information."),c()(!t||"string"==typeof t||Array.isArray(t)&&!t.some(function(e){return"string"!=typeof e}),"Helmet expects a string as a child of <"+e.type+">. Did you forget to wrap your children in braces? ( <"+e.type+">{``}"+e.type+"> ) Refer to our API for more information."),!0},n.mapChildrenToProps=function(e,t){var n=this,o={};return r.Children.forEach(e,function(e){if(e&&e.props){var r=e.props,a=r.children,i=h(r,Z),l=Object.keys(i).reduce(function(e,t){return e[x[t]||t]=i[t],e},{}),s=e.type;switch("symbol"==typeof s?s=s.toString():n.warnOnInvalidChildren(e,a),s){case g.FRAGMENT:t=n.mapChildrenToProps(a,t);break;case g.LINK:case g.META:case g.NOSCRIPT:case g.SCRIPT:case g.STYLE:o=n.flattenArrayTypeChildren({child:e,arrayTypeChildren:o,newChildProps:l,nestedChildren:a});break;default:t=n.mapObjectTypeChildren({child:e,newProps:t,newChildProps:l,nestedChildren:a})}}}),this.mapArrayTypeChildrenToProps(o,t)},n.render=function(){var e=this.props,t=e.children,n=h(e,X),o=f({},n),a=n.helmetData;return t&&(o=this.mapChildrenToProps(t,o)),!a||a instanceof B||(a=new B(a.context,a.instances)),a?r.createElement(Q,f({},o,{context:a.value,helmetData:void 0})):r.createElement(U.Consumer,null,function(e){return r.createElement(Q,f({},o,{context:e}))})},t}(r.Component);J.propTypes={base:a().object,bodyAttributes:a().object,children:a().oneOfType([a().arrayOf(a().node),a().node]),defaultTitle:a().string,defer:a().bool,encodeSpecialCharacters:a().bool,htmlAttributes:a().object,link:a().arrayOf(a().object),meta:a().arrayOf(a().object),noscript:a().arrayOf(a().object),onChangeClientState:a().func,script:a().arrayOf(a().object),style:a().arrayOf(a().object),title:a().string,titleAttributes:a().object,titleTemplate:a().string,prioritizeSeoTags:a().bool,helmetData:a().object},J.defaultProps={defer:!0,encodeSpecialCharacters:!0,prioritizeSeoTags:!1},J.displayName="Helmet"},609:(e,t,n)=>{"use strict";n.d(t,{V:()=>s,t:()=>c});var r=n(6540),o=n(9532),a=n(4848);const i=Symbol("EmptyContext"),l=r.createContext(i);function s({children:e,name:t,items:n}){const o=(0,r.useMemo)(()=>t&&n?{name:t,items:n}:null,[t,n]);return(0,a.jsx)(l.Provider,{value:o,children:e})}function c(){const e=(0,r.useContext)(l);if(e===i)throw new o.dV("DocsSidebarProvider");return e}},679:(e,t,n)=>{"use strict";n.d(t,{Wf:()=>u,Dv:()=>d});var r=n(6540);const o=JSON.parse('{"N":"localStorage","M":""}'),a=o.N;function i({key:e,oldValue:t,newValue:n,storage:r}){if(t===n)return;const o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,e,t,n,window.location.href,r),window.dispatchEvent(o)}function l(e=a){if("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,s||(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),s=!0),null}var t}let s=!1;const c={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function u(e,t){const n=`${e}${o.M}`;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}}(n);const r=l(t?.persistence);return null===r?c:{get:()=>{try{return r.getItem(n)}catch(e){return console.error(`Docusaurus storage error, can't get key=${n}`,e),null}},set:e=>{try{const t=r.getItem(n);r.setItem(n,e),i({key:n,oldValue:t,newValue:e,storage:r})}catch(t){console.error(`Docusaurus storage error, can't set ${n}=${e}`,t)}},del:()=>{try{const e=r.getItem(n);r.removeItem(n),i({key:n,oldValue:e,newValue:null,storage:r})}catch(e){console.error(`Docusaurus storage error, can't delete key=${n}`,e)}},listen:e=>{try{const t=t=>{t.storageArea===r&&t.key===n&&e(t)};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)}catch(t){return console.error(`Docusaurus storage error, can't listen for changes of key=${n}`,t),()=>{}}}}}function d(e,t){const[n]=(0,r.useState)(()=>null===e?c:u(e,t)),o=(0,r.useCallback)(e=>"undefined"==typeof window?()=>{}:n.listen(e),[n]);return[(0,r.useSyncExternalStore)(o,()=>n.get(),()=>null),n]}},961:(e,t,n)=>{"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}(),e.exports=n(6221)},1043:(e,t,n)=>{"use strict";n.r(t)},1107:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(6540);var r=n(4164),o=n(1312),a=n(6342),i=n(8774),l=n(3427);const s={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var c=n(4848);function u({as:e,id:t,...n}){const u=(0,l.A)(),{navbar:{hideOnScroll:d}}=(0,a.p)();if("h1"===e||!t)return(0,c.jsx)(e,{...n,id:void 0});u.collectAnchor(t);const f=(0,o.T)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof n.children?n.children:t});return(0,c.jsxs)(e,{...n,className:(0,r.A)("anchor",d?s.anchorWithHideOnScrollNavbar:s.anchorWithStickyNavbar,n.className),id:t,children:[n.children,(0,c.jsx)(i.A,{className:"hash-link",to:`#${t}`,"aria-label":f,title:f,children:"\u200b"})]})}},1122:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});var r=n(6540),o=n(4164),a=n(2303),i=n(5293);const l={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var s=n(4848);function c({className:e,children:t}){const n=(0,a.A)(),{colorMode:c}=(0,i.G)();return(0,s.jsx)(s.Fragment,{children:(n?"dark"===c?["dark"]:["light"]:["light","dark"]).map(n=>{const a=t({theme:n,className:(0,o.A)(e,l.themedComponent,l[`themedComponent--${n}`])});return(0,s.jsx)(r.Fragment,{children:a},n)})})}function u(e){const{sources:t,className:n,alt:r,...o}=e;return(0,s.jsx)(c,{className:n,children:({theme:e,className:n})=>(0,s.jsx)("img",{src:t[e],alt:r,className:n,...o})})}},1247:(e,t,n)=>{"use strict";var r=n(9982),o=n(6540),a=n(961);function i(e){var t="https://react.dev/errors/"+e;if(1M||(e.current=F[M],F[M]=null,M--)}function B(e,t){M++,F[M]=e.current,e.current=t}var U=z(null),H=z(null),V=z(null),W=z(null);function G(e,t){switch(B(V,t),B(H,e),B(U,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?od(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)e=ad(t=od(t),e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}$(U),B(U,e)}function q(){$(U),$(H),$(V)}function Y(e){null!==e.memoizedState&&B(W,e);var t=U.current,n=ad(t,e.type);t!==n&&(B(H,e),B(U,n))}function K(e){H.current===e&&($(U),$(H)),W.current===e&&($(W),Yd._currentValue=D)}var Q=Object.prototype.hasOwnProperty,Z=r.unstable_scheduleCallback,X=r.unstable_cancelCallback,J=r.unstable_shouldYield,ee=r.unstable_requestPaint,te=r.unstable_now,ne=r.unstable_getCurrentPriorityLevel,re=r.unstable_ImmediatePriority,oe=r.unstable_UserBlockingPriority,ae=r.unstable_NormalPriority,ie=r.unstable_LowPriority,le=r.unstable_IdlePriority,se=r.log,ce=r.unstable_setDisableYieldValue,ue=null,de=null;function fe(e){if("function"==typeof se&&ce(e),de&&"function"==typeof de.setStrictMode)try{de.setStrictMode(ue,e)}catch(t){}}var pe=Math.clz32?Math.clz32:function(e){return 0===(e>>>=0)?32:31-(me(e)/he|0)|0},me=Math.log,he=Math.LN2;var ge=256,ye=4194304;function be(e){var t=42&e;if(0!==t)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return 4194048&e;case 4194304:case 8388608:case 16777216:case 33554432:return 62914560&e;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function ve(e,t,n){var r=e.pendingLanes;if(0===r)return 0;var o=0,a=e.suspendedLanes,i=e.pingedLanes;e=e.warmLanes;var l=134217727&r;return 0!==l?0!==(r=l&~a)?o=be(r):0!==(i&=l)?o=be(i):n||0!==(n=l&~e)&&(o=be(n)):0!==(l=r&~a)?o=be(l):0!==i?o=be(i):n||0!==(n=r&~e)&&(o=be(n)),0===o?0:0!==t&&t!==o&&0===(t&a)&&((a=o&-o)>=(n=t&-t)||32===a&&4194048&n)?t:o}function we(e,t){return 0===(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)}function ke(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;default:return-1}}function xe(){var e=ge;return!(4194048&(ge<<=1))&&(ge=256),e}function Se(){var e=ye;return!(62914560&(ye<<=1))&&(ye=4194304),e}function Ee(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function _e(e,t){e.pendingLanes|=t,268435456!==t&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function Ae(e,t,n){e.pendingLanes|=t,e.suspendedLanes&=~t;var r=31-pe(t);e.entangledLanes|=t,e.entanglements[r]=1073741824|e.entanglements[r]|4194090&n}function Ce(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var r=31-pe(n),o=1<)":-1--o||s[r]!==c[o]){var u="\n"+s[r].replace(" at new "," at ");return e.displayName&&u.includes("")&&(u=u.replace("",e.displayName)),u}}while(1<=r&&0<=o);break}}}finally{at=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:"")?ot(n):""}function lt(e){switch(e.tag){case 26:case 27:case 5:return ot(e.type);case 16:return ot("Lazy");case 13:return ot("Suspense");case 19:return ot("SuspenseList");case 0:case 15:return it(e.type,!1);case 11:return it(e.type.render,!1);case 1:return it(e.type,!0);case 31:return ot("Activity");default:return""}}function st(e){try{var t="";do{t+=lt(e),e=e.return}while(e);return t}catch(n){return"\nError generating stack: "+n.message+"\n"+n.stack}}function ct(e){switch(typeof e){case"bigint":case"boolean":case"number":case"string":case"undefined":case"object":return e;default:return""}}function ut(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function dt(e){e._valueTracker||(e._valueTracker=function(e){var t=ut(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&void 0!==n&&"function"==typeof n.get&&"function"==typeof n.set){var o=n.get,a=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return o.call(this)},set:function(e){r=""+e,a.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(e){r=""+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}(e))}function ft(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=ut(e)?e.checked?"true":"false":e.value),(e=r)!==n&&(t.setValue(e),!0)}function pt(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}var mt=/[\n"\\]/g;function ht(e){return e.replace(mt,function(e){return"\\"+e.charCodeAt(0).toString(16)+" "})}function gt(e,t,n,r,o,a,i,l){e.name="",null!=i&&"function"!=typeof i&&"symbol"!=typeof i&&"boolean"!=typeof i?e.type=i:e.removeAttribute("type"),null!=t?"number"===i?(0===t&&""===e.value||e.value!=t)&&(e.value=""+ct(t)):e.value!==""+ct(t)&&(e.value=""+ct(t)):"submit"!==i&&"reset"!==i||e.removeAttribute("value"),null!=t?bt(e,i,ct(t)):null!=n?bt(e,i,ct(n)):null!=r&&e.removeAttribute("value"),null==o&&null!=a&&(e.defaultChecked=!!a),null!=o&&(e.checked=o&&"function"!=typeof o&&"symbol"!=typeof o),null!=l&&"function"!=typeof l&&"symbol"!=typeof l&&"boolean"!=typeof l?e.name=""+ct(l):e.removeAttribute("name")}function yt(e,t,n,r,o,a,i,l){if(null!=a&&"function"!=typeof a&&"symbol"!=typeof a&&"boolean"!=typeof a&&(e.type=a),null!=t||null!=n){if(("submit"===a||"reset"===a)&&null==t)return;n=null!=n?""+ct(n):"",t=null!=t?""+ct(t):n,l||t===e.value||(e.value=t),e.defaultValue=t}r="function"!=typeof(r=null!=r?r:o)&&"symbol"!=typeof r&&!!r,e.checked=l?e.checked:!!r,e.defaultChecked=!!r,null!=i&&"function"!=typeof i&&"symbol"!=typeof i&&"boolean"!=typeof i&&(e.name=i)}function bt(e,t,n){"number"===t&&pt(e.ownerDocument)===e||e.defaultValue===""+n||(e.defaultValue=""+n)}function vt(e,t,n,r){if(e=e.options,t){t={};for(var o=0;o=Sn),An=String.fromCharCode(32),Cn=!1;function Tn(e,t){switch(e){case"keyup":return-1!==kn.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Pn(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var Nn=!1;var On={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function jn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!On[e.type]:"textarea"===t}function Ln(e,t,n,r){jt?Lt?Lt.push(r):Lt=[r]:jt=r,0<(t=Vu(t,"onChange")).length&&(n=new Jt("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var Rn=null,In=null;function Dn(e){Du(e,0)}function Fn(e){if(ft(He(e)))return e}function Mn(e,t){if("change"===e)return t}var zn=!1;if(Mt){var $n;if(Mt){var Bn="oninput"in document;if(!Bn){var Un=document.createElement("div");Un.setAttribute("oninput","return;"),Bn="function"==typeof Un.oninput}$n=Bn}else $n=!1;zn=$n&&(!document.documentMode||9=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=Zn(r)}}function Jn(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?Jn(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function er(e){for(var t=pt((e=null!=e&&null!=e.ownerDocument&&null!=e.ownerDocument.defaultView?e.ownerDocument.defaultView:window).document);t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(r){n=!1}if(!n)break;t=pt((e=t.contentWindow).document)}return t}function tr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}var nr=Mt&&"documentMode"in document&&11>=document.documentMode,rr=null,or=null,ar=null,ir=!1;function lr(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;ir||null==rr||rr!==pt(r)||("selectionStart"in(r=rr)&&tr(r)?r={start:r.selectionStart,end:r.selectionEnd}:r={anchorNode:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset},ar&&Qn(ar,r)||(ar=r,0<(r=Vu(or,"onSelect")).length&&(t=new Jt("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=rr)))}function sr(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var cr={animationend:sr("Animation","AnimationEnd"),animationiteration:sr("Animation","AnimationIteration"),animationstart:sr("Animation","AnimationStart"),transitionrun:sr("Transition","TransitionRun"),transitionstart:sr("Transition","TransitionStart"),transitioncancel:sr("Transition","TransitionCancel"),transitionend:sr("Transition","TransitionEnd")},ur={},dr={};function fr(e){if(ur[e])return ur[e];if(!cr[e])return e;var t,n=cr[e];for(t in n)if(n.hasOwnProperty(t)&&t in dr)return ur[e]=n[t];return e}Mt&&(dr=document.createElement("div").style,"AnimationEvent"in window||(delete cr.animationend.animation,delete cr.animationiteration.animation,delete cr.animationstart.animation),"TransitionEvent"in window||delete cr.transitionend.transition);var pr=fr("animationend"),mr=fr("animationiteration"),hr=fr("animationstart"),gr=fr("transitionrun"),yr=fr("transitionstart"),br=fr("transitioncancel"),vr=fr("transitionend"),wr=new Map,kr="abort auxClick beforeToggle cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function xr(e,t){wr.set(e,t),Ye(t,[e])}kr.push("scrollEnd");var Sr=new WeakMap;function Er(e,t){if("object"==typeof e&&null!==e){var n=Sr.get(e);return void 0!==n?n:(t={value:e,source:t,stack:st(t)},Sr.set(e,t),t)}return{value:e,source:t,stack:st(t)}}var _r=[],Ar=0,Cr=0;function Tr(){for(var e=Ar,t=Cr=Ar=0;t>=i,o-=i,Zr=1<<32-pe(t)+o|n<a?a:8;var i,l,s,c=R.T,u={};R.T=u,Bi(e,!1,t,n);try{var d=o(),f=R.S;if(null!==f&&f(u,d),null!==d&&"object"==typeof d&&"function"==typeof d.then)$i(e,t,(i=r,l=[],s={status:"pending",value:null,reason:null,then:function(e){l.push(e)}},d.then(function(){s.status="fulfilled",s.value=i;for(var e=0;em?(h=d,d=null):h=d.sibling;var g=p(o,d,l[m],s);if(null===g){null===d&&(d=h);break}e&&d&&null===g.alternate&&t(o,d),i=a(g,i,m),null===u?c=g:u.sibling=g,u=g,d=h}if(m===l.length)return n(o,d),ao&&Jr(o,m),c;if(null===d){for(;mh?(g=m,m=null):g=m.sibling;var v=p(o,m,b.value,c);if(null===v){null===m&&(m=g);break}e&&m&&null===v.alternate&&t(o,m),l=a(v,l,h),null===d?u=v:d.sibling=v,d=v,m=g}if(b.done)return n(o,m),ao&&Jr(o,h),u;if(null===m){for(;!b.done;h++,b=s.next())null!==(b=f(o,b.value,c))&&(l=a(b,l,h),null===d?u=b:d.sibling=b,d=b);return ao&&Jr(o,h),u}for(m=r(m);!b.done;h++,b=s.next())null!==(b=y(m,o,h,b.value,c))&&(e&&null!==b.alternate&&m.delete(null===b.key?h:b.key),l=a(b,l,h),null===d?u=b:d.sibling=b,d=b);return e&&m.forEach(function(e){return t(o,e)}),ao&&Jr(o,h),u}(s,c,u=v.call(u),d)}if("function"==typeof u.then)return b(s,c,Zi(u),d);if(u.$$typeof===k)return b(s,c,To(s,u),d);Ji(s,u)}return"string"==typeof u&&""!==u||"number"==typeof u||"bigint"==typeof u?(u=""+u,null!==c&&6===c.tag?(n(s,c.sibling),(d=o(c,u)).return=s,s=d):(n(s,c),(d=Ur(u,s.mode,d)).return=s,s=d),l(s)):n(s,c)}return function(e,t,n,r){try{Qi=0;var o=b(e,t,n,r);return Ki=null,o}catch(i){if(i===Go||i===Yo)throw i;var a=Dr(29,i,null,e.mode);return a.lanes=r,a.return=e,a}}}var nl=tl(!0),rl=tl(!1),ol=z(null),al=null;function il(e){var t=e.alternate;B(ul,1&ul.current),B(ol,e),null===al&&(null===t||null!==ma.current||null!==t.memoizedState)&&(al=e)}function ll(e){if(22===e.tag){if(B(ul,ul.current),B(ol,e),null===al){var t=e.alternate;null!==t&&null!==t.memoizedState&&(al=e)}}else sl()}function sl(){B(ul,ul.current),B(ol,ol.current)}function cl(e){$(ol),al===e&&(al=null),$(ul)}var ul=z(0);function dl(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedState;if(null!==n&&(null===(n=n.dehydrated)||"$?"===n.data||gd(n)))return t}else if(19===t.tag&&void 0!==t.memoizedProps.revealOrder){if(128&t.flags)return t}else if(null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}function fl(e,t,n,r){n=null==(n=n(r,t=e.memoizedState))?t:f({},t,n),e.memoizedState=n,0===e.lanes&&(e.updateQueue.baseState=n)}var pl={enqueueSetState:function(e,t,n){e=e._reactInternals;var r=Rc(),o=aa(r);o.payload=t,null!=n&&(o.callback=n),null!==(t=ia(e,o,r))&&(Dc(t,e,r),la(t,e,r))},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=Rc(),o=aa(r);o.tag=1,o.payload=t,null!=n&&(o.callback=n),null!==(t=ia(e,o,r))&&(Dc(t,e,r),la(t,e,r))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=Rc(),r=aa(n);r.tag=2,null!=t&&(r.callback=t),null!==(t=ia(e,r,n))&&(Dc(t,e,n),la(t,e,n))}};function ml(e,t,n,r,o,a,i){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(r,a,i):!t.prototype||!t.prototype.isPureReactComponent||(!Qn(n,r)||!Qn(o,a))}function hl(e,t,n,r){e=t.state,"function"==typeof t.componentWillReceiveProps&&t.componentWillReceiveProps(n,r),"function"==typeof t.UNSAFE_componentWillReceiveProps&&t.UNSAFE_componentWillReceiveProps(n,r),t.state!==e&&pl.enqueueReplaceState(t,t.state,null)}function gl(e,t){var n=t;if("ref"in t)for(var r in n={},t)"ref"!==r&&(n[r]=t[r]);if(e=e.defaultProps)for(var o in n===t&&(n=f({},n)),e)void 0===n[o]&&(n[o]=e[o]);return n}var yl="function"==typeof reportError?reportError:function(e){if("object"==typeof window&&"function"==typeof window.ErrorEvent){var t=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:"object"==typeof e&&null!==e&&"string"==typeof e.message?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if("object"==typeof process&&"function"==typeof process.emit)return void process.emit("uncaughtException",e);console.error(e)};function bl(e){yl(e)}function vl(e){console.error(e)}function wl(e){yl(e)}function kl(e,t){try{(0,e.onUncaughtError)(t.value,{componentStack:t.stack})}catch(n){setTimeout(function(){throw n})}}function xl(e,t,n){try{(0,e.onCaughtError)(n.value,{componentStack:n.stack,errorBoundary:1===t.tag?t.stateNode:null})}catch(r){setTimeout(function(){throw r})}}function Sl(e,t,n){return(n=aa(n)).tag=3,n.payload={element:null},n.callback=function(){kl(e,t)},n}function El(e){return(e=aa(e)).tag=3,e}function _l(e,t,n,r){var o=n.type.getDerivedStateFromError;if("function"==typeof o){var a=r.value;e.payload=function(){return o(a)},e.callback=function(){xl(t,n,r)}}var i=n.stateNode;null!==i&&"function"==typeof i.componentDidCatch&&(e.callback=function(){xl(t,n,r),"function"!=typeof o&&(null===Ec?Ec=new Set([this]):Ec.add(this));var e=r.stack;this.componentDidCatch(r.value,{componentStack:null!==e?e:""})})}var Al=Error(i(461)),Cl=!1;function Tl(e,t,n,r){t.child=null===e?rl(t,null,n,r):nl(t,e.child,n,r)}function Pl(e,t,n,r,o){n=n.render;var a=t.ref;if("ref"in r){var i={};for(var l in r)"ref"!==l&&(i[l]=r[l])}else i=r;return Ao(t),r=ja(e,t,n,i,a,o),l=Da(),null===e||Cl?(ao&&l&&to(t),t.flags|=1,Tl(e,t,r,o),t.child):(Fa(e,t,o),Kl(e,t,o))}function Nl(e,t,n,r,o){if(null===e){var a=n.type;return"function"!=typeof a||Fr(a)||void 0!==a.defaultProps||null!==n.compare?((e=$r(n.type,null,r,t,t.mode,o)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=a,Ol(e,t,a,r,o))}if(a=e.child,!Ql(e,o)){var i=a.memoizedProps;if((n=null!==(n=n.compare)?n:Qn)(i,r)&&e.ref===t.ref)return Kl(e,t,o)}return t.flags|=1,(e=Mr(a,r)).ref=t.ref,e.return=t,t.child=e}function Ol(e,t,n,r,o){if(null!==e){var a=e.memoizedProps;if(Qn(a,r)&&e.ref===t.ref){if(Cl=!1,t.pendingProps=r=a,!Ql(e,o))return t.lanes=e.lanes,Kl(e,t,o);131072&e.flags&&(Cl=!0)}}return Il(e,t,n,r,o)}function jl(e,t,n){var r=t.pendingProps,o=r.children,a=null!==e?e.memoizedState:null;if("hidden"===r.mode){if(128&t.flags){if(r=null!==a?a.baseLanes|n:n,null!==e){for(o=t.child=e.child,a=0;null!==o;)a=a|o.lanes|o.childLanes,o=o.sibling;t.childLanes=a&~r}else t.childLanes=0,t.child=null;return Ll(e,t,r,n)}if(!(536870912&n))return t.lanes=t.childLanes=536870912,Ll(e,t,null!==a?a.baseLanes|n:n,n);t.memoizedState={baseLanes:0,cachePool:null},null!==e&&Vo(0,null!==a?a.cachePool:null),null!==a?ga(t,a):ya(),ll(t)}else null!==a?(Vo(0,a.cachePool),ga(t,a),sl(),t.memoizedState=null):(null!==e&&Vo(0,null),ya(),sl());return Tl(e,t,o,n),t.child}function Ll(e,t,n,r){var o=Ho();return o=null===o?null:{parent:Lo._currentValue,pool:o},t.memoizedState={baseLanes:n,cachePool:o},null!==e&&Vo(0,null),ya(),ll(t),null!==e&&Eo(e,t,r,!0),null}function Rl(e,t){var n=t.ref;if(null===n)null!==e&&null!==e.ref&&(t.flags|=4194816);else{if("function"!=typeof n&&"object"!=typeof n)throw Error(i(284));null!==e&&e.ref===n||(t.flags|=4194816)}}function Il(e,t,n,r,o){return Ao(t),n=ja(e,t,n,r,void 0,o),r=Da(),null===e||Cl?(ao&&r&&to(t),t.flags|=1,Tl(e,t,n,o),t.child):(Fa(e,t,o),Kl(e,t,o))}function Dl(e,t,n,r,o,a){return Ao(t),t.updateQueue=null,n=Ra(t,r,n,o),La(e),r=Da(),null===e||Cl?(ao&&r&&to(t),t.flags|=1,Tl(e,t,n,a),t.child):(Fa(e,t,a),Kl(e,t,a))}function Fl(e,t,n,r,o){if(Ao(t),null===t.stateNode){var a=Rr,i=n.contextType;"object"==typeof i&&null!==i&&(a=Co(i)),a=new n(r,a),t.memoizedState=null!==a.state&&void 0!==a.state?a.state:null,a.updater=pl,t.stateNode=a,a._reactInternals=t,(a=t.stateNode).props=r,a.state=t.memoizedState,a.refs={},ra(t),i=n.contextType,a.context="object"==typeof i&&null!==i?Co(i):Rr,a.state=t.memoizedState,"function"==typeof(i=n.getDerivedStateFromProps)&&(fl(t,n,i,r),a.state=t.memoizedState),"function"==typeof n.getDerivedStateFromProps||"function"==typeof a.getSnapshotBeforeUpdate||"function"!=typeof a.UNSAFE_componentWillMount&&"function"!=typeof a.componentWillMount||(i=a.state,"function"==typeof a.componentWillMount&&a.componentWillMount(),"function"==typeof a.UNSAFE_componentWillMount&&a.UNSAFE_componentWillMount(),i!==a.state&&pl.enqueueReplaceState(a,a.state,null),da(t,r,a,o),ua(),a.state=t.memoizedState),"function"==typeof a.componentDidMount&&(t.flags|=4194308),r=!0}else if(null===e){a=t.stateNode;var l=t.memoizedProps,s=gl(n,l);a.props=s;var c=a.context,u=n.contextType;i=Rr,"object"==typeof u&&null!==u&&(i=Co(u));var d=n.getDerivedStateFromProps;u="function"==typeof d||"function"==typeof a.getSnapshotBeforeUpdate,l=t.pendingProps!==l,u||"function"!=typeof a.UNSAFE_componentWillReceiveProps&&"function"!=typeof a.componentWillReceiveProps||(l||c!==i)&&hl(t,a,r,i),na=!1;var f=t.memoizedState;a.state=f,da(t,r,a,o),ua(),c=t.memoizedState,l||f!==c||na?("function"==typeof d&&(fl(t,n,d,r),c=t.memoizedState),(s=na||ml(t,n,s,r,f,c,i))?(u||"function"!=typeof a.UNSAFE_componentWillMount&&"function"!=typeof a.componentWillMount||("function"==typeof a.componentWillMount&&a.componentWillMount(),"function"==typeof a.UNSAFE_componentWillMount&&a.UNSAFE_componentWillMount()),"function"==typeof a.componentDidMount&&(t.flags|=4194308)):("function"==typeof a.componentDidMount&&(t.flags|=4194308),t.memoizedProps=r,t.memoizedState=c),a.props=r,a.state=c,a.context=i,r=s):("function"==typeof a.componentDidMount&&(t.flags|=4194308),r=!1)}else{a=t.stateNode,oa(e,t),u=gl(n,i=t.memoizedProps),a.props=u,d=t.pendingProps,f=a.context,c=n.contextType,s=Rr,"object"==typeof c&&null!==c&&(s=Co(c)),(c="function"==typeof(l=n.getDerivedStateFromProps)||"function"==typeof a.getSnapshotBeforeUpdate)||"function"!=typeof a.UNSAFE_componentWillReceiveProps&&"function"!=typeof a.componentWillReceiveProps||(i!==d||f!==s)&&hl(t,a,r,s),na=!1,f=t.memoizedState,a.state=f,da(t,r,a,o),ua();var p=t.memoizedState;i!==d||f!==p||na||null!==e&&null!==e.dependencies&&_o(e.dependencies)?("function"==typeof l&&(fl(t,n,l,r),p=t.memoizedState),(u=na||ml(t,n,u,r,f,p,s)||null!==e&&null!==e.dependencies&&_o(e.dependencies))?(c||"function"!=typeof a.UNSAFE_componentWillUpdate&&"function"!=typeof a.componentWillUpdate||("function"==typeof a.componentWillUpdate&&a.componentWillUpdate(r,p,s),"function"==typeof a.UNSAFE_componentWillUpdate&&a.UNSAFE_componentWillUpdate(r,p,s)),"function"==typeof a.componentDidUpdate&&(t.flags|=4),"function"==typeof a.getSnapshotBeforeUpdate&&(t.flags|=1024)):("function"!=typeof a.componentDidUpdate||i===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!=typeof a.getSnapshotBeforeUpdate||i===e.memoizedProps&&f===e.memoizedState||(t.flags|=1024),t.memoizedProps=r,t.memoizedState=p),a.props=r,a.state=p,a.context=s,r=u):("function"!=typeof a.componentDidUpdate||i===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!=typeof a.getSnapshotBeforeUpdate||i===e.memoizedProps&&f===e.memoizedState||(t.flags|=1024),r=!1)}return a=r,Rl(e,t),r=!!(128&t.flags),a||r?(a=t.stateNode,n=r&&"function"!=typeof n.getDerivedStateFromError?null:a.render(),t.flags|=1,null!==e&&r?(t.child=nl(t,e.child,null,o),t.child=nl(t,null,n,o)):Tl(e,t,n,o),t.memoizedState=a.state,e=t.child):e=Kl(e,t,o),e}function Ml(e,t,n,r){return mo(),t.flags|=256,Tl(e,t,n,r),t.child}var zl={dehydrated:null,treeContext:null,retryLane:0,hydrationErrors:null};function $l(e){return{baseLanes:e,cachePool:Wo()}}function Bl(e,t,n){return e=null!==e?e.childLanes&~n:0,t&&(e|=gc),e}function Ul(e,t,n){var r,o=t.pendingProps,a=!1,l=!!(128&t.flags);if((r=l)||(r=(null===e||null!==e.memoizedState)&&!!(2&ul.current)),r&&(a=!0,t.flags&=-129),r=!!(32&t.flags),t.flags&=-33,null===e){if(ao){if(a?il(t):sl(),ao){var s,c=oo;if(s=c){e:{for(s=c,c=lo;8!==s.nodeType;){if(!c){c=null;break e}if(null===(s=yd(s.nextSibling))){c=null;break e}}c=s}null!==c?(t.memoizedState={dehydrated:c,treeContext:null!==Qr?{id:Zr,overflow:Xr}:null,retryLane:536870912,hydrationErrors:null},(s=Dr(18,null,null,0)).stateNode=c,s.return=t,t.child=s,ro=t,oo=null,s=!0):s=!1}s||co(t)}if(null!==(c=t.memoizedState)&&null!==(c=c.dehydrated))return gd(c)?t.lanes=32:t.lanes=536870912,null;cl(t)}return c=o.children,o=o.fallback,a?(sl(),c=Vl({mode:"hidden",children:c},a=t.mode),o=Br(o,a,n,null),c.return=t,o.return=t,c.sibling=o,t.child=c,(a=t.child).memoizedState=$l(n),a.childLanes=Bl(e,r,n),t.memoizedState=zl,o):(il(t),Hl(t,c))}if(null!==(s=e.memoizedState)&&null!==(c=s.dehydrated)){if(l)256&t.flags?(il(t),t.flags&=-257,t=Wl(e,t,n)):null!==t.memoizedState?(sl(),t.child=e.child,t.flags|=128,t=null):(sl(),a=o.fallback,c=t.mode,o=Vl({mode:"visible",children:o.children},c),(a=Br(a,c,n,null)).flags|=2,o.return=t,a.return=t,o.sibling=a,t.child=o,nl(t,e.child,null,n),(o=t.child).memoizedState=$l(n),o.childLanes=Bl(e,r,n),t.memoizedState=zl,t=a);else if(il(t),gd(c)){if(r=c.nextSibling&&c.nextSibling.dataset)var u=r.dgst;r=u,(o=Error(i(419))).stack="",o.digest=r,go({value:o,source:null,stack:null}),t=Wl(e,t,n)}else if(Cl||Eo(e,t,n,!1),r=0!==(n&e.childLanes),Cl||r){if(null!==(r=rc)&&(0!==(o=0!==((o=42&(o=n&-n)?1:Te(o))&(r.suspendedLanes|n))?0:o)&&o!==s.retryLane))throw s.retryLane=o,Or(e,o),Dc(r,e,o),Al;"$?"===c.data||qc(),t=Wl(e,t,n)}else"$?"===c.data?(t.flags|=192,t.child=e.child,t=null):(e=s.treeContext,oo=yd(c.nextSibling),ro=t,ao=!0,io=null,lo=!1,null!==e&&(Yr[Kr++]=Zr,Yr[Kr++]=Xr,Yr[Kr++]=Qr,Zr=e.id,Xr=e.overflow,Qr=t),(t=Hl(t,o.children)).flags|=4096);return t}return a?(sl(),a=o.fallback,c=t.mode,u=(s=e.child).sibling,(o=Mr(s,{mode:"hidden",children:o.children})).subtreeFlags=65011712&s.subtreeFlags,null!==u?a=Mr(u,a):(a=Br(a,c,n,null)).flags|=2,a.return=t,o.return=t,o.sibling=a,t.child=o,o=a,a=t.child,null===(c=e.child.memoizedState)?c=$l(n):(null!==(s=c.cachePool)?(u=Lo._currentValue,s=s.parent!==u?{parent:u,pool:u}:s):s=Wo(),c={baseLanes:c.baseLanes|n,cachePool:s}),a.memoizedState=c,a.childLanes=Bl(e,r,n),t.memoizedState=zl,o):(il(t),e=(n=e.child).sibling,(n=Mr(n,{mode:"visible",children:o.children})).return=t,n.sibling=null,null!==e&&(null===(r=t.deletions)?(t.deletions=[e],t.flags|=16):r.push(e)),t.child=n,t.memoizedState=null,n)}function Hl(e,t){return(t=Vl({mode:"visible",children:t},e.mode)).return=e,e.child=t}function Vl(e,t){return(e=Dr(22,e,null,t)).lanes=0,e.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null},e}function Wl(e,t,n){return nl(t,e.child,null,n),(e=Hl(t,t.pendingProps.children)).flags|=2,t.memoizedState=null,e}function Gl(e,t,n){e.lanes|=t;var r=e.alternate;null!==r&&(r.lanes|=t),xo(e.return,t,n)}function ql(e,t,n,r,o){var a=e.memoizedState;null===a?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:o}:(a.isBackwards=t,a.rendering=null,a.renderingStartTime=0,a.last=r,a.tail=n,a.tailMode=o)}function Yl(e,t,n){var r=t.pendingProps,o=r.revealOrder,a=r.tail;if(Tl(e,t,r.children,n),2&(r=ul.current))r=1&r|2,t.flags|=128;else{if(null!==e&&128&e.flags)e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&Gl(e,n,t);else if(19===e.tag)Gl(e,n,t);else if(null!==e.child){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;null===e.sibling;){if(null===e.return||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}switch(B(ul,r),o){case"forwards":for(n=t.child,o=null;null!==n;)null!==(e=n.alternate)&&null===dl(e)&&(o=n),n=n.sibling;null===(n=o)?(o=t.child,t.child=null):(o=n.sibling,n.sibling=null),ql(t,!1,o,n,a);break;case"backwards":for(n=null,o=t.child,t.child=null;null!==o;){if(null!==(e=o.alternate)&&null===dl(e)){t.child=o;break}e=o.sibling,o.sibling=n,n=o,o=e}ql(t,!0,n,null,a);break;case"together":ql(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function Kl(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),pc|=t.lanes,0===(n&t.childLanes)){if(null===e)return null;if(Eo(e,t,n,!1),0===(n&t.childLanes))return null}if(null!==e&&t.child!==e.child)throw Error(i(153));if(null!==t.child){for(n=Mr(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Mr(e,e.pendingProps)).return=t;n.sibling=null}return t.child}function Ql(e,t){return 0!==(e.lanes&t)||!(null===(e=e.dependencies)||!_o(e))}function Zl(e,t,n){if(null!==e)if(e.memoizedProps!==t.pendingProps)Cl=!0;else{if(!(Ql(e,n)||128&t.flags))return Cl=!1,function(e,t,n){switch(t.tag){case 3:G(t,t.stateNode.containerInfo),wo(0,Lo,e.memoizedState.cache),mo();break;case 27:case 5:Y(t);break;case 4:G(t,t.stateNode.containerInfo);break;case 10:wo(0,t.type,t.memoizedProps.value);break;case 13:var r=t.memoizedState;if(null!==r)return null!==r.dehydrated?(il(t),t.flags|=128,null):0!==(n&t.child.childLanes)?Ul(e,t,n):(il(t),null!==(e=Kl(e,t,n))?e.sibling:null);il(t);break;case 19:var o=!!(128&e.flags);if((r=0!==(n&t.childLanes))||(Eo(e,t,n,!1),r=0!==(n&t.childLanes)),o){if(r)return Yl(e,t,n);t.flags|=128}if(null!==(o=t.memoizedState)&&(o.rendering=null,o.tail=null,o.lastEffect=null),B(ul,ul.current),r)break;return null;case 22:case 23:return t.lanes=0,jl(e,t,n);case 24:wo(0,Lo,e.memoizedState.cache)}return Kl(e,t,n)}(e,t,n);Cl=!!(131072&e.flags)}else Cl=!1,ao&&1048576&t.flags&&eo(t,qr,t.index);switch(t.lanes=0,t.tag){case 16:e:{e=t.pendingProps;var r=t.elementType,o=r._init;if(r=o(r._payload),t.type=r,"function"!=typeof r){if(null!=r){if((o=r.$$typeof)===x){t.tag=11,t=Pl(null,t,r,e,n);break e}if(o===_){t.tag=14,t=Nl(null,t,r,e,n);break e}}throw t=j(r)||r,Error(i(306,t,""))}Fr(r)?(e=gl(r,e),t.tag=1,t=Fl(null,t,r,e,n)):(t.tag=0,t=Il(null,t,r,e,n))}return t;case 0:return Il(e,t,t.type,t.pendingProps,n);case 1:return Fl(e,t,r=t.type,o=gl(r,t.pendingProps),n);case 3:e:{if(G(t,t.stateNode.containerInfo),null===e)throw Error(i(387));r=t.pendingProps;var a=t.memoizedState;o=a.element,oa(e,t),da(t,r,null,n);var l=t.memoizedState;if(r=l.cache,wo(0,Lo,r),r!==a.cache&&So(t,[Lo],n,!0),ua(),r=l.element,a.isDehydrated){if(a={element:r,isDehydrated:!1,cache:l.cache},t.updateQueue.baseState=a,t.memoizedState=a,256&t.flags){t=Ml(e,t,r,n);break e}if(r!==o){go(o=Er(Error(i(424)),t)),t=Ml(e,t,r,n);break e}if(9===(e=t.stateNode.containerInfo).nodeType)e=e.body;else e="HTML"===e.nodeName?e.ownerDocument.body:e;for(oo=yd(e.firstChild),ro=t,ao=!0,io=null,lo=!0,n=rl(t,null,r,n),t.child=n;n;)n.flags=-3&n.flags|4096,n=n.sibling}else{if(mo(),r===o){t=Kl(e,t,n);break e}Tl(e,t,r,n)}t=t.child}return t;case 26:return Rl(e,t),null===e?(n=Td(t.type,null,t.pendingProps,null))?t.memoizedState=n:ao||(n=t.type,e=t.pendingProps,(r=rd(V.current).createElement(n))[je]=t,r[Le]=e,ed(r,n,e),We(r),t.stateNode=r):t.memoizedState=Td(t.type,e.memoizedProps,t.pendingProps,e.memoizedState),null;case 27:return Y(t),null===e&&ao&&(r=t.stateNode=wd(t.type,t.pendingProps,V.current),ro=t,lo=!0,o=oo,pd(t.type)?(bd=o,oo=yd(r.firstChild)):oo=o),Tl(e,t,t.pendingProps.children,n),Rl(e,t),null===e&&(t.flags|=4194304),t.child;case 5:return null===e&&ao&&((o=r=oo)&&(null!==(r=function(e,t,n,r){for(;1===e.nodeType;){var o=n;if(e.nodeName.toLowerCase()!==t.toLowerCase()){if(!r&&("INPUT"!==e.nodeName||"hidden"!==e.type))break}else if(r){if(!e[ze])switch(t){case"meta":if(!e.hasAttribute("itemprop"))break;return e;case"link":if("stylesheet"===(a=e.getAttribute("rel"))&&e.hasAttribute("data-precedence"))break;if(a!==o.rel||e.getAttribute("href")!==(null==o.href||""===o.href?null:o.href)||e.getAttribute("crossorigin")!==(null==o.crossOrigin?null:o.crossOrigin)||e.getAttribute("title")!==(null==o.title?null:o.title))break;return e;case"style":if(e.hasAttribute("data-precedence"))break;return e;case"script":if(((a=e.getAttribute("src"))!==(null==o.src?null:o.src)||e.getAttribute("type")!==(null==o.type?null:o.type)||e.getAttribute("crossorigin")!==(null==o.crossOrigin?null:o.crossOrigin))&&a&&e.hasAttribute("async")&&!e.hasAttribute("itemprop"))break;return e;default:return e}}else{if("input"!==t||"hidden"!==e.type)return e;var a=null==o.name?null:""+o.name;if("hidden"===o.type&&e.getAttribute("name")===a)return e}if(null===(e=yd(e.nextSibling)))break}return null}(r,t.type,t.pendingProps,lo))?(t.stateNode=r,ro=t,oo=yd(r.firstChild),lo=!1,o=!0):o=!1),o||co(t)),Y(t),o=t.type,a=t.pendingProps,l=null!==e?e.memoizedProps:null,r=a.children,id(o,a)?r=null:null!==l&&id(o,l)&&(t.flags|=32),null!==t.memoizedState&&(o=ja(e,t,Ia,null,null,n),Yd._currentValue=o),Rl(e,t),Tl(e,t,r,n),t.child;case 6:return null===e&&ao&&((e=n=oo)&&(null!==(n=function(e,t,n){if(""===t)return null;for(;3!==e.nodeType;){if((1!==e.nodeType||"INPUT"!==e.nodeName||"hidden"!==e.type)&&!n)return null;if(null===(e=yd(e.nextSibling)))return null}return e}(n,t.pendingProps,lo))?(t.stateNode=n,ro=t,oo=null,e=!0):e=!1),e||co(t)),null;case 13:return Ul(e,t,n);case 4:return G(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=nl(t,null,r,n):Tl(e,t,r,n),t.child;case 11:return Pl(e,t,t.type,t.pendingProps,n);case 7:return Tl(e,t,t.pendingProps,n),t.child;case 8:case 12:return Tl(e,t,t.pendingProps.children,n),t.child;case 10:return r=t.pendingProps,wo(0,t.type,r.value),Tl(e,t,r.children,n),t.child;case 9:return o=t.type._context,r=t.pendingProps.children,Ao(t),r=r(o=Co(o)),t.flags|=1,Tl(e,t,r,n),t.child;case 14:return Nl(e,t,t.type,t.pendingProps,n);case 15:return Ol(e,t,t.type,t.pendingProps,n);case 19:return Yl(e,t,n);case 31:return r=t.pendingProps,n=t.mode,r={mode:r.mode,children:r.children},null===e?((n=Vl(r,n)).ref=t.ref,t.child=n,n.return=t,t=n):((n=Mr(e.child,r)).ref=t.ref,t.child=n,n.return=t,t=n),t;case 22:return jl(e,t,n);case 24:return Ao(t),r=Co(Lo),null===e?(null===(o=Ho())&&(o=rc,a=Ro(),o.pooledCache=a,a.refCount++,null!==a&&(o.pooledCacheLanes|=n),o=a),t.memoizedState={parent:r,cache:o},ra(t),wo(0,Lo,o)):(0!==(e.lanes&n)&&(oa(e,t),da(t,null,null,n),ua()),o=e.memoizedState,a=t.memoizedState,o.parent!==r?(o={parent:r,cache:r},t.memoizedState=o,0===t.lanes&&(t.memoizedState=t.updateQueue.baseState=o),wo(0,Lo,r)):(r=a.cache,wo(0,Lo,r),r!==o.cache&&So(t,[Lo],n,!0))),Tl(e,t,t.pendingProps.children,n),t.child;case 29:throw t.pendingProps}throw Error(i(156,t.tag))}function Xl(e){e.flags|=4}function Jl(e,t){if("stylesheet"!==t.type||4&t.state.loading)e.flags&=-16777217;else if(e.flags|=16777216,!Bd(t)){if(null!==(t=ol.current)&&((4194048&ac)===ac?null!==al:(62914560&ac)!==ac&&!(536870912&ac)||t!==al))throw Jo=Ko,qo;e.flags|=8192}}function es(e,t){null!==t&&(e.flags|=4),16384&e.flags&&(t=22!==e.tag?Se():536870912,e.lanes|=t,yc|=t)}function ts(e,t){if(!ao)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;null!==t;)null!==t.alternate&&(n=t),t=t.sibling;null===n?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var r=null;null!==n;)null!==n.alternate&&(r=n),n=n.sibling;null===r?t||null===e.tail?e.tail=null:e.tail.sibling=null:r.sibling=null}}function ns(e){var t=null!==e.alternate&&e.alternate.child===e.child,n=0,r=0;if(t)for(var o=e.child;null!==o;)n|=o.lanes|o.childLanes,r|=65011712&o.subtreeFlags,r|=65011712&o.flags,o.return=e,o=o.sibling;else for(o=e.child;null!==o;)n|=o.lanes|o.childLanes,r|=o.subtreeFlags,r|=o.flags,o.return=e,o=o.sibling;return e.subtreeFlags|=r,e.childLanes=n,t}function rs(e,t,n){var r=t.pendingProps;switch(no(t),t.tag){case 31:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:case 1:return ns(t),null;case 3:return n=t.stateNode,r=null,null!==e&&(r=e.memoizedState.cache),t.memoizedState.cache!==r&&(t.flags|=2048),ko(Lo),q(),n.pendingContext&&(n.context=n.pendingContext,n.pendingContext=null),null!==e&&null!==e.child||(po(t)?Xl(t):null===e||e.memoizedState.isDehydrated&&!(256&t.flags)||(t.flags|=1024,ho())),ns(t),null;case 26:return n=t.memoizedState,null===e?(Xl(t),null!==n?(ns(t),Jl(t,n)):(ns(t),t.flags&=-16777217)):n?n!==e.memoizedState?(Xl(t),ns(t),Jl(t,n)):(ns(t),t.flags&=-16777217):(e.memoizedProps!==r&&Xl(t),ns(t),t.flags&=-16777217),null;case 27:K(t),n=V.current;var o=t.type;if(null!==e&&null!=t.stateNode)e.memoizedProps!==r&&Xl(t);else{if(!r){if(null===t.stateNode)throw Error(i(166));return ns(t),null}e=U.current,po(t)?uo(t):(e=wd(o,r,n),t.stateNode=e,Xl(t))}return ns(t),null;case 5:if(K(t),n=t.type,null!==e&&null!=t.stateNode)e.memoizedProps!==r&&Xl(t);else{if(!r){if(null===t.stateNode)throw Error(i(166));return ns(t),null}if(e=U.current,po(t))uo(t);else{switch(o=rd(V.current),e){case 1:e=o.createElementNS("http://www.w3.org/2000/svg",n);break;case 2:e=o.createElementNS("http://www.w3.org/1998/Math/MathML",n);break;default:switch(n){case"svg":e=o.createElementNS("http://www.w3.org/2000/svg",n);break;case"math":e=o.createElementNS("http://www.w3.org/1998/Math/MathML",n);break;case"script":(e=o.createElement("div")).innerHTML="
-
+
+Building Images | Komodo
+
+
-
Komodo builds docker images by cloning the source repository from the configured git provider, running docker build,
and pushing the resulting image to the configured docker registry. Any repo containing a Dockerfile is buildable using this method.