diff --git a/.nojekyll b/.nojekyll
new file mode 100644
index 00000000..e69de29b
diff --git a/404.html b/404.html
new file mode 100644
index 00000000..492f19b1
--- /dev/null
+++ b/404.html
@@ -0,0 +1,20 @@
+
+
+
+
+
+ Kubernetes and Harbor
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 00000000..261eeb9e
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/README.md b/README.md
new file mode 100644
index 00000000..7c810f2a
--- /dev/null
+++ b/README.md
@@ -0,0 +1,69 @@
+# Kubernetes + Harbor
+
+[![Build Status](https://github.com/ruzickap/k8s-harbor/actions/workflows/vuepress-build.yml/badge.svg)](https://github.com/ruzickap/k8s-harbor)
+
+[Harbor](https://goharbor.io/) is an open source cloud native registry that
+stores, signs, and scans container images for vulnerabilities.
+
+![Harbor](./harbor-horizontal-color.svg "Harbor")
+
+Harbor solves common challenges by delivering trust, compliance, performance,
+and interoperability. It fills a gap for organizations and applications that
+cannot use a public or cloud-based registry, or want a consistent experience
+across clouds.
+
+* Demo GitHub repository: [https://github.com/ruzickap/k8s-harbor](https://github.com/ruzickap/k8s-harbor)
+* Demo Web Pages: [https://ruzickap.github.io/k8s-harbor](https://ruzickap.github.io/k8s-harbor)
+* Presentation git repository: [https://github.com/ruzickap/k8s-harbor-presentation](https://github.com/ruzickap/k8s-harbor-presentation)
+* YouTube: [Harbor presentation in Czech language](https://youtu.be/niZJOM7ND24)
+* Asciinema screencast: [https://asciinema.org/a/253519](https://asciinema.org/a/253519)
+* Asciinema screencast (45 minutes): [https://asciinema.org/a/278803](https://asciinema.org/a/278803)
+
+## Requirements
+
+* [ansible](https://ansible.com)
+* [awscli](https://aws.amazon.com/cli/)
+* [AWS IAM Authenticator for Kubernetes](https://github.com/kubernetes-sigs/aws-iam-authenticator)
+* [AWS account](https://aws.amazon.com/account/)
+* [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/)
+* [eksctl](https://eksctl.io/)
+* Kubernetes, Docker, Linux, AWS knowledge required
+
+## Objectives
+
+* Download and install Harbor to your Kubernetes cluster
+
+## Lab Architecture
+
+![Lab architecture](https://raw.githubusercontent.com/ruzickap/k8s-harbor-presentation/master/images/harbor_demo_architecture_diagram.svg?sanitize=true
+"Lab architecture")
+
+## Content
+
+* [Part 01 - Create EKS cluster](https://github.com/ruzickap/k8s-harbor/tree/main/docs/part-01/README.md)
+* [Part 02 - Install Helm](https://github.com/ruzickap/k8s-harbor/tree/main/docs/part-02/README.md)
+* [Part 03 - ingress-nginx + cert-manager installation](https://github.com/ruzickap/k8s-harbor/tree/main/docs/part-03/README.md)
+* [Part 04 - Harbor installation](https://github.com/ruzickap/k8s-harbor/tree/main/docs/part-04/README.md)
+* [Part 05 - Initial Harbor tasks](https://github.com/ruzickap/k8s-harbor/tree/main/docs/part-05/README.md)
+* [Part 06 - Harbor and Helm charts](https://github.com/ruzickap/k8s-harbor/tree/main/docs/part-06/README.md)
+* [Part 07 - Harbor and container images](https://github.com/ruzickap/k8s-harbor/tree/main/docs/part-07/README.md)
+* [Part 08 - Project settings](https://github.com/ruzickap/k8s-harbor/tree/main/docs/part-08/README.md)
+* [Part 09 - Clean-up](https://github.com/ruzickap/k8s-harbor/tree/main/docs/part-09/README.md)
+
+## Links
+
+* Video:
+
+ * [Intro to Harbor](https://youtu.be/Rs3zByxI8aY)
+ * [Intro: Harbor - James Zabala & Henry Zhang, VMware](https://youtu.be/RZQVBWwGa2s)
+ * [Deep Dive: Harbor - Tan Jiang & Jia Zou, VMware](https://youtu.be/OKj1XxtsTCo)
+
+* Pages:
+
+ * [Deploying Harbor Container Registry in Production](https://ikod.medium.com/deploy-harbor-container-registry-in-production-89352fb1a114)
+ * [Use the Notary client for advanced users](https://docs.docker.com/notary/advanced_usage/)
+ * [Handy API Harbor calls (in Chinese)](https://cloud.tencent.com/developer/article/1151425)
+ * [Swagger Editor](https://editor.swagger.io/) + Import [Harbor's swagger.yaml](https://raw.githubusercontent.com/goharbor/harbor/7b6e83090e26d171c0d0e0dacd14e2b61fab45e1/API/harbor/swagger.yaml)
+
+![Harbor](https://raw.githubusercontent.com/cncf/artwork/ab42c9591f6e0fdccc62c7b88f353d3fdc825734/harbor/stacked/color/harbor-stacked-color.svg?sanitize=true
+"Harbor")
diff --git a/assets/css/0.styles.c9a2aaca.css b/assets/css/0.styles.c9a2aaca.css
new file mode 100644
index 00000000..4657543f
--- /dev/null
+++ b/assets/css/0.styles.c9a2aaca.css
@@ -0,0 +1 @@
+.medium-zoom-overlay{z-index:100}.medium-zoom-overlay~img{z-index:101}html{scroll-behavior:smooth}code[class*=language-],pre[class*=language-]{color:#ccc;background:none;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}.theme-default-content code{color:#476582;padding:.25rem .5rem;margin:0;font-size:.85em;background-color:rgba(27,31,35,.05);border-radius:3px}.theme-default-content code .token.deleted{color:#ec5975}.theme-default-content code .token.inserted{color:#3eaf7c}.theme-default-content pre,.theme-default-content pre[class*=language-]{line-height:1.4;padding:1.25rem 1.5rem;margin:.85rem 0;background-color:#282c34;border-radius:6px;overflow:auto}.theme-default-content pre[class*=language-] code,.theme-default-content pre code{color:#fff;padding:0;background-color:transparent;border-radius:0}div[class*=language-]{position:relative;background-color:#282c34;border-radius:6px}div[class*=language-] .highlight-lines{-webkit-user-select:none;user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.4}div[class*=language-] .highlight-lines .highlighted{background-color:rgba(0,0,0,.66)}div[class*=language-] pre,div[class*=language-] pre[class*=language-]{background:transparent;position:relative;z-index:1}div[class*=language-]:before{position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem;color:hsla(0,0%,100%,.4)}div[class*=language-]:not(.line-numbers-mode) .line-numbers-wrapper{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlighted{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlighted:before{content:" ";position:absolute;z-index:3;left:0;top:0;display:block;width:3.5rem;height:100%;background-color:rgba(0,0,0,.66)}div[class*=language-].line-numbers-mode pre{padding-left:4.5rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers-wrapper{position:absolute;top:0;width:3.5rem;text-align:center;color:hsla(0,0%,100%,.3);padding:1.25rem 0;line-height:1.4}div[class*=language-].line-numbers-mode .line-numbers-wrapper br{-webkit-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number{position:relative;z-index:4;-webkit-user-select:none;user-select:none;font-size:.85em}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;z-index:2;top:0;left:0;width:3.5rem;height:100%;border-radius:6px 0 0 6px;border-right:1px solid rgba(0,0,0,.66);background-color:#282c34}div[class~=language-js]:before{content:"js"}div[class~=language-ts]:before{content:"ts"}div[class~=language-html]:before{content:"html"}div[class~=language-md]:before{content:"md"}div[class~=language-vue]:before{content:"vue"}div[class~=language-css]:before{content:"css"}div[class~=language-sass]:before{content:"sass"}div[class~=language-scss]:before{content:"scss"}div[class~=language-less]:before{content:"less"}div[class~=language-stylus]:before{content:"stylus"}div[class~=language-go]:before{content:"go"}div[class~=language-java]:before{content:"java"}div[class~=language-c]:before{content:"c"}div[class~=language-sh]:before{content:"sh"}div[class~=language-yaml]:before{content:"yaml"}div[class~=language-py]:before{content:"py"}div[class~=language-docker]:before{content:"docker"}div[class~=language-dockerfile]:before{content:"dockerfile"}div[class~=language-makefile]:before{content:"makefile"}div[class~=language-javascript]:before{content:"js"}div[class~=language-typescript]:before{content:"ts"}div[class~=language-markup]:before{content:"html"}div[class~=language-markdown]:before{content:"md"}div[class~=language-json]:before{content:"json"}div[class~=language-ruby]:before{content:"rb"}div[class~=language-python]:before{content:"py"}div[class~=language-bash]:before{content:"sh"}div[class~=language-php]:before{content:"php"}.custom-block .custom-block-title{font-weight:600;margin-bottom:-.4rem}.custom-block.danger,.custom-block.tip,.custom-block.warning{padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0}.custom-block.tip{background-color:#f3f5f7;border-color:#42b983}.custom-block.warning{background-color:rgba(255,229,100,.3);border-color:#e7c000;color:#6b5900}.custom-block.warning .custom-block-title{color:#b29400}.custom-block.warning a{color:#2c3e50}.custom-block.danger{background-color:#ffe6e6;border-color:#c00;color:#4d0000}.custom-block.danger .custom-block-title{color:#900}.custom-block.danger a{color:#2c3e50}.custom-block.details{display:block;position:relative;border-radius:2px;margin:1.6em 0;padding:1.6em;background-color:#eee}.custom-block.details h4{margin-top:0}.custom-block.details figure:last-child,.custom-block.details p:last-child{margin-bottom:0;padding-bottom:0}.custom-block.details summary{outline:none;cursor:pointer}.arrow{display:inline-block;width:0;height:0}.arrow.up{border-bottom:6px solid #ccc}.arrow.down,.arrow.up{border-left:4px solid transparent;border-right:4px solid transparent}.arrow.down{border-top:6px solid #ccc}.arrow.right{border-left:6px solid #ccc}.arrow.left,.arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent}.arrow.left{border-right:6px solid #ccc}.theme-default-content:not(.custom){max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.theme-default-content:not(.custom){padding:2rem}}@media (max-width:419px){.theme-default-content:not(.custom){padding:1.5rem}}.table-of-contents .badge{vertical-align:middle}body,html{padding:0;margin:0;background-color:#fff}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:16px;color:#2c3e50}.page{padding-left:20rem}.navbar{z-index:20;right:0;height:3.6rem;background-color:#fff;box-sizing:border-box;border-bottom:1px solid #eaecef}.navbar,.sidebar-mask{position:fixed;top:0;left:0}.sidebar-mask{z-index:9;width:100vw;height:100vh;display:none}.sidebar{font-size:16px;background-color:#fff;width:20rem;position:fixed;z-index:10;margin:0;top:3.6rem;left:0;bottom:0;box-sizing:border-box;border-right:1px solid #eaecef;overflow-y:auto}.theme-default-content:not(.custom)>:first-child{margin-top:3.6rem}.theme-default-content:not(.custom) a:hover{text-decoration:underline}.theme-default-content:not(.custom) p.demo{padding:1rem 1.5rem;border:1px solid #ddd;border-radius:4px}.theme-default-content:not(.custom) img{max-width:100%}.theme-default-content.custom{padding:0;margin:0}.theme-default-content.custom img{max-width:100%}a{font-weight:500;text-decoration:none}a,p a code{color:#3eaf7c}p a code{font-weight:400}kbd{background:#eee;border:.15rem solid #ddd;border-bottom:.25rem solid #ddd;border-radius:.15rem;padding:0 .15em}blockquote{font-size:1rem;color:#999;border-left:.2rem solid #dfe2e5;margin:1rem 0;padding:.25rem 0 .25rem 1rem}blockquote>p{margin:0}ol,ul{padding-left:1.2em}strong{font-weight:600}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.25}.theme-default-content:not(.custom)>h1,.theme-default-content:not(.custom)>h2,.theme-default-content:not(.custom)>h3,.theme-default-content:not(.custom)>h4,.theme-default-content:not(.custom)>h5,.theme-default-content:not(.custom)>h6{margin-top:-3.1rem;padding-top:4.6rem;margin-bottom:0}.theme-default-content:not(.custom)>h1:first-child,.theme-default-content:not(.custom)>h2:first-child,.theme-default-content:not(.custom)>h3:first-child,.theme-default-content:not(.custom)>h4:first-child,.theme-default-content:not(.custom)>h5:first-child,.theme-default-content:not(.custom)>h6:first-child{margin-top:-1.5rem;margin-bottom:1rem}.theme-default-content:not(.custom)>h1:first-child+.custom-block,.theme-default-content:not(.custom)>h1:first-child+p,.theme-default-content:not(.custom)>h1:first-child+pre,.theme-default-content:not(.custom)>h2:first-child+.custom-block,.theme-default-content:not(.custom)>h2:first-child+p,.theme-default-content:not(.custom)>h2:first-child+pre,.theme-default-content:not(.custom)>h3:first-child+.custom-block,.theme-default-content:not(.custom)>h3:first-child+p,.theme-default-content:not(.custom)>h3:first-child+pre,.theme-default-content:not(.custom)>h4:first-child+.custom-block,.theme-default-content:not(.custom)>h4:first-child+p,.theme-default-content:not(.custom)>h4:first-child+pre,.theme-default-content:not(.custom)>h5:first-child+.custom-block,.theme-default-content:not(.custom)>h5:first-child+p,.theme-default-content:not(.custom)>h5:first-child+pre,.theme-default-content:not(.custom)>h6:first-child+.custom-block,.theme-default-content:not(.custom)>h6:first-child+p,.theme-default-content:not(.custom)>h6:first-child+pre{margin-top:2rem}h1:focus .header-anchor,h1:hover .header-anchor,h2:focus .header-anchor,h2:hover .header-anchor,h3:focus .header-anchor,h3:hover .header-anchor,h4:focus .header-anchor,h4:hover .header-anchor,h5:focus .header-anchor,h5:hover .header-anchor,h6:focus .header-anchor,h6:hover .header-anchor{opacity:1}h1{font-size:2.2rem}h2{font-size:1.65rem;padding-bottom:.3rem;border-bottom:1px solid #eaecef}h3{font-size:1.35rem}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;-webkit-user-select:none;user-select:none;opacity:0}a.header-anchor:focus,a.header-anchor:hover{text-decoration:none}.line-number,code,kbd{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}ol,p,ul{line-height:1.7}hr{border:0;border-top:1px solid #eaecef}table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto}tr{border-top:1px solid #dfe2e5}tr:nth-child(2n){background-color:#f6f8fa}td,th{border:1px solid #dfe2e5;padding:.6em 1em}.theme-container.sidebar-open .sidebar-mask{display:block}.theme-container.no-navbar .theme-default-content:not(.custom)>h1,.theme-container.no-navbar h2,.theme-container.no-navbar h3,.theme-container.no-navbar h4,.theme-container.no-navbar h5,.theme-container.no-navbar h6{margin-top:1.5rem;padding-top:0}.theme-container.no-navbar .sidebar{top:0}@media (min-width:720px){.theme-container.no-sidebar .sidebar{display:none}.theme-container.no-sidebar .page{padding-left:0}}@media (max-width:959px){.sidebar{font-size:15px;width:16.4rem}.page{padding-left:16.4rem}}@media (max-width:719px){.sidebar{top:0;padding-top:3.6rem;transform:translateX(-100%);transition:transform .2s ease}.page{padding-left:0}.theme-container.sidebar-open .sidebar{transform:translateX(0)}.theme-container.no-navbar .sidebar{padding-top:0}}@media (max-width:419px){h1{font-size:1.9rem}.theme-default-content div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}#nprogress{pointer-events:none}#nprogress .bar{background:#3eaf7c;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #3eaf7c,0 0 5px #3eaf7c;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border-color:#3eaf7c transparent transparent #3eaf7c;border-style:solid;border-width:2px;border-radius:50%;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.go-to-top[data-v-5fd4ef0c]{cursor:pointer;position:fixed;bottom:2rem;right:2.5rem;width:2rem;color:#3eaf7c;z-index:1}.go-to-top[data-v-5fd4ef0c]:hover{color:#72cda4}@media (max-width:959px){.go-to-top[data-v-5fd4ef0c]{display:none}}.fade-enter-active[data-v-5fd4ef0c],.fade-leave-active[data-v-5fd4ef0c]{transition:opacity .3s}.fade-enter[data-v-5fd4ef0c],.fade-leave-to[data-v-5fd4ef0c]{opacity:0}.reading-progress[data-v-3640397f]{position:fixed;z-index:1000;background:transparent;overflow:hidden}.reading-progress .progress[data-v-3640397f]{width:100%;height:100%;background:#3eaf7c;background-image:none;transform-origin:0 0;transition:transform .2s ease-out}.top[data-v-3640397f]{top:0;left:0;right:0;width:100%;height:3px}.bottom[data-v-3640397f]{bottom:0;left:0;right:0;width:100%;height:3px}.left[data-v-3640397f]{left:0;top:0;bottom:0;width:3px;height:100%}.right[data-v-3640397f]{right:0;top:0;bottom:0;width:3px;height:100%}.icon.outbound{color:#aaa;display:inline-block;vertical-align:middle;position:relative;top:-1px}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.algolia-search-wrapper>span{vertical-align:middle}.algolia-search-wrapper .algolia-autocomplete{line-height:normal}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu{background-color:#fff;border:1px solid #999;border-radius:4px;font-size:16px;margin:6px 0 0;padding:4px;text-align:left}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu:before{border-color:#999}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu [class*=ds-dataset-]{border:none;padding:0}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu .ds-suggestions{margin-top:0}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu .ds-suggestion{border-bottom:1px solid #eaecef}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion--highlight{color:#2c815b}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion{border-color:#eaecef;padding:0}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--category-header{padding:5px 10px;margin-top:0;background:#3eaf7c;color:#fff;font-weight:600}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--highlight{background:hsla(0,0%,100%,.6)}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--wrapper{padding:0}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--title{font-weight:600;margin-bottom:0;color:#2c3e50}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{vertical-align:top;padding:5px 7px 5px 5px;border-color:#eaecef;background:#f1f3f5}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column:after{display:none}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column-text{color:#555}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-footer{border-color:#eaecef}.algolia-search-wrapper .algolia-autocomplete .ds-cursor .algolia-docsearch-suggestion--content{background-color:#e7edf3!important;color:#2c3e50}@media (min-width:719px){.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{float:none;width:150px;min-width:150px;display:table-cell}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content{float:none;display:table-cell;width:100%;vertical-align:top}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .ds-dropdown-menu{min-width:515px!important}}@media (max-width:719px){.algolia-search-wrapper .ds-dropdown-menu{min-width:calc(100vw - 4rem)!important;max-width:calc(100vw - 4rem)!important}.algolia-search-wrapper .algolia-docsearch-suggestion--wrapper{padding:5px 7px 5px 5px!important}.algolia-search-wrapper .algolia-docsearch-suggestion--subcategory-column{padding:0!important;background:#fff!important}.algolia-search-wrapper .algolia-docsearch-suggestion--subcategory-column-text:after{content:" > ";font-size:10px;line-height:14.4px;display:inline-block;width:5px;margin:-3px 3px 0;vertical-align:middle}}.home{padding:3.6rem 2rem 0;max-width:960px;margin:0 auto;display:block}.home .hero{text-align:center}.home .hero img{max-width:100%;max-height:280px;display:block;margin:3rem auto 1.5rem}.home .hero h1{font-size:3rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.8rem auto}.home .hero .description{max-width:35rem;font-size:1.6rem;line-height:1.3;color:#6a8bad}.home .hero .action-button{display:inline-block;font-size:1.2rem;color:#fff;background-color:#3eaf7c;padding:.8rem 1.6rem;border-radius:4px;transition:background-color .1s ease;box-sizing:border-box;border-bottom:1px solid #389d70}.home .hero .action-button:hover{background-color:#4abf8a}.home .features{border-top:1px solid #eaecef;padding:1.2rem 0;margin-top:2.5rem;display:flex;flex-wrap:wrap;align-items:flex-start;align-content:stretch;justify-content:space-between}.home .feature{flex-grow:1;flex-basis:30%;max-width:30%}.home .feature h2{font-size:1.4rem;font-weight:500;border-bottom:none;padding-bottom:0;color:#3a5169}.home .feature p{color:#4e6e8e}.home .footer{padding:2.5rem;border-top:1px solid #eaecef;text-align:center;color:#4e6e8e}@media (max-width:719px){.home .features{flex-direction:column}.home .feature{max-width:100%;padding:0 2.5rem}}@media (max-width:419px){.home{padding-left:1.5rem;padding-right:1.5rem}.home .hero img{max-height:210px;margin:2rem auto 1.2rem}.home .hero h1{font-size:2rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.2rem auto}.home .hero .description{font-size:1.2rem}.home .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home .feature h2{font-size:1.25rem}}.search-box{display:inline-block;position:relative;margin-right:1rem}.search-box input{cursor:text;width:10rem;height:2rem;color:#4e6e8e;display:inline-block;border:1px solid #cfd4db;border-radius:2rem;font-size:.9rem;line-height:2rem;padding:0 .5rem 0 2rem;outline:none;transition:all .2s ease;background:#fff url(/k8s-harbor/assets/img/search.83621669.svg) .6rem .5rem no-repeat;background-size:1rem}.search-box input:focus{cursor:auto;border-color:#3eaf7c}.search-box .suggestions{background:#fff;width:20rem;position:absolute;top:2rem;border:1px solid #cfd4db;border-radius:6px;padding:.4rem;list-style-type:none}.search-box .suggestions.align-right{right:0}.search-box .suggestion{line-height:1.4;padding:.4rem .6rem;border-radius:4px;cursor:pointer}.search-box .suggestion a{white-space:normal;color:#5d82a6}.search-box .suggestion a .page-title{font-weight:600}.search-box .suggestion a .header{font-size:.9em;margin-left:.25em}.search-box .suggestion.focused{background-color:#f3f4f5}.search-box .suggestion.focused a{color:#3eaf7c}@media (max-width:959px){.search-box input{cursor:pointer;width:0;border-color:transparent;position:relative}.search-box input:focus{cursor:text;left:0;width:10rem}}@media (-ms-high-contrast:none){.search-box input{height:2rem}}@media (max-width:959px) and (min-width:719px){.search-box .suggestions{left:0}}@media (max-width:719px){.search-box{margin-right:0}.search-box input{left:1rem}.search-box .suggestions{right:0}}@media (max-width:419px){.search-box .suggestions{width:calc(100vw - 4rem)}.search-box input:focus{width:8rem}}.sidebar-button{cursor:pointer;display:none;width:1.25rem;height:1.25rem;position:absolute;padding:.6rem;top:.6rem;left:1rem}.sidebar-button .icon{display:block;width:1.25rem;height:1.25rem}@media (max-width:719px){.sidebar-button{display:block}}.dropdown-enter,.dropdown-leave-to{height:0!important}.badge[data-v-15b7b770]{display:inline-block;font-size:14px;height:18px;line-height:18px;border-radius:3px;padding:0 6px;color:#fff}.badge.green[data-v-15b7b770],.badge.tip[data-v-15b7b770],.badge[data-v-15b7b770]{background-color:#42b983}.badge.error[data-v-15b7b770]{background-color:#da5961}.badge.warn[data-v-15b7b770],.badge.warning[data-v-15b7b770],.badge.yellow[data-v-15b7b770]{background-color:#e7c000}.badge+.badge[data-v-15b7b770]{margin-left:5px}.theme-code-block[data-v-759a7d02]{display:none}.theme-code-block__active[data-v-759a7d02]{display:block}.theme-code-block>pre[data-v-759a7d02]{background-color:orange}.theme-code-group__nav[data-v-deefee04]{margin-bottom:-35px;background-color:#282c34;padding-bottom:22px;border-top-left-radius:6px;border-top-right-radius:6px;padding-left:10px;padding-top:10px}.theme-code-group__ul[data-v-deefee04]{margin:auto 0;padding-left:0;display:inline-flex;list-style:none}.theme-code-group__nav-tab[data-v-deefee04]{border:0;padding:5px;cursor:pointer;background-color:transparent;font-size:.85em;line-height:1.4;color:hsla(0,0%,100%,.9);font-weight:600}.theme-code-group__nav-tab-active[data-v-deefee04]{border-bottom:1px solid #42b983}.pre-blank[data-v-deefee04]{color:#42b983}.searchbox{display:inline-block;position:relative;width:200px;height:32px!important;white-space:nowrap;box-sizing:border-box;visibility:visible!important}.searchbox .algolia-autocomplete{display:block;width:100%;height:100%}.searchbox__wrapper{width:100%;height:100%;z-index:999;position:relative}.searchbox__input{display:inline-block;box-sizing:border-box;transition:box-shadow .4s ease,background .4s ease;border:0;border-radius:16px;box-shadow:inset 0 0 0 1px #ccc;background:#fff!important;padding:0 26px 0 32px;width:100%;height:100%;vertical-align:middle;white-space:normal;font-size:12px;-webkit-appearance:none;-moz-appearance:none;appearance:none}.searchbox__input::-webkit-search-cancel-button,.searchbox__input::-webkit-search-decoration,.searchbox__input::-webkit-search-results-button,.searchbox__input::-webkit-search-results-decoration{display:none}.searchbox__input:hover{box-shadow:inset 0 0 0 1px #b3b3b3}.searchbox__input:active,.searchbox__input:focus{outline:0;box-shadow:inset 0 0 0 1px #aaa;background:#fff}.searchbox__input::-moz-placeholder{color:#aaa}.searchbox__input::placeholder{color:#aaa}.searchbox__submit{position:absolute;top:0;margin:0;border:0;border-radius:16px 0 0 16px;background-color:rgba(69,142,225,0);padding:0;width:32px;height:100%;vertical-align:middle;text-align:center;font-size:inherit;-webkit-user-select:none;-moz-user-select:none;user-select:none;right:inherit;left:0}.searchbox__submit:before{display:inline-block;margin-right:-4px;height:100%;vertical-align:middle;content:""}.searchbox__submit:active,.searchbox__submit:hover{cursor:pointer}.searchbox__submit:focus{outline:0}.searchbox__submit svg{width:14px;height:14px;vertical-align:middle;fill:#6d7e96}.searchbox__reset{display:block;position:absolute;top:8px;right:8px;margin:0;border:0;background:none;cursor:pointer;padding:0;font-size:inherit;-webkit-user-select:none;-moz-user-select:none;user-select:none;fill:rgba(0,0,0,.5)}.searchbox__reset.hide{display:none}.searchbox__reset:focus{outline:0}.searchbox__reset svg{display:block;margin:4px;width:8px;height:8px}.searchbox__input:valid~.searchbox__reset{display:block;animation-name:sbx-reset-in;animation-duration:.15s}@keyframes sbx-reset-in{0%{transform:translate3d(-20%,0,0);opacity:0}to{transform:none;opacity:1}}.algolia-autocomplete.algolia-autocomplete-right .ds-dropdown-menu{right:0!important;left:inherit!important}.algolia-autocomplete.algolia-autocomplete-right .ds-dropdown-menu:before{right:48px}.algolia-autocomplete.algolia-autocomplete-left .ds-dropdown-menu{left:0!important;right:inherit!important}.algolia-autocomplete.algolia-autocomplete-left .ds-dropdown-menu:before{left:48px}.algolia-autocomplete .ds-dropdown-menu{top:-6px;border-radius:4px;margin:6px 0 0;padding:0;text-align:left;height:auto;position:relative;background:transparent;border:none;z-index:999;max-width:600px;min-width:500px;box-shadow:0 1px 0 0 rgba(0,0,0,.2),0 2px 3px 0 rgba(0,0,0,.1)}.algolia-autocomplete .ds-dropdown-menu:before{display:block;position:absolute;content:"";width:14px;height:14px;background:#fff;z-index:1000;top:-7px;border-top:1px solid #d9d9d9;border-right:1px solid #d9d9d9;transform:rotate(-45deg);border-radius:2px}.algolia-autocomplete .ds-dropdown-menu .ds-suggestions{position:relative;z-index:1000;margin-top:8px}.algolia-autocomplete .ds-dropdown-menu .ds-suggestions a:hover{text-decoration:none}.algolia-autocomplete .ds-dropdown-menu .ds-suggestion{cursor:pointer}.algolia-autocomplete .ds-dropdown-menu .ds-suggestion.ds-cursor .algolia-docsearch-suggestion.suggestion-layout-simple,.algolia-autocomplete .ds-dropdown-menu .ds-suggestion.ds-cursor .algolia-docsearch-suggestion:not(.suggestion-layout-simple) .algolia-docsearch-suggestion--content{background-color:rgba(69,142,225,.05)}.algolia-autocomplete .ds-dropdown-menu [class^=ds-dataset-]{position:relative;border:1px solid #d9d9d9;background:#fff;border-radius:4px;overflow:auto;padding:0 8px 8px}.algolia-autocomplete .ds-dropdown-menu *{box-sizing:border-box}.algolia-autocomplete .algolia-docsearch-suggestion{display:block;position:relative;padding:0 8px;background:#fff;color:#02060c;overflow:hidden}.algolia-autocomplete .algolia-docsearch-suggestion--highlight{color:#174d8c;background:rgba(143,187,237,.1);padding:.1em .05em}.algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl0 .algolia-docsearch-suggestion--highlight,.algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl1 .algolia-docsearch-suggestion--highlight,.algolia-autocomplete .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight{padding:0 0 1px;background:inherit;box-shadow:inset 0 -2px 0 0 rgba(69,142,225,.8);color:inherit}.algolia-autocomplete .algolia-docsearch-suggestion--content{display:block;float:right;width:70%;position:relative;padding:5.33333px 0 5.33333px 10.66667px;cursor:pointer}.algolia-autocomplete .algolia-docsearch-suggestion--content:before{content:"";position:absolute;display:block;top:0;height:100%;width:1px;background:#ddd;left:-1px}.algolia-autocomplete .algolia-docsearch-suggestion--category-header{position:relative;border-bottom:1px solid #ddd;display:none;margin-top:8px;padding:4px 0;font-size:1em;color:#33363d}.algolia-autocomplete .algolia-docsearch-suggestion--wrapper{width:100%;float:left;padding:8px 0 0}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column{float:left;width:30%;text-align:right;position:relative;padding:5.33333px 10.66667px;color:#a4a7ae;font-size:.9em;word-wrap:break-word}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column:before{content:"";position:absolute;display:block;top:0;height:100%;width:1px;background:#ddd;right:0}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-inline{display:none}.algolia-autocomplete .algolia-docsearch-suggestion--title{margin-bottom:4px;color:#02060c;font-size:.9em;font-weight:700}.algolia-autocomplete .algolia-docsearch-suggestion--text{display:block;line-height:1.2em;font-size:.85em;color:#63676d}.algolia-autocomplete .algolia-docsearch-suggestion--no-results{width:100%;padding:8px 0;text-align:center;font-size:1.2em}.algolia-autocomplete .algolia-docsearch-suggestion--no-results:before{display:none}.algolia-autocomplete .algolia-docsearch-suggestion code{padding:1px 5px;font-size:90%;border:none;color:#222;background-color:#ebebeb;border-radius:3px;font-family:Menlo,Monaco,Consolas,Courier New,monospace}.algolia-autocomplete .algolia-docsearch-suggestion code .algolia-docsearch-suggestion--highlight{background:none}.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__main .algolia-docsearch-suggestion--category-header,.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__secondary{display:block}@media (min-width:768px){.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{display:block}}@media (max-width:768px){.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{display:inline-block;width:auto;float:left;padding:0;color:#02060c;font-size:.9em;font-weight:700;text-align:left;opacity:.5}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column:before{display:none}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column:after{content:"|"}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content{display:inline-block;width:auto;text-align:left;float:left;padding:0}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content:before{display:none}}.algolia-autocomplete .suggestion-layout-simple.algolia-docsearch-suggestion{border-bottom:1px solid #eee;padding:8px;margin:0}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--content{width:100%;padding:0}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--content:before{display:none}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header{margin:0;padding:0;display:block;width:100%;border:none}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header-lvl0,.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header-lvl1{opacity:.6;font-size:.85em}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header-lvl1:before{background-image:url('data:image/svg+xml;utf8,');content:"";width:10px;height:10px;display:inline-block}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--wrapper{width:100%;float:left;margin:0;padding:0}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--duplicate-content,.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--subcategory-inline{display:none!important}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--title{margin:0;color:#458ee1;font-size:.9em;font-weight:400}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--title:before{content:"#";font-weight:700;color:#458ee1;display:inline-block}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--text{margin:4px 0 0;display:block;line-height:1.4em;padding:5.33333px 8px;background:#f8f8f8;font-size:.85em;opacity:.8}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight{color:#3f4145;font-weight:700;box-shadow:none}.algolia-autocomplete .algolia-docsearch-footer{width:134px;height:20px;z-index:2000;margin-top:10.66667px;float:right;font-size:0;line-height:0}.algolia-autocomplete .algolia-docsearch-footer--logo{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='168' height='24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cpath d='M78.988.938h16.594a2.968 2.968 0 012.966 2.966V20.5a2.967 2.967 0 01-2.966 2.964H78.988a2.967 2.967 0 01-2.966-2.964V3.897A2.961 2.961 0 0178.988.938zm41.937 17.866c-4.386.02-4.386-3.54-4.386-4.106l-.007-13.336 2.675-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-10.846-2.18c.821 0 1.43-.047 1.855-.129v-2.719a6.334 6.334 0 00-1.574-.199 5.7 5.7 0 00-.897.069 2.699 2.699 0 00-.814.24c-.24.116-.439.28-.582.491-.15.212-.219.335-.219.656 0 .628.219.991.616 1.23s.938.362 1.615.362zm-.233-9.7c.883 0 1.629.109 2.231.328.602.218 1.088.525 1.444.915.363.396.609.922.76 1.483.157.56.232 1.175.232 1.85v6.874a32.5 32.5 0 01-1.868.314c-.834.123-1.772.185-2.813.185-.69 0-1.327-.069-1.895-.198a4.001 4.001 0 01-1.471-.636 3.085 3.085 0 01-.951-1.134c-.226-.465-.343-1.12-.343-1.803 0-.656.13-1.073.384-1.525a3.24 3.24 0 011.047-1.106c.445-.287.95-.492 1.532-.615a8.8 8.8 0 011.82-.185 8.404 8.404 0 011.972.24v-.438c0-.307-.035-.6-.11-.874a1.88 1.88 0 00-.384-.73 1.784 1.784 0 00-.724-.493 3.164 3.164 0 00-1.143-.205c-.616 0-1.177.075-1.69.164a7.735 7.735 0 00-1.26.307l-.321-2.192c.335-.117.834-.233 1.478-.349a10.98 10.98 0 012.073-.178zm52.842 9.626c.822 0 1.43-.048 1.854-.13V13.7a6.347 6.347 0 00-1.574-.199c-.294 0-.595.021-.896.069a2.7 2.7 0 00-.814.24 1.46 1.46 0 00-.582.491c-.15.212-.218.335-.218.656 0 .628.218.991.615 1.23.404.245.938.362 1.615.362zm-.226-9.694c.883 0 1.629.108 2.231.327.602.219 1.088.526 1.444.915.355.39.609.923.759 1.483a6.8 6.8 0 01.233 1.852v6.873c-.41.088-1.034.19-1.868.314-.834.123-1.772.184-2.813.184-.69 0-1.327-.068-1.895-.198a4.001 4.001 0 01-1.471-.635 3.085 3.085 0 01-.951-1.134c-.226-.465-.343-1.12-.343-1.804 0-.656.13-1.073.384-1.524.26-.45.608-.82 1.047-1.107.445-.286.95-.491 1.532-.614a8.803 8.803 0 012.751-.13c.329.034.671.096 1.04.185v-.437a3.3 3.3 0 00-.109-.875 1.873 1.873 0 00-.384-.731 1.784 1.784 0 00-.724-.492 3.165 3.165 0 00-1.143-.205c-.616 0-1.177.075-1.69.164a7.75 7.75 0 00-1.26.307l-.321-2.193c.335-.116.834-.232 1.478-.348a11.633 11.633 0 012.073-.177zm-8.034-1.271a1.626 1.626 0 01-1.628-1.62c0-.895.725-1.62 1.628-1.62.904 0 1.63.725 1.63 1.62 0 .895-.733 1.62-1.63 1.62zm1.348 13.22h-2.689V7.27l2.69-.423v11.956zm-4.714 0c-4.386.02-4.386-3.54-4.386-4.107l-.008-13.336 2.676-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-8.698-5.903c0-1.156-.253-2.119-.746-2.788-.493-.677-1.183-1.01-2.067-1.01-.882 0-1.574.333-2.065 1.01-.493.676-.733 1.632-.733 2.788 0 1.168.246 1.953.74 2.63.492.683 1.183 1.018 2.066 1.018.882 0 1.574-.342 2.067-1.019.492-.683.738-1.46.738-2.63zm2.737-.007c0 .902-.13 1.584-.397 2.33a5.52 5.52 0 01-1.128 1.906 4.986 4.986 0 01-1.752 1.223c-.685.286-1.739.45-2.265.45-.528-.006-1.574-.157-2.252-.45a5.096 5.096 0 01-1.744-1.223c-.487-.527-.863-1.162-1.137-1.906a6.345 6.345 0 01-.41-2.33c0-.902.123-1.77.397-2.508a5.554 5.554 0 011.15-1.892 5.133 5.133 0 011.75-1.216c.679-.287 1.425-.423 2.232-.423.808 0 1.553.142 2.237.423a4.88 4.88 0 011.753 1.216 5.644 5.644 0 011.135 1.892c.287.738.431 1.606.431 2.508zm-20.138 0c0 1.12.246 2.363.738 2.882.493.52 1.13.78 1.91.78.424 0 .828-.062 1.204-.178.377-.116.677-.253.917-.417V9.33a10.476 10.476 0 00-1.766-.226c-.971-.028-1.71.37-2.23 1.004-.513.636-.773 1.75-.773 2.788zm7.438 5.274c0 1.824-.466 3.156-1.404 4.004-.936.846-2.367 1.27-4.296 1.27-.705 0-2.17-.137-3.34-.396l.431-2.118c.98.205 2.272.26 2.95.26 1.074 0 1.84-.219 2.299-.656.459-.437.684-1.086.684-1.948v-.437a8.07 8.07 0 01-1.047.397c-.43.13-.93.198-1.492.198-.739 0-1.41-.116-2.018-.349a4.206 4.206 0 01-1.567-1.025c-.431-.45-.774-1.017-1.013-1.694-.24-.677-.363-1.885-.363-2.773 0-.834.13-1.88.384-2.577.26-.696.629-1.298 1.129-1.796.493-.498 1.095-.881 1.8-1.162a6.605 6.605 0 012.428-.457c.87 0 1.67.109 2.45.24.78.129 1.444.265 1.985.415V18.17z' fill='%235468FF'/%3E%3Cpath d='M6.972 6.677v1.627c-.712-.446-1.52-.67-2.425-.67-.585 0-1.045.13-1.38.391a1.24 1.24 0 00-.502 1.03c0 .425.164.765.494 1.02.33.256.835.532 1.516.83.447.192.795.356 1.045.495.25.138.537.332.862.582.324.25.563.548.718.894.154.345.23.741.23 1.188 0 .947-.334 1.691-1.004 2.234-.67.542-1.537.814-2.601.814-1.18 0-2.16-.229-2.936-.686v-1.708c.84.628 1.814.942 2.92.942.585 0 1.048-.136 1.388-.407.34-.271.51-.646.51-1.125 0-.287-.1-.55-.302-.79-.203-.24-.42-.42-.655-.542-.234-.123-.585-.29-1.053-.503a61.27 61.27 0 01-.582-.271 13.67 13.67 0 01-.55-.287 4.275 4.275 0 01-.567-.351 6.92 6.92 0 01-.455-.4c-.18-.17-.31-.34-.39-.51-.08-.17-.155-.37-.224-.598a2.553 2.553 0 01-.104-.742c0-.915.333-1.638.998-2.17.664-.532 1.523-.798 2.576-.798.968 0 1.793.17 2.473.51zm7.468 5.696v-.287c-.022-.607-.187-1.088-.495-1.444-.309-.357-.75-.535-1.324-.535-.532 0-.99.194-1.373.583-.382.388-.622.949-.717 1.683h3.909zm1.005 2.792v1.404c-.596.34-1.383.51-2.362.51-1.255 0-2.255-.377-3-1.132-.744-.755-1.116-1.744-1.116-2.968 0-1.297.34-2.316 1.021-3.055.68-.74 1.548-1.11 2.6-1.11 1.033 0 1.852.323 2.458.966.606.644.91 1.572.91 2.784 0 .33-.033.676-.096 1.038h-5.314c.107.702.405 1.239.894 1.611.49.372 1.106.558 1.85.558.862 0 1.58-.202 2.155-.606zm6.605-1.77h-1.212c-.596 0-1.045.116-1.349.35-.303.234-.454.532-.454.894 0 .372.117.664.35.877.235.213.575.32 1.022.32.51 0 .912-.142 1.204-.424.293-.281.44-.651.44-1.108v-.91zm-4.068-2.554V9.325c.627-.361 1.457-.542 2.489-.542 2.116 0 3.175 1.026 3.175 3.08V17h-1.548v-.957c-.415.68-1.143 1.02-2.186 1.02-.766 0-1.38-.22-1.843-.661-.462-.442-.694-1.003-.694-1.684 0-.776.293-1.38.878-1.81.585-.431 1.404-.647 2.457-.647h1.34V11.8c0-.554-.133-.971-.399-1.253-.266-.282-.707-.423-1.324-.423a4.07 4.07 0 00-2.345.718zm9.333-1.93v1.42c.394-1 1.101-1.5 2.123-1.5.148 0 .313.016.494.048v1.531a1.885 1.885 0 00-.75-.143c-.542 0-.989.24-1.34.718-.351.479-.527 1.048-.527 1.707V17h-1.563V8.91h1.563zm5.01 4.084c.022.82.272 1.492.75 2.019.479.526 1.15.79 2.01.79.639 0 1.235-.176 1.788-.527v1.404c-.521.319-1.186.479-1.995.479-1.265 0-2.276-.4-3.031-1.197-.755-.798-1.133-1.792-1.133-2.984 0-1.16.38-2.151 1.14-2.975.761-.825 1.79-1.237 3.088-1.237.702 0 1.346.149 1.93.447v1.436a3.242 3.242 0 00-1.77-.495c-.84 0-1.513.266-2.019.798-.505.532-.758 1.213-.758 2.042zM40.24 5.72v4.579c.458-1 1.293-1.5 2.505-1.5.787 0 1.42.245 1.899.734.479.49.718 1.17.718 2.042V17h-1.564v-5.106c0-.553-.14-.98-.422-1.284-.282-.303-.652-.455-1.11-.455-.531 0-1.002.202-1.411.606-.41.405-.615 1.022-.615 1.851V17h-1.563V5.72h1.563zm14.966 10.02c.596 0 1.096-.253 1.5-.758.404-.506.606-1.157.606-1.955 0-.915-.202-1.62-.606-2.114-.404-.495-.92-.742-1.548-.742-.553 0-1.05.224-1.491.67-.442.447-.662 1.133-.662 2.058 0 .958.212 1.67.638 2.138.425.469.946.703 1.563.703zM53.004 5.72v4.42c.574-.894 1.388-1.341 2.44-1.341 1.022 0 1.857.383 2.506 1.149.649.766.973 1.781.973 3.047 0 1.138-.309 2.109-.925 2.912-.617.803-1.463 1.205-2.537 1.205-1.075 0-1.894-.447-2.457-1.34V17h-1.58V5.72h1.58zm9.908 11.104l-3.223-7.913h1.739l1.005 2.632 1.26 3.415c.096-.32.48-1.458 1.15-3.415l.909-2.632h1.66l-2.92 7.866c-.777 2.074-1.963 3.11-3.559 3.11a2.92 2.92 0 01-.734-.079v-1.34c.17.042.351.064.543.064 1.032 0 1.755-.57 2.17-1.708z' fill='%235D6494'/%3E%3Cpath d='M89.632 5.967v-.772a.978.978 0 00-.978-.977h-2.28a.978.978 0 00-.978.977v.793c0 .088.082.15.171.13a7.127 7.127 0 011.984-.28c.65 0 1.295.088 1.917.259.082.02.164-.04.164-.13m-6.248 1.01l-.39-.389a.977.977 0 00-1.382 0l-.465.465a.973.973 0 000 1.38l.383.383c.062.061.15.047.205-.014.226-.307.472-.601.746-.874.281-.28.568-.526.883-.751.068-.042.075-.137.02-.2m4.16 2.453v3.341c0 .096.104.165.192.117l2.97-1.537c.068-.034.089-.117.055-.184a3.695 3.695 0 00-3.08-1.866c-.068 0-.136.054-.136.13m0 8.048a4.489 4.489 0 01-4.49-4.482 4.488 4.488 0 014.49-4.482 4.488 4.488 0 014.489 4.482 4.484 4.484 0 01-4.49 4.482m0-10.85a6.363 6.363 0 100 12.729 6.37 6.37 0 006.372-6.368 6.358 6.358 0 00-6.371-6.36' fill='%23FFF'/%3E%3C/g%3E%3C/svg%3E");background-repeat:no-repeat;background-position:50%;background-size:100%;overflow:hidden;text-indent:-9000px;padding:0!important;width:100%;height:100%;display:block}.dropdown-wrapper{cursor:pointer}.dropdown-wrapper .dropdown-title,.dropdown-wrapper .mobile-dropdown-title{display:block;font-size:.9rem;font-family:inherit;cursor:inherit;padding:inherit;line-height:1.4rem;background:transparent;border:none;font-weight:500;color:#2c3e50}.dropdown-wrapper .dropdown-title:hover,.dropdown-wrapper .mobile-dropdown-title:hover{border-color:transparent}.dropdown-wrapper .dropdown-title .arrow,.dropdown-wrapper .mobile-dropdown-title .arrow{vertical-align:middle;margin-top:-1px;margin-left:.4rem}.dropdown-wrapper .mobile-dropdown-title{display:none;font-weight:600}.dropdown-wrapper .mobile-dropdown-title font-size inherit:hover{color:#3eaf7c}.dropdown-wrapper .nav-dropdown .dropdown-item{color:inherit;line-height:1.7rem}.dropdown-wrapper .nav-dropdown .dropdown-item h4{margin:.45rem 0 0;border-top:1px solid #eee;padding:1rem 1.5rem .45rem 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper{padding:0;list-style:none}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper .dropdown-subitem{font-size:.9em}.dropdown-wrapper .nav-dropdown .dropdown-item a{display:block;line-height:1.7rem;position:relative;border-bottom:none;font-weight:400;margin-bottom:0;padding:0 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active,.dropdown-wrapper .nav-dropdown .dropdown-item a:hover{color:#3eaf7c}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{content:"";width:0;height:0;border-left:5px solid #3eaf7c;border-top:3px solid transparent;border-bottom:3px solid transparent;position:absolute;top:calc(50% - 2px);left:9px}.dropdown-wrapper .nav-dropdown .dropdown-item:first-child h4{margin-top:0;padding-top:0;border-top:0}@media (max-width:719px){.dropdown-wrapper.open .dropdown-title{margin-bottom:.5rem}.dropdown-wrapper .dropdown-title{display:none}.dropdown-wrapper .mobile-dropdown-title{display:block}.dropdown-wrapper .nav-dropdown{transition:height .1s ease-out;overflow:hidden}.dropdown-wrapper .nav-dropdown .dropdown-item h4{border-top:0;margin-top:0;padding-top:0}.dropdown-wrapper .nav-dropdown .dropdown-item>a,.dropdown-wrapper .nav-dropdown .dropdown-item h4{font-size:15px;line-height:2rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem{font-size:14px;padding-left:1rem}}@media (min-width:719px){.dropdown-wrapper{height:1.8rem}.dropdown-wrapper.open .nav-dropdown,.dropdown-wrapper:hover .nav-dropdown{display:block!important}.dropdown-wrapper .nav-dropdown{display:none;height:auto!important;box-sizing:border-box;max-height:calc(100vh - 2.7rem);overflow-y:auto;position:absolute;top:100%;right:0;background-color:#fff;padding:.6rem 0;border:1px solid;border-color:#ddd #ddd #ccc;text-align:left;border-radius:.25rem;white-space:nowrap;margin:0}}.nav-links{display:inline-block}.nav-links a{line-height:1.4rem;color:inherit}.nav-links a.router-link-active,.nav-links a:hover{color:#3eaf7c}.nav-links .nav-item{position:relative;display:inline-block;margin-left:1.5rem;line-height:2rem}.nav-links .nav-item:first-child{margin-left:0}.nav-links .repo-link{margin-left:1.5rem}@media (max-width:719px){.nav-links .nav-item,.nav-links .repo-link{margin-left:0}}@media (min-width:719px){.nav-links a.router-link-active,.nav-links a:hover{color:#2c3e50}.nav-item>a:not(.external).router-link-active,.nav-item>a:not(.external):hover{margin-bottom:-2px;border-bottom:2px solid #46bd87}}.navbar{padding:.7rem 1.5rem;line-height:2.2rem}.navbar a,.navbar img,.navbar span{display:inline-block}.navbar .logo{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top}.navbar .site-name{font-size:1.3rem;font-weight:600;color:#2c3e50;position:relative}.navbar .links{padding-left:1.5rem;box-sizing:border-box;background-color:#fff;white-space:nowrap;font-size:.9rem;position:absolute;right:1.5rem;top:.7rem;display:flex}.navbar .links .search-box{flex:0 0 auto;vertical-align:top}@media (max-width:719px){.navbar{padding-left:4rem}.navbar .can-hide{display:none}.navbar .links{padding-left:1.5rem}.navbar .site-name{width:calc(100vw - 9.4rem);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}}.page-edit{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-edit{padding:2rem}}@media (max-width:419px){.page-edit{padding:1.5rem}}.page-edit{padding-top:1rem;padding-bottom:1rem;overflow:auto}.page-edit .edit-link{display:inline-block}.page-edit .edit-link a{color:#4e6e8e;margin-right:.25rem}.page-edit .last-updated{float:right;font-size:.9em}.page-edit .last-updated .prefix{font-weight:500;color:#4e6e8e}.page-edit .last-updated .time{font-weight:400;color:#767676}@media (max-width:719px){.page-edit .edit-link{margin-bottom:.5rem}.page-edit .last-updated{font-size:.8em;float:none;text-align:left}}.page-nav{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-nav{padding:2rem}}@media (max-width:419px){.page-nav{padding:1.5rem}}.page-nav{padding-top:1rem;padding-bottom:0}.page-nav .inner{min-height:2rem;margin-top:0;border-top:1px solid #eaecef;padding-top:1rem;overflow:auto}.page-nav .next{float:right}.page{padding-bottom:2rem;display:block}.sidebar-group .sidebar-group{padding-left:.5em}.sidebar-group:not(.collapsable) .sidebar-heading:not(.clickable){cursor:auto;color:inherit}.sidebar-group.is-sub-group{padding-left:0}.sidebar-group.is-sub-group>.sidebar-heading{font-size:.95em;line-height:1.4;font-weight:400;padding-left:2rem}.sidebar-group.is-sub-group>.sidebar-heading:not(.clickable){opacity:.5}.sidebar-group.is-sub-group>.sidebar-group-items{padding-left:1rem}.sidebar-group.is-sub-group>.sidebar-group-items>li>.sidebar-link{font-size:.95em;border-left:none}.sidebar-group.depth-2>.sidebar-heading{border-left:none}.sidebar-heading{color:#2c3e50;transition:color .15s ease;cursor:pointer;font-size:1.1em;font-weight:700;padding:.35rem 1.5rem .35rem 1.25rem;width:100%;box-sizing:border-box;margin:0;border-left:.25rem solid transparent}.sidebar-heading.open,.sidebar-heading:hover{color:inherit}.sidebar-heading .arrow{position:relative;top:-.12em;left:.5em}.sidebar-heading.clickable.active{font-weight:600;color:#3eaf7c;border-left-color:#3eaf7c}.sidebar-heading.clickable:hover{color:#3eaf7c}.sidebar-group-items{transition:height .1s ease-out;font-size:.95em;overflow:hidden}.sidebar .sidebar-sub-headers{padding-left:1rem;font-size:.95em}a.sidebar-link{font-size:1em;font-weight:400;display:inline-block;color:#2c3e50;border-left:.25rem solid transparent;padding:.35rem 1rem .35rem 1.25rem;line-height:1.4;width:100%;box-sizing:border-box}a.sidebar-link:hover{color:#3eaf7c}a.sidebar-link.active{font-weight:600;color:#3eaf7c;border-left-color:#3eaf7c}.sidebar-group a.sidebar-link{padding-left:2rem}.sidebar-sub-headers a.sidebar-link{padding-top:.25rem;padding-bottom:.25rem;border-left:none}.sidebar-sub-headers a.sidebar-link.active{font-weight:500}.sidebar ul{padding:0;margin:0;list-style-type:none}.sidebar a{display:inline-block}.sidebar .nav-links{display:none;border-bottom:1px solid #eaecef;padding:.5rem 0 .75rem}.sidebar .nav-links a{font-weight:600}.sidebar .nav-links .nav-item,.sidebar .nav-links .repo-link{display:block;line-height:1.25rem;font-size:1.1em;padding:.5rem 0 .5rem 1.5rem}.sidebar>.sidebar-links{padding:1.5rem 0}.sidebar>.sidebar-links>li>a.sidebar-link{font-size:1.1em;line-height:1.7;font-weight:700}.sidebar>.sidebar-links>li:not(:first-child){margin-top:.75rem}@media (max-width:719px){.sidebar .nav-links{display:block}.sidebar .nav-links .dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{top:calc(1rem - 2px)}.sidebar>.sidebar-links{padding:1rem 0}}
\ No newline at end of file
diff --git a/assets/img/DockerHub_Replication.de8ba50b.svg b/assets/img/DockerHub_Replication.de8ba50b.svg
new file mode 100644
index 00000000..3ccda796
--- /dev/null
+++ b/assets/img/DockerHub_Replication.de8ba50b.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/img/gitea_screenshot.3ab2ff11.png b/assets/img/gitea_screenshot.3ab2ff11.png
new file mode 100644
index 00000000..8879c218
Binary files /dev/null and b/assets/img/gitea_screenshot.3ab2ff11.png differ
diff --git a/assets/img/harbor-horizontal-color.ef644877.svg b/assets/img/harbor-horizontal-color.ef644877.svg
new file mode 100644
index 00000000..bdcf9c7f
--- /dev/null
+++ b/assets/img/harbor-horizontal-color.ef644877.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/img/harbor_admin_view.ad001b0d.png b/assets/img/harbor_admin_view.ad001b0d.png
new file mode 100644
index 00000000..ba4fbf1d
Binary files /dev/null and b/assets/img/harbor_admin_view.ad001b0d.png differ
diff --git a/assets/img/harbor_automatically_scan_images_on_push.3fa4828e.png b/assets/img/harbor_automatically_scan_images_on_push.3fa4828e.png
new file mode 100644
index 00000000..3b82a88d
Binary files /dev/null and b/assets/img/harbor_automatically_scan_images_on_push.3fa4828e.png differ
diff --git a/assets/img/harbor_container_image.bcd6ded7.png b/assets/img/harbor_container_image.bcd6ded7.png
new file mode 100644
index 00000000..c7b841aa
Binary files /dev/null and b/assets/img/harbor_container_image.bcd6ded7.png differ
diff --git a/assets/img/harbor_container_image_vulnerability_list.68a48998.png b/assets/img/harbor_container_image_vulnerability_list.68a48998.png
new file mode 100644
index 00000000..87edabeb
Binary files /dev/null and b/assets/img/harbor_container_image_vulnerability_list.68a48998.png differ
diff --git a/assets/img/harbor_ldap_auth_configuration.c095a145.png b/assets/img/harbor_ldap_auth_configuration.c095a145.png
new file mode 100644
index 00000000..cbccd6d5
Binary files /dev/null and b/assets/img/harbor_ldap_auth_configuration.c095a145.png differ
diff --git a/assets/img/harbor_login_page.703b5e90.png b/assets/img/harbor_login_page.703b5e90.png
new file mode 100644
index 00000000..eb22d5d9
Binary files /dev/null and b/assets/img/harbor_login_page.703b5e90.png differ
diff --git a/assets/img/harbor_my_rbac_test_project.953b533b.png b/assets/img/harbor_my_rbac_test_project.953b533b.png
new file mode 100644
index 00000000..3efb02be
Binary files /dev/null and b/assets/img/harbor_my_rbac_test_project.953b533b.png differ
diff --git a/assets/img/harbor_prevent_vulnerable_images_from_running.a6cbe95c.png b/assets/img/harbor_prevent_vulnerable_images_from_running.a6cbe95c.png
new file mode 100644
index 00000000..79d3ffd0
Binary files /dev/null and b/assets/img/harbor_prevent_vulnerable_images_from_running.a6cbe95c.png differ
diff --git a/assets/img/harbor_project_helm_charts.a0eaa6b9.png b/assets/img/harbor_project_helm_charts.a0eaa6b9.png
new file mode 100644
index 00000000..fcf86946
Binary files /dev/null and b/assets/img/harbor_project_helm_charts.a0eaa6b9.png differ
diff --git a/assets/img/harbor_project_library_examples-bookinfo-reviews-v3.ecf81b10.png b/assets/img/harbor_project_library_examples-bookinfo-reviews-v3.ecf81b10.png
new file mode 100644
index 00000000..d051c3f1
Binary files /dev/null and b/assets/img/harbor_project_library_examples-bookinfo-reviews-v3.ecf81b10.png differ
diff --git a/assets/img/harbor_project_members.4a0a8937.png b/assets/img/harbor_project_members.4a0a8937.png
new file mode 100644
index 00000000..14a5983f
Binary files /dev/null and b/assets/img/harbor_project_members.4a0a8937.png differ
diff --git a/assets/img/harbor_project_new_member.da1ac377.png b/assets/img/harbor_project_new_member.da1ac377.png
new file mode 100644
index 00000000..35de53c8
Binary files /dev/null and b/assets/img/harbor_project_new_member.da1ac377.png differ
diff --git a/assets/img/harbor_project_repository_list.7011b27a.png b/assets/img/harbor_project_repository_list.7011b27a.png
new file mode 100644
index 00000000..fe6d0f74
Binary files /dev/null and b/assets/img/harbor_project_repository_list.7011b27a.png differ
diff --git a/assets/img/harbor_projects.338db00b.png b/assets/img/harbor_projects.338db00b.png
new file mode 100644
index 00000000..c4265b32
Binary files /dev/null and b/assets/img/harbor_projects.338db00b.png differ
diff --git a/assets/img/harbor_projects_repositories_list.3e69ceb1.png b/assets/img/harbor_projects_repositories_list.3e69ceb1.png
new file mode 100644
index 00000000..d77db64a
Binary files /dev/null and b/assets/img/harbor_projects_repositories_list.3e69ceb1.png differ
diff --git a/assets/img/harbor_registries.a1f41363.png b/assets/img/harbor_registries.a1f41363.png
new file mode 100644
index 00000000..17716e0c
Binary files /dev/null and b/assets/img/harbor_registries.a1f41363.png differ
diff --git a/assets/img/harbor_replication_execution.910b07ab.png b/assets/img/harbor_replication_execution.910b07ab.png
new file mode 100644
index 00000000..e5516a4b
Binary files /dev/null and b/assets/img/harbor_replication_execution.910b07ab.png differ
diff --git a/assets/img/harbor_replications.c55dea3b.png b/assets/img/harbor_replications.c55dea3b.png
new file mode 100644
index 00000000..86c0b308
Binary files /dev/null and b/assets/img/harbor_replications.c55dea3b.png differ
diff --git a/assets/img/harbor_scanned_container_image.ce6c791c.png b/assets/img/harbor_scanned_container_image.ce6c791c.png
new file mode 100644
index 00000000..44a0cb84
Binary files /dev/null and b/assets/img/harbor_scanned_container_image.ce6c791c.png differ
diff --git a/assets/img/harbor_scanned_container_image_with_vulnerabilities.ff516df4.png b/assets/img/harbor_scanned_container_image_with_vulnerabilities.ff516df4.png
new file mode 100644
index 00000000..dfafb60b
Binary files /dev/null and b/assets/img/harbor_scanned_container_image_with_vulnerabilities.ff516df4.png differ
diff --git a/assets/img/harbor_signed_container_image.10bd8b45.png b/assets/img/harbor_signed_container_image.10bd8b45.png
new file mode 100644
index 00000000..5b232bbf
Binary files /dev/null and b/assets/img/harbor_signed_container_image.10bd8b45.png differ
diff --git a/assets/img/harbor_standard_user_view.a731b397.png b/assets/img/harbor_standard_user_view.a731b397.png
new file mode 100644
index 00000000..6e61b272
Binary files /dev/null and b/assets/img/harbor_standard_user_view.a731b397.png differ
diff --git a/assets/img/harbor_upload_chart_files.0353006a.png b/assets/img/harbor_upload_chart_files.0353006a.png
new file mode 100644
index 00000000..7b5c3f91
Binary files /dev/null and b/assets/img/harbor_upload_chart_files.0353006a.png differ
diff --git a/assets/img/kuard_screenshot.39323cbd.png b/assets/img/kuard_screenshot.39323cbd.png
new file mode 100644
index 00000000..2e786ef8
Binary files /dev/null and b/assets/img/kuard_screenshot.39323cbd.png differ
diff --git a/assets/img/kubed.e88b1fb6.svg b/assets/img/kubed.e88b1fb6.svg
new file mode 100644
index 00000000..14c7ef73
--- /dev/null
+++ b/assets/img/kubed.e88b1fb6.svg
@@ -0,0 +1,173 @@
+
+
+
\ No newline at end of file
diff --git a/assets/img/search.83621669.svg b/assets/img/search.83621669.svg
new file mode 100644
index 00000000..03d83913
--- /dev/null
+++ b/assets/img/search.83621669.svg
@@ -0,0 +1 @@
+
diff --git a/assets/img/xfreerdp_windows_server.8552fbcd.png b/assets/img/xfreerdp_windows_server.8552fbcd.png
new file mode 100644
index 00000000..9715595e
Binary files /dev/null and b/assets/img/xfreerdp_windows_server.8552fbcd.png differ
diff --git a/assets/js/1.f0fb5331.js b/assets/js/1.f0fb5331.js
new file mode 100644
index 00000000..926933b3
--- /dev/null
+++ b/assets/js/1.f0fb5331.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[1,12,16,23,24,26],{246:function(t,e,n){"use strict";n.d(e,"d",(function(){return s})),n.d(e,"a",(function(){return r})),n.d(e,"i",(function(){return o})),n.d(e,"f",(function(){return l})),n.d(e,"g",(function(){return u})),n.d(e,"h",(function(){return c})),n.d(e,"b",(function(){return h})),n.d(e,"e",(function(){return f})),n.d(e,"k",(function(){return p})),n.d(e,"l",(function(){return d})),n.d(e,"c",(function(){return m})),n.d(e,"j",(function(){return k}));n(92);const s=/#.*$/,i=/\.(md|html)$/,r=/\/$/,o=/^[a-z]+:/i;function a(t){return decodeURI(t).replace(s,"").replace(i,"")}function l(t){return o.test(t)}function u(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function h(t){if(l(t))return t;const e=t.match(s),n=e?e[0]:"",i=a(t);return r.test(i)?t:i+".html"+n}function f(t,e){const n=decodeURIComponent(t.hash),i=function(t){const e=t.match(s);if(e)return e[0]}(e);if(i&&n!==i)return!1;return a(t.path)===a(e)}function p(t,e,n){if(l(e))return{type:"external",path:e};n&&(e=function(t,e,n){const s=t.charAt(0);if("/"===s)return t;if("?"===s||"#"===s)return e+t;const i=e.split("/");n&&i[i.length-1]||i.pop();const r=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,s,i=1){if("string"==typeof e)return p(n,e,s);if(Array.isArray(e))return Object.assign(p(n,e[0],s),{title:e[1]});{const r=e.children||[];return 0===r.length&&e.path?Object.assign(p(n,e.path,s),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:r.map(e=>t(e,n,s,i+1)),collapsable:!1!==e.collapsable}}}(t,i,n)):[]}return[]}function g(t){const e=m(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function m(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function k(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},247:function(t,e,n){},248:function(t,e,n){"use strict";n.r(e);var s=n(246),i={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(s.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(s.g)(this.link)||Object(s.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(s.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(s.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI||!1===this.item.rel?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":null}},methods:{focusoutAction(){this.$emit("focusout")}}},r=n(8),o=Object(r.a)(i,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=o.exports},249:function(t,e,n){"use strict";n.r(e);var s={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},i=(n(250),n(8)),r=Object(i.a)(s,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=r.exports},250:function(t,e,n){"use strict";n(247)},251:function(t,e,n){},254:function(t,e,n){},258:function(t,e,n){"use strict";n(251)},261:function(t,e,n){"use strict";n.r(e);var s=n(248),i=n(249),r=n(93),o=n.n(r),a={name:"DropdownLink",components:{NavLink:s.default,DropdownTransition:i.default},props:{item:{required:!0}},data:()=>({open:!1}),computed:{dropdownAriaLabel(){return this.item.ariaLabel||this.item.text}},watch:{$route(){this.open=!1}},methods:{setOpen(t){this.open=t},isLastItemOfArray:(t,e)=>o()(e)===t,handleDropdown(){0===event.detail&&this.setOpen(!this.open)}}},l=(n(258),n(8)),u=Object(l.a)(a,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"dropdown-wrapper",class:{open:t.open}},[e("button",{staticClass:"dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:t.handleDropdown}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow down"})]),t._v(" "),e("button",{staticClass:"mobile-dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:function(e){return t.setOpen(!t.open)}}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow",class:t.open?"down":"right"})]),t._v(" "),e("DropdownTransition",[e("ul",{directives:[{name:"show",rawName:"v-show",value:t.open,expression:"open"}],staticClass:"nav-dropdown"},t._l(t.item.items,(function(n,s){return e("li",{key:n.link||s,staticClass:"dropdown-item"},["links"===n.type?e("h4",[t._v("\n "+t._s(n.text)+"\n ")]):t._e(),t._v(" "),"links"===n.type?e("ul",{staticClass:"dropdown-subitem-wrapper"},t._l(n.items,(function(s){return e("li",{key:s.link,staticClass:"dropdown-subitem"},[e("NavLink",{attrs:{item:s},on:{focusout:function(e){t.isLastItemOfArray(s,n.items)&&t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0):e("NavLink",{attrs:{item:n},on:{focusout:function(e){t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0)])],1)}),[],!1,null,null,null);e.default=u.exports},264:function(t,e,n){"use strict";n(254)},265:function(t,e,n){},272:function(t,e,n){"use strict";n.r(e);var s=n(261),i=n(246),r={name:"NavLinks",components:{NavLink:n(248).default,DropdownLink:s.default},computed:{userNav(){return this.$themeLocaleConfig.nav||this.$site.themeConfig.nav||[]},nav(){const{locales:t}=this.$site;if(t&&Object.keys(t).length>1){const e=this.$page.path,n=this.$router.options.routes,s=this.$site.themeConfig.locales||{},i={text:this.$themeLocaleConfig.selectText||"Languages",ariaLabel:this.$themeLocaleConfig.ariaLabel||"Select language",items:Object.keys(t).map(i=>{const r=t[i],o=s[i]&&s[i].label||r.lang;let a;return r.lang===this.$lang?a=e:(a=e.replace(this.$localeConfig.path,i),n.some(t=>t.path===a)||(a=i)),{text:o,link:a}})};return[...this.userNav,i]}return this.userNav},userLinks(){return(this.nav||[]).map(t=>Object.assign(Object(i.j)(t),{items:(t.items||[]).map(i.j)}))},repoLink(){const{repo:t}=this.$site.themeConfig;return t?/^https?:/.test(t)?t:"https://github.com/"+t:null},repoLabel(){if(!this.repoLink)return;if(this.$site.themeConfig.repoLabel)return this.$site.themeConfig.repoLabel;const t=this.repoLink.match(/^https?:\/\/[^/]+/)[0],e=["GitHub","GitLab","Bitbucket"];for(let n=0;n{let s=i()(e,"title","");return i()(e,"frontmatter.tags")&&(s+=" "+e.frontmatter.tags.join(" ")),n&&(s+=" "+n),o(t,s)};const o=(t,e)=>{const n=t=>t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),s=new RegExp("[^\0-]"),i=t.split(/\s+/g).map(t=>t.trim()).filter(t=>!!t);if(s.test(t))return i.some(t=>e.toLowerCase().indexOf(t)>-1);{const s=t.endsWith(" ");return new RegExp(i.map((t,e)=>i.length!==e+1||s?`(?=.*\\b${n(t)}\\b)`:`(?=.*\\b${n(t)})`).join("")+".+","gi").test(e)}};var a={name:"SearchBox",data:()=>({query:"",focused:!1,focusIndex:0,placeholder:void 0}),computed:{showSuggestions(){return this.focused&&this.suggestions&&this.suggestions.length},suggestions(){const t=this.query.trim().toLowerCase();if(!t)return;const{pages:e}=this.$site,n=this.$site.themeConfig.searchMaxSuggestions||5,s=this.$localePath,i=[];for(let o=0;o=n);o++){const a=e[o];if(this.getPageLocalePath(a)===s&&this.isSearchable(a))if(r(t,a))i.push(a);else if(a.headers)for(let e=0;e=n);e++){const n=a.headers[e];n.title&&r(t,a,n.title)&&i.push(Object.assign({},a,{path:a.path+"#"+n.slug,header:n}))}}return i},alignRight(){return(this.$site.themeConfig.nav||[]).length+(this.$site.repo?1:0)<=2}},mounted(){this.placeholder=this.$site.themeConfig.searchPlaceholder||"",document.addEventListener("keydown",this.onHotkey)},beforeDestroy(){document.removeEventListener("keydown",this.onHotkey)},methods:{getPageLocalePath(t){for(const e in this.$site.locales||{})if("/"!==e&&0===t.path.indexOf(e))return e;return"/"},isSearchable(t){let e=null;return null===e||(e=Array.isArray(e)?e:new Array(e),e.filter(e=>t.path.match(e)).length>0)},onHotkey(t){t.srcElement===document.body&&["s","/"].includes(t.key)&&(this.$refs.input.focus(),t.preventDefault())},onUp(){this.showSuggestions&&(this.focusIndex>0?this.focusIndex--:this.focusIndex=this.suggestions.length-1)},onDown(){this.showSuggestions&&(this.focusIndex "+t._s(n.header.title))]):t._e()])])})),0):t._e()])}),[],!1,null,null,null).exports,c=n(290),h=n(272);function f(t,e){return t.ownerDocument.defaultView.getComputedStyle(t,null)[e]}var p={name:"Navbar",components:{SidebarButton:c.default,NavLinks:h.default,SearchBox:u,AlgoliaSearchBox:{}},data:()=>({linksWrapMaxWidth:null}),computed:{algolia(){return this.$themeLocaleConfig.algolia||this.$site.themeConfig.algolia||{}},isAlgoliaSearch(){return this.algolia&&this.algolia.apiKey&&this.algolia.indexName}},mounted(){const t=parseInt(f(this.$el,"paddingLeft"))+parseInt(f(this.$el,"paddingRight")),e=()=>{document.documentElement.clientWidth<719?this.linksWrapMaxWidth=null:this.linksWrapMaxWidth=this.$el.offsetWidth-t-(this.$refs.siteName&&this.$refs.siteName.offsetWidth||0)};e(),window.addEventListener("resize",e,!1)}},d=(n(297),Object(l.a)(p,(function(){var t=this,e=t._self._c;return e("header",{staticClass:"navbar"},[e("SidebarButton",{on:{"toggle-sidebar":function(e){return t.$emit("toggle-sidebar")}}}),t._v(" "),e("RouterLink",{staticClass:"home-link",attrs:{to:t.$localePath}},[t.$site.themeConfig.logo?e("img",{staticClass:"logo",attrs:{src:t.$withBase(t.$site.themeConfig.logo),alt:t.$siteTitle}}):t._e(),t._v(" "),t.$siteTitle?e("span",{ref:"siteName",staticClass:"site-name",class:{"can-hide":t.$site.themeConfig.logo}},[t._v(t._s(t.$siteTitle))]):t._e()]),t._v(" "),e("div",{staticClass:"links",style:t.linksWrapMaxWidth?{"max-width":t.linksWrapMaxWidth+"px"}:{}},[t.isAlgoliaSearch?e("AlgoliaSearchBox",{attrs:{options:t.algolia}}):!1!==t.$site.themeConfig.search&&!1!==t.$page.frontmatter.search?e("SearchBox"):t._e(),t._v(" "),e("NavLinks",{staticClass:"can-hide"})],1)],1)}),[],!1,null,null,null));e.default=d.exports}}]);
\ No newline at end of file
diff --git a/assets/js/10.4c38d8c7.js b/assets/js/10.4c38d8c7.js
new file mode 100644
index 00000000..b1cf99a7
--- /dev/null
+++ b/assets/js/10.4c38d8c7.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[10,3,12,16,20,23,26],{246:function(t,e,n){"use strict";n.d(e,"d",(function(){return i})),n.d(e,"a",(function(){return r})),n.d(e,"i",(function(){return a})),n.d(e,"f",(function(){return l})),n.d(e,"g",(function(){return u})),n.d(e,"h",(function(){return c})),n.d(e,"b",(function(){return p})),n.d(e,"e",(function(){return h})),n.d(e,"k",(function(){return d})),n.d(e,"l",(function(){return f})),n.d(e,"c",(function(){return m})),n.d(e,"j",(function(){return g}));n(92);const i=/#.*$/,s=/\.(md|html)$/,r=/\/$/,a=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(i,"").replace(s,"")}function l(t){return a.test(t)}function u(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function p(t){if(l(t))return t;const e=t.match(i),n=e?e[0]:"",s=o(t);return r.test(s)?t:s+".html"+n}function h(t,e){const n=decodeURIComponent(t.hash),s=function(t){const e=t.match(i);if(e)return e[0]}(e);if(s&&n!==s)return!1;return o(t.path)===o(e)}function d(t,e,n){if(l(e))return{type:"external",path:e};n&&(e=function(t,e,n){const i=t.charAt(0);if("/"===i)return t;if("?"===i||"#"===i)return e+t;const s=e.split("/");n&&s[s.length-1]||s.pop();const r=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,i,s=1){if("string"==typeof e)return d(n,e,i);if(Array.isArray(e))return Object.assign(d(n,e[0],i),{title:e[1]});{const r=e.children||[];return 0===r.length&&e.path?Object.assign(d(n,e.path,i),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:r.map(e=>t(e,n,i,s+1)),collapsable:!1!==e.collapsable}}}(t,s,n)):[]}return[]}function b(t){const e=m(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function m(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function g(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},247:function(t,e,n){},248:function(t,e,n){"use strict";n.r(e);var i=n(246),s={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(i.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(i.g)(this.link)||Object(i.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(i.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(i.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI||!1===this.item.rel?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":null}},methods:{focusoutAction(){this.$emit("focusout")}}},r=n(8),a=Object(r.a)(s,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=a.exports},249:function(t,e,n){"use strict";n.r(e);var i={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},s=(n(250),n(8)),r=Object(s.a)(i,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=r.exports},250:function(t,e,n){"use strict";n(247)},251:function(t,e,n){},252:function(t,e,n){},254:function(t,e,n){},257:function(t,e,n){},258:function(t,e,n){"use strict";n(251)},259:function(t,e,n){"use strict";n(252)},260:function(t,e,n){"use strict";n.r(e);var i=n(273),s=n(262),r=n(246);function a(t,e){if("group"===e.type){const n=e.path&&Object(r.e)(t,e.path),i=e.children.some(e=>"group"===e.type?a(t,e):"page"===e.type&&Object(r.e)(t,e.path));return n||i}return!1}var o={name:"SidebarLinks",components:{SidebarGroup:i.default,SidebarLink:s.default},props:["items","depth","sidebarDepth","initialOpenGroupIndex"],data(){return{openGroupIndex:this.initialOpenGroupIndex||0}},watch:{$route(){this.refreshIndex()}},created(){this.refreshIndex()},methods:{refreshIndex(){const t=function(t,e){for(let n=0;n-1&&(this.openGroupIndex=t)},toggleGroup(t){this.openGroupIndex=t===this.openGroupIndex?-1:t},isActive(t){return Object(r.e)(this.$route,t.regularPath)}}},l=n(8),u=Object(l.a)(o,(function(){var t=this,e=t._self._c;return t.items.length?e("ul",{staticClass:"sidebar-links"},t._l(t.items,(function(n,i){return e("li",{key:i},["group"===n.type?e("SidebarGroup",{attrs:{item:n,open:i===t.openGroupIndex,collapsable:n.collapsable||n.collapsible,depth:t.depth},on:{toggle:function(e){return t.toggleGroup(i)}}}):e("SidebarLink",{attrs:{"sidebar-depth":t.sidebarDepth,item:n}})],1)})),0):t._e()}),[],!1,null,null,null);e.default=u.exports},261:function(t,e,n){"use strict";n.r(e);var i=n(248),s=n(249),r=n(93),a=n.n(r),o={name:"DropdownLink",components:{NavLink:i.default,DropdownTransition:s.default},props:{item:{required:!0}},data:()=>({open:!1}),computed:{dropdownAriaLabel(){return this.item.ariaLabel||this.item.text}},watch:{$route(){this.open=!1}},methods:{setOpen(t){this.open=t},isLastItemOfArray:(t,e)=>a()(e)===t,handleDropdown(){0===event.detail&&this.setOpen(!this.open)}}},l=(n(258),n(8)),u=Object(l.a)(o,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"dropdown-wrapper",class:{open:t.open}},[e("button",{staticClass:"dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:t.handleDropdown}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow down"})]),t._v(" "),e("button",{staticClass:"mobile-dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:function(e){return t.setOpen(!t.open)}}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow",class:t.open?"down":"right"})]),t._v(" "),e("DropdownTransition",[e("ul",{directives:[{name:"show",rawName:"v-show",value:t.open,expression:"open"}],staticClass:"nav-dropdown"},t._l(t.item.items,(function(n,i){return e("li",{key:n.link||i,staticClass:"dropdown-item"},["links"===n.type?e("h4",[t._v("\n "+t._s(n.text)+"\n ")]):t._e(),t._v(" "),"links"===n.type?e("ul",{staticClass:"dropdown-subitem-wrapper"},t._l(n.items,(function(i){return e("li",{key:i.link,staticClass:"dropdown-subitem"},[e("NavLink",{attrs:{item:i},on:{focusout:function(e){t.isLastItemOfArray(i,n.items)&&t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0):e("NavLink",{attrs:{item:n},on:{focusout:function(e){t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0)])],1)}),[],!1,null,null,null);e.default=u.exports},262:function(t,e,n){"use strict";n.r(e);var i=n(246);function s(t,e,n,i,s){const r={props:{to:e,activeClass:"",exactActiveClass:""},class:{active:i,"sidebar-link":!0}};return s>2&&(r.style={"padding-left":s+"rem"}),t("RouterLink",r,n)}function r(t,e,n,a,o,l=1){return!e||l>o?null:t("ul",{class:"sidebar-sub-headers"},e.map(e=>{const u=Object(i.e)(a,n+"#"+e.slug);return t("li",{class:"sidebar-sub-header"},[s(t,n+"#"+e.slug,e.title,u,e.level-1),r(t,e.children,n,a,o,l+1)])}))}var a={functional:!0,props:["item","sidebarDepth"],render(t,{parent:{$page:e,$site:n,$route:a,$themeConfig:o,$themeLocaleConfig:l},props:{item:u,sidebarDepth:c}}){const p=Object(i.e)(a,u.path),h="auto"===u.type?p||u.children.some(t=>Object(i.e)(a,u.basePath+"#"+t.slug)):p,d="external"===u.type?function(t,e,n){return t("a",{attrs:{href:e,target:"_blank",rel:"noopener noreferrer"},class:{"sidebar-link":!0}},[n,t("OutboundLink")])}(t,u.path,u.title||u.path):s(t,u.path,u.title||u.path,h),f=[e.frontmatter.sidebarDepth,c,l.sidebarDepth,o.sidebarDepth,1].find(t=>void 0!==t),b=l.displayAllHeaders||o.displayAllHeaders;if("auto"===u.type)return[d,r(t,u.children,u.basePath,a,f)];if((h||b)&&u.headers&&!i.d.test(u.path)){return[d,r(t,Object(i.c)(u.headers),u.path,a,f)]}return d}},o=(n(259),n(8)),l=Object(o.a)(a,void 0,void 0,!1,null,null,null);e.default=l.exports},264:function(t,e,n){"use strict";n(254)},270:function(t,e,n){"use strict";n(257)},271:function(t,e,n){},272:function(t,e,n){"use strict";n.r(e);var i=n(261),s=n(246),r={name:"NavLinks",components:{NavLink:n(248).default,DropdownLink:i.default},computed:{userNav(){return this.$themeLocaleConfig.nav||this.$site.themeConfig.nav||[]},nav(){const{locales:t}=this.$site;if(t&&Object.keys(t).length>1){const e=this.$page.path,n=this.$router.options.routes,i=this.$site.themeConfig.locales||{},s={text:this.$themeLocaleConfig.selectText||"Languages",ariaLabel:this.$themeLocaleConfig.ariaLabel||"Select language",items:Object.keys(t).map(s=>{const r=t[s],a=i[s]&&i[s].label||r.lang;let o;return r.lang===this.$lang?o=e:(o=e.replace(this.$localeConfig.path,s),n.some(t=>t.path===o)||(o=s)),{text:a,link:o}})};return[...this.userNav,s]}return this.userNav},userLinks(){return(this.nav||[]).map(t=>Object.assign(Object(s.j)(t),{items:(t.items||[]).map(s.j)}))},repoLink(){const{repo:t}=this.$site.themeConfig;return t?/^https?:/.test(t)?t:"https://github.com/"+t:null},repoLabel(){if(!this.repoLink)return;if(this.$site.themeConfig.repoLabel)return this.$site.themeConfig.repoLabel;const t=this.repoLink.match(/^https?:\/\/[^/]+/)[0],e=["GitHub","GitLab","Bitbucket"];for(let n=0;nfunction t(e,n,r,i=1){if("string"==typeof e)return d(n,e,r);if(Array.isArray(e))return Object.assign(d(n,e[0],r),{title:e[1]});{const a=e.children||[];return 0===a.length&&e.path?Object.assign(d(n,e.path,r),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:a.map(e=>t(e,n,r,i+1)),collapsable:!1!==e.collapsable}}}(t,i,n)):[]}return[]}function g(t){const e=v(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function v(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function m(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},253:function(t,e){t.exports=function(t){return null==t}},255:function(t,e,n){},256:function(t,e,n){},266:function(t,e,n){"use strict";n(255)},267:function(t,e,n){var r=n(12),i=n(4),a=n(11);t.exports=function(t){return"string"==typeof t||!i(t)&&a(t)&&"[object String]"==r(t)}},268:function(t,e,n){"use strict";n(256)},269:function(t,e,n){},274:function(t,e,n){"use strict";n.r(e);var r=n(253),i=n.n(r),a=n(246),s={name:"PageEdit",computed:{lastUpdated(){return this.$page.lastUpdated},lastUpdatedText(){return"string"==typeof this.$themeLocaleConfig.lastUpdated?this.$themeLocaleConfig.lastUpdated:"string"==typeof this.$site.themeConfig.lastUpdated?this.$site.themeConfig.lastUpdated:"Last Updated"},editLink(){const t=i()(this.$page.frontmatter.editLink)?this.$site.themeConfig.editLinks:this.$page.frontmatter.editLink,{repo:e,docsDir:n="",docsBranch:r="master",docsRepo:a=e}=this.$site.themeConfig;return t&&a&&this.$page.relativePath?this.createEditLink(e,a,n,r,this.$page.relativePath):null},editLinkText(){return this.$themeLocaleConfig.editLinkText||this.$site.themeConfig.editLinkText||"Edit this page"}},methods:{createEditLink(t,e,n,r,i){if(/bitbucket.org/.test(e)){return e.replace(a.a,"")+"/src"+`/${r}/`+(n?n.replace(a.a,"")+"/":"")+i+`?mode=edit&spa=0&at=${r}&fileviewer=file-view-default`}if(/gitlab.com/.test(e)){return e.replace(a.a,"")+"/-/edit"+`/${r}/`+(n?n.replace(a.a,"")+"/":"")+i}return(a.i.test(e)?e:"https://github.com/"+e).replace(a.a,"")+"/edit"+`/${r}/`+(n?n.replace(a.a,"")+"/":"")+i}}},o=(n(266),n(8)),u=Object(o.a)(s,(function(){var t=this,e=t._self._c;return e("footer",{staticClass:"page-edit"},[t.editLink?e("div",{staticClass:"edit-link"},[e("a",{attrs:{href:t.editLink,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.editLinkText))]),t._v(" "),e("OutboundLink")],1):t._e(),t._v(" "),t.lastUpdated?e("div",{staticClass:"last-updated"},[e("span",{staticClass:"prefix"},[t._v(t._s(t.lastUpdatedText)+":")]),t._v(" "),e("span",{staticClass:"time"},[t._v(t._s(t.lastUpdated))])]):t._e()])}),[],!1,null,null,null);e.default=u.exports},275:function(t,e,n){"use strict";n.r(e);n(92);var r=n(246),i=n(267),a=n.n(i),s=n(253),o=n.n(s),u={name:"PageNav",props:["sidebarItems"],computed:{prev(){return l(c.PREV,this)},next(){return l(c.NEXT,this)}}};const c={NEXT:{resolveLink:function(t,e){return p(t,e,1)},getThemeLinkConfig:({nextLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.next},PREV:{resolveLink:function(t,e){return p(t,e,-1)},getThemeLinkConfig:({prevLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.prev}};function l(t,{$themeConfig:e,$page:n,$route:i,$site:s,sidebarItems:u}){const{resolveLink:c,getThemeLinkConfig:l,getPageLinkConfig:p}=t,f=l(e),d=p(n),h=o()(d)?f:d;return!1===h?void 0:a()(h)?Object(r.k)(s.pages,h,i.path):c(n,u)}function p(t,e,n){const r=[];!function t(e,n){for(let r=0,i=e.length;rfunction t(e,n,i,r=1){if("string"==typeof e)return f(n,e,i);if(Array.isArray(e))return Object.assign(f(n,e[0],i),{title:e[1]});{const s=e.children||[];return 0===s.length&&e.path?Object.assign(f(n,e.path,i),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:s.map(e=>t(e,n,i,r+1)),collapsable:!1!==e.collapsable}}}(t,r,n)):[]}return[]}function m(t){const e=b(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function b(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function g(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},247:function(t,e,n){},248:function(t,e,n){"use strict";n.r(e);var i=n(246),r={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(i.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(i.g)(this.link)||Object(i.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(i.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(i.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI||!1===this.item.rel?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":null}},methods:{focusoutAction(){this.$emit("focusout")}}},s=n(8),a=Object(s.a)(r,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=a.exports},249:function(t,e,n){"use strict";n.r(e);var i={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},r=(n(250),n(8)),s=Object(r.a)(i,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=s.exports},250:function(t,e,n){"use strict";n(247)},251:function(t,e,n){},254:function(t,e,n){},258:function(t,e,n){"use strict";n(251)},261:function(t,e,n){"use strict";n.r(e);var i=n(248),r=n(249),s=n(93),a=n.n(s),o={name:"DropdownLink",components:{NavLink:i.default,DropdownTransition:r.default},props:{item:{required:!0}},data:()=>({open:!1}),computed:{dropdownAriaLabel(){return this.item.ariaLabel||this.item.text}},watch:{$route(){this.open=!1}},methods:{setOpen(t){this.open=t},isLastItemOfArray:(t,e)=>a()(e)===t,handleDropdown(){0===event.detail&&this.setOpen(!this.open)}}},l=(n(258),n(8)),u=Object(l.a)(o,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"dropdown-wrapper",class:{open:t.open}},[e("button",{staticClass:"dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:t.handleDropdown}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow down"})]),t._v(" "),e("button",{staticClass:"mobile-dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:function(e){return t.setOpen(!t.open)}}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow",class:t.open?"down":"right"})]),t._v(" "),e("DropdownTransition",[e("ul",{directives:[{name:"show",rawName:"v-show",value:t.open,expression:"open"}],staticClass:"nav-dropdown"},t._l(t.item.items,(function(n,i){return e("li",{key:n.link||i,staticClass:"dropdown-item"},["links"===n.type?e("h4",[t._v("\n "+t._s(n.text)+"\n ")]):t._e(),t._v(" "),"links"===n.type?e("ul",{staticClass:"dropdown-subitem-wrapper"},t._l(n.items,(function(i){return e("li",{key:i.link,staticClass:"dropdown-subitem"},[e("NavLink",{attrs:{item:i},on:{focusout:function(e){t.isLastItemOfArray(i,n.items)&&t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0):e("NavLink",{attrs:{item:n},on:{focusout:function(e){t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0)])],1)}),[],!1,null,null,null);e.default=u.exports},264:function(t,e,n){"use strict";n(254)},272:function(t,e,n){"use strict";n.r(e);var i=n(261),r=n(246),s={name:"NavLinks",components:{NavLink:n(248).default,DropdownLink:i.default},computed:{userNav(){return this.$themeLocaleConfig.nav||this.$site.themeConfig.nav||[]},nav(){const{locales:t}=this.$site;if(t&&Object.keys(t).length>1){const e=this.$page.path,n=this.$router.options.routes,i=this.$site.themeConfig.locales||{},r={text:this.$themeLocaleConfig.selectText||"Languages",ariaLabel:this.$themeLocaleConfig.ariaLabel||"Select language",items:Object.keys(t).map(r=>{const s=t[r],a=i[r]&&i[r].label||s.lang;let o;return s.lang===this.$lang?o=e:(o=e.replace(this.$localeConfig.path,r),n.some(t=>t.path===o)||(o=r)),{text:a,link:o}})};return[...this.userNav,r]}return this.userNav},userLinks(){return(this.nav||[]).map(t=>Object.assign(Object(r.j)(t),{items:(t.items||[]).map(r.j)}))},repoLink(){const{repo:t}=this.$site.themeConfig;return t?/^https?:/.test(t)?t:"https://github.com/"+t:null},repoLabel(){if(!this.repoLink)return;if(this.$site.themeConfig.repoLabel)return this.$site.themeConfig.repoLabel;const t=this.repoLink.match(/^https?:\/\/[^/]+/)[0],e=["GitHub","GitLab","Bitbucket"];for(let n=0;n\nNode: ip-192-168-56-161.eu-central-1.compute.internal/192.168.56.161\nStart Time: Fri, 19 Jul 2019 12:52:21 +0200\nLabels: app=nginx\n pod-template-hash=d879bd8db\nAnnotations: kubernetes.io/psp: eks.privileged\nStatus: Pending\nIP: 192.168.61.206\nControlled By: ReplicaSet/nginx-d879bd8db\nContainers:\n nginx:\n Container ID:\n Image: harbor.mylabs.dev/library/nginx:1.13.12\n Image ID:\n Port: 80/TCP\n Host Port: 0/TCP\n State: Waiting\n Reason: ImagePullBackOff\n Ready: False\n Restart Count: 0\n Environment: <none>\n Mounts:\n /var/run/secrets/kubernetes.io/serviceaccount from default-token-5lzmk (ro)\nConditions:\n Type Status\n Initialized True\n Ready False\n ContainersReady False\n PodScheduled True\nVolumes:\n default-token-5lzmk:\n Type: Secret (a volume populated by a Secret)\n SecretName: default-token-5lzmk\n Optional: false\nQoS Class: BestEffort\nNode-Selectors: <none>\nTolerations: node.kubernetes.io/not-ready:NoExecute for 300s\n node.kubernetes.io/unreachable:NoExecute for 300s\nEvents:\n Type Reason Age From Message\n ---- ------ ---- ---- -------\n Normal Scheduled 47s default-scheduler Successfully assigned mytest/nginx-d879bd8db-nmzc8 to ip-192-168-56-161.eu-central-1.compute.internal\n Normal BackOff 16s (x3 over 45s) kubelet, ip-192-168-56-161.eu-central-1.compute.internal Back-off pulling image "harbor.mylabs.dev/library/nginx:1.13.12"\n Warning Failed 16s (x3 over 45s) kubelet, ip-192-168-56-161.eu-central-1.compute.internal Error: ImagePullBackOff\n Normal Pulling 2s (x3 over 46s) kubelet, ip-192-168-56-161.eu-central-1.compute.internal pulling image "harbor.mylabs.dev/library/nginx:1.13.12"\n Warning Failed 2s (x3 over 46s) kubelet, ip-192-168-56-161.eu-central-1.compute.internal Failed to pull image "harbor.mylabs.dev/library/nginx:1.13.12": rpc error: code = Unknown desc = Error response from daemon: unknown: The severity of vulnerability of the image: "high" is equal or higher than the threshold in project setting: "high".\n Warning Failed 2s (x3 over 46s) kubelet, ip-192-168-56-161.eu-central-1.compute.internal Error: ErrImagePull\n')])])]),a("p",[t._v('You are not able to run docker images with "High" security issues. You can see\nthe error message: '),a("code",[t._v('The severity of vulnerability of the image: "high" is equal or higher than the threshold in project setting: "high".')])]),t._v(" "),a("h2",{attrs:{id:"project-rbac-settings"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#project-rbac-settings"}},[t._v("#")]),t._v(" Project RBAC settings")]),t._v(" "),a("p",[t._v("YouTube video: "),a("a",{attrs:{href:"https://youtu.be/2ZIu9XTvsC0",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://youtu.be/2ZIu9XTvsC0"),a("OutboundLink")],1)]),t._v(" "),a("p",[t._v("Create new project called "),a("code",[t._v("my_rbac_test_project")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-u")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"admin:admin"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-X")]),t._v(" POST "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-H")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Content-Type: application/json"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://harbor.'),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),t._v('/api/projects"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-d")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{\n '),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("project_name"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("my_rbac_test_project"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(",\n "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("public"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(': 0\n}"')]),t._v("\n")])])]),a("p",[t._v('Try to push the kuard image as a "Guest" user:')]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" admin "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("docker")]),t._v(" login "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--username")]),t._v(" aduser03 --password-stdin harbor."),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("docker")]),t._v(" tag gcr.io/kuar-demo/kuard-amd64:blue harbor."),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),t._v("/my_rbac_test_project/kuard-amd64:blue\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("docker")]),t._v(" push harbor."),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),t._v("/my_rbac_test_project/kuard-amd64:blue\n")])])]),a("p",[t._v("Output:")]),t._v(" "),a("div",{staticClass:"language-text extra-class"},[a("div",{staticClass:"highlight-lines"},[a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("div",{staticClass:"highlighted"},[t._v(" ")]),a("br")]),a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("WARNING! Your password will be stored unencrypted in /home/pruzicka/.docker/config.json.\nConfigure a credential helper to remove this warning. See\nhttps://docs.docker.com/engine/reference/commandline/login/#credentials-store\n\nLogin Succeeded\nThe push refers to repository [harbor.mylabs.dev/my_rbac_test_project/kuard-amd64]\n656e9c47289e: Preparing\nbcf2f368fe23: Preparing\ndenied: requested access to the resource is denied\n")])])]),a("ul",[a("li",[t._v("Guests are not allow to push anything into the projects as you can see from\nthe error message: "),a("code",[t._v("denied: requested access to the resource is denied")]),t._v(".")])]),t._v(" "),a("p",[t._v("Add user "),a("code",[t._v("aduser03")]),t._v(" on the project "),a("code",[t._v("my_rbac_test_project")]),t._v(" as a Developer:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("PROJECT_ID")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-s")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-u")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"admin:admin"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-X")]),t._v(" GET "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://harbor.'),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),t._v('/api/projects?name=my_rbac_test_project"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" jq "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('".[].project_id"')]),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-u")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"admin:admin"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-X")]),t._v(" POST "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://harbor.'),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),t._v("/api/projects/"),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${PROJECT_ID}")]),t._v('/members"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-H")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Content-Type: application/json"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-d")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{\n '),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("role_id"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": 2,\n "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("member_user"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": {\n "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("username"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("aduser03"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v('\n }\n}"')]),t._v("\n")])])]),a("p",[a("img",{attrs:{src:e(327),alt:"Harbor - Project add new member",title:"Harbor - Project add new member"}})]),t._v(" "),a("p",[a("img",{attrs:{src:e(328),alt:"Harbor - Project members",title:"Harbor - Project members"}})]),t._v(" "),a("p",[t._v("Push the container image again:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("docker")]),t._v(" push harbor."),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),t._v("/my_rbac_test_project/kuard-amd64:blue\n")])])]),a("p",[t._v("Output:")]),t._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("The push refers to repository [harbor.mylabs.dev/my_rbac_test_project/kuard-amd64]\n656e9c47289e: Mounted from library/kuard-amd64\nbcf2f368fe23: Mounted from library/kuard-amd64\nblue: digest: sha256:1ecc9fb2c871302fdb57a25e0c076311b7b352b0a9246d442940ca8fb4efe229 size: 739\n")])])]),a("p",[t._v("Now the image was successfully uploaded:")]),t._v(" "),a("p",[a("img",{attrs:{src:e(329),alt:"Harbor - Project - my_rbac_test_project",title:"Harbor - Project - my_rbac_test_project"}})]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v("\n")])])])])}),[],!1,null,null,null);a.default=r.exports}}]);
\ No newline at end of file
diff --git a/assets/js/15.e1917aa1.js b/assets/js/15.e1917aa1.js
new file mode 100644
index 00000000..9eab1850
--- /dev/null
+++ b/assets/js/15.e1917aa1.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{280:function(e,t,a){"use strict";var i=TypeError;e.exports=function(e,t){if(e({placeholder:void 0}),watch:{$lang(e){this.update(this.options,e)},options(e){this.update(e,this.$lang)}},mounted(){this.initialize(this.options,this.$lang),this.placeholder=this.$site.themeConfig.searchPlaceholder||""},methods:{initialize(e,t){Promise.all([Promise.all([a.e(0),a.e(9)]).then(a.t.bind(null,331,7)),Promise.all([a.e(0),a.e(9)]).then(a.t.bind(null,332,7))]).then(([a])=>{a=a.default;const{algoliaOptions:i={}}=e;a(Object.assign({},e,{inputSelector:"#algolia-search-input",algoliaOptions:{...i,facetFilters:["lang:"+t].concat(i.facetFilters||[])},handleSelected:(e,t,a)=>{const{pathname:i,hash:n}=new URL(a.url),r=i.replace(this.$site.base,"/"),s=decodeURIComponent(n);this.$router.push(`${r}${s}`)}}))})},update(e,t){this.$el.innerHTML='',this.initialize(e,t)}}},n=(a(295),a(8)),r=Object(n.a)(i,(function(){var e=this._self._c;return e("form",{staticClass:"algolia-search-wrapper search-box",attrs:{id:"search-form",role:"search"}},[e("input",{staticClass:"search-query",attrs:{id:"algolia-search-input",placeholder:this.placeholder}})])}),[],!1,null,null,null);t.default=r.exports}}]);
\ No newline at end of file
diff --git a/assets/js/16.86a83cf4.js b/assets/js/16.86a83cf4.js
new file mode 100644
index 00000000..f85769ff
--- /dev/null
+++ b/assets/js/16.86a83cf4.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[16,23,26],{246:function(t,e,n){"use strict";n.d(e,"d",(function(){return i})),n.d(e,"a",(function(){return s})),n.d(e,"i",(function(){return o})),n.d(e,"f",(function(){return l})),n.d(e,"g",(function(){return u})),n.d(e,"h",(function(){return c})),n.d(e,"b",(function(){return p})),n.d(e,"e",(function(){return f})),n.d(e,"k",(function(){return h})),n.d(e,"l",(function(){return d})),n.d(e,"c",(function(){return b})),n.d(e,"j",(function(){return g}));n(92);const i=/#.*$/,r=/\.(md|html)$/,s=/\/$/,o=/^[a-z]+:/i;function a(t){return decodeURI(t).replace(i,"").replace(r,"")}function l(t){return o.test(t)}function u(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function p(t){if(l(t))return t;const e=t.match(i),n=e?e[0]:"",r=a(t);return s.test(r)?t:r+".html"+n}function f(t,e){const n=decodeURIComponent(t.hash),r=function(t){const e=t.match(i);if(e)return e[0]}(e);if(r&&n!==r)return!1;return a(t.path)===a(e)}function h(t,e,n){if(l(e))return{type:"external",path:e};n&&(e=function(t,e,n){const i=t.charAt(0);if("/"===i)return t;if("?"===i||"#"===i)return e+t;const r=e.split("/");n&&r[r.length-1]||r.pop();const s=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,i,r=1){if("string"==typeof e)return h(n,e,i);if(Array.isArray(e))return Object.assign(h(n,e[0],i),{title:e[1]});{const s=e.children||[];return 0===s.length&&e.path?Object.assign(h(n,e.path,i),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:s.map(e=>t(e,n,i,r+1)),collapsable:!1!==e.collapsable}}}(t,r,n)):[]}return[]}function m(t){const e=b(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function b(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function g(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},247:function(t,e,n){},248:function(t,e,n){"use strict";n.r(e);var i=n(246),r={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(i.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(i.g)(this.link)||Object(i.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(i.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(i.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI||!1===this.item.rel?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":null}},methods:{focusoutAction(){this.$emit("focusout")}}},s=n(8),o=Object(s.a)(r,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=o.exports},249:function(t,e,n){"use strict";n.r(e);var i={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},r=(n(250),n(8)),s=Object(r.a)(i,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=s.exports},250:function(t,e,n){"use strict";n(247)},251:function(t,e,n){},258:function(t,e,n){"use strict";n(251)},261:function(t,e,n){"use strict";n.r(e);var i=n(248),r=n(249),s=n(93),o=n.n(s),a={name:"DropdownLink",components:{NavLink:i.default,DropdownTransition:r.default},props:{item:{required:!0}},data:()=>({open:!1}),computed:{dropdownAriaLabel(){return this.item.ariaLabel||this.item.text}},watch:{$route(){this.open=!1}},methods:{setOpen(t){this.open=t},isLastItemOfArray:(t,e)=>o()(e)===t,handleDropdown(){0===event.detail&&this.setOpen(!this.open)}}},l=(n(258),n(8)),u=Object(l.a)(a,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"dropdown-wrapper",class:{open:t.open}},[e("button",{staticClass:"dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:t.handleDropdown}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow down"})]),t._v(" "),e("button",{staticClass:"mobile-dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:function(e){return t.setOpen(!t.open)}}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow",class:t.open?"down":"right"})]),t._v(" "),e("DropdownTransition",[e("ul",{directives:[{name:"show",rawName:"v-show",value:t.open,expression:"open"}],staticClass:"nav-dropdown"},t._l(t.item.items,(function(n,i){return e("li",{key:n.link||i,staticClass:"dropdown-item"},["links"===n.type?e("h4",[t._v("\n "+t._s(n.text)+"\n ")]):t._e(),t._v(" "),"links"===n.type?e("ul",{staticClass:"dropdown-subitem-wrapper"},t._l(n.items,(function(i){return e("li",{key:i.link,staticClass:"dropdown-subitem"},[e("NavLink",{attrs:{item:i},on:{focusout:function(e){t.isLastItemOfArray(i,n.items)&&t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0):e("NavLink",{attrs:{item:n},on:{focusout:function(e){t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0)])],1)}),[],!1,null,null,null);e.default=u.exports}}]);
\ No newline at end of file
diff --git a/assets/js/17.0662481b.js b/assets/js/17.0662481b.js
new file mode 100644
index 00000000..f1455142
--- /dev/null
+++ b/assets/js/17.0662481b.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{246:function(t,n,e){"use strict";e.d(n,"d",(function(){return r})),e.d(n,"a",(function(){return o})),e.d(n,"i",(function(){return a})),e.d(n,"f",(function(){return u})),e.d(n,"g",(function(){return c})),e.d(n,"h",(function(){return p})),e.d(n,"b",(function(){return l})),e.d(n,"e",(function(){return f})),e.d(n,"k",(function(){return h})),e.d(n,"l",(function(){return d})),e.d(n,"c",(function(){return v})),e.d(n,"j",(function(){return b}));e(92);const r=/#.*$/,i=/\.(md|html)$/,o=/\/$/,a=/^[a-z]+:/i;function s(t){return decodeURI(t).replace(r,"").replace(i,"")}function u(t){return a.test(t)}function c(t){return/^mailto:/.test(t)}function p(t){return/^tel:/.test(t)}function l(t){if(u(t))return t;const n=t.match(r),e=n?n[0]:"",i=s(t);return o.test(i)?t:i+".html"+e}function f(t,n){const e=decodeURIComponent(t.hash),i=function(t){const n=t.match(r);if(n)return n[0]}(n);if(i&&e!==i)return!1;return s(t.path)===s(n)}function h(t,n,e){if(u(n))return{type:"external",path:n};e&&(n=function(t,n,e){const r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return n+t;const i=n.split("/");e&&i[i.length-1]||i.pop();const o=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(n,e,r,i=1){if("string"==typeof n)return h(e,n,r);if(Array.isArray(n))return Object.assign(h(e,n[0],r),{title:n[1]});{const o=n.children||[];return 0===o.length&&n.path?Object.assign(h(e,n.path,r),{title:n.title}):{type:"group",path:n.path,title:n.title,sidebarDepth:n.sidebarDepth,initialOpenGroupIndex:n.initialOpenGroupIndex,children:o.map(n=>t(n,e,r,i+1)),collapsable:!1!==n.collapsable}}}(t,i,e)):[]}return[]}function g(t){const n=v(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:n.map(n=>({type:"auto",title:n.title,basePath:t.path,path:t.path+"#"+n.slug,children:n.children||[]}))}]}function v(t){let n;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?n=t:n&&(n.children||(n.children=[])).push(t)}),t.filter(t=>2===t.level)}function b(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},253:function(t,n){t.exports=function(t){return null==t}},256:function(t,n,e){},267:function(t,n,e){var r=e(12),i=e(4),o=e(11);t.exports=function(t){return"string"==typeof t||!i(t)&&o(t)&&"[object String]"==r(t)}},268:function(t,n,e){"use strict";e(256)},275:function(t,n,e){"use strict";e.r(n);e(92);var r=e(246),i=e(267),o=e.n(i),a=e(253),s=e.n(a),u={name:"PageNav",props:["sidebarItems"],computed:{prev(){return p(c.PREV,this)},next(){return p(c.NEXT,this)}}};const c={NEXT:{resolveLink:function(t,n){return l(t,n,1)},getThemeLinkConfig:({nextLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.next},PREV:{resolveLink:function(t,n){return l(t,n,-1)},getThemeLinkConfig:({prevLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.prev}};function p(t,{$themeConfig:n,$page:e,$route:i,$site:a,sidebarItems:u}){const{resolveLink:c,getThemeLinkConfig:p,getPageLinkConfig:l}=t,f=p(n),h=l(e),d=s()(h)?f:h;return!1===d?void 0:o()(d)?Object(r.k)(a.pages,d,i.path):c(e,u)}function l(t,n,e){const r=[];!function t(n,e){for(let r=0,i=n.length;rfunction t(e,n,i,r=1){if("string"==typeof e)return d(n,e,i);if(Array.isArray(e))return Object.assign(d(n,e[0],i),{title:e[1]});{const a=e.children||[];return 0===a.length&&e.path?Object.assign(d(n,e.path,i),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:a.map(e=>t(e,n,i,r+1)),collapsable:!1!==e.collapsable}}}(t,r,n)):[]}return[]}function m(t){const e=g(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function g(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function b(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},248:function(t,e,n){"use strict";n.r(e);var i=n(246),r={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(i.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(i.g)(this.link)||Object(i.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(i.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(i.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI||!1===this.item.rel?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":null}},methods:{focusoutAction(){this.$emit("focusout")}}},a=n(8),s=Object(a.a)(r,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=s.exports},263:function(t,e,n){},276:function(t,e,n){"use strict";n(263)},287:function(t,e,n){"use strict";n.r(e);var i={name:"Home",components:{NavLink:n(248).default},computed:{data(){return this.$page.frontmatter},actionLink(){return{link:this.data.actionLink,text:this.data.actionText}}}},r=(n(276),n(8)),a=Object(r.a)(i,(function(){var t=this,e=t._self._c;return e("main",{staticClass:"home",attrs:{"aria-labelledby":null!==t.data.heroText?"main-title":null}},[e("header",{staticClass:"hero"},[t.data.heroImage?e("img",{attrs:{src:t.$withBase(t.data.heroImage),alt:t.data.heroAlt||"hero"}}):t._e(),t._v(" "),null!==t.data.heroText?e("h1",{attrs:{id:"main-title"}},[t._v("\n "+t._s(t.data.heroText||t.$title||"Hello")+"\n ")]):t._e(),t._v(" "),null!==t.data.tagline?e("p",{staticClass:"description"},[t._v("\n "+t._s(t.data.tagline||t.$description||"Welcome to your VuePress site")+"\n ")]):t._e(),t._v(" "),t.data.actionText&&t.data.actionLink?e("p",{staticClass:"action"},[e("NavLink",{staticClass:"action-button",attrs:{item:t.actionLink}})],1):t._e()]),t._v(" "),t.data.features&&t.data.features.length?e("div",{staticClass:"features"},t._l(t.data.features,(function(n,i){return e("div",{key:i,staticClass:"feature"},[e("h2",[t._v(t._s(n.title))]),t._v(" "),e("p",[t._v(t._s(n.details))])])})),0):t._e(),t._v(" "),e("Content",{staticClass:"theme-default-content custom"}),t._v(" "),t.data.footer?e("div",{staticClass:"footer"},[t._v("\n "+t._s(t.data.footer)+"\n ")]):e("Content",{staticClass:"footer",attrs:{"slot-key":"footer"}})],1)}),[],!1,null,null,null);e.default=a.exports}}]);
\ No newline at end of file
diff --git a/assets/js/19.669973b5.js b/assets/js/19.669973b5.js
new file mode 100644
index 00000000..3ac6465d
--- /dev/null
+++ b/assets/js/19.669973b5.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{246:function(t,e,n){"use strict";n.d(e,"d",(function(){return i})),n.d(e,"a",(function(){return a})),n.d(e,"i",(function(){return s})),n.d(e,"f",(function(){return c})),n.d(e,"g",(function(){return u})),n.d(e,"h",(function(){return l})),n.d(e,"b",(function(){return d})),n.d(e,"e",(function(){return p})),n.d(e,"k",(function(){return f})),n.d(e,"l",(function(){return h})),n.d(e,"c",(function(){return m})),n.d(e,"j",(function(){return b}));n(92);const i=/#.*$/,r=/\.(md|html)$/,a=/\/$/,s=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(i,"").replace(r,"")}function c(t){return s.test(t)}function u(t){return/^mailto:/.test(t)}function l(t){return/^tel:/.test(t)}function d(t){if(c(t))return t;const e=t.match(i),n=e?e[0]:"",r=o(t);return a.test(r)?t:r+".html"+n}function p(t,e){const n=decodeURIComponent(t.hash),r=function(t){const e=t.match(i);if(e)return e[0]}(e);if(r&&n!==r)return!1;return o(t.path)===o(e)}function f(t,e,n){if(c(e))return{type:"external",path:e};n&&(e=function(t,e,n){const i=t.charAt(0);if("/"===i)return t;if("?"===i||"#"===i)return e+t;const r=e.split("/");n&&r[r.length-1]||r.pop();const a=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,i,r=1){if("string"==typeof e)return f(n,e,i);if(Array.isArray(e))return Object.assign(f(n,e[0],i),{title:e[1]});{const a=e.children||[];return 0===a.length&&e.path?Object.assign(f(n,e.path,i),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:a.map(e=>t(e,n,i,r+1)),collapsable:!1!==e.collapsable}}}(t,r,n)):[]}return[]}function g(t){const e=m(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function m(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function b(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},253:function(t,e){t.exports=function(t){return null==t}},255:function(t,e,n){},266:function(t,e,n){"use strict";n(255)},274:function(t,e,n){"use strict";n.r(e);var i=n(253),r=n.n(i),a=n(246),s={name:"PageEdit",computed:{lastUpdated(){return this.$page.lastUpdated},lastUpdatedText(){return"string"==typeof this.$themeLocaleConfig.lastUpdated?this.$themeLocaleConfig.lastUpdated:"string"==typeof this.$site.themeConfig.lastUpdated?this.$site.themeConfig.lastUpdated:"Last Updated"},editLink(){const t=r()(this.$page.frontmatter.editLink)?this.$site.themeConfig.editLinks:this.$page.frontmatter.editLink,{repo:e,docsDir:n="",docsBranch:i="master",docsRepo:a=e}=this.$site.themeConfig;return t&&a&&this.$page.relativePath?this.createEditLink(e,a,n,i,this.$page.relativePath):null},editLinkText(){return this.$themeLocaleConfig.editLinkText||this.$site.themeConfig.editLinkText||"Edit this page"}},methods:{createEditLink(t,e,n,i,r){if(/bitbucket.org/.test(e)){return e.replace(a.a,"")+"/src"+`/${i}/`+(n?n.replace(a.a,"")+"/":"")+r+`?mode=edit&spa=0&at=${i}&fileviewer=file-view-default`}if(/gitlab.com/.test(e)){return e.replace(a.a,"")+"/-/edit"+`/${i}/`+(n?n.replace(a.a,"")+"/":"")+r}return(a.i.test(e)?e:"https://github.com/"+e).replace(a.a,"")+"/edit"+`/${i}/`+(n?n.replace(a.a,"")+"/":"")+r}}},o=(n(266),n(8)),c=Object(o.a)(s,(function(){var t=this,e=t._self._c;return e("footer",{staticClass:"page-edit"},[t.editLink?e("div",{staticClass:"edit-link"},[e("a",{attrs:{href:t.editLink,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.editLinkText))]),t._v(" "),e("OutboundLink")],1):t._e(),t._v(" "),t.lastUpdated?e("div",{staticClass:"last-updated"},[e("span",{staticClass:"prefix"},[t._v(t._s(t.lastUpdatedText)+":")]),t._v(" "),e("span",{staticClass:"time"},[t._v(t._s(t.lastUpdated))])]):t._e()])}),[],!1,null,null,null);e.default=c.exports}}]);
\ No newline at end of file
diff --git a/assets/js/2.521d4de5.js b/assets/js/2.521d4de5.js
new file mode 100644
index 00000000..fb76d255
--- /dev/null
+++ b/assets/js/2.521d4de5.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{252:function(t,e,a){},253:function(t,e){t.exports=function(t){return null==t}},255:function(t,e,a){},256:function(t,e,a){},257:function(t,e,a){},259:function(t,e,a){"use strict";a(252)},260:function(t,e,a){"use strict";a.r(e);var n=a(273),s=a(262),i=a(246);function r(t,e){if("group"===e.type){const a=e.path&&Object(i.e)(t,e.path),n=e.children.some(e=>"group"===e.type?r(t,e):"page"===e.type&&Object(i.e)(t,e.path));return a||n}return!1}var o={name:"SidebarLinks",components:{SidebarGroup:n.default,SidebarLink:s.default},props:["items","depth","sidebarDepth","initialOpenGroupIndex"],data(){return{openGroupIndex:this.initialOpenGroupIndex||0}},watch:{$route(){this.refreshIndex()}},created(){this.refreshIndex()},methods:{refreshIndex(){const t=function(t,e){for(let a=0;a-1&&(this.openGroupIndex=t)},toggleGroup(t){this.openGroupIndex=t===this.openGroupIndex?-1:t},isActive(t){return Object(i.e)(this.$route,t.regularPath)}}},l=a(8),u=Object(l.a)(o,(function(){var t=this,e=t._self._c;return t.items.length?e("ul",{staticClass:"sidebar-links"},t._l(t.items,(function(a,n){return e("li",{key:n},["group"===a.type?e("SidebarGroup",{attrs:{item:a,open:n===t.openGroupIndex,collapsable:a.collapsable||a.collapsible,depth:t.depth},on:{toggle:function(e){return t.toggleGroup(n)}}}):e("SidebarLink",{attrs:{"sidebar-depth":t.sidebarDepth,item:a}})],1)})),0):t._e()}),[],!1,null,null,null);e.default=u.exports},262:function(t,e,a){"use strict";a.r(e);var n=a(246);function s(t,e,a,n,s){const i={props:{to:e,activeClass:"",exactActiveClass:""},class:{active:n,"sidebar-link":!0}};return s>2&&(i.style={"padding-left":s+"rem"}),t("RouterLink",i,a)}function i(t,e,a,r,o,l=1){return!e||l>o?null:t("ul",{class:"sidebar-sub-headers"},e.map(e=>{const u=Object(n.e)(r,a+"#"+e.slug);return t("li",{class:"sidebar-sub-header"},[s(t,a+"#"+e.slug,e.title,u,e.level-1),i(t,e.children,a,r,o,l+1)])}))}var r={functional:!0,props:["item","sidebarDepth"],render(t,{parent:{$page:e,$site:a,$route:r,$themeConfig:o,$themeLocaleConfig:l},props:{item:u,sidebarDepth:c}}){const p=Object(n.e)(r,u.path),d="auto"===u.type?p||u.children.some(t=>Object(n.e)(r,u.basePath+"#"+t.slug)):p,h="external"===u.type?function(t,e,a){return t("a",{attrs:{href:e,target:"_blank",rel:"noopener noreferrer"},class:{"sidebar-link":!0}},[a,t("OutboundLink")])}(t,u.path,u.title||u.path):s(t,u.path,u.title||u.path,d),f=[e.frontmatter.sidebarDepth,c,l.sidebarDepth,o.sidebarDepth,1].find(t=>void 0!==t),b=l.displayAllHeaders||o.displayAllHeaders;if("auto"===u.type)return[h,i(t,u.children,u.basePath,r,f)];if((d||b)&&u.headers&&!n.d.test(u.path)){return[h,i(t,Object(n.c)(u.headers),u.path,r,f)]}return h}},o=(a(259),a(8)),l=Object(o.a)(r,void 0,void 0,!1,null,null,null);e.default=l.exports},263:function(t,e,a){},266:function(t,e,a){"use strict";a(255)},267:function(t,e,a){var n=a(12),s=a(4),i=a(11);t.exports=function(t){return"string"==typeof t||!s(t)&&i(t)&&"[object String]"==n(t)}},268:function(t,e,a){"use strict";a(256)},269:function(t,e,a){},270:function(t,e,a){"use strict";a(257)},271:function(t,e,a){},273:function(t,e,a){"use strict";a.r(e);var n=a(246),s={name:"SidebarGroup",components:{DropdownTransition:a(249).default},props:["item","open","collapsable","depth"],beforeCreate(){this.$options.components.SidebarLinks=a(260).default},methods:{isActive:n.e}},i=(a(270),a(8)),r=Object(i.a)(s,(function(){var t=this,e=t._self._c;return e("section",{staticClass:"sidebar-group",class:[{collapsable:t.collapsable,"is-sub-group":0!==t.depth},"depth-"+t.depth]},[t.item.path?e("RouterLink",{staticClass:"sidebar-heading clickable",class:{open:t.open,active:t.isActive(t.$route,t.item.path)},attrs:{to:t.item.path},nativeOn:{click:function(e){return t.$emit("toggle")}}},[e("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?e("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]):e("p",{staticClass:"sidebar-heading",class:{open:t.open},on:{click:function(e){return t.$emit("toggle")}}},[e("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?e("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]),t._v(" "),e("DropdownTransition",[t.open||!t.collapsable?e("SidebarLinks",{staticClass:"sidebar-group-items",attrs:{items:t.item.children,"sidebar-depth":t.item.sidebarDepth,"initial-open-group-index":t.item.initialOpenGroupIndex,depth:t.depth+1}}):t._e()],1)],1)}),[],!1,null,null,null);e.default=r.exports},274:function(t,e,a){"use strict";a.r(e);var n=a(253),s=a.n(n),i=a(246),r={name:"PageEdit",computed:{lastUpdated(){return this.$page.lastUpdated},lastUpdatedText(){return"string"==typeof this.$themeLocaleConfig.lastUpdated?this.$themeLocaleConfig.lastUpdated:"string"==typeof this.$site.themeConfig.lastUpdated?this.$site.themeConfig.lastUpdated:"Last Updated"},editLink(){const t=s()(this.$page.frontmatter.editLink)?this.$site.themeConfig.editLinks:this.$page.frontmatter.editLink,{repo:e,docsDir:a="",docsBranch:n="master",docsRepo:i=e}=this.$site.themeConfig;return t&&i&&this.$page.relativePath?this.createEditLink(e,i,a,n,this.$page.relativePath):null},editLinkText(){return this.$themeLocaleConfig.editLinkText||this.$site.themeConfig.editLinkText||"Edit this page"}},methods:{createEditLink(t,e,a,n,s){if(/bitbucket.org/.test(e)){return e.replace(i.a,"")+"/src"+`/${n}/`+(a?a.replace(i.a,"")+"/":"")+s+`?mode=edit&spa=0&at=${n}&fileviewer=file-view-default`}if(/gitlab.com/.test(e)){return e.replace(i.a,"")+"/-/edit"+`/${n}/`+(a?a.replace(i.a,"")+"/":"")+s}return(i.i.test(e)?e:"https://github.com/"+e).replace(i.a,"")+"/edit"+`/${n}/`+(a?a.replace(i.a,"")+"/":"")+s}}},o=(a(266),a(8)),l=Object(o.a)(r,(function(){var t=this,e=t._self._c;return e("footer",{staticClass:"page-edit"},[t.editLink?e("div",{staticClass:"edit-link"},[e("a",{attrs:{href:t.editLink,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.editLinkText))]),t._v(" "),e("OutboundLink")],1):t._e(),t._v(" "),t.lastUpdated?e("div",{staticClass:"last-updated"},[e("span",{staticClass:"prefix"},[t._v(t._s(t.lastUpdatedText)+":")]),t._v(" "),e("span",{staticClass:"time"},[t._v(t._s(t.lastUpdated))])]):t._e()])}),[],!1,null,null,null);e.default=l.exports},275:function(t,e,a){"use strict";a.r(e);a(92);var n=a(246),s=a(267),i=a.n(s),r=a(253),o=a.n(r),l={name:"PageNav",props:["sidebarItems"],computed:{prev(){return c(u.PREV,this)},next(){return c(u.NEXT,this)}}};const u={NEXT:{resolveLink:function(t,e){return p(t,e,1)},getThemeLinkConfig:({nextLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.next},PREV:{resolveLink:function(t,e){return p(t,e,-1)},getThemeLinkConfig:({prevLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.prev}};function c(t,{$themeConfig:e,$page:a,$route:s,$site:r,sidebarItems:l}){const{resolveLink:u,getThemeLinkConfig:c,getPageLinkConfig:p}=t,d=c(e),h=p(a),f=o()(h)?d:h;return!1===f?void 0:i()(f)?Object(n.k)(r.pages,f,s.path):u(a,l)}function p(t,e,a){const n=[];!function t(e,a){for(let n=0,s=e.length;n({isSidebarOpen:!1}),computed:{shouldShowNavbar(){const{themeConfig:t}=this.$site,{frontmatter:e}=this.$page;return!1!==e.navbar&&!1!==t.navbar&&(this.$title||t.logo||t.repo||t.nav||this.$themeLocaleConfig.nav)},shouldShowSidebar(){const{frontmatter:t}=this.$page;return!t.home&&!1!==t.sidebar&&this.sidebarItems.length},sidebarItems(){return Object(o.l)(this.$page,this.$page.regularPath,this.$site,this.$localePath)},pageClasses(){const t=this.$page.frontmatter.pageClass;return[{"no-navbar":!this.shouldShowNavbar,"sidebar-open":this.isSidebarOpen,"no-sidebar":!this.shouldShowSidebar},t]}},mounted(){this.$router.afterEach(()=>{this.isSidebarOpen=!1})},methods:{toggleSidebar(t){this.isSidebarOpen="boolean"==typeof t?t:!this.isSidebarOpen,this.$emit("toggle-sidebar",this.isSidebarOpen)},onTouchStart(t){this.touchStart={x:t.changedTouches[0].clientX,y:t.changedTouches[0].clientY}},onTouchEnd(t){const e=t.changedTouches[0].clientX-this.touchStart.x,a=t.changedTouches[0].clientY-this.touchStart.y;Math.abs(e)>Math.abs(a)&&Math.abs(e)>40&&(e>0&&this.touchStart.x<=80?this.toggleSidebar(!0):this.toggleSidebar(!1))}}},u=a(8),c=Object(u.a)(l,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"theme-container",class:t.pageClasses,on:{touchstart:t.onTouchStart,touchend:t.onTouchEnd}},[t.shouldShowNavbar?e("Navbar",{on:{"toggle-sidebar":t.toggleSidebar}}):t._e(),t._v(" "),e("div",{staticClass:"sidebar-mask",on:{click:function(e){return t.toggleSidebar(!1)}}}),t._v(" "),e("Sidebar",{attrs:{items:t.sidebarItems},on:{"toggle-sidebar":t.toggleSidebar},scopedSlots:t._u([{key:"top",fn:function(){return[t._t("sidebar-top")]},proxy:!0},{key:"bottom",fn:function(){return[t._t("sidebar-bottom")]},proxy:!0}],null,!0)}),t._v(" "),t.$page.frontmatter.home?e("Home"):e("Page",{attrs:{"sidebar-items":t.sidebarItems},scopedSlots:t._u([{key:"top",fn:function(){return[t._t("page-top")]},proxy:!0},{key:"bottom",fn:function(){return[t._t("page-bottom")]},proxy:!0}],null,!0)})],1)}),[],!1,null,null,null);e.default=c.exports}}]);
\ No newline at end of file
diff --git a/assets/js/20.c0980bf6.js b/assets/js/20.c0980bf6.js
new file mode 100644
index 00000000..e9c41175
--- /dev/null
+++ b/assets/js/20.c0980bf6.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{246:function(t,e,n){"use strict";n.d(e,"d",(function(){return r})),n.d(e,"a",(function(){return a})),n.d(e,"i",(function(){return s})),n.d(e,"f",(function(){return o})),n.d(e,"g",(function(){return c})),n.d(e,"h",(function(){return l})),n.d(e,"b",(function(){return p})),n.d(e,"e",(function(){return f})),n.d(e,"k",(function(){return d})),n.d(e,"l",(function(){return h})),n.d(e,"c",(function(){return g})),n.d(e,"j",(function(){return m}));n(92);const r=/#.*$/,i=/\.(md|html)$/,a=/\/$/,s=/^[a-z]+:/i;function u(t){return decodeURI(t).replace(r,"").replace(i,"")}function o(t){return s.test(t)}function c(t){return/^mailto:/.test(t)}function l(t){return/^tel:/.test(t)}function p(t){if(o(t))return t;const e=t.match(r),n=e?e[0]:"",i=u(t);return a.test(i)?t:i+".html"+n}function f(t,e){const n=decodeURIComponent(t.hash),i=function(t){const e=t.match(r);if(e)return e[0]}(e);if(i&&n!==i)return!1;return u(t.path)===u(e)}function d(t,e,n){if(o(e))return{type:"external",path:e};n&&(e=function(t,e,n){const r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return e+t;const i=e.split("/");n&&i[i.length-1]||i.pop();const a=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,r,i=1){if("string"==typeof e)return d(n,e,r);if(Array.isArray(e))return Object.assign(d(n,e[0],r),{title:e[1]});{const a=e.children||[];return 0===a.length&&e.path?Object.assign(d(n,e.path,r),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:a.map(e=>t(e,n,r,i+1)),collapsable:!1!==e.collapsable}}}(t,i,n)):[]}return[]}function b(t){const e=g(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function g(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function m(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},252:function(t,e,n){},259:function(t,e,n){"use strict";n(252)},262:function(t,e,n){"use strict";n.r(e);var r=n(246);function i(t,e,n,r,i){const a={props:{to:e,activeClass:"",exactActiveClass:""},class:{active:r,"sidebar-link":!0}};return i>2&&(a.style={"padding-left":i+"rem"}),t("RouterLink",a,n)}function a(t,e,n,s,u,o=1){return!e||o>u?null:t("ul",{class:"sidebar-sub-headers"},e.map(e=>{const c=Object(r.e)(s,n+"#"+e.slug);return t("li",{class:"sidebar-sub-header"},[i(t,n+"#"+e.slug,e.title,c,e.level-1),a(t,e.children,n,s,u,o+1)])}))}var s={functional:!0,props:["item","sidebarDepth"],render(t,{parent:{$page:e,$site:n,$route:s,$themeConfig:u,$themeLocaleConfig:o},props:{item:c,sidebarDepth:l}}){const p=Object(r.e)(s,c.path),f="auto"===c.type?p||c.children.some(t=>Object(r.e)(s,c.basePath+"#"+t.slug)):p,d="external"===c.type?function(t,e,n){return t("a",{attrs:{href:e,target:"_blank",rel:"noopener noreferrer"},class:{"sidebar-link":!0}},[n,t("OutboundLink")])}(t,c.path,c.title||c.path):i(t,c.path,c.title||c.path,f),h=[e.frontmatter.sidebarDepth,l,o.sidebarDepth,u.sidebarDepth,1].find(t=>void 0!==t),b=o.displayAllHeaders||u.displayAllHeaders;if("auto"===c.type)return[d,a(t,c.children,c.basePath,s,h)];if((f||b)&&c.headers&&!r.d.test(c.path)){return[d,a(t,Object(r.c)(c.headers),c.path,s,h)]}return d}},u=(n(259),n(8)),o=Object(u.a)(s,void 0,void 0,!1,null,null,null);e.default=o.exports}}]);
\ No newline at end of file
diff --git a/assets/js/21.307fb84e.js b/assets/js/21.307fb84e.js
new file mode 100644
index 00000000..cb597118
--- /dev/null
+++ b/assets/js/21.307fb84e.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{306:function(t,s,a){t.exports=a.p+"assets/img/harbor_ldap_auth_configuration.c095a145.png"},307:function(t,s,a){t.exports=a.p+"assets/img/harbor_standard_user_view.a731b397.png"},308:function(t,s,a){t.exports=a.p+"assets/img/harbor_admin_view.ad001b0d.png"},344:function(t,s,a){"use strict";a.r(s);var e=a(8),r=Object(e.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"initial-harbor-tasks"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#initial-harbor-tasks"}},[t._v("#")]),t._v(" Initial Harbor tasks")]),t._v(" "),s("p",[t._v("YouTube video: "),s("a",{attrs:{href:"https://youtu.be/DcArQEFgk5s",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://youtu.be/DcArQEFgk5s"),s("OutboundLink")],1)]),t._v(" "),s("p",[t._v("Let's do some initial Harbor configuration on second Harbor instance:\n"),s("a",{attrs:{href:"https://harbor.mylabs.dev",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://harbor.mylabs.dev"),s("OutboundLink")],1)]),t._v(" "),s("p",[t._v('If you are using Let\'s Encrypt "staging" you need to download and use their\n"Fake LE Root X1" certificate for curl, helm and k8s cluster:')]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("test")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-d")]),t._v(" tmp "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" tmp\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" tmp\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${LETSENCRYPT_ENVIRONMENT}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"staging"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("then")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-pv")]),t._v(" /etc/docker/certs.d/harbor."),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),t._v("/\n "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("CA_CERT")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),t._v("kubectl get secrets ingress-cert-staging "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-n")]),t._v(" cert-manager "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-o")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("jsonpath")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{.data.ca\\.crt}"')]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${CA_CERT}")]),t._v('"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${CA_CERT}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" base64 "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-d")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" ca.crt\n "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("test")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-s")]),t._v(" ca.crt "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("wget")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-q")]),t._v(" https://letsencrypt.org/certs/fakelerootx1.pem "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-O")]),t._v(" ca.crt\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" ca.crt /etc/docker/certs.d/harbor."),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),t._v("/ca.crt\n "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("SSL_CERT_FILE")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("$PWD")]),t._v("/ca.crt\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token for-or-select variable"}},[t._v("EXTERNAL_IP")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),t._v("kubectl get nodes "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--output")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("jsonpath"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{.items[*].status.addresses[?(@.type=='),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("ExternalIP"),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(')].address}"')]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("do")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ssh")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-q")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-o")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("StrictHostKeyChecking")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("no "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-l")]),t._v(" ec2-user "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${EXTERNAL_IP}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"sudo mkdir -p /etc/docker/certs.d/harbor.'),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),t._v("/ && sudo wget -q https://letsencrypt.org/certs/fakelerootx1.pem -O /etc/docker/certs.d/harbor."),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),t._v('/ca.crt"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("done")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"*** Done"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fi")]),t._v("\n")])])]),s("p",[t._v("Output:")]),t._v(" "),s("div",{staticClass:"language-text extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code")])]),s("h2",{attrs:{id:"ldap-authentication"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#ldap-authentication"}},[t._v("#")]),t._v(" LDAP Authentication")]),t._v(" "),s("p",[t._v("List users which are in Active Directory:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("ldapsearch "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-LLL")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-x")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-h")]),t._v(" winad01."),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-D")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("cn")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("ansible,cn"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("Users,dc"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("mylabs,dc"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("dev "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-w")]),t._v(" ansible_secret_password "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-b")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("cn")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("users,dc"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("mylabs,dc"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("dev "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-s")]),t._v(" sub "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"(cn=aduser*)"')]),t._v(" dn name description memberOf\n")])])]),s("p",[t._v("Output:")]),t._v(" "),s("div",{staticClass:"language-text extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("dn: CN=aduser01,CN=Users,DC=mylabs,DC=dev\ndescription: User 01 - Group 01\nmemberOf: CN=adgroup01,CN=Users,DC=mylabs,DC=dev\nname: aduser01\n\ndn: CN=aduser02,CN=Users,DC=mylabs,DC=dev\ndescription: User 02 - Group 01\nmemberOf: CN=adgroup01,CN=Users,DC=mylabs,DC=dev\nname: aduser02\n\ndn: CN=aduser03,CN=Users,DC=mylabs,DC=dev\ndescription: User 03 - Group 02\nmemberOf: CN=adgroup02,CN=Users,DC=mylabs,DC=dev\nname: aduser03\n\ndn: CN=aduser04,CN=Users,DC=mylabs,DC=dev\ndescription: User 04 - Group 02\nmemberOf: CN=adgroup02,CN=Users,DC=mylabs,DC=dev\nname: aduser04\n\ndn: CN=aduser05,CN=Users,DC=mylabs,DC=dev\ndescription: User 05 - Group 03\nmemberOf: CN=adgroup03,CN=Users,DC=mylabs,DC=dev\nname: aduser05\n\ndn: CN=aduser06,CN=Users,DC=mylabs,DC=dev\ndescription: User 06 - Group 03\nmemberOf: CN=adgroup03,CN=Users,DC=mylabs,DC=dev\nname: aduser06\n")])])]),s("p",[t._v("List groups which are in Active Directory:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("ldapsearch "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-LLL")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-x")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-h")]),t._v(" winad01."),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-D")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("cn")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("ansible,cn"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("Users,dc"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("mylabs,dc"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("dev "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-w")]),t._v(" ansible_secret_password "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-b")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("cn")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("users,dc"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("mylabs,dc"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("dev "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-s")]),t._v(" sub "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"(cn=adgroup*)"')]),t._v(" dn name description member\n")])])]),s("p",[t._v("Output:")]),t._v(" "),s("div",{staticClass:"language-text extra-class"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br")]),s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("dn: CN=adgroup01,CN=Users,DC=mylabs,DC=dev\ndescription: AD User Group 01\nmember: CN=aduser02,CN=Users,DC=mylabs,DC=dev\nmember: CN=aduser01,CN=Users,DC=mylabs,DC=dev\nname: adgroup01\n\ndn: CN=adgroup02,CN=Users,DC=mylabs,DC=dev\ndescription: AD User Group 02\nmember: CN=aduser04,CN=Users,DC=mylabs,DC=dev\nmember: CN=aduser03,CN=Users,DC=mylabs,DC=dev\nname: adgroup02\n\ndn: CN=adgroup03,CN=Users,DC=mylabs,DC=dev\ndescription: AD User Group 03\nmember: CN=aduser06,CN=Users,DC=mylabs,DC=dev\nmember: CN=aduser05,CN=Users,DC=mylabs,DC=dev\nname: adgroup03\n")])])]),s("p",[t._v("Configure LDAP/Active Directory authentication in Harbor by going to\n"),s("code",[t._v("Administration")]),t._v(" -> "),s("code",[t._v("Configuration")]),t._v(" -> "),s("code",[t._v("Authentication")]),t._v(":")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("Auth Mode: LDAP")])]),t._v(" "),s("li",[s("code",[t._v("LDAP URL: ldap://winad01.mylabs.dev")])]),t._v(" "),s("li",[s("code",[t._v("LDAP Search DN: cn=ansible,cn=Users,dc=mylabs,dc=dev")])]),t._v(" "),s("li",[s("code",[t._v("LDAP Search Password: ansible_secret_password")])]),t._v(" "),s("li",[s("code",[t._v("LDAP Base DN: cn=users,dc=mylabs,dc=dev")])]),t._v(" "),s("li",[s("code",[t._v("LDAP UID: sAMAccountName")])]),t._v(" "),s("li",[s("code",[t._v("LDAP Scope: OneLevel")])]),t._v(" "),s("li",[s("code",[t._v("LDAP Group Base DN: cn=users,dc=mylabs,dc=dev")])]),t._v(" "),s("li",[s("code",[t._v("LDAP Group GID: sAMAccountName")])]),t._v(" "),s("li",[s("code",[t._v("LDAP Group Admin DN: cn=adgroup03,cn=users,dc=mylabs,dc=dev")])]),t._v(" "),s("li",[s("code",[t._v("LDAP Group Scope: OneLevel")])])]),t._v(" "),s("p",[t._v("It's possible to use API call as well:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-u")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"admin:admin"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-X")]),t._v(" PUT "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://harbor.'),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),t._v('/api/configurations"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-H")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Content-Type: application/json"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-d")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{\n '),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("auth_mode"),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": "),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("ldap_auth"),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("ldap_base_dn"),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": "),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("cn=users,dc=mylabs,dc=dev"),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("ldap_filter"),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": "),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("(objectClass=organizationalPerson)"),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("ldap_group_admin_dn"),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": "),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("cn=adgroup03,cn=users,dc=mylabs,dc=dev"),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("ldap_group_attribute_name"),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": "),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("sAMAccountName"),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("ldap_group_base_dn"),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": "),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("cn=users,dc=mylabs,dc=dev"),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("ldap_group_search_filter"),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": "),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("(objectClass=group)"),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("ldap_group_search_scope"),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": 1,\n "),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("ldap_scope"),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": 1,\n "),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("ldap_search_dn"),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": "),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("cn=ansible,cn=Users,dc=mylabs,dc=dev"),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("ldap_search_password"),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": "),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("ansible_secret_password"),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("ldap_uid"),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": "),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("sAMAccountName"),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("ldap_url"),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": "),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("ldap://winad01."),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("token_expiration"),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(': 300\n}"')]),t._v("\n")])])]),s("p",[s("img",{attrs:{src:a(306),alt:"Harbor Authentication Configuration page",title:"Harbor Authentication Configuration page"}})]),t._v(" "),s("p",[t._v("Open a new tab with Harbor login page\n("),s("a",{attrs:{href:"https://harbor.mylabs.dev",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://harbor.mylabs.dev"),s("OutboundLink")],1),t._v(") and login as:")]),t._v(" "),s("ul",[s("li",[t._v("User: "),s("code",[t._v("aduser01")])]),t._v(" "),s("li",[t._v("Password: "),s("code",[t._v("admin")])])]),t._v(" "),s("p",[t._v("You should see limited view on the right side containing only "),s("code",[t._v("Projects")]),t._v("\nand "),s("code",[t._v("Logs")]),t._v(":")]),t._v(" "),s("p",[s("img",{attrs:{src:a(307),alt:"Harbor - Standard user view",title:"Harbor - Standard user view"}})]),t._v(" "),s("p",[t._v("Open a new tab with Harbor login page\n("),s("a",{attrs:{href:"https://harbor.mylabs.dev",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://harbor.mylabs.dev"),s("OutboundLink")],1),t._v(") and login as:")]),t._v(" "),s("ul",[s("li",[t._v("User: "),s("code",[t._v("aduser06")]),t._v(" and "),s("code",[t._v("aduser05")])]),t._v(" "),s("li",[t._v("Password: "),s("code",[t._v("admin")])])]),t._v(" "),s("p",[t._v("This user belongs to group "),s("code",[t._v("adgroup03")]),t._v(" which is group containing Harbor\nAdministrators. You should be able to see much more details in Harbor now\nand also Users table has some details:")]),t._v(" "),s("p",[s("img",{attrs:{src:a(308),alt:"Harbor - Admin view",title:"Harbor - Admin view"}})])])}),[],!1,null,null,null);s.default=r.exports}}]);
\ No newline at end of file
diff --git a/assets/js/22.66b4b5c7.js b/assets/js/22.66b4b5c7.js
new file mode 100644
index 00000000..16698304
--- /dev/null
+++ b/assets/js/22.66b4b5c7.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{309:function(a,t,e){a.exports=e.p+"assets/img/harbor_project_helm_charts.a0eaa6b9.png"},310:function(a,t,e){a.exports=e.p+"assets/img/harbor_upload_chart_files.0353006a.png"},311:function(a,t,e){a.exports=e.p+"assets/img/gitea_screenshot.3ab2ff11.png"},345:function(a,t,e){"use strict";e.r(t);var s=e(8),r=Object(s.a)({},(function(){var a=this,t=a._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[t("h1",{attrs:{id:"harbor-and-helm-charts"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#harbor-and-helm-charts"}},[a._v("#")]),a._v(" Harbor and Helm charts")]),a._v(" "),t("p",[a._v("YouTube video: "),t("a",{attrs:{href:"https://youtu.be/XSszSd-TTCQ",target:"_blank",rel:"noopener noreferrer"}},[a._v("https://youtu.be/XSszSd-TTCQ"),t("OutboundLink")],1)]),a._v(" "),t("h2",{attrs:{id:"add-project"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#add-project"}},[a._v("#")]),a._v(" Add Project")]),a._v(" "),t("ul",[t("li",[a._v("Go to "),t("code",[a._v("Projects")]),a._v(", click on "),t("code",[a._v("NEW PROJECT")]),a._v(' and create "private"\n'),t("code",[a._v("my_project")]),a._v(" project.")])]),a._v(" "),t("p",[a._v("You can also use the API directly:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("div",{staticClass:"highlight-lines"},[t("br"),t("br"),t("div",{staticClass:"highlighted"},[a._v(" ")]),t("br"),t("br"),t("br")]),t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-u")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"admin:admin"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-X")]),a._v(" POST "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-H")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Content-Type: application/json"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"https://harbor.'),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v('/api/projects"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-d")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"{\n '),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v("project_name"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v(": "),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v("my_project"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v(",\n "),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v("public"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v(': 0\n}"')]),a._v("\n")])])]),t("p",[a._v("Create namespace which will be used later:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubectl create namespace mytest\n")])])]),t("h2",{attrs:{id:"upload-helm-chart-using-cli"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#upload-helm-chart-using-cli"}},[a._v("#")]),a._v(" Upload Helm Chart using CLI")]),a._v(" "),t("p",[a._v("Clone "),t("code",[a._v("harbor-helm")]),a._v(" repository containing Helm chart of Harbor:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("git")]),a._v(" clone https://github.com/goharbor/harbor-helm.git\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("git")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-C")]),a._v(" harbor-helm checkout v1.1.1\n")])])]),t("p",[a._v("See the Helm chart content:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("ls")]),a._v(" ./harbor-helm/\n")])])]),t("p",[a._v("Output:")]),a._v(" "),t("div",{staticClass:"language-text extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[a._v("cert Chart.yaml CONTRIBUTING.md docs LICENSE README.md templates values.yaml\n")])])]),t("p",[a._v('Add the public "library" Helm Chart repository:')]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("helm repo "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("add")]),a._v(" library https://harbor."),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("/chartrepo/library\n")])])]),t("p",[a._v("Output:")]),a._v(" "),t("div",{staticClass:"language-text extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[a._v('"library" has been added to your repositories\n')])])]),t("p",[a._v("Push the "),t("code",[a._v("harbor-helm")]),a._v(" to the "),t("code",[a._v("library")]),a._v(' project in Harbor":')]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("helm push "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--username")]),a._v(" aduser05 "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--password")]),a._v(" admin ./harbor-helm/ library\n")])])]),t("p",[a._v("Output:")]),a._v(" "),t("div",{staticClass:"language-text extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[a._v("Pushing harbor-1.1.1.tgz to library...\nDone.\n")])])]),t("p",[a._v("Check the Helm Repository list:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("helm repo list\n")])])]),t("p",[a._v("Output:")]),a._v(" "),t("div",{staticClass:"language-text extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[a._v("NAME URL\nstable https://kubernetes-charts.storage.googleapis.com\nlocal http://127.0.0.1:8879/charts\njetstack https://charts.jetstack.io\nappscode https://charts.appscode.com/stable/\nharbor https://helm.goharbor.io\nlibrary https://harbor.mylabs.dev/chartrepo/library\n")])])]),t("p",[a._v("Check the content of the "),t("code",[a._v("library")]),a._v(" repository:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("helm repo update\nhelm search "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-l")]),a._v(" library/\n")])])]),t("p",[a._v("Output:")]),a._v(" "),t("div",{staticClass:"language-text extra-class"},[t("div",{staticClass:"highlight-lines"},[t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("div",{staticClass:"highlighted"},[a._v(" ")]),t("br")]),t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[a._v('Hang tight while we grab the latest from your chart repositories...\n...Skip local chart repository\n...Successfully got an update from the "harbor" chart repository\n...Successfully got an update from the "appscode" chart repository\n...Successfully got an update from the "library" chart repository\n...Successfully got an update from the "jetstack" chart repository\n...Successfully got an update from the "stable" chart repository\nUpdate Complete.\nNAME CHART VERSION APP VERSION DESCRIPTION\nlibrary/harbor 1.1.1 1.8.1 An open source trusted cloud native registry that stores,...\n')])])]),t("p",[a._v("Harbor Project Helm Charts:")]),a._v(" "),t("p",[t("img",{attrs:{src:e(309),alt:"Harbor Project Helm Charts",title:"Harbor Project Helm Charts"}})]),a._v(" "),t("h2",{attrs:{id:"upload-signed-helm-chart-using-cli"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#upload-signed-helm-chart-using-cli"}},[a._v("#")]),a._v(" Upload signed Helm Chart using CLI")]),a._v(" "),t("p",[a._v("Create GPG key in "),t("code",[a._v(".gnupg")]),a._v(" directory:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("div",{staticClass:"highlight-lines"},[t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("div",{staticClass:"highlighted"},[a._v(" ")]),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br")]),t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("GNUPGHOME")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("$PWD")]),a._v("/.gnupg\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("mkdir")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${GNUPGHOME}")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("chmod")]),a._v(" 0700 "),t("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("$PWD")]),a._v("/.gnupg\n\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("cat")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${GNUPGHOME}")]),a._v("/my_gpg_key "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("<<")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v("EOF\n%echo Generating a basic OpenPGP key\nKey-Type: RSA\nKey-Length: 2048\nSubkey-Type: RSA\nSubkey-Length: 2048\nName-Real: Helm User\nName-Comment: User\nName-Email: my_helm_user@"),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("\nExpire-Date: 0\n%no-protection\n%commit\nEOF")]),a._v("\n\ngpg2 "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--verbose")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--batch")]),a._v(" --gen-key "),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${GNUPGHOME}")]),a._v("/my_gpg_key\n")])])]),t("p",[a._v("Output:")]),a._v(" "),t("div",{staticClass:"language-text extra-class"},[t("div",{staticClass:"highlight-lines"},[t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("div",{staticClass:"highlighted"},[a._v(" ")]),t("br"),t("br")]),t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[a._v("gpg: keybox '/home/pruzicka/git/k8s-harbor/tmp/.gnupg/pubring.kbx' created\ngpg: Generating a basic OpenPGP key\ngpg: no running gpg-agent - starting '/usr/bin/gpg-agent'\ngpg: waiting for the agent to come up ... (5s)\ngpg: connection to agent established\ngpg: writing self signature\ngpg: RSA/SHA256 signature from: \"6733D8DA847797FE [?]\"\ngpg: writing key binding signature\ngpg: RSA/SHA256 signature from: \"6733D8DA847797FE [?]\"\ngpg: RSA/SHA256 signature from: \"C8B680F790B62239 [?]\"\ngpg: writing public key to '/home/pruzicka/git/k8s-harbor/tmp/.gnupg/pubring.kbx'\ngpg: /home/pruzicka/git/k8s-harbor/tmp/.gnupg/trustdb.gpg: trustdb created\ngpg: using pgp trust model\ngpg: key 6733D8DA847797FE marked as ultimately trusted\ngpg: directory '/home/pruzicka/git/k8s-harbor/tmp/.gnupg/openpgp-revocs.d' created\ngpg: writing to '/home/pruzicka/git/k8s-harbor/tmp/.gnupg/openpgp-revocs.d/4DA54853FC984FF42EDD2C9B6733D8DA847797FE.rev'\ngpg: RSA/SHA256 signature from: \"6733D8DA847797FE Helm User (User) <my_helm_user@mylabs.dev>\"\ngpg: revocation certificate stored as '/home/pruzicka/git/k8s-harbor/tmp/.gnupg/openpgp-revocs.d/4DA54853FC984FF42EDD2C9B6733D8DA847797FE.rev'\n")])])]),t("p",[a._v("List the GPG secret key:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("gpg2 --list-secret-keys\n")])])]),t("p",[a._v("Output:")]),a._v(" "),t("div",{staticClass:"language-text extra-class"},[t("div",{staticClass:"highlight-lines"},[t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("div",{staticClass:"highlighted"},[a._v(" ")]),t("br"),t("br")]),t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[a._v("gpg: checking the trustdb\ngpg: marginals needed: 3 completes needed: 1 trust model: pgp\ngpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u\n/home/pruzicka/git/k8s-harbor/tmp/.gnupg/pubring.kbx\n----------------------------------------------------\nsec rsa2048 2019-07-19 [SCEA]\n 4DA54853FC984FF42EDD2C9B6733D8DA847797FE\nuid [ultimate] Helm User (User) <my_helm_user@mylabs.dev>\nssb rsa2048 2019-07-19 [SEA]\n")])])]),t("p",[a._v("Export private GPG key into "),t("code",[a._v(".gnupg/secring.gpg")]),a._v(", because Helm doesn't\nsupport GnuPG 2.1:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("gpg2 --export-secret-keys "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${GNUPGHOME}")]),a._v("/secring.gpg\n")])])]),t("p",[a._v("Output:")]),a._v(" "),t("div",{staticClass:"language-text extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[a._v("gpg: starting migration from earlier GnuPG versions\ngpg: porting secret keys from '/home/pruzicka/git/k8s-harbor/tmp/.gnupg/secring.gpg' to gpg-agent\ngpg: migration succeeded\n")])])]),t("p",[a._v("Download and unpack Gitea Helm chart:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("git")]),a._v(" clone "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--quiet")]),a._v(" https://github.com/jfelten/gitea-helm-chart gitea\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("git")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-C")]),a._v(" ./gitea/ checkout "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--quiet")]),a._v(" 8c9adad\n")])])]),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("ls")]),a._v(" ./gitea/\n")])])]),t("p",[a._v("Output:")]),a._v(" "),t("div",{staticClass:"language-text extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[a._v("Chart.yaml LICENSE postgres-values.yaml README.md templates values.yaml\n")])])]),t("p",[a._v("Create signed Helm package:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("helm package "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--sign")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--key")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"my_helm_user@'),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v('"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--keyring")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${GNUPGHOME}")]),a._v("/secring.gpg "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--destination")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v(".")]),a._v(" ./gitea/\n")])])]),t("p",[a._v("Output:")]),a._v(" "),t("div",{staticClass:"language-text extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[a._v("Successfully packaged chart and saved it to: /home/pruzicka/git/k8s-harbor/tmp/gitea-1.6.1.tgz\n")])])]),t("p",[a._v("There should be 2 files in current directory - the archive with the Helm Chart\nand "),t("strong",[a._v("provenance")]),a._v(" file:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("ls")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-la")]),a._v(" gitea*tgz*\n")])])]),t("p",[a._v("Output:")]),a._v(" "),t("div",{staticClass:"language-text extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[a._v("-rw-rw-r-- 1 pruzicka pruzicka 20391 Jul 19 12:27 gitea-1.6.1.tgz\n-rwxr-xr-x 1 pruzicka pruzicka 966 Jul 19 12:27 gitea-1.6.1.tgz.prov\n")])])]),t("p",[a._v("See the provenance file:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("cat")]),a._v(" gitea-1.6.1.tgz.prov "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v("\n")])])]),t("p",[a._v("Output:")]),a._v(" "),t("div",{staticClass:"language-text extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[a._v("-----BEGIN PGP SIGNED MESSAGE-----\nHash: SHA512\n\nappVersion: 1.6.1\ndescription: Git with a cup of tea\nicon: https://docs.gitea.io/images/gitea.png\nkeywords:\n- - git\n- - issue tracker\n- - code review\n- - wiki\n- - gitea\n- - gogs\nmaintainers:\n- - email: john.felten@gmail.com\n name: John Felten\nname: gitea\nsources:\n- - https://github.com/go-gitea/gitea\n- - https://hub.docker.com/r/gitea/gitea/\nversion: 1.6.1\n\n...\nfiles:\n gitea-1.6.1.tgz: sha256:f2e1989577cea950226abe714103709dca8574d82b7a0035b32e97f8d956bcae\n-----BEGIN PGP SIGNATURE-----\n...\n-----END PGP SIGNATURE-----\n")])])]),t("p",[a._v("Upload the signed Helm package to Harbor public project "),t("code",[a._v("library")]),a._v(":")]),a._v(" "),t("p",[a._v("Upload manually Gitea Helm Chart to Harbor by clicking on:")]),a._v(" "),t("p",[a._v("Projects -> library -> Helm Chart -> UPLOAD\n-> "),t("code",[a._v("gitea-1.6.1.tgz")]),a._v(" + "),t("code",[a._v("gitea-1.6.1.tgz.prov")])]),a._v(" "),t("p",[t("img",{attrs:{src:e(310),alt:"Harbor Upload Chart Files",title:"Harbor Upload Chart Files"}})]),a._v(" "),t("p",[a._v("You can also do the same using the Harbor API:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-s")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-u")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"aduser06:admin"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-X")]),a._v(" POST "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"https://harbor.'),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v('/api/chartrepo/library/charts"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-H")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Content-Type: multipart/form-data"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-F")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"chart=@gitea-1.6.1.tgz;type=application/x-compressed-tar"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-F")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"prov=@gitea-1.6.1.tgz.prov"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" jq "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"."')]),a._v("\n")])])]),t("p",[a._v("Output:")]),a._v(" "),t("div",{staticClass:"language-json extra-class"},[t("pre",{pre:!0,attrs:{class:"language-json"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[a._v('"saved"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token boolean"}},[a._v("true")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),t("h2",{attrs:{id:"use-harbor-helm-chart-repository"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#use-harbor-helm-chart-repository"}},[a._v("#")]),a._v(" Use Harbor Helm Chart repository")]),a._v(" "),t("p",[t("img",{attrs:{src:"https://raw.githubusercontent.com/helm/chartmuseum/0cfa25360682f66069d595fb0ede0fcc69bad41f/logo.png",alt:"ChartMuseum logo",title:"ChartMuseum logo"}})]),a._v(" "),t("p",[a._v("Install Gitea using Helm Chart stored in Harbor:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("helm repo list "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("grep")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-q")]),a._v(" library "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("||")]),a._v(" helm repo "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("add")]),a._v(" library https://harbor."),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("/chartrepo/library\nhelm repo update\nhelm "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--wait")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--name")]),a._v(" gitea "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--namespace")]),a._v(" gitea-system library/gitea "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("ingress.enabled")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("true "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" ingress.tls"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v(".secretName"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("ingress-cert-"),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${LETSENCRYPT_ENVIRONMENT}")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" ingress.tls"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v(".hosts"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("gitea."),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("service.http.externalHost")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("gitea."),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("config.disableInstaller")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("true\n")])])]),t("p",[a._v("Output:")]),a._v(" "),t("div",{staticClass:"language-text extra-class"},[t("div",{staticClass:"highlight-lines"},[t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("div",{staticClass:"highlighted"},[a._v(" ")]),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br"),t("br")]),t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[a._v('Hang tight while we grab the latest from your chart repositories...\n...Skip local chart repository\n...Successfully got an update from the "appscode" chart repository\n...Successfully got an update from the "library" chart repository\n...Successfully got an update from the "harbor" chart repository\n...Successfully got an update from the "jetstack" chart repository\n...Successfully got an update from the "stable" chart repository\nUpdate Complete.\nNAME: gitea\nLAST DEPLOYED: Fri Jul 19 12:34:25 2019\nNAMESPACE: gitea-system\nSTATUS: DEPLOYED\n\nRESOURCES:\n==> v1/ConfigMap\nNAME DATA AGE\ngitea-gitea 1 2s\n\n==> v1/Pod(related)\nNAME READY STATUS RESTARTS AGE\ngitea-gitea-5fff4b9c-4k4xq 0/3 Init:0/1 0 2s\n\n==> v1/Secret\nNAME TYPE DATA AGE\ngitea-db Opaque 1 2s\n\n==> v1/Service\nNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\ngitea-gitea-http ClusterIP 10.100.121.156 <none> 3000/TCP 2s\ngitea-gitea-ssh ClusterIP 10.100.181.96 <none> 22/TCP 2s\n\n==> v1beta1/Deployment\nNAME READY UP-TO-DATE AVAILABLE AGE\ngitea-gitea 0/1 1 0 2s\n\n==> v1beta1/Ingress\nNAME HOSTS ADDRESS PORTS AGE\ngitea-giteaingress gitea.mylabs.dev 80, 443 2s\n\n\nNOTES:\n1. Connect to your Gitea web URL by running:\n\n\n Ingress is enabled for this chart deployment. Please access the web UI at gitea.mylabs.dev\n\n2. Connect to your Gitea ssh port:\n\n export POD_NAME=$(kubectl get pods --namespace gitea-system -l "app=gitea-gitea" -o jsonpath="{.items[0].metadata.name}")\n echo http://127.0.0.1:8080/\n kubectl port-forward $POD_NAME 8022:22\n')])])]),t("p",[a._v("If you open the "),t("a",{attrs:{href:"https://gitea.mylabs.dev",target:"_blank",rel:"noopener noreferrer"}},[a._v("https://gitea.mylabs.dev"),t("OutboundLink")],1),a._v(" you should\nsee the initial Gitea page:")]),a._v(" "),t("p",[t("img",{attrs:{src:e(311),alt:"Gitea main page",title:"Gitea main page"}})])])}),[],!1,null,null,null);t.default=r.exports}}]);
\ No newline at end of file
diff --git a/assets/js/23.e984e1a2.js b/assets/js/23.e984e1a2.js
new file mode 100644
index 00000000..2801a6fe
--- /dev/null
+++ b/assets/js/23.e984e1a2.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{247:function(t,e,n){},249:function(t,e,n){"use strict";n.r(e);var s={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},i=(n(250),n(8)),o=Object(i.a)(s,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=o.exports},250:function(t,e,n){"use strict";n(247)}}]);
\ No newline at end of file
diff --git a/assets/js/24.db412079.js b/assets/js/24.db412079.js
new file mode 100644
index 00000000..9c479ca9
--- /dev/null
+++ b/assets/js/24.db412079.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{265:function(t,c,n){},277:function(t,c,n){"use strict";n(265)},290:function(t,c,n){"use strict";n.r(c);n(277);var i=n(8),s=Object(i.a)({},(function(){var t=this,c=t._self._c;return c("div",{staticClass:"sidebar-button",on:{click:function(c){return t.$emit("toggle-sidebar")}}},[c("svg",{staticClass:"icon",attrs:{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",role:"img",viewBox:"0 0 448 512"}},[c("path",{attrs:{fill:"currentColor",d:"M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"}})])])}),[],!1,null,null,null);c.default=s.exports}}]);
\ No newline at end of file
diff --git a/assets/js/25.f7323b51.js b/assets/js/25.f7323b51.js
new file mode 100644
index 00000000..64c3397a
--- /dev/null
+++ b/assets/js/25.f7323b51.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[25],{304:function(r,a,s){r.exports=s.p+"assets/img/harbor_login_page.703b5e90.png"},305:function(r,a,s){r.exports=s.p+"assets/img/harbor_projects.338db00b.png"},343:function(r,a,s){"use strict";s.r(a);var e=s(8),t=Object(e.a)({},(function(){var r=this,a=r._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":r.$parent.slotKey}},[a("h1",{attrs:{id:"install-harbor"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#install-harbor"}},[r._v("#")]),r._v(" Install Harbor")]),r._v(" "),a("p",[a("img",{attrs:{src:"https://raw.githubusercontent.com/cncf/artwork/c33a8386bce4eabc36e1d4972e0996db4630037b/projects/harbor/horizontal/color/harbor-horizontal-color.svg?sanitize=true",alt:"Harbor logo",title:"Harbor logo"}})]),r._v(" "),a("h2",{attrs:{id:"install-harbor-using-helm"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#install-harbor-using-helm"}},[r._v("#")]),r._v(" Install Harbor using Helm")]),r._v(" "),a("p",[r._v("Lab architecture:")]),r._v(" "),a("p",[a("img",{attrs:{src:"https://raw.githubusercontent.com/ruzickap/k8s-harbor-presentation/master/images/harbor_demo_architecture_diagram.svg?sanitize=true",alt:"Lab architecture",title:"Lab architecture"}})]),r._v(" "),a("p",[r._v("Label Harbor namespace and copy there the secret with certificates signed by\nLet's Encrypt certificate:")]),r._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[r._v("kubectl get namespace harbor-system "),a("span",{pre:!0,attrs:{class:"token operator"}},[r._v("&>")]),r._v(" /dev/null "),a("span",{pre:!0,attrs:{class:"token operator"}},[r._v("||")]),r._v(" kubectl create namespace harbor-system\nkubectl label namespace "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[r._v("--overwrite")]),r._v(" harbor-system "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[r._v("app")]),a("span",{pre:!0,attrs:{class:"token operator"}},[r._v("=")]),r._v("kubed\n")])])]),a("p",[r._v("Output:")]),r._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[r._v("namespace/harbor-system labeled\n")])])]),a("p",[r._v("Check if the certificate generated by cert-manager in "),a("code",[r._v("cert-manager")]),r._v(" namespace\nwas successfully copied to "),a("code",[r._v("harbor-system")]),r._v(" namespace:")]),r._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[r._v("kubectl get secrets ingress-cert-"),a("span",{pre:!0,attrs:{class:"token variable"}},[r._v("${LETSENCRYPT_ENVIRONMENT}")]),r._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[r._v("-n")]),r._v(" harbor-system "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[r._v("-o")]),r._v(" json "),a("span",{pre:!0,attrs:{class:"token operator"}},[r._v("|")]),r._v(" jq "),a("span",{pre:!0,attrs:{class:"token string"}},[r._v('".metadata | .annotations, .labels"')]),r._v("\n")])])]),a("p",[r._v("Output:")]),r._v(" "),a("div",{staticClass:"language-json extra-class"},[a("div",{staticClass:"highlight-lines"},[a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("div",{staticClass:"highlighted"},[r._v(" ")]),a("br"),a("br")]),a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[r._v("{")]),r._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[r._v('"certmanager.k8s.io/alt-names"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[r._v(":")]),r._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[r._v('"*.mylabs.dev"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[r._v(",")]),r._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[r._v('"certmanager.k8s.io/common-name"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[r._v(":")]),r._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[r._v('"*.mylabs.dev"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[r._v(",")]),r._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[r._v('"certmanager.k8s.io/ip-sans"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[r._v(":")]),r._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[r._v('""')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[r._v(",")]),r._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[r._v('"certmanager.k8s.io/issuer-kind"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[r._v(":")]),r._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[r._v('"ClusterIssuer"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[r._v(",")]),r._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[r._v('"certmanager.k8s.io/issuer-name"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[r._v(":")]),r._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[r._v('"letsencrypt-production-dns"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[r._v(",")]),r._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[r._v('"kubed.appscode.com/origin"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[r._v(":")]),r._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[r._v('"{\\"namespace\\":\\"cert-manager\\",\\"name\\":\\"ingress-cert-production\\",\\"uid\\":\\"51b889ad-aa0a-11e9-8d10-06a66d4e34ba\\",\\"resourceVersion\\":\\"2916\\"}"')]),r._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[r._v("}")]),r._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[r._v("{")]),r._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[r._v('"certmanager.k8s.io/certificate-name"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[r._v(":")]),r._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[r._v('"ingress-cert-production"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[r._v(",")]),r._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[r._v('"kubed.appscode.com/origin.cluster"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[r._v(":")]),r._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[r._v('"my_k8s_cluster"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[r._v(",")]),r._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[r._v('"kubed.appscode.com/origin.name"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[r._v(":")]),r._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[r._v('"ingress-cert-production"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[r._v(",")]),r._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[r._v('"kubed.appscode.com/origin.namespace"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[r._v(":")]),r._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[r._v('"cert-manager"')]),r._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[r._v("}")]),r._v("\n")])])]),a("p",[r._v("Add Harbor Helm repository:")]),r._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[r._v("helm repo "),a("span",{pre:!0,attrs:{class:"token function"}},[r._v("add")]),r._v(" harbor https://helm.goharbor.io\n")])])]),a("p",[r._v("Output:")]),r._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[r._v('"harbor" has been added to your repositories\n')])])]),a("p",[r._v("Install Harbor using Helm:")]),r._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[r._v("helm "),a("span",{pre:!0,attrs:{class:"token function"}},[r._v("ls")]),r._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[r._v("|")]),r._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[r._v("grep")]),r._v(" harbor "),a("span",{pre:!0,attrs:{class:"token operator"}},[r._v("||")]),r._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[r._v("\\")]),r._v("\nhelm "),a("span",{pre:!0,attrs:{class:"token function"}},[r._v("install")]),r._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[r._v("--wait")]),r._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[r._v("--name")]),r._v(" harbor "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[r._v("--namespace")]),r._v(" harbor-system harbor/harbor "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[r._v("--version")]),r._v(" v1.2.1 "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[r._v("\\")]),r._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[r._v("--set")]),r._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[r._v("expose.ingress.hosts.core")]),a("span",{pre:!0,attrs:{class:"token operator"}},[r._v("=")]),r._v("harbor."),a("span",{pre:!0,attrs:{class:"token variable"}},[r._v("${MY_DOMAIN}")]),r._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[r._v("\\")]),r._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[r._v("--set")]),r._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[r._v("expose.ingress.hosts.notary")]),a("span",{pre:!0,attrs:{class:"token operator"}},[r._v("=")]),r._v("notary."),a("span",{pre:!0,attrs:{class:"token variable"}},[r._v("${MY_DOMAIN}")]),r._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[r._v("\\")]),r._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[r._v("--set")]),r._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[r._v("expose.tls.secretName")]),a("span",{pre:!0,attrs:{class:"token operator"}},[r._v("=")]),r._v("ingress-cert-"),a("span",{pre:!0,attrs:{class:"token variable"}},[r._v("${LETSENCRYPT_ENVIRONMENT}")]),r._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[r._v("\\")]),r._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[r._v("--set")]),r._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[r._v("persistence.enabled")]),a("span",{pre:!0,attrs:{class:"token operator"}},[r._v("=")]),r._v("false "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[r._v("\\")]),r._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[r._v("--set")]),r._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[r._v("externalURL")]),a("span",{pre:!0,attrs:{class:"token operator"}},[r._v("=")]),r._v("https://harbor."),a("span",{pre:!0,attrs:{class:"token variable"}},[r._v("${MY_DOMAIN}")]),r._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[r._v("\\")]),r._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[r._v("--set")]),r._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[r._v("harborAdminPassword")]),a("span",{pre:!0,attrs:{class:"token operator"}},[r._v("=")]),r._v("admin\n")])])]),a("p",[r._v("Output:")]),r._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[r._v("NAME: harbor\nLAST DEPLOYED: Fri Jul 19 11:49:59 2019\nNAMESPACE: harbor-system\nSTATUS: DEPLOYED\n\nRESOURCES:\n==> v1/ConfigMap\nNAME DATA AGE\nharbor-harbor-chartmuseum 23 65s\nharbor-harbor-clair 1 65s\nharbor-harbor-core 34 65s\nharbor-harbor-jobservice 1 65s\nharbor-harbor-notary-server 5 65s\nharbor-harbor-registry 2 65s\n\n==> v1/Deployment\nNAME READY UP-TO-DATE AVAILABLE AGE\nharbor-harbor-chartmuseum 1/1 1 1 65s\nharbor-harbor-clair 1/1 1 1 65s\nharbor-harbor-core 1/1 1 1 65s\nharbor-harbor-jobservice 1/1 1 1 65s\nharbor-harbor-notary-server 1/1 1 1 65s\nharbor-harbor-notary-signer 1/1 1 1 65s\nharbor-harbor-portal 1/1 1 1 65s\nharbor-harbor-registry 1/1 1 1 65s\n\n==> v1/Pod(related)\nNAME READY STATUS RESTARTS AGE\nharbor-harbor-chartmuseum-8647f45994-8nvd7 1/1 Running 0 65s\nharbor-harbor-clair-55c56ccf4-kjc67 1/1 Running 2 65s\nharbor-harbor-core-8554f8c5cd-n5dks 1/1 Running 0 65s\nharbor-harbor-database-0 1/1 Running 0 64s\nharbor-harbor-jobservice-5989b8c6c4-nwxns 1/1 Running 0 65s\nharbor-harbor-notary-server-694d84d7-vwgdm 1/1 Running 0 65s\nharbor-harbor-notary-signer-749cbf5948-b7b6g 1/1 Running 0 65s\nharbor-harbor-portal-64899d584-gtr4x 1/1 Running 0 64s\nharbor-harbor-redis-0 1/1 Running 0 64s\nharbor-harbor-registry-69bb76d7-8pcf9 2/2 Running 0 64s\n\n==> v1/Secret\nNAME TYPE DATA AGE\nharbor-harbor-chartmuseum Opaque 1 65s\nharbor-harbor-core Opaque 7 65s\nharbor-harbor-database Opaque 1 65s\nharbor-harbor-jobservice Opaque 1 65s\nharbor-harbor-registry Opaque 2 65s\n\n==> v1/Service\nNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\nharbor-harbor-chartmuseum ClusterIP 10.100.188.79 <none> 80/TCP 65s\nharbor-harbor-clair ClusterIP 10.100.157.91 <none> 6060/TCP,6061/TCP 65s\nharbor-harbor-core ClusterIP 10.100.95.26 <none> 80/TCP 65s\nharbor-harbor-database ClusterIP 10.100.126.163 <none> 5432/TCP 65s\nharbor-harbor-jobservice ClusterIP 10.100.210.198 <none> 80/TCP 65s\nharbor-harbor-notary-server ClusterIP 10.100.249.4 <none> 4443/TCP 65s\nharbor-harbor-notary-signer ClusterIP 10.100.192.142 <none> 7899/TCP 65s\nharbor-harbor-portal ClusterIP 10.100.154.171 <none> 80/TCP 65s\nharbor-harbor-redis ClusterIP 10.100.156.84 <none> 6379/TCP 65s\nharbor-harbor-registry ClusterIP 10.100.27.218 <none> 5000/TCP,8080/TCP 65s\n\n==> v1/StatefulSet\nNAME READY AGE\nharbor-harbor-database 1/1 65s\nharbor-harbor-redis 1/1 64s\n\n==> v1beta1/Ingress\nNAME HOSTS ADDRESS PORTS AGE\nharbor-harbor-ingress harbor.mylabs.dev,notary.mylabs.dev 54.93.96.15 80, 443 64s\n\n\nNOTES:\nPlease wait for several minutes for Harbor deployment to complete.\nThen you should be able to visit the Harbor portal at https://harbor.mylabs.dev.\nFor more details, please visit https://github.com/goharbor/harbor.\n")])])]),a("p",[r._v("Harbor architecture:")]),r._v(" "),a("p",[a("img",{attrs:{src:"https://raw.githubusercontent.com/goharbor/harbor/5d31dd5b57d83f300907744aabf13ca60aac19b3/docs/img/harbor-arch.png",alt:"Harbor Architecture",title:"Harbor Architecture"}})]),r._v(" "),a("p",[r._v("Check how the Harbor Ingress looks like:")]),r._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[r._v("kubectl describe ingresses "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[r._v("-n")]),r._v(" harbor-system harbor-harbor-ingress\n")])])]),a("p",[r._v("Output:")]),r._v(" "),a("div",{staticClass:"language-text extra-class"},[a("div",{staticClass:"highlight-lines"},[a("br"),a("br"),a("br"),a("br"),a("br"),a("div",{staticClass:"highlighted"},[r._v(" ")]),a("div",{staticClass:"highlighted"},[r._v(" ")]),a("br"),a("br"),a("br"),a("div",{staticClass:"highlighted"},[r._v(" ")]),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("div",{staticClass:"highlighted"},[r._v(" ")]),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br")]),a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[r._v("Name: harbor-harbor-ingress\nNamespace: harbor-system\nAddress: 54.93.96.15\nDefault backend: default-http-backend:80 (<none>)\nTLS:\n ingress-cert-production terminates harbor.mylabs.dev\n ingress-cert-production terminates notary.mylabs.dev\nRules:\n Host Path Backends\n ---- ---- --------\n harbor.mylabs.dev\n / harbor-harbor-portal:80 (192.168.52.252:80)\n /api/ harbor-harbor-core:80 (192.168.34.28:8080)\n /service/ harbor-harbor-core:80 (192.168.34.28:8080)\n /v2/ harbor-harbor-core:80 (192.168.34.28:8080)\n /chartrepo/ harbor-harbor-core:80 (192.168.34.28:8080)\n /c/ harbor-harbor-core:80 (192.168.34.28:8080)\n notary.mylabs.dev\n / harbor-harbor-notary-server:4443 (192.168.47.135:4443)\nAnnotations:\n ingress.kubernetes.io/ssl-redirect: true\n nginx.ingress.kubernetes.io/proxy-body-size: 0\n nginx.ingress.kubernetes.io/ssl-redirect: true\n ingress.kubernetes.io/proxy-body-size: 0\nEvents:\n Type Reason Age From Message\n ---- ------ ---- ---- -------\n Normal CREATE 29m nginx-ingress-controller Ingress harbor-system/harbor-harbor-ingress\n Normal UPDATE 29m nginx-ingress-controller Ingress harbor-system/harbor-harbor-ingress\n")])])]),a("p",[r._v("Open the "),a("a",{attrs:{href:"https://harbor.mylabs.dev",target:"_blank",rel:"noopener noreferrer"}},[r._v("https://harbor.mylabs.dev"),a("OutboundLink")],1),r._v(":")]),r._v(" "),a("p",[a("img",{attrs:{src:s(304),alt:"Harbor login page",title:"Harbor login page"}})]),r._v(" "),a("p",[r._v("Log in:")]),r._v(" "),a("ul",[a("li",[r._v("User: "),a("code",[r._v("admin")])]),r._v(" "),a("li",[r._v("Password: "),a("code",[r._v("admin")])])]),r._v(" "),a("p",[r._v("You should see the Web UI:")]),r._v(" "),a("p",[a("img",{attrs:{src:s(305),alt:"Harbor",title:"Harbor"}})])])}),[],!1,null,null,null);a.default=t.exports}}]);
\ No newline at end of file
diff --git a/assets/js/26.30631009.js b/assets/js/26.30631009.js
new file mode 100644
index 00000000..d59b9b73
--- /dev/null
+++ b/assets/js/26.30631009.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[26],{246:function(t,n,e){"use strict";e.d(n,"d",(function(){return r})),e.d(n,"a",(function(){return s})),e.d(n,"i",(function(){return u})),e.d(n,"f",(function(){return a})),e.d(n,"g",(function(){return l})),e.d(n,"h",(function(){return c})),e.d(n,"b",(function(){return f})),e.d(n,"e",(function(){return h})),e.d(n,"k",(function(){return p})),e.d(n,"l",(function(){return d})),e.d(n,"c",(function(){return b})),e.d(n,"j",(function(){return m}));e(92);const r=/#.*$/,i=/\.(md|html)$/,s=/\/$/,u=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(r,"").replace(i,"")}function a(t){return u.test(t)}function l(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function f(t){if(a(t))return t;const n=t.match(r),e=n?n[0]:"",i=o(t);return s.test(i)?t:i+".html"+e}function h(t,n){const e=decodeURIComponent(t.hash),i=function(t){const n=t.match(r);if(n)return n[0]}(n);if(i&&e!==i)return!1;return o(t.path)===o(n)}function p(t,n,e){if(a(n))return{type:"external",path:n};e&&(n=function(t,n,e){const r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return n+t;const i=n.split("/");e&&i[i.length-1]||i.pop();const s=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(n,e,r,i=1){if("string"==typeof n)return p(e,n,r);if(Array.isArray(n))return Object.assign(p(e,n[0],r),{title:n[1]});{const s=n.children||[];return 0===s.length&&n.path?Object.assign(p(e,n.path,r),{title:n.title}):{type:"group",path:n.path,title:n.title,sidebarDepth:n.sidebarDepth,initialOpenGroupIndex:n.initialOpenGroupIndex,children:s.map(n=>t(n,e,r,i+1)),collapsable:!1!==n.collapsable}}}(t,i,e)):[]}return[]}function g(t){const n=b(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:n.map(n=>({type:"auto",title:n.title,basePath:t.path,path:t.path+"#"+n.slug,children:n.children||[]}))}]}function b(t){let n;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?n=t:n&&(n.children||(n.children=[])).push(t)}),t.filter(t=>2===t.level)}function m(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},248:function(t,n,e){"use strict";e.r(n);var r=e(246),i={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(r.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(r.g)(this.link)||Object(r.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(r.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(r.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI||!1===this.item.rel?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":null}},methods:{focusoutAction(){this.$emit("focusout")}}},s=e(8),u=Object(s.a)(i,(function(){var t=this,n=t._self._c;return t.isInternal?n("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(n){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):n("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?n("OutboundLink"):t._e()],1)}),[],!1,null,null,null);n.default=u.exports}}]);
\ No newline at end of file
diff --git a/assets/js/27.6981350f.js b/assets/js/27.6981350f.js
new file mode 100644
index 00000000..f6bb309d
--- /dev/null
+++ b/assets/js/27.6981350f.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[27],{301:function(r,t,e){r.exports=e.p+"assets/img/harbor-horizontal-color.ef644877.svg"},339:function(r,t,e){"use strict";e.r(t);var a=e(8),n=Object(a.a)({},(function(){var r=this,t=r._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":r.$parent.slotKey}},[t("h1",{attrs:{id:"kubernetes-harbor"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#kubernetes-harbor"}},[r._v("#")]),r._v(" Kubernetes + Harbor")]),r._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/ruzickap/k8s-harbor",target:"_blank",rel:"noopener noreferrer"}},[t("img",{attrs:{src:"https://github.com/ruzickap/k8s-harbor/actions/workflows/vuepress-build.yml/badge.svg",alt:"Build Status"}}),t("OutboundLink")],1)]),r._v(" "),t("p",[t("a",{attrs:{href:"https://goharbor.io/",target:"_blank",rel:"noopener noreferrer"}},[r._v("Harbor"),t("OutboundLink")],1),r._v(" is an open source cloud native registry that\nstores, signs, and scans container images for vulnerabilities.")]),r._v(" "),t("p",[t("img",{attrs:{src:e(301),alt:"Harbor",title:"Harbor"}})]),r._v(" "),t("p",[r._v("Harbor solves common challenges by delivering trust, compliance, performance,\nand interoperability. It fills a gap for organizations and applications that\ncannot use a public or cloud-based registry, or want a consistent experience\nacross clouds.")]),r._v(" "),t("ul",[t("li",[r._v("Demo GitHub repository: "),t("a",{attrs:{href:"https://github.com/ruzickap/k8s-harbor",target:"_blank",rel:"noopener noreferrer"}},[r._v("https://github.com/ruzickap/k8s-harbor"),t("OutboundLink")],1)]),r._v(" "),t("li",[r._v("Demo Web Pages: "),t("a",{attrs:{href:"https://ruzickap.github.io/k8s-harbor",target:"_blank",rel:"noopener noreferrer"}},[r._v("https://ruzickap.github.io/k8s-harbor"),t("OutboundLink")],1)]),r._v(" "),t("li",[r._v("Presentation git repository: "),t("a",{attrs:{href:"https://github.com/ruzickap/k8s-harbor-presentation",target:"_blank",rel:"noopener noreferrer"}},[r._v("https://github.com/ruzickap/k8s-harbor-presentation"),t("OutboundLink")],1)]),r._v(" "),t("li",[r._v("YouTube: "),t("a",{attrs:{href:"https://youtu.be/niZJOM7ND24",target:"_blank",rel:"noopener noreferrer"}},[r._v("Harbor presentation in Czech language"),t("OutboundLink")],1)]),r._v(" "),t("li",[r._v("Asciinema screencast: "),t("a",{attrs:{href:"https://asciinema.org/a/253519",target:"_blank",rel:"noopener noreferrer"}},[r._v("https://asciinema.org/a/253519"),t("OutboundLink")],1)]),r._v(" "),t("li",[r._v("Asciinema screencast (45 minutes): "),t("a",{attrs:{href:"https://asciinema.org/a/278803",target:"_blank",rel:"noopener noreferrer"}},[r._v("https://asciinema.org/a/278803"),t("OutboundLink")],1)])]),r._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[r._v("#")]),r._v(" Requirements")]),r._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://ansible.com",target:"_blank",rel:"noopener noreferrer"}},[r._v("ansible"),t("OutboundLink")],1)]),r._v(" "),t("li",[t("a",{attrs:{href:"https://aws.amazon.com/cli/",target:"_blank",rel:"noopener noreferrer"}},[r._v("awscli"),t("OutboundLink")],1)]),r._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/kubernetes-sigs/aws-iam-authenticator",target:"_blank",rel:"noopener noreferrer"}},[r._v("AWS IAM Authenticator for Kubernetes"),t("OutboundLink")],1)]),r._v(" "),t("li",[t("a",{attrs:{href:"https://aws.amazon.com/account/",target:"_blank",rel:"noopener noreferrer"}},[r._v("AWS account"),t("OutboundLink")],1)]),r._v(" "),t("li",[t("a",{attrs:{href:"https://kubernetes.io/docs/tasks/tools/install-kubectl/",target:"_blank",rel:"noopener noreferrer"}},[r._v("kubectl"),t("OutboundLink")],1)]),r._v(" "),t("li",[t("a",{attrs:{href:"https://eksctl.io/",target:"_blank",rel:"noopener noreferrer"}},[r._v("eksctl"),t("OutboundLink")],1)]),r._v(" "),t("li",[r._v("Kubernetes, Docker, Linux, AWS knowledge required")])]),r._v(" "),t("h2",{attrs:{id:"objectives"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#objectives"}},[r._v("#")]),r._v(" Objectives")]),r._v(" "),t("ul",[t("li",[r._v("Download and install Harbor to your Kubernetes cluster")])]),r._v(" "),t("h2",{attrs:{id:"lab-architecture"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#lab-architecture"}},[r._v("#")]),r._v(" Lab Architecture")]),r._v(" "),t("p",[t("img",{attrs:{src:"https://raw.githubusercontent.com/ruzickap/k8s-harbor-presentation/master/images/harbor_demo_architecture_diagram.svg?sanitize=true",alt:"Lab architecture",title:"Lab architecture"}})]),r._v(" "),t("h2",{attrs:{id:"content"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#content"}},[r._v("#")]),r._v(" Content")]),r._v(" "),t("ul",[t("li",[t("RouterLink",{attrs:{to:"/part-01/"}},[r._v("Part 01 - Create EKS cluster")])],1),r._v(" "),t("li",[t("RouterLink",{attrs:{to:"/part-02/"}},[r._v("Part 02 - Install Helm")])],1),r._v(" "),t("li",[t("RouterLink",{attrs:{to:"/part-03/"}},[r._v("Part 03 - ingress-nginx + cert-manager installation")])],1),r._v(" "),t("li",[t("RouterLink",{attrs:{to:"/part-04/"}},[r._v("Part 04 - Harbor installation")])],1),r._v(" "),t("li",[t("RouterLink",{attrs:{to:"/part-05/"}},[r._v("Part 05 - Initial Harbor tasks")])],1),r._v(" "),t("li",[t("RouterLink",{attrs:{to:"/part-06/"}},[r._v("Part 06 - Harbor and Helm charts")])],1),r._v(" "),t("li",[t("RouterLink",{attrs:{to:"/part-07/"}},[r._v("Part 07 - Harbor and container images")])],1),r._v(" "),t("li",[t("RouterLink",{attrs:{to:"/part-08/"}},[r._v("Part 08 - Project settings")])],1),r._v(" "),t("li",[t("RouterLink",{attrs:{to:"/part-09/"}},[r._v("Part 09 - Clean-up")])],1)]),r._v(" "),t("h2",{attrs:{id:"links"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#links"}},[r._v("#")]),r._v(" Links")]),r._v(" "),t("ul",[t("li",[t("p",[r._v("Video:")]),r._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://youtu.be/Rs3zByxI8aY",target:"_blank",rel:"noopener noreferrer"}},[r._v("Intro to Harbor"),t("OutboundLink")],1)]),r._v(" "),t("li",[t("a",{attrs:{href:"https://youtu.be/RZQVBWwGa2s",target:"_blank",rel:"noopener noreferrer"}},[r._v("Intro: Harbor - James Zabala & Henry Zhang, VMware"),t("OutboundLink")],1)]),r._v(" "),t("li",[t("a",{attrs:{href:"https://youtu.be/OKj1XxtsTCo",target:"_blank",rel:"noopener noreferrer"}},[r._v("Deep Dive: Harbor - Tan Jiang & Jia Zou, VMware"),t("OutboundLink")],1)])])]),r._v(" "),t("li",[t("p",[r._v("Pages:")]),r._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://ikod.medium.com/deploy-harbor-container-registry-in-production-89352fb1a114",target:"_blank",rel:"noopener noreferrer"}},[r._v("Deploying Harbor Container Registry in Production"),t("OutboundLink")],1)]),r._v(" "),t("li",[t("a",{attrs:{href:"https://docs.docker.com/notary/advanced_usage/",target:"_blank",rel:"noopener noreferrer"}},[r._v("Use the Notary client for advanced users"),t("OutboundLink")],1)]),r._v(" "),t("li",[t("a",{attrs:{href:"https://cloud.tencent.com/developer/article/1151425",target:"_blank",rel:"noopener noreferrer"}},[r._v("Handy API Harbor calls (in Chinese)"),t("OutboundLink")],1)]),r._v(" "),t("li",[t("a",{attrs:{href:"https://editor.swagger.io/",target:"_blank",rel:"noopener noreferrer"}},[r._v("Swagger Editor"),t("OutboundLink")],1),r._v(" + Import "),t("a",{attrs:{href:"https://raw.githubusercontent.com/goharbor/harbor/7b6e83090e26d171c0d0e0dacd14e2b61fab45e1/API/harbor/swagger.yaml",target:"_blank",rel:"noopener noreferrer"}},[r._v("Harbor's swagger.yaml"),t("OutboundLink")],1)])])])]),r._v(" "),t("p",[t("img",{attrs:{src:"https://raw.githubusercontent.com/cncf/artwork/ab42c9591f6e0fdccc62c7b88f353d3fdc825734/harbor/stacked/color/harbor-stacked-color.svg?sanitize=true",alt:"Harbor",title:"Harbor"}})])])}),[],!1,null,null,null);t.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/28.49150c67.js b/assets/js/28.49150c67.js
new file mode 100644
index 00000000..5a34e024
--- /dev/null
+++ b/assets/js/28.49150c67.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[28],{302:function(a,s,t){a.exports=t.p+"assets/img/xfreerdp_windows_server.8552fbcd.png"},340:function(a,s,t){"use strict";t.r(s);var e=t(8),r=Object(e.a)({},(function(){var a=this,s=a._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[s("h1",{attrs:{id:"create-eks-cluster"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-eks-cluster"}},[a._v("#")]),a._v(" Create EKS cluster")]),a._v(" "),s("p",[s("img",{attrs:{src:"https://raw.githubusercontent.com/cncf/landscape/7f5b02ecba914a32912e77fc78e1c54d1c2f98ec/hosted_logos/amazon-eks.svg?sanitize=true",alt:"Amazon EKS",title:"Amazon EKS"}})]),a._v(" "),s("p",[a._v("Before starting with the main content, it's necessary to provision\nthe "),s("a",{attrs:{href:"https://aws.amazon.com/eks/",target:"_blank",rel:"noopener noreferrer"}},[a._v("Amazon EKS"),s("OutboundLink")],1),a._v(" in AWS.")]),a._v(" "),s("p",[a._v("Use the "),s("code",[a._v("MY_DOMAIN")]),a._v(" variable containing domain and "),s("code",[a._v("LETSENCRYPT_ENVIRONMENT")]),a._v("\nvariable.\nThe "),s("code",[a._v("LETSENCRYPT_ENVIRONMENT")]),a._v(" variable should be one of:")]),a._v(" "),s("ul",[s("li",[s("p",[s("code",[a._v("staging")]),a._v(" - Let’s Encrypt will create testing certificate (not valid)")])]),a._v(" "),s("li",[s("p",[s("code",[a._v("production")]),a._v(" - Let’s Encrypt will create valid certificate (use with care)")])])]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("MY_DOMAIN")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":-")]),a._v("mylabs.dev}")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("LETSENCRYPT_ENVIRONMENT")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${LETSENCRYPT_ENVIRONMENT"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":-")]),a._v("staging}")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v(" | "),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${LETSENCRYPT_ENVIRONMENT}")]),a._v('"')]),a._v("\n")])])]),s("h2",{attrs:{id:"prepare-the-local-working-environment"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#prepare-the-local-working-environment"}},[a._v("#")]),a._v(" Prepare the local working environment")]),a._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[a._v("TIP")]),a._v(" "),s("p",[a._v("You can skip these steps if you have all the required software already\ninstalled.")])]),a._v(" "),s("p",[a._v("Install necessary software:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("test")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-x")]),a._v(" /usr/bin/apt "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("apt")]),a._v(" update "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-qq")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("DEBIAN_FRONTEND")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("noninteractive "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("apt-get")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-y")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-qq")]),a._v(" awscli "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" docker.io freerdp-x11 gettext-base "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("git")]),a._v(" gnupg2 jq ldap-utils openssh-client python3-pip "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("wget")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">")]),a._v(" /dev/null "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\npip3 "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--quiet")]),a._v(" ansible boto3 pywinrm\n")])])]),s("p",[a._v("Install "),s("a",{attrs:{href:"https://github.com/kubernetes/kubectl",target:"_blank",rel:"noopener noreferrer"}},[a._v("kubectl"),s("OutboundLink")],1),a._v(" binary:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("if")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("!")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-x")]),a._v(" /usr/local/bin/kubectl "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("then")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-s")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-Lo")]),a._v(" /usr/local/bin/kubectl https://storage.googleapis.com/kubernetes-release/release/"),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-s")]),a._v(" https://storage.googleapis.com/kubernetes-release/release/stable.txt"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v("/bin/linux/amd64/kubectl\n "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("chmod")]),a._v(" a+x /usr/local/bin/kubectl\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("fi")]),a._v("\n")])])]),s("p",[a._v("Install "),s("a",{attrs:{href:"https://eksctl.io/",target:"_blank",rel:"noopener noreferrer"}},[a._v("eksctl"),s("OutboundLink")],1),a._v(":")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("if")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("!")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-x")]),a._v(" /usr/local/bin/eksctl "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("then")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-s")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-L")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"https://github.com/weaveworks/eksctl/releases/download/latest_release/eksctl_Linux_amd64.tar.gz"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("tar")]),a._v(" xz "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-C")]),a._v(" /usr/local/bin/\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("fi")]),a._v("\n")])])]),s("p",[a._v("Install "),s("a",{attrs:{href:"https://github.com/kubernetes-sigs/aws-iam-authenticator",target:"_blank",rel:"noopener noreferrer"}},[a._v("AWS IAM Authenticator for Kubernetes"),s("OutboundLink")],1),a._v(":")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("if")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("!")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-x")]),a._v(" /usr/local/bin/aws-iam-authenticator "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("then")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-s")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-Lo")]),a._v(" /usr/local/bin/aws-iam-authenticator https://amazon-eks.s3-us-west-2.amazonaws.com/1.12.7/2019-03-27/bin/linux/amd64/aws-iam-authenticator\n "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("chmod")]),a._v(" a+x /usr/local/bin/aws-iam-authenticator\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("fi")]),a._v("\n")])])]),s("h2",{attrs:{id:"configure-aws"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#configure-aws"}},[a._v("#")]),a._v(" Configure AWS")]),a._v(" "),s("p",[a._v("Authorize to AWS using AWS CLI: "),s("a",{attrs:{href:"https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html",target:"_blank",rel:"noopener noreferrer"}},[a._v("Configuring the AWS CLI"),s("OutboundLink")],1)]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("aws configure\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("..")]),a._v(".\n")])])]),s("p",[a._v("Create DNS zone:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("aws route53 create-hosted-zone "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--name")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v(" --caller-reference "),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("\n")])])]),s("p",[a._v('Use your domain registrar to change the nameservers for your zone (for example\n"mylabs.dev") to use the Amazon Route 53 nameservers. Here is the way how you\ncan find out the the Route 53 nameservers:')]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("aws route53 get-hosted-zone "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--id")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),a._v("aws route53 list-hosted-zones "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--query")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"HostedZones[?Name==\\'),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("`")]),a._v("$"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("MY_DOMAIN"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("."),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("`")])]),a._v('].Id"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--output")]),a._v(" text"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--query")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"DelegationSet.NameServers"')]),a._v("\n")])])]),s("p",[a._v("Create policy allowing the cert-manager to change Route 53 settings. This will\nallow cert-manager to generate wildcard SSL certificates by Let's Encrypt\ncertificate authority.")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("aws iam create-policy "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n --policy-name "),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("-AmazonRoute53Domains-cert-manager "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--description")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Policy required by cert-manager to be able to modify Route 53 when generating wildcard certificates using Lets Encrypt"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n --policy-document file://files/route_53_change_policy.json "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" jq\n")])])]),s("p",[a._v("Output:")]),a._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[a._v('"Policy"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[a._v('"PolicyName"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"pruzicka-AmazonRoute53Domains-cert-manager"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[a._v('"PolicyId"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"xxxxxxxxxxxxxxxxxxxx"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[a._v('"Arn"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"arn:aws:iam::822044714040:policy/pruzicka-AmazonRoute53Domains-cert-manager"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[a._v('"Path"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"/"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[a._v('"DefaultVersionId"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"v1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[a._v('"AttachmentCount"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[a._v('"IsAttachable"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[a._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[a._v('"CreateDate"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"2019-06-05T11:16:58Z"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[a._v('"UpdateDate"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"2019-06-05T11:16:58Z"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("Create user which will use the policy above allowing the cert-manager to change\nRoute 53 settings:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("aws iam create-user --user-name "),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("-eks-cert-manager-route53 "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" jq "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("POLICY_ARN")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),a._v("aws iam list-policies "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--query")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Policies[?PolicyName==\\'),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("`")]),a._v("$"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("-AmazonRoute53Domains-cert-manager"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("`")])]),a._v('].{ARN:Arn}"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--output")]),a._v(" text"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\naws iam attach-user-policy --user-name "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v('-eks-cert-manager-route53"')]),a._v(" --policy-arn "),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$POLICY_ARN")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\naws iam create-access-key --user-name "),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("-eks-cert-manager-route53 "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("$HOME")]),a._v("/.aws/"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("-eks-cert-manager-route53-"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("EKS_CERT_MANAGER_ROUTE53_AWS_ACCESS_KEY_ID")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("awk")]),a._v(" -F"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v('" '),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"/AccessKeyId/ { print \\'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$4")]),a._v(' }"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("$HOME")]),a._v("/.aws/$"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("-eks-cert-manager-route53-$"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("MY_DOMAIN"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("EKS_CERT_MANAGER_ROUTE53_AWS_SECRET_ACCESS_KEY")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("awk")]),a._v(" -F"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v('" '),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"/SecretAccessKey/ { print \\'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$4")]),a._v(' }"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("$HOME")]),a._v("/.aws/$"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("-eks-cert-manager-route53-$"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("MY_DOMAIN"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v("\n")])])]),s("p",[a._v("Output:")]),a._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[a._v('"User"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[a._v('"Path"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"/"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[a._v('"UserName"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"pruzicka-eks-cert-manager-route53"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[a._v('"UserId"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"xxxxxxxxxxxxxxxxxxxx"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[a._v('"Arn"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"arn:aws:iam::822044714040:user/pruzicka-eks-cert-manager-route53"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[a._v('"CreateDate"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"2019-06-05T11:16:59Z"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("The "),s("code",[a._v("AccessKeyId")]),a._v(" and "),s("code",[a._v("SecretAccessKey")]),a._v(" is need for creating the "),s("code",[a._v("ClusterIssuer")]),a._v("\ndefinition for "),s("code",[a._v("cert-manager")]),a._v(".")]),a._v(" "),s("h2",{attrs:{id:"create-amazon-eks"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-amazon-eks"}},[a._v("#")]),a._v(" Create Amazon EKS")]),a._v(" "),s("p",[s("img",{attrs:{src:"https://raw.githubusercontent.com/aws-samples/eks-workshop/65b766c494a5b4f5420b2912d8373c4957163541/static/images/3-service-animated.gif",alt:"EKS",title:"EKS"}})]),a._v(" "),s("p",[a._v("Generate SSH keys if not exists:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("test")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-f")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("$HOME")]),a._v("/.ssh/id_rsa "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("||")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-m")]),a._v(" 0700 "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-d")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("$HOME")]),a._v("/.ssh "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" ssh-keygen "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-b")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[a._v("2048")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-t")]),a._v(" rsa "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-f")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("$HOME")]),a._v("/.ssh/id_rsa "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-q")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-N")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('""')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),a._v("\n")])])]),s("p",[a._v("Clone the "),s("a",{attrs:{href:"https://github.com/ruzickap/k8s-harbor",target:"_blank",rel:"noopener noreferrer"}},[a._v("k8s-harbor"),s("OutboundLink")],1),a._v(" Git repository\nif it wasn't done already:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("!")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-d")]),a._v(" .git "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("git")]),a._v(" clone "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--quiet")]),a._v(" https://github.com/ruzickap/k8s-harbor "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("cd")]),a._v(" k8s-harbor\n")])])]),s("p",[a._v("Create "),s("a",{attrs:{href:"https://aws.amazon.com/eks/",target:"_blank",rel:"noopener noreferrer"}},[a._v("Amazon EKS"),s("OutboundLink")],1),a._v(" in AWS by using "),s("a",{attrs:{href:"https://eksctl.io/",target:"_blank",rel:"noopener noreferrer"}},[a._v("eksctl"),s("OutboundLink")],1),a._v(".\nIt's a tool from Weaveworks based on official\nAWS CloudFormation templates which will be used to launch and configure our\nEKS cluster and nodes.")]),a._v(" "),s("p",[s("img",{attrs:{src:"https://raw.githubusercontent.com/weaveworks/eksctl/c365149fc1a0b8d357139cbd6cda5aee8841c16c/logo/eksctl.png",alt:"eksctl",title:"eksctl"}})]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("eksctl create cluster "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--name")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("-k8s-harbor "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--tags")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Application=Harbor,Owner='),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v(',Environment=Test,Division=Services"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--region")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("eu-central-1 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n--node-type"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("t3.large "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n--ssh-access "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n--ssh-public-key "),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("$HOME")]),a._v("/.ssh/id_rsa.pub "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n--node-ami"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("auto "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n--node-labels "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Application=Harbor,Owner='),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v(',Environment=Test,Division=Services"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--kubeconfig")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("kubeconfig.conf\n")])])]),s("p",[a._v("Output:")]),a._v(" "),s("div",{staticClass:"language-text extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v('[ℹ] using region eu-central-1\n[ℹ] setting availability zones to [eu-central-1c eu-central-1b eu-central-1a]\n[ℹ] subnets for eu-central-1c - public:192.168.0.0/19 private:192.168.96.0/19\n[ℹ] subnets for eu-central-1b - public:192.168.32.0/19 private:192.168.128.0/19\n[ℹ] subnets for eu-central-1a - public:192.168.64.0/19 private:192.168.160.0/19\n[ℹ] nodegroup "ng-d1b535b2" will use "ami-0b7127e7a2a38802a" [AmazonLinux2/1.13]\n[ℹ] using SSH public key "/home/pruzicka/.ssh/id_rsa.pub" as "eksctl-pruzicka-k8s-harbor-nodegroup-ng-d1b535b2-a3:84:e4:0d:af:5f:c8:40:da:71:68:8a:74:c7:ba:16"\n[ℹ] using Kubernetes version 1.13\n[ℹ] creating EKS cluster "pruzicka-k8s-harbor" in "eu-central-1" region\n[ℹ] will create 2 separate CloudFormation stacks for cluster itself and the initial nodegroup\n[ℹ] if you encounter any issues, check CloudFormation console or try \'eksctl utils describe-stacks --region=eu-central-1 --name=pruzicka-k8s-harbor\'\n[ℹ] 2 sequential tasks: { create cluster control plane "pruzicka-k8s-harbor", create nodegroup "ng-d1b535b2" }\n[ℹ] building cluster stack "eksctl-pruzicka-k8s-harbor-cluster"\n[ℹ] deploying stack "eksctl-pruzicka-k8s-harbor-cluster"\n[ℹ] building nodegroup stack "eksctl-pruzicka-k8s-harbor-nodegroup-ng-d1b535b2"\n[ℹ] --nodes-min=2 was set automatically for nodegroup ng-d1b535b2\n[ℹ] --nodes-max=2 was set automatically for nodegroup ng-d1b535b2\n[ℹ] deploying stack "eksctl-pruzicka-k8s-harbor-nodegroup-ng-d1b535b2"\n[✔] all EKS cluster resource for "pruzicka-k8s-harbor" had been created\n[✔] saved kubeconfig as "kubeconfig.conf"\n[ℹ] adding role "arn:aws:iam::822044714040:role/eksctl-pruzicka-k8s-harbor-nodegr-NodeInstanceRole-A4XWMWDV73D9" to auth ConfigMap\n[ℹ] nodegroup "ng-d1b535b2" has 0 node(s)\n[ℹ] waiting for at least 2 node(s) to become ready in "ng-d1b535b2"\n[ℹ] nodegroup "ng-d1b535b2" has 2 node(s)\n[ℹ] node "ip-192-168-56-161.eu-central-1.compute.internal" is ready\n[ℹ] node "ip-192-168-9-2.eu-central-1.compute.internal" is ready\n[ℹ] kubectl command should work with "kubeconfig.conf", try \'kubectl --kubeconfig=kubeconfig.conf get nodes\'\n[✔] EKS cluster "pruzicka-k8s-harbor" in "eu-central-1" region is ready\n')])])]),s("p",[s("img",{attrs:{src:"https://raw.githubusercontent.com/aws-samples/eks-workshop/3e7da75de884d9efeec8e8ba21161169d3e80da7/static/images/introduction/eks-architecture.svg?sanitize=true",alt:"EKS Architecture",title:"EKS Architecture"}})]),a._v(" "),s("p",[a._v("Create CloudFormation stack with Windows Server 2016, which will serve as\nActive Directory to use LDAP connection from Harbor:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("ansible-playbook "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--connection")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("local "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-i")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"127.0.0.1,"')]),a._v(" files/ansible/aws_windows_server_2016.yml\n")])])]),s("p",[a._v("Output:")]),a._v(" "),s("div",{staticClass:"language-text extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("...\nPLAY RECAP *********************************************************************\n127.0.0.1 : ok=6 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0\nwinad01.mylabs.dev : ok=22 changed=8 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0\n")])])]),s("p",[a._v("You should be able to access Windows Server using RDP:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("xfreerdp /u:Administrator /p:really_long_secret_windows_password /size:1440x810 "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-wallpaper")]),a._v(" /cert-ignore /dynamic-resolution /v:winad01."),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&>")]),a._v(" /dev/null "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&")]),a._v("\n")])])]),s("p",[a._v("Windows desktop should appear:")]),a._v(" "),s("p",[s("img",{attrs:{src:t(302),alt:"Windows Server",title:"Windows Server"}})]),a._v(" "),s("p",[a._v("If you check the AD Users you should see users "),s("code",[a._v("aduser{01..06}")]),a._v(" distributed into\nthree groups "),s("code",[a._v("adgroup{01.03}")]),a._v(" with password "),s("code",[a._v("admin")]),a._v(".")]),a._v(" "),s("p",[a._v("Check if the new EKS cluster is available:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("KUBECONFIG")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("$PWD")]),a._v("/kubeconfig.conf\nkubectl get nodes "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-o")]),a._v(" wide\n")])])]),s("p",[a._v("Output:")]),a._v(" "),s("div",{staticClass:"language-text extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME\nip-192-168-56-161.eu-central-1.compute.internal Ready <none> 46m v1.13.7-eks-c57ff8 192.168.56.161 54.93.96.15 Amazon Linux 2 4.14.128-112.105.amzn2.x86_64 docker://18.6.1\nip-192-168-9-2.eu-central-1.compute.internal Ready <none> 46m v1.13.7-eks-c57ff8 192.168.9.2 18.196.16.153 Amazon Linux 2 4.14.128-112.105.amzn2.x86_64 docker://18.6.1\n")])])]),s("p",[s("img",{attrs:{src:"https://raw.githubusercontent.com/aws-samples/eks-workshop/3e7da75de884d9efeec8e8ba21161169d3e80da7/static/images/introduction/eks-high-level.svg?sanitize=true",alt:"EKS High Level",title:"EKS High Level"}})]),a._v(" "),s("p",[a._v("Both worker nodes should be accessible via SSH:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("for")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token for-or-select variable"}},[a._v("EXTERNAL_IP")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("in")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),a._v("kubectl get nodes "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--output")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("jsonpath"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"{.items[*].status.addresses[?(@.type=='),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v("ExternalIP"),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v(')].address}"')]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("do")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"*** '),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${EXTERNAL_IP}")]),a._v('"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("ssh")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-q")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-n")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-o")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("StrictHostKeyChecking")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("no "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-l")]),a._v(" ec2-user "),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${EXTERNAL_IP}")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("uptime")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("done")]),a._v("\n")])])]),s("p",[a._v("Output:")]),a._v(" "),s("div",{staticClass:"language-text extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("*** 54.93.96.15\n 10:16:43 up 48 min, 0 users, load average: 1.03, 0.47, 0.25\n*** 18.196.16.153\n 10:16:43 up 48 min, 0 users, load average: 0.64, 0.91, 0.61\n")])])]),s("p",[a._v("At the end of the output you should see 2 IP addresses which\nshould be accessible by SSH using your public key "),s("code",[a._v("~/.ssh/id_rsa.pub")]),a._v(".")])])}),[],!1,null,null,null);s.default=r.exports}}]);
\ No newline at end of file
diff --git a/assets/js/29.d09a07de.js b/assets/js/29.d09a07de.js
new file mode 100644
index 00000000..87a8a581
--- /dev/null
+++ b/assets/js/29.d09a07de.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{303:function(e,a,s){e.exports=s.p+"assets/img/kubed.e88b1fb6.svg"},342:function(e,a,s){"use strict";s.r(a);var t=s(8),r=Object(t.a)({},(function(){var e=this,a=e._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"nginx-cert-manager-kubed-installation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#nginx-cert-manager-kubed-installation"}},[e._v("#")]),e._v(" Nginx + cert-manager + kubed installation")]),e._v(" "),a("p",[e._v("Before we move on with other tasks it is necessary to install Nginx Ingress.\nIt's also handy to install cert-manager for managing SSL certificates.")]),e._v(" "),a("h2",{attrs:{id:"install-cert-manager"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#install-cert-manager"}},[e._v("#")]),e._v(" Install cert-manager")]),e._v(" "),a("p",[e._v("cert-manager architecture:")]),e._v(" "),a("p",[a("img",{attrs:{src:"https://raw.githubusercontent.com/jetstack/cert-manager/4f30ed75e88e5d0defeb950501b5cac6da7fa7fe/docs/images/high-level-overview.png",alt:"cert-manager high level overview",title:"cert-manager high level overview"}})]),e._v(" "),a("p",[e._v("Install the CRDs resources separately:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("kubectl apply "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-f")]),e._v(" https://raw.githubusercontent.com/jetstack/cert-manager/release-0.10/deploy/manifests/00-crds.yaml\n")])])]),a("p",[e._v("Output:")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("customresourcedefinition.apiextensions.k8s.io/certificates.certmanager.k8s.io created\ncustomresourcedefinition.apiextensions.k8s.io/challenges.certmanager.k8s.io created\ncustomresourcedefinition.apiextensions.k8s.io/clusterissuers.certmanager.k8s.io created\ncustomresourcedefinition.apiextensions.k8s.io/issuers.certmanager.k8s.io created\ncustomresourcedefinition.apiextensions.k8s.io/orders.certmanager.k8s.io created\n")])])]),a("p",[e._v("Create the namespace for cert-manager and label it to disable resource\nvalidation:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("kubectl create namespace cert-manager\nkubectl label namespace cert-manager certmanager.k8s.io/disable-validation"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("true\n")])])]),a("p",[e._v("Output:")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("namespace/cert-manager created\nnamespace/cert-manager labeled\n")])])]),a("p",[e._v("Install the cert-manager Helm chart:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("helm repo "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("add")]),e._v(" jetstack https://charts.jetstack.io\nhelm "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--name")]),e._v(" cert-manager "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--namespace")]),e._v(" cert-manager "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--wait")]),e._v(" jetstack/cert-manager "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--version")]),e._v(" v0.10.0\n")])])]),a("p",[e._v("Output:")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("\"jetstack\" has been added to your repositories\nNAME: cert-manager\nLAST DEPLOYED: Fri Jul 19 11:47:58 2019\nNAMESPACE: cert-manager\nSTATUS: DEPLOYED\n\nRESOURCES:\n==> v1/ClusterRole\nNAME AGE\ncert-manager-edit 10s\ncert-manager-view 10s\n\n==> v1/Pod(related)\nNAME READY STATUS RESTARTS AGE\ncert-manager-578fc6ff6-qjvrr 1/1 Running 0 10s\ncert-manager-cainjector-5975fd64c5-82c8x 1/1 Running 0 10s\n\n==> v1/ServiceAccount\nNAME SECRETS AGE\ncert-manager 1 10s\ncert-manager-cainjector 1 10s\n\n==> v1beta1/ClusterRole\nNAME AGE\ncert-manager 10s\ncert-manager-cainjector 10s\n\n==> v1beta1/ClusterRoleBinding\nNAME AGE\ncert-manager 10s\ncert-manager-cainjector 10s\n\n==> v1beta1/Deployment\nNAME READY UP-TO-DATE AVAILABLE AGE\ncert-manager 1/1 1 1 10s\ncert-manager-cainjector 1/1 1 1 10s\n\n\nNOTES:\ncert-manager has been deployed successfully!\n\nIn order to begin issuing certificates, you will need to set up a ClusterIssuer\nor Issuer resource (for example, by creating a 'letsencrypt-staging' issuer).\n\nMore information on the different types of issuers and how to configure them\ncan be found in our documentation:\n\nhttps://docs.cert-manager.io/en/latest/reference/issuers.html\n\nFor information on how to configure cert-manager to automatically provision\nCertificates for Ingress resources, take a look at the `ingress-shim`\ndocumentation:\n\nhttps://docs.cert-manager.io/en/latest/reference/ingress-shim.html\n")])])]),a("h3",{attrs:{id:"create-clusterissuer-for-let-s-encrypt"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#create-clusterissuer-for-let-s-encrypt"}},[e._v("#")]),e._v(" Create ClusterIssuer for Let's Encrypt")]),e._v(" "),a("p",[e._v("Create "),a("code",[e._v("ClusterIssuer")]),e._v(" for Route53 used by cert-manager. It will allow Let's\nEncrypt to generate certificate. Route53 (DNS) method of requesting certificate\nfrom Let's Encrypt must be used to create wildcard certificate "),a("code",[e._v("*.mylabs.dev")]),e._v("\n(details "),a("a",{attrs:{href:"https://community.letsencrypt.org/t/wildcard-certificates-via-http-01/51223",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),a("OutboundLink")],1),e._v(").")]),e._v(" "),a("p",[a("img",{attrs:{src:"https://b3n.org/wp-content/uploads/2016/09/acme_letsencrypt_dns-01-challenge.png",alt:"ACME DNS Challenge",title:"ACME DNS Challenge"}})]),e._v(" "),a("p",[e._v("("),a("a",{attrs:{href:"https://b3n.org/intranet-ssl-certificates-using-lets-encrypt-dns-01/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://b3n.org/intranet-ssl-certificates-using-lets-encrypt-dns-01/"),a("OutboundLink")],1),e._v(")")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("EKS_CERT_MANAGER_ROUTE53_AWS_SECRET_ACCESS_KEY_BASE64")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("echo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-n")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$EKS_CERT_MANAGER_ROUTE53_AWS_SECRET_ACCESS_KEY")]),e._v('"')]),e._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" base64"),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\nenvsubst "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),e._v(" files/cert-manager-letsencrypt-aws-route53-clusterissuer.yaml "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" kubectl apply "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-f")]),e._v(" -\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("cat")]),e._v(" files/cert-manager-letsencrypt-aws-route53-clusterissuer.yaml\n")])])]),a("p",[e._v("Output:")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("div",{staticClass:"highlight-lines"},[a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("div",{staticClass:"highlighted"},[e._v(" ")]),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("div",{staticClass:"highlighted"},[e._v(" ")]),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("div",{staticClass:"highlighted"},[e._v(" ")]),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br")]),a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("secret/aws-route53-secret-access-key-secret created\nclusterissuer.certmanager.k8s.io/selfsigning-issuer created\nclusterissuer.certmanager.k8s.io/letsencrypt-staging-dns created\nclusterissuer.certmanager.k8s.io/letsencrypt-production-dns created\napiVersion: v1\nkind: Secret\nmetadata:\n name: aws-route53-secret-access-key-secret\n namespace: cert-manager\ndata:\n secret-access-key: $EKS_CERT_MANAGER_ROUTE53_AWS_SECRET_ACCESS_KEY_BASE64\n---\napiVersion: certmanager.k8s.io/v1alpha1\nkind: ClusterIssuer\nmetadata:\n name: selfsigning-issuer\nspec:\n selfSigned: {}\n---\napiVersion: certmanager.k8s.io/v1alpha1\nkind: ClusterIssuer\nmetadata:\n name: letsencrypt-staging-dns\n namespace: cert-manager\nspec:\n acme:\n # The ACME server URL\n server: https://acme-staging-v02.api.letsencrypt.org/directory\n # Email address used for ACME registration\n email: petr.ruzicka@gmail.com\n # Name of a secret used to store the ACME account private key\n privateKeySecretRef:\n name: letsencrypt-staging-dns\n dns01:\n # Here we define a list of DNS-01 providers that can solve DNS challenges\n providers:\n - name: aws-route53\n route53:\n accessKeyID: ${EKS_CERT_MANAGER_ROUTE53_AWS_ACCESS_KEY_ID}\n region: eu-central-1\n secretAccessKeySecretRef:\n name: aws-route53-secret-access-key-secret\n key: secret-access-key\n---\napiVersion: certmanager.k8s.io/v1alpha1\nkind: ClusterIssuer\nmetadata:\n name: letsencrypt-production-dns\n namespace: cert-manager\nspec:\n acme:\n # The ACME server URL\n server: https://acme-v02.api.letsencrypt.org/directory\n # Email address used for ACME registration\n email: petr.ruzicka@gmail.com\n # Name of a secret used to store the ACME account private key\n privateKeySecretRef:\n name: letsencrypt-production-dns\n dns01:\n # Here we define a list of DNS-01 providers that can solve DNS challenges\n providers:\n - name: aws-route53\n route53:\n accessKeyID: ${EKS_CERT_MANAGER_ROUTE53_AWS_ACCESS_KEY_ID}\n region: eu-central-1\n secretAccessKeySecretRef:\n name: aws-route53-secret-access-key-secret\n key: secret-access-key\n")])])]),a("h2",{attrs:{id:"generate-tls-certificate"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#generate-tls-certificate"}},[e._v("#")]),e._v(" Generate TLS certificate")]),e._v(" "),a("p",[e._v("Create certificate using cert-manager:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("envsubst "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),e._v(" files/cert-manager-letsencrypt-aws-route53-certificate.yaml "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" kubectl apply "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-f")]),e._v(" -\nenvsubst "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),e._v(" files/cert-manager-letsencrypt-aws-route53-certificate.yaml\n")])])]),a("p",[e._v("Output:")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("div",{staticClass:"highlight-lines"},[a("br"),a("br"),a("br"),a("br"),a("div",{staticClass:"highlighted"},[e._v(" ")]),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br")]),a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v('certificate.certmanager.k8s.io/ingress-cert-production created\napiVersion: certmanager.k8s.io/v1alpha1\nkind: Certificate\nmetadata:\n name: ingress-cert-production\n namespace: cert-manager\nspec:\n secretName: ingress-cert-production\n issuerRef:\n kind: ClusterIssuer\n name: letsencrypt-production-dns\n commonName: "*.mylabs.dev"\n dnsNames:\n - "*.mylabs.dev"\n acme:\n config:\n - dns01:\n provider: aws-route53\n domains:\n - "*.mylabs.dev"\n')])])]),a("p",[e._v("("),a("a",{attrs:{href:"https://www.openshift.com/blog/self-serviced-end-to-end-encryption-approaches-for-applications-deployed-in-openshift",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://www.openshift.com/blog/self-serviced-end-to-end-encryption-approaches-for-applications-deployed-in-openshift"),a("OutboundLink")],1),e._v(")")]),e._v(" "),a("h2",{attrs:{id:"install-kubed"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#install-kubed"}},[e._v("#")]),e._v(" Install kubed")]),e._v(" "),a("p",[e._v("It's necessary to copy the wildcard certificate across all \"future\" namespaces\nand that's the reason why "),a("a",{attrs:{href:"https://github.com/appscode/kubed",target:"_blank",rel:"noopener noreferrer"}},[e._v("kubed"),a("OutboundLink")],1),e._v(" needs to be\ninstalled (for now).\n"),a("a",{attrs:{href:"https://github.com/appscode/kubed",target:"_blank",rel:"noopener noreferrer"}},[e._v("kubed"),a("OutboundLink")],1),e._v(" can "),a("a",{attrs:{href:"https://appscode.com/products/kubed/",target:"_blank",rel:"noopener noreferrer"}},[e._v("synchronize ConfigMaps/Secrets"),a("OutboundLink")],1),e._v("\nacross Kubernetes namespaces/clusters.")]),e._v(" "),a("p",[e._v("Kubed - synchronize secret diagram:")]),e._v(" "),a("p",[a("img",{attrs:{src:s(303),alt:"Kubed - synchronize secret",title:"Kubed - synchronize secret"}})]),e._v(" "),a("p",[e._v("Add kubed helm repository:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("helm repo "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("add")]),e._v(" appscode https://charts.appscode.com/stable/\n")])])]),a("p",[e._v("Output:")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v('"appscode" has been added to your repositories\n')])])]),a("p",[e._v("Install kubed:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("helm "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" appscode/kubed "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--name")]),e._v(" kubed "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--version")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0.11")]),e._v(".0 "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--namespace")]),e._v(" kube-system "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--wait")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--set")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("config.clusterName")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("my_k8s_cluster "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--set")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("apiserver.enabled")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("false\n")])])]),a("p",[e._v("Output:")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v('NAME: kubed\nLAST DEPLOYED: Fri Jul 19 11:48:10 2019\nNAMESPACE: kube-system\nSTATUS: DEPLOYED\n\nRESOURCES:\n==> v1/ClusterRole\nNAME AGE\nkubed-kubed 4s\n\n==> v1/ClusterRoleBinding\nNAME AGE\nkubed-kubed 4s\nkubed-kubed-apiserver-auth-delegator 4s\n\n==> v1/Pod(related)\nNAME READY STATUS RESTARTS AGE\nkubed-kubed-75789b6cc6-6zrst 0/1 ContainerCreating 0 4s\n\n==> v1/RoleBinding\nNAME AGE\nkubed-kubed-apiserver-extension-server-authentication-reader 4s\n\n==> v1/Secret\nNAME TYPE DATA AGE\nkubed-kubed Opaque 1 4s\nkubed-kubed-apiserver-cert Opaque 2 4s\n\n==> v1/Service\nNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\nkubed-kubed ClusterIP 10.100.193.123 <none> 443/TCP 4s\n\n==> v1/ServiceAccount\nNAME SECRETS AGE\nkubed-kubed 1 4s\n\n==> v1beta1/Deployment\nNAME READY UP-TO-DATE AVAILABLE AGE\nkubed-kubed 0/1 1 0 4s\n\n\nNOTES:\nTo verify that Kubed has started, run:\n\n kubectl --namespace=kube-system get deployments -l "release=kubed, app=kubed"\n')])])]),a("p",[e._v("Annotate (mark) the cert-manager secret to be copied to other namespaces\nif necessary:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("kubectl annotate secret ingress-cert-"),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("${LETSENCRYPT_ENVIRONMENT}")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-n")]),e._v(" cert-manager kubed.appscode.com/sync"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"app=kubed"')]),e._v("\n")])])]),a("p",[e._v("Output:")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("secret/ingress-cert-production annotated\n")])])]),a("h2",{attrs:{id:"install-nginx-ingress"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#install-nginx-ingress"}},[e._v("#")]),e._v(" Install nginx-ingress")]),e._v(" "),a("p",[a("img",{attrs:{src:"https://camo.githubusercontent.com/b2184aaf45a035d28011cf0eb4de2d2e70a2b5c43cc2b5645889bc156251f23e/68747470733a2f2f7869616f7275692d63632e6f73732d636e2d68616e677a686f752e616c6979756e63732e636f6d2f696d616765732f3230323330312f3230323330313031303032313439372e706e67",alt:"Nginx Ingress controller",title:"Nginx Ingress controller"}})]),e._v(" "),a("p",[e._v("("),a("a",{attrs:{href:"https://www.nginx.com/blog/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://www.nginx.com/blog/"),a("OutboundLink")],1),e._v(")")]),e._v(" "),a("p",[e._v("Install nginx-ingress which will also create a new loadbalancer:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("helm "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" stable/nginx-ingress "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--wait")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--name")]),e._v(" nginx-ingress "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--namespace")]),e._v(" nginx-ingress-system "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--version")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("1.24")]),e._v(".3 "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--set")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("rbac.create")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("true "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--set")]),e._v(" controller.extraArgs.default-ssl-certificate"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("cert-manager/ingress-cert-"),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("${LETSENCRYPT_ENVIRONMENT}")]),e._v("\n")])])]),a("p",[e._v("Output:")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("NAME: nginx-ingress\nLAST DEPLOYED: Fri Jul 19 11:48:17 2019\nNAMESPACE: nginx-ingress-system\nSTATUS: DEPLOYED\n\nRESOURCES:\n==> v1/ConfigMap\nNAME DATA AGE\nnginx-ingress-controller 1 8s\n\n==> v1/Pod(related)\nNAME READY STATUS RESTARTS AGE\nnginx-ingress-controller-7b59c7c7bc-nhmq8 0/1 ContainerCreating 0 8s\nnginx-ingress-default-backend-6d489448cb-d9brb 1/1 Running 0 8s\n\n==> v1/Service\nNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\nnginx-ingress-controller LoadBalancer 10.100.37.102 a55fd2fadaa0a... 80:30958/TCP,443:31932/TCP 8s\nnginx-ingress-default-backend ClusterIP 10.100.15.87 <none> 80/TCP 8s\n\n==> v1/ServiceAccount\nNAME SECRETS AGE\nnginx-ingress 1 8s\n\n==> v1beta1/ClusterRole\nNAME AGE\nnginx-ingress 8s\n\n==> v1beta1/ClusterRoleBinding\nNAME AGE\nnginx-ingress 8s\n\n==> v1beta1/Deployment\nNAME READY UP-TO-DATE AVAILABLE AGE\nnginx-ingress-controller 0/1 1 0 8s\nnginx-ingress-default-backend 1/1 1 1 8s\n\n==> v1beta1/Role\nNAME AGE\nnginx-ingress 8s\n\n==> v1beta1/RoleBinding\nNAME AGE\nnginx-ingress 8s\n\n\nNOTES:\nThe nginx-ingress controller has been installed.\nIt may take a few minutes for the LoadBalancer IP to be available.\nYou can watch the status by running 'kubectl --namespace nginx-ingress-system get services -o wide -w nginx-ingress-controller'\n\nAn example Ingress that makes use of the controller:\n\n apiVersion: extensions/v1beta1\n kind: Ingress\n metadata:\n annotations:\n kubernetes.io/ingress.class: nginx\n name: example\n namespace: foo\n spec:\n rules:\n - host: www.example.com\n http:\n paths:\n - backend:\n serviceName: exampleService\n servicePort: 80\n path: /\n # This section is only required if TLS is to be enabled for the Ingress\n tls:\n - hosts:\n - www.example.com\n secretName: example-tls\n\nIf TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided:\n\n apiVersion: v1\n kind: Secret\n metadata:\n name: example-tls\n namespace: foo\n data:\n tls.crt: <base64 encoded cert>\n tls.key: <base64 encoded key>\n type: kubernetes.io/tls\n")])])]),a("h2",{attrs:{id:"create-dns-records"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#create-dns-records"}},[e._v("#")]),e._v(" Create DNS records")]),e._v(" "),a("p",[e._v("nginx-ingress created the loadbalancer service. In case of AWS it is\nClassic Elastic Loadbalancer:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("kubectl get "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("service")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-n")]),e._v(" nginx-ingress-system\n")])])]),a("p",[e._v("Output:")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("div",{staticClass:"highlight-lines"},[a("br"),a("div",{staticClass:"highlighted"},[e._v(" ")]),a("br"),a("br")]),a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\nnginx-ingress-controller LoadBalancer 10.100.37.102 a55fd2fadaa0a11e9bcf2026dca96845-1478956562.eu-central-1.elb.amazonaws.com 80:30958/TCP,443:31932/TCP 8s\nnginx-ingress-default-backend ClusterIP 10.100.15.87 <none> 80/TCP 8s\n")])])]),a("p",[e._v("Create DNS record "),a("code",[e._v("mylabs.dev")]),e._v(" for the loadbalancer created by nginx-ingress:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("LOADBALANCER_HOSTNAME")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("kubectl get svc nginx-ingress-controller "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-n")]),e._v(" nginx-ingress-system "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-o")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("jsonpath")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"{.status.loadBalancer.ingress[0].hostname}"')]),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("CANONICAL_HOSTED_ZONE_NAME_ID")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("aws elb describe-load-balancers "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--query")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"LoadBalancerDescriptions[?DNSName==\\'),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("`")]),e._v("$LOADBALANCER_HOSTNAME"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("`")])]),e._v('].CanonicalHostedZoneNameID"')]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--output")]),e._v(" text"),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("HOSTED_ZONE_ID")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("aws route53 list-hosted-zones "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--query")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"HostedZones[?Name==\\'),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("`")]),e._v("$"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("MY_DOMAIN"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("."),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("`")])]),e._v('].Id"')]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--output")]),e._v(" text"),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n\nenvsubst "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),e._v(" files/aws_route53-dns_change.json "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" aws route53 change-resource-record-sets --hosted-zone-id "),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("${HOSTED_ZONE_ID}")]),e._v(" --change-batch"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("file:///dev/stdin "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" jq\n")])])]),a("p",[e._v("Output:")]),e._v(" "),a("div",{staticClass:"language-json extra-class"},[a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[e._v('"ChangeInfo"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[e._v('"Id"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"/change/C2YV79SSX0CS95"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[e._v('"Status"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"PENDING"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[e._v('"SubmittedAt"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"2019-07-19T09:48:29.092Z"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[e._v('"Comment"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"A new record set for the zone."')]),e._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),a("p",[e._v("Wait for completion of certificate create process:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("COUNT")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("OUTPUT")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("while")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("${OUTPUT}")]),e._v('"')]),e._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("!=")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"True"')]),e._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("&&")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("${COUNT}")]),e._v('"')]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-lt")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("100")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("do")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("COUNT")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$((")]),e._v("COUNT"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("+")]),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("))")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("OUTPUT")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("kubectl get certificate ingress-cert-$"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("LETSENCRYPT_ENVIRONMENT"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-n")]),e._v(" cert-manager "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-o")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("jsonpath")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"{.status.conditions[0].status}"')]),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sleep")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("echo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-n")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("${COUNT}")]),e._v(' "')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("done")]),e._v("\n")])])]),a("p",[a("img",{attrs:{src:"https://raw.githubusercontent.com/aws-samples/eks-workshop/65b766c494a5b4f5420b2912d8373c4957163541/static/images/crystal.svg?sanitize=true",alt:"Architecture",title:"Architecture"}})]),e._v(" "),a("p",[e._v("You should see the following output form cert-manager when looking at\ncertificates:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("kubectl describe certificates "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-n")]),e._v(" cert-manager ingress-cert-"),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("${LETSENCRYPT_ENVIRONMENT}")]),e._v("\n")])])]),a("p",[e._v("Output")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("div",{staticClass:"highlight-lines"},[a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("div",{staticClass:"highlighted"},[e._v(" ")]),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br")]),a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v('Name: ingress-cert-production\nNamespace: cert-manager\nLabels: <none>\nAnnotations: kubectl.kubernetes.io/last-applied-configuration:\n {"apiVersion":"certmanager.k8s.io/v1alpha1","kind":"Certificate","metadata":{"annotations":{},"name":"ingress-cert-production","namespace"...\nAPI Version: certmanager.k8s.io/v1alpha1\nKind: Certificate\nMetadata:\n Creation Timestamp: 2019-07-19T09:48:10Z\n Generation: 4\n Resource Version: 2919\n Self Link: /apis/certmanager.k8s.io/v1alpha1/namespaces/cert-manager/certificates/ingress-cert-production\n UID: 5131721b-aa0a-11e9-bcf2-026dca968456\nSpec:\n Acme:\n Config:\n Dns 01:\n Provider: aws-route53\n Domains:\n *.mylabs.dev\n Common Name: *.mylabs.dev\n Dns Names:\n *.mylabs.dev\n Issuer Ref:\n Kind: ClusterIssuer\n Name: letsencrypt-production-dns\n Secret Name: ingress-cert-production\nStatus:\n Conditions:\n Last Transition Time: 2019-07-19T09:49:54Z\n Message: Certificate is up to date and has not expired\n Reason: Ready\n Status: True\n Type: Ready\n Not After: 2019-10-17T08:49:53Z\nEvents:\n Type Reason Age From Message\n ---- ------ ---- ---- -------\n Warning IssuerNotReady 105s (x2 over 105s) cert-manager Issuer letsencrypt-production-dns not ready\n Normal Generated 105s cert-manager Generated new private key\n Normal GenerateSelfSigned 105s cert-manager Generated temporary self signed certificate\n Normal OrderCreated 105s cert-manager Created Order resource "ingress-cert-production-20059064"\n Normal OrderComplete 1s cert-manager Order "ingress-cert-production-20059064" completed successfully\n Normal CertIssued 1s cert-manager Certificate issued successfully\n')])])]),a("p",[e._v('The Kubernetes "secret" in '),a("code",[e._v("cert-manager")]),e._v(" namespace should contain the\ncertificates:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("kubectl describe secret "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-n")]),e._v(" cert-manager ingress-cert-"),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("${LETSENCRYPT_ENVIRONMENT}")]),e._v("\n")])])]),a("p",[e._v("Output:")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("Name: ingress-cert-production\nNamespace: cert-manager\nLabels: certmanager.k8s.io/certificate-name=ingress-cert-production\nAnnotations: certmanager.k8s.io/alt-names: *.mylabs.dev\n certmanager.k8s.io/common-name: *.mylabs.dev\n certmanager.k8s.io/ip-sans:\n certmanager.k8s.io/issuer-kind: ClusterIssuer\n certmanager.k8s.io/issuer-name: letsencrypt-production-dns\n kubed.appscode.com/sync: app=kubed\n\nType: kubernetes.io/tls\n\nData\n====\nca.crt: 0 bytes\ntls.crt: 3550 bytes\ntls.key: 1675 bytes\n")])])]),a("p",[e._v("Check the SSL certificate:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("while")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("!")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("echo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" openssl s_client "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-showcerts")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-connect")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("${MY_DOMAIN}")]),e._v(":443 "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("&>")]),e._v(" /dev/null"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("do")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sleep")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("echo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-n")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('". "')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("done")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("echo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" openssl s_client "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-showcerts")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-connect")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("${MY_DOMAIN}")]),e._v(":443 "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" openssl x509 "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-inform")]),e._v(" pem "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-noout")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-text")]),e._v("\n")])])]),a("p",[e._v("Output:")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("div",{staticClass:"highlight-lines"},[a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("div",{staticClass:"highlighted"},[e._v(" ")]),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br")]),a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3\nverify return:1\ndepth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3\nverify return:1\ndepth=0 CN = *.mylabs.dev\nverify return:1\nDONE\nCertificate:\n Data:\n Version: 3 (0x2)\n Serial Number:\n 03:cf:14:18:90:0e:c8:7f:c2:39:eb:e5:dc:42:d7:c6:7a:a6\n Signature Algorithm: sha256WithRSAEncryption\n Issuer: C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3\n Validity\n Not Before: Jul 19 08:49:53 2019 GMT\n Not After : Oct 17 08:49:53 2019 GMT\n Subject: CN = *.mylabs.dev\n Subject Public Key Info:\n Public Key Algorithm: rsaEncryption\n RSA Public-Key: (2048 bit)\n Modulus:\n...\n Exponent: 65537 (0x10001)\n X509v3 extensions:\n X509v3 Key Usage: critical\n Digital Signature, Key Encipherment\n X509v3 Extended Key Usage:\n TLS Web Server Authentication, TLS Web Client Authentication\n X509v3 Basic Constraints: critical\n CA:FALSE\n X509v3 Subject Key Identifier:\n 44:C9:D2:B1:71:D6:94:92:67:DB:8C:C9:7E:0C:68:10:C3:10:41:D9\n X509v3 Authority Key Identifier:\n keyid:A8:4A:6A:63:04:7D:DD:BA:E6:D1:39:B7:A6:45:65:EF:F3:A8:EC:A1\n\n Authority Information Access:\n OCSP - URI:http://ocsp.int-x3.letsencrypt.org\n CA Issuers - URI:http://cert.int-x3.letsencrypt.org/\n\n X509v3 Subject Alternative Name:\n DNS:*.mylabs.dev\n X509v3 Certificate Policies:\n Policy: 2.23.140.1.2.1\n Policy: 1.3.6.1.4.1.44947.1.1.1\n CPS: http://cps.letsencrypt.org\n...\n")])])])])}),[],!1,null,null,null);a.default=r.exports}}]);
\ No newline at end of file
diff --git a/assets/js/3.d9eaaa0b.js b/assets/js/3.d9eaaa0b.js
new file mode 100644
index 00000000..872548f0
--- /dev/null
+++ b/assets/js/3.d9eaaa0b.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[3,20,23],{246:function(t,e,n){"use strict";n.d(e,"d",(function(){return r})),n.d(e,"a",(function(){return s})),n.d(e,"i",(function(){return a})),n.d(e,"f",(function(){return l})),n.d(e,"g",(function(){return u})),n.d(e,"h",(function(){return c})),n.d(e,"b",(function(){return p})),n.d(e,"e",(function(){return d})),n.d(e,"k",(function(){return h})),n.d(e,"l",(function(){return f})),n.d(e,"c",(function(){return g})),n.d(e,"j",(function(){return m}));n(92);const r=/#.*$/,i=/\.(md|html)$/,s=/\/$/,a=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(r,"").replace(i,"")}function l(t){return a.test(t)}function u(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function p(t){if(l(t))return t;const e=t.match(r),n=e?e[0]:"",i=o(t);return s.test(i)?t:i+".html"+n}function d(t,e){const n=decodeURIComponent(t.hash),i=function(t){const e=t.match(r);if(e)return e[0]}(e);if(i&&n!==i)return!1;return o(t.path)===o(e)}function h(t,e,n){if(l(e))return{type:"external",path:e};n&&(e=function(t,e,n){const r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return e+t;const i=e.split("/");n&&i[i.length-1]||i.pop();const s=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,r,i=1){if("string"==typeof e)return h(n,e,r);if(Array.isArray(e))return Object.assign(h(n,e[0],r),{title:e[1]});{const s=e.children||[];return 0===s.length&&e.path?Object.assign(h(n,e.path,r),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:s.map(e=>t(e,n,r,i+1)),collapsable:!1!==e.collapsable}}}(t,i,n)):[]}return[]}function b(t){const e=g(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function g(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function m(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},247:function(t,e,n){},249:function(t,e,n){"use strict";n.r(e);var r={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},i=(n(250),n(8)),s=Object(i.a)(r,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=s.exports},250:function(t,e,n){"use strict";n(247)},252:function(t,e,n){},257:function(t,e,n){},259:function(t,e,n){"use strict";n(252)},260:function(t,e,n){"use strict";n.r(e);var r=n(273),i=n(262),s=n(246);function a(t,e){if("group"===e.type){const n=e.path&&Object(s.e)(t,e.path),r=e.children.some(e=>"group"===e.type?a(t,e):"page"===e.type&&Object(s.e)(t,e.path));return n||r}return!1}var o={name:"SidebarLinks",components:{SidebarGroup:r.default,SidebarLink:i.default},props:["items","depth","sidebarDepth","initialOpenGroupIndex"],data(){return{openGroupIndex:this.initialOpenGroupIndex||0}},watch:{$route(){this.refreshIndex()}},created(){this.refreshIndex()},methods:{refreshIndex(){const t=function(t,e){for(let n=0;n-1&&(this.openGroupIndex=t)},toggleGroup(t){this.openGroupIndex=t===this.openGroupIndex?-1:t},isActive(t){return Object(s.e)(this.$route,t.regularPath)}}},l=n(8),u=Object(l.a)(o,(function(){var t=this,e=t._self._c;return t.items.length?e("ul",{staticClass:"sidebar-links"},t._l(t.items,(function(n,r){return e("li",{key:r},["group"===n.type?e("SidebarGroup",{attrs:{item:n,open:r===t.openGroupIndex,collapsable:n.collapsable||n.collapsible,depth:t.depth},on:{toggle:function(e){return t.toggleGroup(r)}}}):e("SidebarLink",{attrs:{"sidebar-depth":t.sidebarDepth,item:n}})],1)})),0):t._e()}),[],!1,null,null,null);e.default=u.exports},262:function(t,e,n){"use strict";n.r(e);var r=n(246);function i(t,e,n,r,i){const s={props:{to:e,activeClass:"",exactActiveClass:""},class:{active:r,"sidebar-link":!0}};return i>2&&(s.style={"padding-left":i+"rem"}),t("RouterLink",s,n)}function s(t,e,n,a,o,l=1){return!e||l>o?null:t("ul",{class:"sidebar-sub-headers"},e.map(e=>{const u=Object(r.e)(a,n+"#"+e.slug);return t("li",{class:"sidebar-sub-header"},[i(t,n+"#"+e.slug,e.title,u,e.level-1),s(t,e.children,n,a,o,l+1)])}))}var a={functional:!0,props:["item","sidebarDepth"],render(t,{parent:{$page:e,$site:n,$route:a,$themeConfig:o,$themeLocaleConfig:l},props:{item:u,sidebarDepth:c}}){const p=Object(r.e)(a,u.path),d="auto"===u.type?p||u.children.some(t=>Object(r.e)(a,u.basePath+"#"+t.slug)):p,h="external"===u.type?function(t,e,n){return t("a",{attrs:{href:e,target:"_blank",rel:"noopener noreferrer"},class:{"sidebar-link":!0}},[n,t("OutboundLink")])}(t,u.path,u.title||u.path):i(t,u.path,u.title||u.path,d),f=[e.frontmatter.sidebarDepth,c,l.sidebarDepth,o.sidebarDepth,1].find(t=>void 0!==t),b=l.displayAllHeaders||o.displayAllHeaders;if("auto"===u.type)return[h,s(t,u.children,u.basePath,a,f)];if((d||b)&&u.headers&&!r.d.test(u.path)){return[h,s(t,Object(r.c)(u.headers),u.path,a,f)]}return h}},o=(n(259),n(8)),l=Object(o.a)(a,void 0,void 0,!1,null,null,null);e.default=l.exports},270:function(t,e,n){"use strict";n(257)},273:function(t,e,n){"use strict";n.r(e);var r=n(246),i={name:"SidebarGroup",components:{DropdownTransition:n(249).default},props:["item","open","collapsable","depth"],beforeCreate(){this.$options.components.SidebarLinks=n(260).default},methods:{isActive:r.e}},s=(n(270),n(8)),a=Object(s.a)(i,(function(){var t=this,e=t._self._c;return e("section",{staticClass:"sidebar-group",class:[{collapsable:t.collapsable,"is-sub-group":0!==t.depth},"depth-"+t.depth]},[t.item.path?e("RouterLink",{staticClass:"sidebar-heading clickable",class:{open:t.open,active:t.isActive(t.$route,t.item.path)},attrs:{to:t.item.path},nativeOn:{click:function(e){return t.$emit("toggle")}}},[e("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?e("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]):e("p",{staticClass:"sidebar-heading",class:{open:t.open},on:{click:function(e){return t.$emit("toggle")}}},[e("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?e("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]),t._v(" "),e("DropdownTransition",[t.open||!t.collapsable?e("SidebarLinks",{staticClass:"sidebar-group-items",attrs:{items:t.item.children,"sidebar-depth":t.item.sidebarDepth,"initial-open-group-index":t.item.initialOpenGroupIndex,depth:t.depth+1}}):t._e()],1)],1)}),[],!1,null,null,null);e.default=a.exports}}]);
\ No newline at end of file
diff --git a/assets/js/30.7bad3658.js b/assets/js/30.7bad3658.js
new file mode 100644
index 00000000..e531ea6e
--- /dev/null
+++ b/assets/js/30.7bad3658.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[30],{341:function(e,t,a){"use strict";a.r(t);var s=a(8),r=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"install-helm"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#install-helm"}},[e._v("#")]),e._v(" Install Helm")]),e._v(" "),t("p",[e._v("Install "),t("a",{attrs:{href:"https://helm.sh/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Helm"),t("OutboundLink")],1),e._v(" binary:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-s")]),e._v(" https://raw.githubusercontent.com/helm/helm/master/scripts/get "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("bash")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-s")]),e._v(" -- "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--version")]),e._v(" v2.16.1\n")])])]),t("p",[e._v("Output:")]),e._v(" "),t("div",{staticClass:"language-text extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("Helm v2.16.1 is already v2.16.1\nRun 'helm init' to configure helm.\n")])])]),t("p",[e._v("Install Tiller (the Helm server-side component) into the Kubernetes cluster:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("kubectl create serviceaccount tiller "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--namespace")]),e._v(" kube-system\nkubectl create clusterrolebinding tiller-cluster-rule "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--clusterrole")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("cluster-admin "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--serviceaccount")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("kube-system:tiller\nhelm init "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--wait")]),e._v(" --service-account tiller\n")])])]),t("p",[e._v("Output:")]),e._v(" "),t("div",{staticClass:"language-text extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("Creating /home/pruzicka/.helm\nCreating /home/pruzicka/.helm/repository\nCreating /home/pruzicka/.helm/repository/cache\nCreating /home/pruzicka/.helm/repository/local\nCreating /home/pruzicka/.helm/plugins\nCreating /home/pruzicka/.helm/starters\nCreating /home/pruzicka/.helm/cache/archive\nCreating /home/pruzicka/.helm/repository/repositories.yaml\nAdding stable repo with URL: https://kubernetes-charts.storage.googleapis.com\nAdding local repo with URL: http://127.0.0.1:8879/charts\n$HELM_HOME has been configured at /home/pruzicka/.helm.\n\nTiller (the Helm server-side component) has been installed into your Kubernetes Cluster.\n\nPlease note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.\nTo prevent this, run `helm init` with the --tiller-tls-verify flag.\nFor more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installation\nHappy Helming!\n")])])]),t("p",[e._v("Check if the tiller was installed properly:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("kubectl get pods "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-l")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("app")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("helm "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-n")]),e._v(" kube-system\n")])])]),t("p",[e._v("Output:")]),e._v(" "),t("div",{staticClass:"language-text extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("NAME READY STATUS RESTARTS AGE\ntiller-deploy-845fb7cfc6-k47c2 1/1 Running 0 9s\n")])])]),t("p",[e._v("Add "),t("a",{attrs:{href:"https://github.com/chartmuseum/helm-push",target:"_blank",rel:"noopener noreferrer"}},[e._v("Helm plugin"),t("OutboundLink")],1),e._v(" to push chart\npackage to "),t("a",{attrs:{href:"https://chartmuseum.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("ChartMuseum"),t("OutboundLink")],1),e._v(":")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("helm plugin list "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("grep")]),e._v(" ^push "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("||")]),e._v(" helm plugin "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" https://github.com/chartmuseum/helm-push\n")])])]),t("p",[e._v("Output:")]),e._v(" "),t("div",{staticClass:"language-text extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("Downloading and installing helm-push v0.7.1 ...\nhttps://github.com/chartmuseum/helm-push/releases/download/v0.7.1/helm-push_0.7.1_linux_amd64.tar.gz\nInstalled plugin: push\n")])])]),t("p",[t("img",{attrs:{src:"https://raw.githubusercontent.com/helm/chartmuseum/f8b563ea87317eb490eefd51f74d43b0f466d132/logo2.png",alt:"Helm Chart Repository",title:"Helm Chart Repository"}})])])}),[],!1,null,null,null);t.default=r.exports}}]);
\ No newline at end of file
diff --git a/assets/js/31.b1273fb8.js b/assets/js/31.b1273fb8.js
new file mode 100644
index 00000000..ce4d2f9e
--- /dev/null
+++ b/assets/js/31.b1273fb8.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{348:function(a,e,s){"use strict";s.r(e);var t=s(8),r=Object(t.a)({},(function(){var a=this,e=a._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h1",{attrs:{id:"clean-up"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#clean-up"}},[a._v("#")]),a._v(" Clean-up")]),a._v(" "),e("p",[e("img",{attrs:{src:"https://raw.githubusercontent.com/aws-samples/eks-workshop/65b766c494a5b4f5420b2912d8373c4957163541/static/images/cleanup.svg?sanitize=true",alt:"Clean-up",title:"Clean-up"}})]),a._v(" "),e("hr"),a._v(" "),e("p",[a._v("Configure "),e("code",[a._v("kubeconfig")]),a._v(":")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("MY_DOMAIN")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[a._v('"mylabs.dev"')]),a._v("\neksctl utils write-kubeconfig "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--kubeconfig")]),a._v(" kubeconfig.conf "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--name")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),e("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("-k8s-harbor\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("KUBECONFIG")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${KUBECONFIG"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":-")]),a._v("$PWD"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("/")]),a._v("kubeconfig.conf}")]),a._v("\n")])])]),e("p",[a._v("Remove Windows Server 2016 CloudFormation stack:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("aws cloudformation delete-stack --stack-name eksctl-"),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),e("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("-k8s-harbor-cluster-windows-server-2016\n")])])]),e("p",[a._v("Remove Gitea:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("helm delete "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--purge")]),a._v(" gitea\nkubectl delete namespace gitea-system "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--wait")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("false\n")])])]),e("p",[a._v("Remove Harbor:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("helm delete "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--purge")]),a._v(" harbor\nkubectl delete namespace harbor-system "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--wait")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("false\n")])])]),e("p",[a._v("Remove kubed:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("helm delete "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--purge")]),a._v(" kubed\n")])])]),e("p",[a._v("Remove cert-manager:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("helm delete "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--purge")]),a._v(" cert-manager\nkubectl delete "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-f")]),a._v(" https://raw.githubusercontent.com/jetstack/cert-manager/release-0.10/deploy/manifests/00-crds.yaml "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--wait")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("false\nkubectl delete namespace cert-manager "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--wait")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("false\n")])])]),e("p",[a._v("Remove Nginx-ingress:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("helm delete "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--purge")]),a._v(" nginx-ingress\nkubectl delete namespace nginx-ingress-system "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--wait")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("false\nkubectl delete namespace mytest "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--wait")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("false\n")])])]),e("p",[a._v("Cleanup + Remove Helm:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("helm repo remove harbor jetstack appscode library\nhelm reset --remove-helm-home\nkubectl delete serviceaccount tiller "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--namespace")]),a._v(" kube-system "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--wait")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("false\nkubectl delete clusterrolebinding tiller-cluster-rule "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--wait")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("false\n")])])]),e("p",[a._v("Output:")]),a._v(" "),e("div",{staticClass:"language-text extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[a._v("Deleting /home/pruzicka/.helm\nTiller (the Helm server-side component) has been uninstalled from your Kubernetes Cluster.\n")])])]),e("p",[a._v("Remove EKS cluster:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("eksctl delete cluster "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--name")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),e("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("-k8s-harbor\n")])])]),e("p",[a._v("Output:")]),a._v(" "),e("div",{staticClass:"language-text extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[a._v('[ℹ] using region eu-central-1\n[ℹ] deleting EKS cluster "pruzicka-k8s-harbor"\n[✔] kubeconfig has been updated\n[ℹ] 2 sequential tasks: { delete nodegroup "ng-d1b535b2", delete cluster control plane "pruzicka-k8s-harbor" [async] }\n[ℹ] will delete stack "eksctl-pruzicka-k8s-harbor-nodegroup-ng-d1b535b2"\n[ℹ] waiting for stack "eksctl-pruzicka-k8s-harbor-nodegroup-ng-d1b535b2" to get deleted\n[ℹ] will delete stack "eksctl-pruzicka-k8s-harbor-cluster"\n[✔] all cluster resources were deleted\n')])])]),e("p",[a._v("Clean Policy, User, Access Key in AWS:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[a._v('# aws route53 delete-hosted-zone --id $(aws route53 list-hosted-zones --query "HostedZones[?Name==\\`${MY_DOMAIN}.\\`].Id" --output text)')]),a._v("\naws iam detach-user-policy --user-name "),e("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),e("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v('-eks-cert-manager-route53"')]),a._v(" --policy-arn "),e("span",{pre:!0,attrs:{class:"token variable"}},[e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),a._v("aws iam list-policies "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--query")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Policies[?PolicyName==\\'),e("span",{pre:!0,attrs:{class:"token variable"}},[e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("`")]),a._v("$"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),e("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("-AmazonRoute53Domains-cert-manager"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("`")])]),a._v('].{ARN:Arn}"')]),a._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--output")]),a._v(" text"),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v("\naws iam delete-policy --policy-arn "),e("span",{pre:!0,attrs:{class:"token variable"}},[e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),a._v("aws iam list-policies "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--query")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Policies[?PolicyName==\\'),e("span",{pre:!0,attrs:{class:"token variable"}},[e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("`")]),a._v("$"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),e("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("-AmazonRoute53Domains-cert-manager"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("`")])]),a._v('].{ARN:Arn}"')]),a._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--output")]),a._v(" text"),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v("\naws iam delete-access-key --user-name "),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),e("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("-eks-cert-manager-route53 --access-key-id "),e("span",{pre:!0,attrs:{class:"token variable"}},[e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),a._v("aws iam list-access-keys --user-name $"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),e("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("-eks-cert-manager-route53 "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--query")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[a._v('"AccessKeyMetadata[].AccessKeyId"')]),a._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--output")]),a._v(" text"),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v("\naws iam delete-user --user-name "),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),e("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("-eks-cert-manager-route53\n")])])]),e("p",[a._v("Docker clean-up:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("test")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-d")]),a._v(" ~/.docker/ "),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("rm")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-rf")]),a._v(" ~/.docker/\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("DOCKER_CONTAINERS")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),e("span",{pre:!0,attrs:{class:"token variable"}},[e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("docker")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("ps")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-a")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-q")]),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-n")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${DOCKER_CONTAINERS}")]),a._v('"')]),a._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("docker")]),a._v(" stop "),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${DOCKER_CONTAINERS}")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("docker")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("rm")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${DOCKER_CONTAINERS}")]),a._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("DOCKER_IMAGES")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),e("span",{pre:!0,attrs:{class:"token variable"}},[e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("docker")]),a._v(" images "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-q")]),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-n")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${DOCKER_IMAGES}")]),a._v('"')]),a._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("docker")]),a._v(" rmi "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--force")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${DOCKER_IMAGES}")]),a._v("\n")])])]),e("p",[a._v("Notary clean-up:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("test")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-d")]),a._v(" ~/.notary/ "),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("rm")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-rf")]),a._v(" ~/.notary/\n")])])]),e("p",[a._v("Docker certificate cleanup if exists:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("rm")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-rf")]),a._v(" /etc/docker/certs.d/harbor."),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("\n")])])]),e("p",[a._v("Remove "),e("code",[a._v("tmp")]),a._v(" directory:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[a._v("rm")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-rf")]),a._v(" tmp\n")])])]),e("p",[a._v("Remove other files:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[a._v("rm")]),a._v(" demo-magic.sh kubeconfig.conf README.sh "),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&>")]),a._v(" /dev/null\n")])])])])}),[],!1,null,null,null);e.default=r.exports}}]);
\ No newline at end of file
diff --git a/assets/js/4.54426d1d.js b/assets/js/4.54426d1d.js
new file mode 100644
index 00000000..4a3e5a28
--- /dev/null
+++ b/assets/js/4.54426d1d.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{284:function(t,e,n){},298:function(t,e,n){"use strict";n(284)},338:function(t,e,n){"use strict";n.r(e);var i={functional:!0,props:{type:{type:String,default:"tip"},text:String,vertical:{type:String,default:"top"}},render:(t,{props:e,slots:n})=>t("span",{class:["badge",e.type],style:{verticalAlign:e.vertical}},e.text||n().default)},p=(n(298),n(8)),l=Object(p.a)(i,void 0,void 0,!1,null,"15b7b770",null);e.default=l.exports}}]);
\ No newline at end of file
diff --git a/assets/js/5.57e51451.js b/assets/js/5.57e51451.js
new file mode 100644
index 00000000..01fc03b5
--- /dev/null
+++ b/assets/js/5.57e51451.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{285:function(t,e,a){},299:function(t,e,a){"use strict";a(285)},334:function(t,e,a){"use strict";a.r(e);var s={name:"CodeBlock",props:{title:{type:String,required:!0},active:{type:Boolean,default:!1}},mounted(){this.$parent&&this.$parent.loadTabs&&this.$parent.loadTabs()}},i=(a(299),a(8)),n=Object(i.a)(s,(function(){return(0,this._self._c)("div",{staticClass:"theme-code-block",class:{"theme-code-block__active":this.active}},[this._t("default")],2)}),[],!1,null,"759a7d02",null);e.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/6.ca1ab2fc.js b/assets/js/6.ca1ab2fc.js
new file mode 100644
index 00000000..77cdd78f
--- /dev/null
+++ b/assets/js/6.ca1ab2fc.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{286:function(e,t,a){},300:function(e,t,a){"use strict";a(286)},335:function(e,t,a){"use strict";a.r(t);var o={name:"CodeGroup",data:()=>({codeTabs:[],activeCodeTabIndex:-1}),watch:{activeCodeTabIndex(e){this.activateCodeTab(e)}},mounted(){this.loadTabs()},methods:{changeCodeTab(e){this.activeCodeTabIndex=e},loadTabs(){this.codeTabs=(this.$slots.default||[]).filter(e=>Boolean(e.componentOptions)).map((e,t)=>(""===e.componentOptions.propsData.active&&(this.activeCodeTabIndex=t),{title:e.componentOptions.propsData.title,elm:e.elm})),-1===this.activeCodeTabIndex&&this.codeTabs.length>0&&(this.activeCodeTabIndex=0),this.activateCodeTab(0)},activateCodeTab(e){this.codeTabs.forEach(e=>{e.elm&&e.elm.classList.remove("theme-code-block__active")}),this.codeTabs[e].elm&&this.codeTabs[e].elm.classList.add("theme-code-block__active")}}},s=(a(300),a(8)),c=Object(s.a)(o,(function(){var e=this,t=e._self._c;return t("ClientOnly",[t("div",{staticClass:"theme-code-group"},[t("div",{staticClass:"theme-code-group__nav"},[t("ul",{staticClass:"theme-code-group__ul"},e._l(e.codeTabs,(function(a,o){return t("li",{key:a.title,staticClass:"theme-code-group__li"},[t("button",{staticClass:"theme-code-group__nav-tab",class:{"theme-code-group__nav-tab-active":o===e.activeCodeTabIndex},on:{click:function(t){return e.changeCodeTab(o)}}},[e._v("\n "+e._s(a.title)+"\n ")])])})),0)]),e._v(" "),e._t("default"),e._v(" "),e.codeTabs.length<1?t("pre",{staticClass:"pre-blank"},[e._v("// Make sure to add code blocks to your code group")]):e._e()],2)])}),[],!1,null,"deefee04",null);t.default=c.exports}}]);
\ No newline at end of file
diff --git a/assets/js/7.b9b9e65d.js b/assets/js/7.b9b9e65d.js
new file mode 100644
index 00000000..9f46fb39
--- /dev/null
+++ b/assets/js/7.b9b9e65d.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{336:function(t,e,s){"use strict";s.r(e);const o=["There's nothing here.","How did we get here?","That's a Four-Oh-Four.","Looks like we've got some broken links."];var n={methods:{getMsg:()=>o[Math.floor(Math.random()*o.length)]}},h=s(8),i=Object(h.a)(n,(function(){var t=this._self._c;return t("div",{staticClass:"theme-container"},[t("div",{staticClass:"theme-default-content"},[t("h1",[this._v("404")]),this._v(" "),t("blockquote",[this._v(this._s(this.getMsg()))]),this._v(" "),t("RouterLink",{attrs:{to:"/"}},[this._v("\n Take me home.\n ")])],1)])}),[],!1,null,null,null);e.default=i.exports}}]);
\ No newline at end of file
diff --git a/assets/js/app.f411144f.js b/assets/js/app.f411144f.js
new file mode 100644
index 00000000..08508807
--- /dev/null
+++ b/assets/js/app.f411144f.js
@@ -0,0 +1,16 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(t){function e(e){for(var r,a,s=e[0],c=e[1],u=e[2],f=0,p=[];f=e||n<0||m&&t-u>=i}function w(){var t=d();if(_(t))return x(t);s=setTimeout(w,function(t){var n=e-(t-c);return m?p(n,i-(t-u)):n}(t))}function x(t){return s=void 0,g&&r?y(t):(r=o=void 0,a)}function O(){var t=d(),n=_(t);if(r=arguments,o=this,c=t,n){if(void 0===s)return b(c);if(m)return s=setTimeout(w,e),y(c)}return void 0===s&&(s=setTimeout(w,e)),a}return e=v(e)||0,h(n)&&(l=!!n.leading,i=(m="maxWait"in n)?f(v(n.maxWait)||0,e):i,g="trailing"in n?!!n.trailing:g),O.cancel=function(){void 0!==s&&clearTimeout(s),u=0,r=c=o=s=void 0},O.flush=function(){return void 0===s?a:x(d())},O}},function(t,e,n){var r,o;
+/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress
+ * @license MIT */void 0===(o="function"==typeof(r=function(){var t,e,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:''};function o(t,e,n){return tn?n:t}function i(t){return 100*(-1+t)}n.configure=function(t){var e,n;for(e in t)void 0!==(n=t[e])&&t.hasOwnProperty(e)&&(r[e]=n);return this},n.status=null,n.set=function(t){var e=n.isStarted();t=o(t,r.minimum,1),n.status=1===t?null:t;var c=n.render(!e),u=c.querySelector(r.barSelector),l=r.speed,f=r.easing;return c.offsetWidth,a((function(e){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(u,function(t,e,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+i(t)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+i(t)+"%,0)"}:{"margin-left":i(t)+"%"}).transition="all "+e+"ms "+n,o}(t,l,f)),1===t?(s(c,{transition:"none",opacity:1}),c.offsetWidth,setTimeout((function(){s(c,{transition:"all "+l+"ms linear",opacity:0}),setTimeout((function(){n.remove(),e()}),l)}),l)):setTimeout(e,l)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var t=function(){setTimeout((function(){n.status&&(n.trickle(),t())}),r.trickleSpeed)};return r.trickle&&t(),this},n.done=function(t){return t||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(t){var e=n.status;return e?("number"!=typeof t&&(t=(1-e)*o(Math.random()*e,.1,.95)),e=o(e+t,0,.994),n.set(e)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},t=0,e=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===e&&n.start(),t++,e++,r.always((function(){0==--e?(t=0,n.done()):n.set((t-e)/t)})),this):this},n.render=function(t){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var e=document.createElement("div");e.id="nprogress",e.innerHTML=r.template;var o,a=e.querySelector(r.barSelector),c=t?"-100":i(n.status||0),l=document.querySelector(r.parent);return s(a,{transition:"all 0 linear",transform:"translate3d("+c+"%,0,0)"}),r.showSpinner||(o=e.querySelector(r.spinnerSelector))&&p(o),l!=document.body&&u(l,"nprogress-custom-parent"),l.appendChild(e),e},n.remove=function(){l(document.documentElement,"nprogress-busy"),l(document.querySelector(r.parent),"nprogress-custom-parent");var t=document.getElementById("nprogress");t&&p(t)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var t=document.body.style,e="WebkitTransform"in t?"Webkit":"MozTransform"in t?"Moz":"msTransform"in t?"ms":"OTransform"in t?"O":"";return e+"Perspective"in t?"translate3d":e+"Transform"in t?"translate":"margin"};var a=function(){var t=[];function e(){var n=t.shift();n&&n(e)}return function(n){t.push(n),1==t.length&&e()}}(),s=function(){var t=["Webkit","O","Moz","ms"],e={};function n(n){return n=n.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(t,e){return e.toUpperCase()})),e[n]||(e[n]=function(e){var n=document.body.style;if(e in n)return e;for(var r,o=t.length,i=e.charAt(0).toUpperCase()+e.slice(1);o--;)if((r=t[o]+i)in n)return r;return e}(n))}function r(t,e,r){e=n(e),t.style[e]=r}return function(t,e){var n,o,i=arguments;if(2==i.length)for(n in e)void 0!==(o=e[n])&&e.hasOwnProperty(n)&&r(t,n,o);else r(t,i[1],i[2])}}();function c(t,e){return("string"==typeof t?t:f(t)).indexOf(" "+e+" ")>=0}function u(t,e){var n=f(t),r=n+e;c(n,e)||(t.className=r.substring(1))}function l(t,e){var n,r=f(t);c(t,e)&&(n=r.replace(" "+e+" "," "),t.className=n.substring(1,n.length-1))}function f(t){return(" "+(t.className||"")+" ").replace(/\s+/gi," ")}function p(t){t&&t.parentNode&&t.parentNode.removeChild(t)}return n})?r.call(e,n,e,t):r)||(t.exports=o)},function(t,e,n){"use strict";var r=n(0),o=n(46).f,i=n(13),a=n(94),s=n(34),c=n(61),u=n(122);t.exports=function(t,e){var n,l,f,p,d,h=t.target,v=t.global,m=t.stat;if(n=v?r:m?r[h]||s(h,{}):r[h]&&r[h].prototype)for(l in e){if(p=e[l],f=t.dontCallGetSet?(d=o(n,l))&&d.value:n[l],!u(v?l:h+(m?".":"#")+l,t.forced)&&void 0!==f){if(typeof p==typeof f)continue;c(p,f)}(t.sham||f&&f.sham)&&i(p,"sham",!0),a(n,l,p,t)}}},function(t,e,n){"use strict";var r=n(26),o=Function.prototype.call;t.exports=r?o.bind(o):function(){return o.apply(o,arguments)}},function(t,e,n){"use strict";var r=n(3);t.exports=!r((function(){var t=function(){}.bind();return"function"!=typeof t||t.hasOwnProperty("prototype")}))},function(t,e,n){"use strict";t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e,n){"use strict";var r=n(47),o=n(29);t.exports=function(t){return r(o(t))}},function(t,e,n){"use strict";var r=n(48),o=TypeError;t.exports=function(t){if(r(t))throw new o("Can't call method on "+t);return t}},function(t,e,n){"use strict";var r=n(0),o=n(1),i=function(t){return o(t)?t:void 0};t.exports=function(t,e){return arguments.length<2?i(r[t]):r[t]&&r[t][e]}},function(t,e,n){"use strict";var r=n(1),o=n(104),i=TypeError;t.exports=function(t){if(r(t))return t;throw new i(o(t)+" is not a function")}},function(t,e,n){"use strict";var r=n(0),o=n(55),i=n(9),a=n(57),s=n(53),c=n(52),u=r.Symbol,l=o("wks"),f=c?u.for||u:u&&u.withoutSetter||a;t.exports=function(t){return i(l,t)||(l[t]=s&&i(u,t)?u[t]:f("Symbol."+t)),l[t]}},function(t,e,n){"use strict";var r=n(56),o=n(0),i=n(34),a=t.exports=o["__core-js_shared__"]||i("__core-js_shared__",{});(a.versions||(a.versions=[])).push({version:"3.37.1",mode:r?"pure":"global",copyright:"© 2014-2024 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.37.1/LICENSE",source:"https://github.com/zloirock/core-js"})},function(t,e,n){"use strict";var r=n(0),o=Object.defineProperty;t.exports=function(t,e){try{o(r,t,{value:e,configurable:!0,writable:!0})}catch(n){r[t]=e}return e}},function(t,e,n){"use strict";var r=n(29),o=Object;t.exports=function(t){return o(r(t))}},function(t,e,n){"use strict";var r=n(119);t.exports=function(t){return r(t.length)}},function(t,e,n){var r=n(146),o=n(11),i=Object.prototype,a=i.hasOwnProperty,s=i.propertyIsEnumerable,c=r(function(){return arguments}())?r:function(t){return o(t)&&a.call(t,"callee")&&!s.call(t,"callee")};t.exports=c},function(t,e,n){var r=n(10)(n(7),"Map");t.exports=r},function(t,e){t.exports=function(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}},function(t,e,n){var r=n(166),o=n(173),i=n(175),a=n(176),s=n(177);function c(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e-1&&t%1==0&&t<=9007199254740991}},function(t,e,n){var r=n(4),o=n(44),i=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,a=/^\w*$/;t.exports=function(t,e){if(r(t))return!1;var n=typeof t;return!("number"!=n&&"symbol"!=n&&"boolean"!=n&&null!=t&&!o(t))||(a.test(t)||!i.test(t)||null!=e&&t in Object(e))}},function(t,e,n){var r=n(12),o=n(11);t.exports=function(t){return"symbol"==typeof t||o(t)&&"[object Symbol]"==r(t)}},function(t,e){t.exports=function(t){return t}},function(t,e,n){"use strict";var r=n(5),o=n(25),i=n(100),a=n(27),s=n(28),c=n(49),u=n(9),l=n(58),f=Object.getOwnPropertyDescriptor;e.f=r?f:function(t,e){if(t=s(t),e=c(e),l)try{return f(t,e)}catch(t){}if(u(t,e))return a(!o(i.f,t,e),t[e])}},function(t,e,n){"use strict";var r=n(2),o=n(3),i=n(16),a=Object,s=r("".split);t.exports=o((function(){return!a("z").propertyIsEnumerable(0)}))?function(t){return"String"===i(t)?s(t,""):a(t)}:a},function(t,e,n){"use strict";t.exports=function(t){return null==t}},function(t,e,n){"use strict";var r=n(101),o=n(50);t.exports=function(t){var e=r(t,"string");return o(e)?e:e+""}},function(t,e,n){"use strict";var r=n(30),o=n(1),i=n(51),a=n(52),s=Object;t.exports=a?function(t){return"symbol"==typeof t}:function(t){var e=r("Symbol");return o(e)&&i(e.prototype,s(t))}},function(t,e,n){"use strict";var r=n(2);t.exports=r({}.isPrototypeOf)},function(t,e,n){"use strict";var r=n(53);t.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},function(t,e,n){"use strict";var r=n(54),o=n(3),i=n(0).String;t.exports=!!Object.getOwnPropertySymbols&&!o((function(){var t=Symbol("symbol detection");return!i(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&r&&r<41}))},function(t,e,n){"use strict";var r,o,i=n(0),a=n(102),s=i.process,c=i.Deno,u=s&&s.versions||c&&c.version,l=u&&u.v8;l&&(o=(r=l.split("."))[0]>0&&r[0]<4?1:+(r[0]+r[1])),!o&&a&&(!(r=a.match(/Edge\/(\d+)/))||r[1]>=74)&&(r=a.match(/Chrome\/(\d+)/))&&(o=+r[1]),t.exports=o},function(t,e,n){"use strict";var r=n(33);t.exports=function(t,e){return r[t]||(r[t]=e||{})}},function(t,e,n){"use strict";t.exports=!1},function(t,e,n){"use strict";var r=n(2),o=0,i=Math.random(),a=r(1..toString);t.exports=function(t){return"Symbol("+(void 0===t?"":t)+")_"+a(++o+i,36)}},function(t,e,n){"use strict";var r=n(5),o=n(3),i=n(106);t.exports=!r&&!o((function(){return 7!==Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},function(t,e,n){"use strict";var r=n(6),o=String,i=TypeError;t.exports=function(t){if(r(t))return t;throw new i(o(t)+" is not an object")}},function(t,e,n){"use strict";t.exports={}},function(t,e,n){"use strict";var r=n(9),o=n(113),i=n(46),a=n(15);t.exports=function(t,e,n){for(var s=o(e),c=a.f,u=i.f,l=0;ll))return!1;var p=c.get(t),d=c.get(e);if(p&&d)return p==e&&d==t;var h=-1,v=!0,m=2&n?new r:void 0;for(c.set(t,e),c.set(e,t);++h-1&&t%1==0&&t]/;t.exports=function(t){var e,n=""+t,o=r.exec(n);if(!o)return n;var i="",a=0,s=0;for(a=o.index;a1?1:s,n=.5*(1-Math.cos(Math.PI*a)),r=e.startX+(e.x-e.startX)*n,o=e.startY+(e.y-e.startY)*n,e.method.call(e.scrollable,r,o),r===e.x&&o===e.y||t.requestAnimationFrame(d.bind(t,e))}function h(n,r,a){var c,u,l,f,p=i();n===e.body?(c=t,u=t.scrollX||t.pageXOffset,l=t.scrollY||t.pageYOffset,f=o.scroll):(c=n,u=n.scrollLeft,l=n.scrollTop,f=s),d({scrollable:c,method:f,startTime:p,startX:u,startY:l,x:r,y:a})}}}}()},function(t,e,n){"use strict";var r=n(24),o=n(35),i=n(36),a=n(141),s=n(143);r({target:"Array",proto:!0,arity:1,forced:n(3)((function(){return 4294967297!==[].push.call({length:4294967296},1)}))||!function(){try{Object.defineProperty([],"length",{writable:!1}).push()}catch(t){return t instanceof TypeError}}()},{push:function(t){var e=o(this),n=i(e),r=arguments.length;s(n+r);for(var c=0;c79&&a<83||!i("reduce")},{reduce:function(t){var e=arguments.length;return o(this,t,e,e>1?arguments[1]:void 0)}})},function(t,e,n){"use strict";var r={}.propertyIsEnumerable,o=Object.getOwnPropertyDescriptor,i=o&&!r.call({1:2},1);e.f=i?function(t){var e=o(this,t);return!!e&&e.enumerable}:r},function(t,e,n){"use strict";var r=n(25),o=n(6),i=n(50),a=n(103),s=n(105),c=n(32),u=TypeError,l=c("toPrimitive");t.exports=function(t,e){if(!o(t)||i(t))return t;var n,c=a(t,l);if(c){if(void 0===e&&(e="default"),n=r(c,t,e),!o(n)||i(n))return n;throw new u("Can't convert object to primitive value")}return void 0===e&&(e="number"),s(t,e)}},function(t,e,n){"use strict";t.exports="undefined"!=typeof navigator&&String(navigator.userAgent)||""},function(t,e,n){"use strict";var r=n(31),o=n(48);t.exports=function(t,e){var n=t[e];return o(n)?void 0:r(n)}},function(t,e,n){"use strict";var r=String;t.exports=function(t){try{return r(t)}catch(t){return"Object"}}},function(t,e,n){"use strict";var r=n(25),o=n(1),i=n(6),a=TypeError;t.exports=function(t,e){var n,s;if("string"===e&&o(n=t.toString)&&!i(s=r(n,t)))return s;if(o(n=t.valueOf)&&!i(s=r(n,t)))return s;if("string"!==e&&o(n=t.toString)&&!i(s=r(n,t)))return s;throw new a("Can't convert object to primitive value")}},function(t,e,n){"use strict";var r=n(0),o=n(6),i=r.document,a=o(i)&&o(i.createElement);t.exports=function(t){return a?i.createElement(t):{}}},function(t,e,n){"use strict";var r=n(5),o=n(3);t.exports=r&&o((function(){return 42!==Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype}))},function(t,e,n){"use strict";var r=n(5),o=n(9),i=Function.prototype,a=r&&Object.getOwnPropertyDescriptor,s=o(i,"name"),c=s&&"something"===function(){}.name,u=s&&(!r||r&&a(i,"name").configurable);t.exports={EXISTS:s,PROPER:c,CONFIGURABLE:u}},function(t,e,n){"use strict";var r=n(2),o=n(1),i=n(33),a=r(Function.toString);o(i.inspectSource)||(i.inspectSource=function(t){return a(t)}),t.exports=i.inspectSource},function(t,e,n){"use strict";var r,o,i,a=n(111),s=n(0),c=n(6),u=n(13),l=n(9),f=n(33),p=n(112),d=n(60),h=s.TypeError,v=s.WeakMap;if(a||f.state){var m=f.state||(f.state=new v);m.get=m.get,m.has=m.has,m.set=m.set,r=function(t,e){if(m.has(t))throw new h("Object already initialized");return e.facade=t,m.set(t,e),e},o=function(t){return m.get(t)||{}},i=function(t){return m.has(t)}}else{var g=p("state");d[g]=!0,r=function(t,e){if(l(t,g))throw new h("Object already initialized");return e.facade=t,u(t,g,e),e},o=function(t){return l(t,g)?t[g]:{}},i=function(t){return l(t,g)}}t.exports={set:r,get:o,has:i,enforce:function(t){return i(t)?o(t):r(t,{})},getterFor:function(t){return function(e){var n;if(!c(e)||(n=o(e)).type!==t)throw new h("Incompatible receiver, "+t+" required");return n}}}},function(t,e,n){"use strict";var r=n(0),o=n(1),i=r.WeakMap;t.exports=o(i)&&/native code/.test(String(i))},function(t,e,n){"use strict";var r=n(55),o=n(57),i=r("keys");t.exports=function(t){return i[t]||(i[t]=o(t))}},function(t,e,n){"use strict";var r=n(30),o=n(2),i=n(114),a=n(121),s=n(59),c=o([].concat);t.exports=r("Reflect","ownKeys")||function(t){var e=i.f(s(t)),n=a.f;return n?c(e,n(t)):e}},function(t,e,n){"use strict";var r=n(115),o=n(120).concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return r(t,o)}},function(t,e,n){"use strict";var r=n(2),o=n(9),i=n(28),a=n(116).indexOf,s=n(60),c=r([].push);t.exports=function(t,e){var n,r=i(t),u=0,l=[];for(n in r)!o(s,n)&&o(r,n)&&c(l,n);for(;e.length>u;)o(r,n=e[u++])&&(~a(l,n)||c(l,n));return l}},function(t,e,n){"use strict";var r=n(28),o=n(117),i=n(36),a=function(t){return function(e,n,a){var s=r(e),c=i(s);if(0===c)return!t&&-1;var u,l=o(a,c);if(t&&n!=n){for(;c>l;)if((u=s[l++])!=u)return!0}else for(;c>l;l++)if((t||l in s)&&s[l]===n)return t||l||0;return!t&&-1}};t.exports={includes:a(!0),indexOf:a(!1)}},function(t,e,n){"use strict";var r=n(62),o=Math.max,i=Math.min;t.exports=function(t,e){var n=r(t);return n<0?o(n+e,0):i(n,e)}},function(t,e,n){"use strict";var r=Math.ceil,o=Math.floor;t.exports=Math.trunc||function(t){var e=+t;return(e>0?o:r)(e)}},function(t,e,n){"use strict";var r=n(62),o=Math.min;t.exports=function(t){var e=r(t);return e>0?o(e,9007199254740991):0}},function(t,e,n){"use strict";t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(t,e,n){"use strict";e.f=Object.getOwnPropertySymbols},function(t,e,n){"use strict";var r=n(3),o=n(1),i=/#|\.prototype\./,a=function(t,e){var n=c[s(t)];return n===l||n!==u&&(o(e)?r(e):!!e)},s=a.normalize=function(t){return String(t).replace(i,".").toLowerCase()},c=a.data={},u=a.NATIVE="N",l=a.POLYFILL="P";t.exports=a},function(t,e,n){"use strict";var r=n(31),o=n(35),i=n(47),a=n(36),s=TypeError,c="Reduce of empty array with no initial value",u=function(t){return function(e,n,u,l){var f=o(e),p=i(f),d=a(f);if(r(n),0===d&&u<2)throw new s(c);var h=t?d-1:0,v=t?-1:1;if(u<2)for(;;){if(h in p){l=p[h],h+=v;break}if(h+=v,t?h<0:d<=h)throw new s(c)}for(;t?h>=0:d>h;h+=v)h in p&&(l=n(l,p[h],h,f));return l}};t.exports={left:u(!1),right:u(!0)}},function(t,e,n){"use strict";var r=n(3);t.exports=function(t,e){var n=[][t];return!!n&&r((function(){n.call(null,e||function(){return 1},1)}))}},function(t,e,n){"use strict";var r=n(0),o=n(16);t.exports="process"===o(r.process)},function(t,e,n){"use strict";var r=n(24),o=n(0),i=n(127),a=n(128),s=o.WebAssembly,c=7!==new Error("e",{cause:7}).cause,u=function(t,e){var n={};n[t]=a(t,e,c),r({global:!0,constructor:!0,arity:1,forced:c},n)},l=function(t,e){if(s&&s[t]){var n={};n[t]=a("WebAssembly."+t,e,c),r({target:"WebAssembly",stat:!0,constructor:!0,arity:1,forced:c},n)}};u("Error",(function(t){return function(e){return i(t,this,arguments)}})),u("EvalError",(function(t){return function(e){return i(t,this,arguments)}})),u("RangeError",(function(t){return function(e){return i(t,this,arguments)}})),u("ReferenceError",(function(t){return function(e){return i(t,this,arguments)}})),u("SyntaxError",(function(t){return function(e){return i(t,this,arguments)}})),u("TypeError",(function(t){return function(e){return i(t,this,arguments)}})),u("URIError",(function(t){return function(e){return i(t,this,arguments)}})),l("CompileError",(function(t){return function(e){return i(t,this,arguments)}})),l("LinkError",(function(t){return function(e){return i(t,this,arguments)}})),l("RuntimeError",(function(t){return function(e){return i(t,this,arguments)}}))},function(t,e,n){"use strict";var r=n(26),o=Function.prototype,i=o.apply,a=o.call;t.exports="object"==typeof Reflect&&Reflect.apply||(r?a.bind(i):function(){return a.apply(i,arguments)})},function(t,e,n){"use strict";var r=n(30),o=n(9),i=n(13),a=n(51),s=n(63),c=n(61),u=n(132),l=n(133),f=n(134),p=n(137),d=n(138),h=n(5),v=n(56);t.exports=function(t,e,n,m){var g=m?2:1,y=t.split("."),b=y[y.length-1],_=r.apply(null,y);if(_){var w=_.prototype;if(!v&&o(w,"cause")&&delete w.cause,!n)return _;var x=r("Error"),O=e((function(t,e){var n=f(m?e:t,void 0),r=m?new _(t):new _;return void 0!==n&&i(r,"message",n),d(r,O,r.stack,2),this&&a(w,this)&&l(r,this,O),arguments.length>g&&p(r,arguments[g]),r}));if(O.prototype=w,"Error"!==b?s?s(O,x):c(O,x,{name:!0}):h&&"stackTraceLimit"in _&&(u(O,_,"stackTraceLimit"),u(O,_,"prepareStackTrace")),c(O,_),!v)try{w.name!==b&&i(w,"name",b),w.constructor=O}catch(t){}return O}}},function(t,e,n){"use strict";var r=n(2),o=n(31);t.exports=function(t,e,n){try{return r(o(Object.getOwnPropertyDescriptor(t,e)[n]))}catch(t){}}},function(t,e,n){"use strict";var r=n(131),o=String,i=TypeError;t.exports=function(t){if(r(t))return t;throw new i("Can't set "+o(t)+" as a prototype")}},function(t,e,n){"use strict";var r=n(6);t.exports=function(t){return r(t)||null===t}},function(t,e,n){"use strict";var r=n(15).f;t.exports=function(t,e,n){n in t||r(t,n,{configurable:!0,get:function(){return e[n]},set:function(t){e[n]=t}})}},function(t,e,n){"use strict";var r=n(1),o=n(6),i=n(63);t.exports=function(t,e,n){var a,s;return i&&r(a=e.constructor)&&a!==n&&o(s=a.prototype)&&s!==n.prototype&&i(t,s),t}},function(t,e,n){"use strict";var r=n(95);t.exports=function(t,e){return void 0===t?arguments.length<2?"":e:r(t)}},function(t,e,n){"use strict";var r=n(136),o=n(1),i=n(16),a=n(32)("toStringTag"),s=Object,c="Arguments"===i(function(){return arguments}());t.exports=r?i:function(t){var e,n,r;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=function(t,e){try{return t[e]}catch(t){}}(e=s(t),a))?n:c?i(e):"Object"===(r=i(e))&&o(e.callee)?"Arguments":r}},function(t,e,n){"use strict";var r={};r[n(32)("toStringTag")]="z",t.exports="[object z]"===String(r)},function(t,e,n){"use strict";var r=n(6),o=n(13);t.exports=function(t,e){r(e)&&"cause"in e&&o(t,"cause",e.cause)}},function(t,e,n){"use strict";var r=n(13),o=n(139),i=n(140),a=Error.captureStackTrace;t.exports=function(t,e,n,s){i&&(a?a(t,e):r(t,"stack",o(n,s)))}},function(t,e,n){"use strict";var r=n(2),o=Error,i=r("".replace),a=String(new o("zxcasd").stack),s=/\n\s*at [^:]*:[^\n]*/,c=s.test(a);t.exports=function(t,e){if(c&&"string"==typeof t&&!o.prepareStackTrace)for(;e--;)t=i(t,s,"");return t}},function(t,e,n){"use strict";var r=n(3),o=n(27);t.exports=!r((function(){var t=new Error("a");return!("stack"in t)||(Object.defineProperty(t,"stack",o(1,7)),7!==t.stack)}))},function(t,e,n){"use strict";var r=n(5),o=n(142),i=TypeError,a=Object.getOwnPropertyDescriptor,s=r&&!function(){if(void 0!==this)return!0;try{Object.defineProperty([],"length",{writable:!1}).length=1}catch(t){return t instanceof TypeError}}();t.exports=s?function(t,e){if(o(t)&&!a(t,"length").writable)throw new i("Cannot set read only .length");return t.length=e}:function(t,e){return t.length=e}},function(t,e,n){"use strict";var r=n(16);t.exports=Array.isArray||function(t){return"Array"===r(t)}},function(t,e,n){"use strict";var r=TypeError;t.exports=function(t){if(t>9007199254740991)throw r("Maximum allowed index exceeded");return t}},function(t,e,n){var r=n(64),o=n(145);t.exports=function t(e,n,i,a,s){var c=-1,u=e.length;for(i||(i=o),s||(s=[]);++c0&&i(l)?n>1?t(l,n-1,i,a,s):r(s,l):a||(s[s.length]=l)}return s}},function(t,e,n){var r=n(14),o=n(37),i=n(4),a=r?r.isConcatSpreadable:void 0;t.exports=function(t){return i(t)||o(t)||!!(a&&t&&t[a])}},function(t,e,n){var r=n(12),o=n(11);t.exports=function(t){return o(t)&&"[object Arguments]"==r(t)}},function(t,e,n){var r=n(14),o=Object.prototype,i=o.hasOwnProperty,a=o.toString,s=r?r.toStringTag:void 0;t.exports=function(t){var e=i.call(t,s),n=t[s];try{t[s]=void 0;var r=!0}catch(t){}var o=a.call(t);return r&&(e?t[s]=n:delete t[s]),o}},function(t,e){var n=Object.prototype.toString;t.exports=function(t){return n.call(t)}},function(t,e,n){var r=n(150),o=n(206),i=n(45),a=n(4),s=n(216);t.exports=function(t){return"function"==typeof t?t:null==t?i:"object"==typeof t?a(t)?o(t[0],t[1]):r(t):s(t)}},function(t,e,n){var r=n(151),o=n(205),i=n(82);t.exports=function(t){var e=o(t);return 1==e.length&&e[0][2]?i(e[0][0],e[0][1]):function(n){return n===t||r(n,t,e)}}},function(t,e,n){var r=n(66),o=n(70);t.exports=function(t,e,n,i){var a=n.length,s=a,c=!i;if(null==t)return!s;for(t=Object(t);a--;){var u=n[a];if(c&&u[2]?u[1]!==t[u[0]]:!(u[0]in t))return!1}for(;++a-1}},function(t,e,n){var r=n(18);t.exports=function(t,e){var n=this.__data__,o=r(n,t);return o<0?(++this.size,n.push([t,e])):n[o][1]=e,this}},function(t,e,n){var r=n(17);t.exports=function(){this.__data__=new r,this.size=0}},function(t,e){t.exports=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n}},function(t,e){t.exports=function(t){return this.__data__.get(t)}},function(t,e){t.exports=function(t){return this.__data__.has(t)}},function(t,e,n){var r=n(17),o=n(38),i=n(40);t.exports=function(t,e){var n=this.__data__;if(n instanceof r){var a=n.__data__;if(!o||a.length<199)return a.push([t,e]),this.size=++n.size,this;n=this.__data__=new i(a)}return n.set(t,e),this.size=n.size,this}},function(t,e,n){var r=n(68),o=n(163),i=n(39),a=n(69),s=/^\[object .+?Constructor\]$/,c=Function.prototype,u=Object.prototype,l=c.toString,f=u.hasOwnProperty,p=RegExp("^"+l.call(f).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");t.exports=function(t){return!(!i(t)||o(t))&&(r(t)?p:s).test(a(t))}},function(t,e,n){var r,o=n(164),i=(r=/[^.]+$/.exec(o&&o.keys&&o.keys.IE_PROTO||""))?"Symbol(src)_1."+r:"";t.exports=function(t){return!!i&&i in t}},function(t,e,n){var r=n(7)["__core-js_shared__"];t.exports=r},function(t,e){t.exports=function(t,e){return null==t?void 0:t[e]}},function(t,e,n){var r=n(167),o=n(17),i=n(38);t.exports=function(){this.size=0,this.__data__={hash:new r,map:new(i||o),string:new r}}},function(t,e,n){var r=n(168),o=n(169),i=n(170),a=n(171),s=n(172);function c(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e0){if(++e>=800)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}},function(t,e,n){var r=n(72),o=n(228),i=n(233),a=n(73),s=n(234),c=n(41);t.exports=function(t,e,n){var u=-1,l=o,f=t.length,p=!0,d=[],h=d;if(n)p=!1,l=i;else if(f>=200){var v=e?null:s(t);if(v)return c(v);p=!1,l=a,h=new r}else h=e?[]:d;t:for(;++u-1}},function(t,e,n){var r=n(230),o=n(231),i=n(232);t.exports=function(t,e,n){return e==e?i(t,e,n):r(t,o,n)}},function(t,e){t.exports=function(t,e,n,r){for(var o=t.length,i=n+(r?1:-1);r?i--:++i=0&&Math.floor(e)===e&&isFinite(t)}function v(t){return a(t)&&"function"==typeof t.then&&"function"==typeof t.catch}function m(t){return null==t?"":Array.isArray(t)||p(t)&&t.toString===f?JSON.stringify(t,g,2):String(t)}function g(t,e){return e&&e.__v_isRef?e.value:e}function y(t){var e=parseFloat(t);return isNaN(e)?t:e}function b(t,e){for(var n=Object.create(null),r=t.split(","),o=0;o-1)return t.splice(r,1)}}var x=Object.prototype.hasOwnProperty;function O(t,e){return x.call(t,e)}function S(t){var e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}var C=/-(\w)/g,$=S((function(t){return t.replace(C,(function(t,e){return e?e.toUpperCase():""}))})),k=S((function(t){return t.charAt(0).toUpperCase()+t.slice(1)})),E=/\B([A-Z])/g,j=S((function(t){return t.replace(E,"-$1").toLowerCase()}));var T=Function.prototype.bind?function(t,e){return t.bind(e)}:function(t,e){function n(n){var r=arguments.length;return r?r>1?t.apply(e,arguments):t.call(e,n):t.call(e)}return n._length=t.length,n};function A(t,e){e=e||0;for(var n=t.length-e,r=new Array(n);n--;)r[n]=t[n+e];return r}function P(t,e){for(var n in e)t[n]=e[n];return t}function L(t){for(var e={},n=0;n0,Q=G&&G.indexOf("edge/")>0;G&&G.indexOf("android");var tt=G&&/iphone|ipad|ipod|ios/.test(G);G&&/chrome\/\d+/.test(G),G&&/phantomjs/.test(G);var et,nt=G&&G.match(/firefox\/(\d+)/),rt={}.watch,ot=!1;if(X)try{var it={};Object.defineProperty(it,"passive",{get:function(){ot=!0}}),window.addEventListener("test-passive",null,it)}catch(t){}var at=function(){return void 0===et&&(et=!X&&"undefined"!=typeof global&&(global.process&&"server"===global.process.env.VUE_ENV)),et},st=X&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function ct(t){return"function"==typeof t&&/native code/.test(t.toString())}var ut,lt="undefined"!=typeof Symbol&&ct(Symbol)&&"undefined"!=typeof Reflect&&ct(Reflect.ownKeys);ut="undefined"!=typeof Set&&ct(Set)?Set:function(){function t(){this.set=Object.create(null)}return t.prototype.has=function(t){return!0===this.set[t]},t.prototype.add=function(t){this.set[t]=!0},t.prototype.clear=function(){this.set=Object.create(null)},t}();var ft=null;function pt(t){void 0===t&&(t=null),t||ft&&ft._scope.off(),ft=t,t&&t._scope.on()}var dt=function(){function t(t,e,n,r,o,i,a,s){this.tag=t,this.data=e,this.children=n,this.text=r,this.elm=o,this.ns=void 0,this.context=i,this.fnContext=void 0,this.fnOptions=void 0,this.fnScopeId=void 0,this.key=e&&e.key,this.componentOptions=a,this.componentInstance=void 0,this.parent=void 0,this.raw=!1,this.isStatic=!1,this.isRootInsert=!0,this.isComment=!1,this.isCloned=!1,this.isOnce=!1,this.asyncFactory=s,this.asyncMeta=void 0,this.isAsyncPlaceholder=!1}return Object.defineProperty(t.prototype,"child",{get:function(){return this.componentInstance},enumerable:!1,configurable:!0}),t}(),ht=function(t){void 0===t&&(t="");var e=new dt;return e.text=t,e.isComment=!0,e};function vt(t){return new dt(void 0,void 0,void 0,String(t))}function mt(t){var e=new dt(t.tag,t.data,t.children&&t.children.slice(),t.text,t.elm,t.context,t.componentOptions,t.asyncFactory);return e.ns=t.ns,e.isStatic=t.isStatic,e.key=t.key,e.isComment=t.isComment,e.fnContext=t.fnContext,e.fnOptions=t.fnOptions,e.fnScopeId=t.fnScopeId,e.asyncMeta=t.asyncMeta,e.isCloned=!0,e}"function"==typeof SuppressedError&&SuppressedError;var gt=0,yt=[],bt=function(){function t(){this._pending=!1,this.id=gt++,this.subs=[]}return t.prototype.addSub=function(t){this.subs.push(t)},t.prototype.removeSub=function(t){this.subs[this.subs.indexOf(t)]=null,this._pending||(this._pending=!0,yt.push(this))},t.prototype.depend=function(e){t.target&&t.target.addDep(this)},t.prototype.notify=function(t){var e=this.subs.filter((function(t){return t}));for(var n=0,r=e.length;n0&&(Gt((u=t(u,"".concat(n||"","_").concat(r)))[0])&&Gt(f)&&(p[l]=vt(f.text+u[0].text),u.shift()),p.push.apply(p,u)):c(u)?Gt(f)?p[l]=vt(f.text+u):""!==u&&p.push(vt(u)):Gt(u)&&Gt(f)?p[l]=vt(f.text+u.text):(s(e._isVList)&&a(u.tag)&&i(u.key)&&a(n)&&(u.key="__vlist".concat(n,"_").concat(r,"__")),p.push(u)));return p}(t):void 0}function Gt(t){return a(t)&&a(t.text)&&!1===t.isComment}function Jt(t,e){var n,r,i,s,c=null;if(o(t)||"string"==typeof t)for(c=new Array(t.length),n=0,r=t.length;n0,s=e?!!e.$stable:!a,c=e&&e.$key;if(e){if(e._normalized)return e._normalized;if(s&&o&&o!==r&&c===o.$key&&!a&&!o.$hasNormal)return o;for(var u in i={},e)e[u]&&"$"!==u[0]&&(i[u]=me(t,n,u,e[u]))}else i={};for(var l in n)l in i||(i[l]=ge(n,l));return e&&Object.isExtensible(e)&&(e._normalized=i),W(i,"$stable",s),W(i,"$key",c),W(i,"$hasNormal",a),i}function me(t,e,n,r){var i=function(){var e=ft;pt(t);var n=arguments.length?r.apply(null,arguments):r({}),i=(n=n&&"object"==typeof n&&!o(n)?[n]:Xt(n))&&n[0];return pt(e),n&&(!i||1===n.length&&i.isComment&&!he(i))?void 0:n};return r.proxy&&Object.defineProperty(e,n,{get:i,enumerable:!0,configurable:!0}),i}function ge(t,e){return function(){return t[e]}}function ye(t){return{get attrs(){if(!t._attrsProxy){var e=t._attrsProxy={};W(e,"_v_attr_proxy",!0),be(e,t.$attrs,r,t,"$attrs")}return t._attrsProxy},get listeners(){t._listenersProxy||be(t._listenersProxy={},t.$listeners,r,t,"$listeners");return t._listenersProxy},get slots(){return function(t){t._slotsProxy||we(t._slotsProxy={},t.$scopedSlots);return t._slotsProxy}(t)},emit:T(t.$emit,t),expose:function(e){e&&Object.keys(e).forEach((function(n){return Ht(t,e,n)}))}}}function be(t,e,n,r,o){var i=!1;for(var a in e)a in t?e[a]!==n[a]&&(i=!0):(i=!0,_e(t,a,r,o));for(var a in t)a in e||(i=!0,delete t[a]);return i}function _e(t,e,n,r){Object.defineProperty(t,e,{enumerable:!0,configurable:!0,get:function(){return n[r][e]}})}function we(t,e){for(var n in e)t[n]=e[n];for(var n in t)n in e||delete t[n]}var xe=null;function Oe(t,e){return(t.__esModule||lt&&"Module"===t[Symbol.toStringTag])&&(t=t.default),l(t)?e.extend(t):t}function Se(t){if(o(t))for(var e=0;edocument.createEvent("Event").timeStamp&&(un=function(){return ln.now()})}var fn=function(t,e){if(t.post){if(!e.post)return 1}else if(e.post)return-1;return t.id-e.id};function pn(){var t,e;for(cn=un(),an=!0,en.sort(fn),sn=0;snsn&&en[n].id>t.id;)n--;en.splice(n+1,0,t)}else en.push(t);on||(on=!0,De(pn))}}function hn(t,e){if(t){for(var n=Object.create(null),r=lt?Reflect.ownKeys(t):Object.keys(t),o=0;o-1)if(i&&!O(o,"default"))a=!1;else if(""===a||a===j(t)){var c=Mn(String,o.type);(c<0||s-1:"string"==typeof t?t.split(",").indexOf(e)>-1:!!d(t)&&t.test(e)}function Jn(t,e){var n=t.cache,r=t.keys,o=t._vnode,i=t.$vnode;for(var a in n){var s=n[a];if(s){var c=s.name;c&&!e(c)&&Zn(n,a,r,o)}}i.componentOptions.children=void 0}function Zn(t,e,n,r){var o=t[e];!o||r&&o.tag===r.tag||o.componentInstance.$destroy(),t[e]=null,w(n,e)}Kn.prototype._init=function(t){var e=this;e._uid=qn++,e._isVue=!0,e.__v_skip=!0,e._scope=new Bt(!0),e._scope.parent=void 0,e._scope._vm=!0,t&&t._isComponent?function(t,e){var n=t.$options=Object.create(t.constructor.options),r=e._parentVnode;n.parent=e.parent,n._parentVnode=r;var o=r.componentOptions;n.propsData=o.propsData,n._parentListeners=o.listeners,n._renderChildren=o.children,n._componentTag=o.tag,e.render&&(n.render=e.render,n.staticRenderFns=e.staticRenderFns)}(e,t):e.$options=Tn(Wn(e.constructor),t||{},e),e._renderProxy=e,e._self=e,function(t){var e=t.$options,n=e.parent;if(n&&!e.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(t)}t.$parent=n,t.$root=n?n.$root:t,t.$children=[],t.$refs={},t._provided=n?n._provided:Object.create(null),t._watcher=null,t._inactive=null,t._directInactive=!1,t._isMounted=!1,t._isDestroyed=!1,t._isBeingDestroyed=!1}(e),function(t){t._events=Object.create(null),t._hasHookEvent=!1;var e=t.$options._parentListeners;e&&Xe(t,e)}(e),function(t){t._vnode=null,t._staticTrees=null;var e=t.$options,n=t.$vnode=e._parentVnode,o=n&&n.context;t.$slots=pe(e._renderChildren,o),t.$scopedSlots=n?ve(t.$parent,n.data.scopedSlots,t.$slots):r,t._c=function(e,n,r,o){return Ce(t,e,n,r,o,!1)},t.$createElement=function(e,n,r,o){return Ce(t,e,n,r,o,!0)};var i=n&&n.data;Pt(t,"$attrs",i&&i.attrs||r,null,!0),Pt(t,"$listeners",e._parentListeners||r,null,!0)}(e),tn(e,"beforeCreate",void 0,!1),function(t){var e=hn(t.$options.inject,t);e&&(Et(!1),Object.keys(e).forEach((function(n){Pt(t,n,e[n])})),Et(!0))}(e),Dn(e),function(t){var e=t.$options.provide;if(e){var n=u(e)?e.call(t):e;if(!l(n))return;for(var r=Ft(t),o=lt?Reflect.ownKeys(n):Object.keys(n),i=0;i1?A(n):n;for(var r=A(arguments,1),o='event handler for "'.concat(t,'"'),i=0,a=n.length;iparseInt(this.max)&&Zn(t,e[0],e,this._vnode),this.vnodeToCache=null}}},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var t in this.cache)Zn(this.cache,t,this.keys)},mounted:function(){var t=this;this.cacheVNode(),this.$watch("include",(function(e){Jn(t,(function(t){return Gn(e,t)}))})),this.$watch("exclude",(function(e){Jn(t,(function(t){return!Gn(e,t)}))}))},updated:function(){this.cacheVNode()},render:function(){var t=this.$slots.default,e=Se(t),n=e&&e.componentOptions;if(n){var r=Xn(n),o=this.include,i=this.exclude;if(o&&(!r||!Gn(o,r))||i&&r&&Gn(i,r))return e;var a=this.cache,s=this.keys,c=null==e.key?n.Ctor.cid+(n.tag?"::".concat(n.tag):""):e.key;a[c]?(e.componentInstance=a[c].componentInstance,w(s,c),s.push(c)):(this.vnodeToCache=e,this.keyToCache=c),e.data.keepAlive=!0}return e||t&&t[0]}}};!function(t){var e={get:function(){return F}};Object.defineProperty(t,"config",e),t.util={warn:On,extend:P,mergeOptions:Tn,defineReactive:Pt},t.set=Lt,t.delete=zt,t.nextTick=De,t.observable=function(t){return At(t),t},t.options=Object.create(null),U.forEach((function(e){t.options[e+"s"]=Object.create(null)})),t.options._base=t,P(t.options.components,tr),function(t){t.use=function(t){var e=this._installedPlugins||(this._installedPlugins=[]);if(e.indexOf(t)>-1)return this;var n=A(arguments,1);return n.unshift(this),u(t.install)?t.install.apply(t,n):u(t)&&t.apply(null,n),e.push(t),this}}(t),function(t){t.mixin=function(t){return this.options=Tn(this.options,t),this}}(t),Yn(t),function(t){U.forEach((function(e){t[e]=function(t,n){return n?("component"===e&&p(n)&&(n.name=n.name||t,n=this.options._base.extend(n)),"directive"===e&&u(n)&&(n={bind:n,update:n}),this.options[e+"s"][t]=n,n):this.options[e+"s"][t]}}))}(t)}(Kn),Object.defineProperty(Kn.prototype,"$isServer",{get:at}),Object.defineProperty(Kn.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(Kn,"FunctionalRenderContext",{value:vn}),Kn.version="2.7.16";var er=b("style,class"),nr=b("input,textarea,option,select,progress"),rr=b("contenteditable,draggable,spellcheck"),or=b("events,caret,typing,plaintext-only"),ir=b("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,truespeed,typemustmatch,visible"),ar="http://www.w3.org/1999/xlink",sr=function(t){return":"===t.charAt(5)&&"xlink"===t.slice(0,5)},cr=function(t){return sr(t)?t.slice(6,t.length):""},ur=function(t){return null==t||!1===t};function lr(t){for(var e=t.data,n=t,r=t;a(r.componentInstance);)(r=r.componentInstance._vnode)&&r.data&&(e=fr(r.data,e));for(;a(n=n.parent);)n&&n.data&&(e=fr(e,n.data));return function(t,e){if(a(t)||a(e))return pr(t,dr(e));return""}(e.staticClass,e.class)}function fr(t,e){return{staticClass:pr(t.staticClass,e.staticClass),class:a(t.class)?[t.class,e.class]:e.class}}function pr(t,e){return t?e?t+" "+e:t:e||""}function dr(t){return Array.isArray(t)?function(t){for(var e,n="",r=0,o=t.length;r-1?Ir(t,e,n):ir(e)?ur(n)?t.removeAttribute(e):(n="allowfullscreen"===e&&"EMBED"===t.tagName?"true":e,t.setAttribute(e,n)):rr(e)?t.setAttribute(e,function(t,e){return ur(e)||"false"===e?"false":"contenteditable"===t&&or(e)?e:"true"}(e,n)):sr(e)?ur(n)?t.removeAttributeNS(ar,cr(e)):t.setAttributeNS(ar,e,n):Ir(t,e,n)}function Ir(t,e,n){if(ur(n))t.removeAttribute(e);else{if(J&&!Z&&"TEXTAREA"===t.tagName&&"placeholder"===e&&""!==n&&!t.__ieph){var r=function(e){e.stopImmediatePropagation(),t.removeEventListener("input",r)};t.addEventListener("input",r),t.__ieph=!0}t.setAttribute(e,n)}}var Nr={create:Rr,update:Rr};function Dr(t,e){var n=e.elm,r=e.data,o=t.data;if(!(i(r.staticClass)&&i(r.class)&&(i(o)||i(o.staticClass)&&i(o.class)))){var s=lr(e),c=n._transitionClasses;a(c)&&(s=pr(s,dr(c))),s!==n._prevClass&&(n.setAttribute("class",s),n._prevClass=s)}}var Hr,Ur={create:Dr,update:Dr};function Br(t,e,n){var r=Hr;return function o(){var i=e.apply(null,arguments);null!==i&&qr(t,o,n,r)}}var Fr=Ae&&!(nt&&Number(nt[1])<=53);function Vr(t,e,n,r){if(Fr){var o=cn,i=e;e=i._wrapper=function(t){if(t.target===t.currentTarget||t.timeStamp>=o||t.timeStamp<=0||t.target.ownerDocument!==document)return i.apply(this,arguments)}}Hr.addEventListener(t,e,ot?{capture:n,passive:r}:n)}function qr(t,e,n,r){(r||Hr).removeEventListener(t,e._wrapper||e,n)}function Wr(t,e){if(!i(t.data.on)||!i(e.data.on)){var n=e.data.on||{},r=t.data.on||{};Hr=e.elm||t.elm,function(t){if(a(t.__r)){var e=J?"change":"input";t[e]=[].concat(t.__r,t[e]||[]),delete t.__r}a(t.__c)&&(t.change=[].concat(t.__c,t.change||[]),delete t.__c)}(n),Wt(n,r,Vr,qr,Br,e.context),Hr=void 0}}var Kr,Yr={create:Wr,update:Wr,destroy:function(t){return Wr(t,Sr)}};function Xr(t,e){if(!i(t.data.domProps)||!i(e.data.domProps)){var n,r,o=e.elm,c=t.data.domProps||{},u=e.data.domProps||{};for(n in(a(u.__ob__)||s(u._v_attr_proxy))&&(u=e.data.domProps=P({},u)),c)n in u||(o[n]="");for(n in u){if(r=u[n],"textContent"===n||"innerHTML"===n){if(e.children&&(e.children.length=0),r===c[n])continue;1===o.childNodes.length&&o.removeChild(o.childNodes[0])}if("value"===n&&"PROGRESS"!==o.tagName){o._value=r;var l=i(r)?"":String(r);Gr(o,l)&&(o.value=l)}else if("innerHTML"===n&&mr(o.tagName)&&i(o.innerHTML)){(Kr=Kr||document.createElement("div")).innerHTML="");for(var f=Kr.firstChild;o.firstChild;)o.removeChild(o.firstChild);for(;f.firstChild;)o.appendChild(f.firstChild)}else if(r!==c[n])try{o[n]=r}catch(t){}}}}function Gr(t,e){return!t.composing&&("OPTION"===t.tagName||function(t,e){var n=!0;try{n=document.activeElement!==t}catch(t){}return n&&t.value!==e}(t,e)||function(t,e){var n=t.value,r=t._vModifiers;if(a(r)){if(r.number)return y(n)!==y(e);if(r.trim)return n.trim()!==e.trim()}return n!==e}(t,e))}var Jr={create:Xr,update:Xr},Zr=S((function(t){var e={},n=/:(.+)/;return t.split(/;(?![^(]*\))/g).forEach((function(t){if(t){var r=t.split(n);r.length>1&&(e[r[0].trim()]=r[1].trim())}})),e}));function Qr(t){var e=to(t.style);return t.staticStyle?P(t.staticStyle,e):e}function to(t){return Array.isArray(t)?L(t):"string"==typeof t?Zr(t):t}var eo,no=/^--/,ro=/\s*!important$/,oo=function(t,e,n){if(no.test(e))t.style.setProperty(e,n);else if(ro.test(n))t.style.setProperty(j(e),n.replace(ro,""),"important");else{var r=ao(e);if(Array.isArray(n))for(var o=0,i=n.length;o-1?e.split(uo).forEach((function(e){return t.classList.add(e)})):t.classList.add(e);else{var n=" ".concat(t.getAttribute("class")||""," ");n.indexOf(" "+e+" ")<0&&t.setAttribute("class",(n+e).trim())}}function fo(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.split(uo).forEach((function(e){return t.classList.remove(e)})):t.classList.remove(e),t.classList.length||t.removeAttribute("class");else{for(var n=" ".concat(t.getAttribute("class")||""," "),r=" "+e+" ";n.indexOf(r)>=0;)n=n.replace(r," ");(n=n.trim())?t.setAttribute("class",n):t.removeAttribute("class")}}function po(t){if(t){if("object"==typeof t){var e={};return!1!==t.css&&P(e,ho(t.name||"v")),P(e,t),e}return"string"==typeof t?ho(t):void 0}}var ho=S((function(t){return{enterClass:"".concat(t,"-enter"),enterToClass:"".concat(t,"-enter-to"),enterActiveClass:"".concat(t,"-enter-active"),leaveClass:"".concat(t,"-leave"),leaveToClass:"".concat(t,"-leave-to"),leaveActiveClass:"".concat(t,"-leave-active")}})),vo=X&&!Z,mo="transition",go="transitionend",yo="animation",bo="animationend";vo&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(mo="WebkitTransition",go="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(yo="WebkitAnimation",bo="webkitAnimationEnd"));var _o=X?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(t){return t()};function wo(t){_o((function(){_o(t)}))}function xo(t,e){var n=t._transitionClasses||(t._transitionClasses=[]);n.indexOf(e)<0&&(n.push(e),lo(t,e))}function Oo(t,e){t._transitionClasses&&w(t._transitionClasses,e),fo(t,e)}function So(t,e,n){var r=$o(t,e),o=r.type,i=r.timeout,a=r.propCount;if(!o)return n();var s="transition"===o?go:bo,c=0,u=function(){t.removeEventListener(s,l),n()},l=function(e){e.target===t&&++c>=a&&u()};setTimeout((function(){c0&&(n="transition",l=a,f=i.length):"animation"===e?u>0&&(n="animation",l=u,f=c.length):f=(n=(l=Math.max(a,u))>0?a>u?"transition":"animation":null)?"transition"===n?i.length:c.length:0,{type:n,timeout:l,propCount:f,hasTransform:"transition"===n&&Co.test(r[mo+"Property"])}}function ko(t,e){for(;t.length1}function Lo(t,e){!0!==e.data.show&&jo(e)}var zo=function(t){var e,n,r={},u=t.modules,l=t.nodeOps;for(e=0;eh?_(t,i(n[g+1])?null:n[g+1].elm,n,d,g,r):d>g&&x(e,f,h)}(f,v,g,n,u):a(g)?(a(t.text)&&l.setTextContent(f,""),_(f,null,g,0,g.length-1,n)):a(v)?x(v,0,v.length-1):a(t.text)&&l.setTextContent(f,""):t.text!==e.text&&l.setTextContent(f,e.text),a(h)&&a(d=h.hook)&&a(d=d.postpatch)&&d(t,e)}}}function $(t,e,n){if(s(n)&&a(t.parent))t.parent.data.pendingInsert=e;else for(var r=0;r-1,a.selected!==i&&(a.selected=i);else if(I(Do(a),r))return void(t.selectedIndex!==s&&(t.selectedIndex=s));o||(t.selectedIndex=-1)}}function No(t,e){return e.every((function(e){return!I(e,t)}))}function Do(t){return"_value"in t?t._value:t.value}function Ho(t){t.target.composing=!0}function Uo(t){t.target.composing&&(t.target.composing=!1,Bo(t.target,"input"))}function Bo(t,e){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0),t.dispatchEvent(n)}function Fo(t){return!t.componentInstance||t.data&&t.data.transition?t:Fo(t.componentInstance._vnode)}var Vo={model:Ro,show:{bind:function(t,e,n){var r=e.value,o=(n=Fo(n)).data&&n.data.transition,i=t.__vOriginalDisplay="none"===t.style.display?"":t.style.display;r&&o?(n.data.show=!0,jo(n,(function(){t.style.display=i}))):t.style.display=r?i:"none"},update:function(t,e,n){var r=e.value;!r!=!e.oldValue&&((n=Fo(n)).data&&n.data.transition?(n.data.show=!0,r?jo(n,(function(){t.style.display=t.__vOriginalDisplay})):To(n,(function(){t.style.display="none"}))):t.style.display=r?t.__vOriginalDisplay:"none")},unbind:function(t,e,n,r,o){o||(t.style.display=t.__vOriginalDisplay)}}},qo={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function Wo(t){var e=t&&t.componentOptions;return e&&e.Ctor.options.abstract?Wo(Se(e.children)):t}function Ko(t){var e={},n=t.$options;for(var r in n.propsData)e[r]=t[r];var o=n._parentListeners;for(var r in o)e[$(r)]=o[r];return e}function Yo(t,e){if(/\d-keep-alive$/.test(e.tag))return t("keep-alive",{props:e.componentOptions.propsData})}var Xo=function(t){return t.tag||he(t)},Go=function(t){return"show"===t.name},Jo={name:"transition",props:qo,abstract:!0,render:function(t){var e=this,n=this.$slots.default;if(n&&(n=n.filter(Xo)).length){0;var r=this.mode;0;var o=n[0];if(function(t){for(;t=t.parent;)if(t.data.transition)return!0}(this.$vnode))return o;var i=Wo(o);if(!i)return o;if(this._leaving)return Yo(t,o);var a="__transition-".concat(this._uid,"-");i.key=null==i.key?i.isComment?a+"comment":a+i.tag:c(i.key)?0===String(i.key).indexOf(a)?i.key:a+i.key:i.key;var s=(i.data||(i.data={})).transition=Ko(this),u=this._vnode,l=Wo(u);if(i.data.directives&&i.data.directives.some(Go)&&(i.data.show=!0),l&&l.data&&!function(t,e){return e.key===t.key&&e.tag===t.tag}(i,l)&&!he(l)&&(!l.componentInstance||!l.componentInstance._vnode.isComment)){var f=l.data.transition=P({},s);if("out-in"===r)return this._leaving=!0,Kt(f,"afterLeave",(function(){e._leaving=!1,e.$forceUpdate()})),Yo(t,o);if("in-out"===r){if(he(i))return u;var p,d=function(){p()};Kt(s,"afterEnter",d),Kt(s,"enterCancelled",d),Kt(f,"delayLeave",(function(t){p=t}))}}return o}}},Zo=P({tag:String,moveClass:String},qo);function Qo(t){t.elm._moveCb&&t.elm._moveCb(),t.elm._enterCb&&t.elm._enterCb()}function ti(t){t.data.newPos=t.elm.getBoundingClientRect()}function ei(t){var e=t.data.pos,n=t.data.newPos,r=e.left-n.left,o=e.top-n.top;if(r||o){t.data.moved=!0;var i=t.elm.style;i.transform=i.WebkitTransform="translate(".concat(r,"px,").concat(o,"px)"),i.transitionDuration="0s"}}delete Zo.mode;var ni={Transition:Jo,TransitionGroup:{props:Zo,beforeMount:function(){var t=this,e=this._update;this._update=function(n,r){var o=Je(t);t.__patch__(t._vnode,t.kept,!1,!0),t._vnode=t.kept,o(),e.call(t,n,r)}},render:function(t){for(var e=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,o=this.$slots.default||[],i=this.children=[],a=Ko(this),s=0;s-1?yr[t]=e.constructor===window.HTMLUnknownElement||e.constructor===window.HTMLElement:yr[t]=/HTMLUnknownElement/.test(e.toString())},P(Kn.options.directives,Vo),P(Kn.options.components,ni),Kn.prototype.__patch__=X?zo:z,Kn.prototype.$mount=function(t,e){return function(t,e,n){var r;t.$el=e,t.$options.render||(t.$options.render=ht),tn(t,"beforeMount"),r=function(){t._update(t._render(),n)},new qe(t,r,z,{before:function(){t._isMounted&&!t._isDestroyed&&tn(t,"beforeUpdate")}},!0),n=!1;var o=t._preWatchers;if(o)for(var i=0;i0?ci(n.join("=")):null;void 0===e[r]?e[r]=o:Array.isArray(e[r])?e[r].push(o):e[r]=[e[r],o]})),e):e}function fi(t){var e=t?Object.keys(t).map((function(e){var n=t[e];if(void 0===n)return"";if(null===n)return si(e);if(Array.isArray(n)){var r=[];return n.forEach((function(t){void 0!==t&&(null===t?r.push(si(e)):r.push(si(e)+"="+si(t)))})),r.join("&")}return si(e)+"="+si(n)})).filter((function(t){return t.length>0})).join("&"):null;return e?"?"+e:""}var pi=/\/?$/;function di(t,e,n,r){var o=r&&r.options.stringifyQuery,i=e.query||{};try{i=hi(i)}catch(t){}var a={name:e.name||t&&t.name,meta:t&&t.meta||{},path:e.path||"/",hash:e.hash||"",query:i,params:e.params||{},fullPath:gi(e,o),matched:t?mi(t):[]};return n&&(a.redirectedFrom=gi(n,o)),Object.freeze(a)}function hi(t){if(Array.isArray(t))return t.map(hi);if(t&&"object"==typeof t){var e={};for(var n in t)e[n]=hi(t[n]);return e}return t}var vi=di(null,{path:"/"});function mi(t){for(var e=[];t;)e.unshift(t),t=t.parent;return e}function gi(t,e){var n=t.path,r=t.query;void 0===r&&(r={});var o=t.hash;return void 0===o&&(o=""),(n||"/")+(e||fi)(r)+o}function yi(t,e,n){return e===vi?t===e:!!e&&(t.path&&e.path?t.path.replace(pi,"")===e.path.replace(pi,"")&&(n||t.hash===e.hash&&bi(t.query,e.query)):!(!t.name||!e.name)&&(t.name===e.name&&(n||t.hash===e.hash&&bi(t.query,e.query)&&bi(t.params,e.params))))}function bi(t,e){if(void 0===t&&(t={}),void 0===e&&(e={}),!t||!e)return t===e;var n=Object.keys(t).sort(),r=Object.keys(e).sort();return n.length===r.length&&n.every((function(n,o){var i=t[n];if(r[o]!==n)return!1;var a=e[n];return null==i||null==a?i===a:"object"==typeof i&&"object"==typeof a?bi(i,a):String(i)===String(a)}))}function _i(t){for(var e=0;e=0&&(e=t.slice(r),t=t.slice(0,r));var o=t.indexOf("?");return o>=0&&(n=t.slice(o+1),t=t.slice(0,o)),{path:t,query:n,hash:e}}(o.path||""),u=e&&e.path||"/",l=c.path?Oi(c.path,u,n||o.append):u,f=function(t,e,n){void 0===e&&(e={});var r,o=n||li;try{r=o(t||"")}catch(t){r={}}for(var i in e){var a=e[i];r[i]=Array.isArray(a)?a.map(ui):ui(a)}return r}(c.query,o.query,r&&r.options.parseQuery),p=o.hash||c.hash;return p&&"#"!==p.charAt(0)&&(p="#"+p),{_normalized:!0,path:l,query:f,hash:p}}var Vi,qi=function(){},Wi={name:"RouterLink",props:{to:{type:[String,Object],required:!0},tag:{type:String,default:"a"},custom:Boolean,exact:Boolean,exactPath:Boolean,append:Boolean,replace:Boolean,activeClass:String,exactActiveClass:String,ariaCurrentValue:{type:String,default:"page"},event:{type:[String,Array],default:"click"}},render:function(t){var e=this,n=this.$router,r=this.$route,o=n.resolve(this.to,r,this.append),i=o.location,a=o.route,s=o.href,c={},u=n.options.linkActiveClass,l=n.options.linkExactActiveClass,f=null==u?"router-link-active":u,p=null==l?"router-link-exact-active":l,d=null==this.activeClass?f:this.activeClass,h=null==this.exactActiveClass?p:this.exactActiveClass,v=a.redirectedFrom?di(null,Fi(a.redirectedFrom),null,n):a;c[h]=yi(r,v,this.exactPath),c[d]=this.exact||this.exactPath?c[h]:function(t,e){return 0===t.path.replace(pi,"/").indexOf(e.path.replace(pi,"/"))&&(!e.hash||t.hash===e.hash)&&function(t,e){for(var n in e)if(!(n in t))return!1;return!0}(t.query,e.query)}(r,v);var m=c[h]?this.ariaCurrentValue:null,g=function(t){Ki(t)&&(e.replace?n.replace(i,qi):n.push(i,qi))},y={click:Ki};Array.isArray(this.event)?this.event.forEach((function(t){y[t]=g})):y[this.event]=g;var b={class:c},_=!this.$scopedSlots.$hasNormal&&this.$scopedSlots.default&&this.$scopedSlots.default({href:s,route:a,navigate:g,isActive:c[d],isExactActive:c[h]});if(_){if(1===_.length)return _[0];if(_.length>1||!_.length)return 0===_.length?t():t("span",{},_)}if("a"===this.tag)b.on=y,b.attrs={href:s,"aria-current":m};else{var w=function t(e){var n;if(e)for(var r=0;r-1&&(s.params[p]=n.params[p]);return s.path=Bi(l.path,s.params),c(l,s,a)}if(s.path){s.params={};for(var d=0;d-1}function Sa(t,e){return Oa(t)&&t._isRouter&&(null==e||t.type===e)}function Ca(t,e,n){var r=function(o){o>=t.length?n():t[o]?e(t[o],(function(){r(o+1)})):r(o+1)};r(0)}function $a(t){return function(e,n,r){var o=!1,i=0,a=null;ka(t,(function(t,e,n,s){if("function"==typeof t&&void 0===t.cid){o=!0,i++;var c,u=Ta((function(e){var o;((o=e).__esModule||ja&&"Module"===o[Symbol.toStringTag])&&(e=e.default),t.resolved="function"==typeof e?e:Vi.extend(e),n.components[s]=e,--i<=0&&r()})),l=Ta((function(t){var e="Failed to resolve async component "+s+": "+t;a||(a=Oa(t)?t:new Error(e),r(a))}));try{c=t(u,l)}catch(t){l(t)}if(c)if("function"==typeof c.then)c.then(u,l);else{var f=c.component;f&&"function"==typeof f.then&&f.then(u,l)}}})),o||r()}}function ka(t,e){return Ea(t.map((function(t){return Object.keys(t.components).map((function(n){return e(t.components[n],t.instances[n],t,n)}))})))}function Ea(t){return Array.prototype.concat.apply([],t)}var ja="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;function Ta(t){var e=!1;return function(){for(var n=[],r=arguments.length;r--;)n[r]=arguments[r];if(!e)return e=!0,t.apply(this,n)}}var Aa=function(t,e){this.router=t,this.base=function(t){if(!t)if(Yi){var e=document.querySelector("base");t=(t=e&&e.getAttribute("href")||"/").replace(/^https?:\/\/[^\/]+/,"")}else t="/";"/"!==t.charAt(0)&&(t="/"+t);return t.replace(/\/$/,"")}(e),this.current=vi,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[],this.listeners=[]};function Pa(t,e,n,r){var o=ka(t,(function(t,r,o,i){var a=function(t,e){"function"!=typeof t&&(t=Vi.extend(t));return t.options[e]}(t,e);if(a)return Array.isArray(a)?a.map((function(t){return n(t,r,o,i)})):n(a,r,o,i)}));return Ea(r?o.reverse():o)}function La(t,e){if(e)return function(){return t.apply(e,arguments)}}Aa.prototype.listen=function(t){this.cb=t},Aa.prototype.onReady=function(t,e){this.ready?t():(this.readyCbs.push(t),e&&this.readyErrorCbs.push(e))},Aa.prototype.onError=function(t){this.errorCbs.push(t)},Aa.prototype.transitionTo=function(t,e,n){var r,o=this;try{r=this.router.match(t,this.current)}catch(t){throw this.errorCbs.forEach((function(e){e(t)})),t}var i=this.current;this.confirmTransition(r,(function(){o.updateRoute(r),e&&e(r),o.ensureURL(),o.router.afterHooks.forEach((function(t){t&&t(r,i)})),o.ready||(o.ready=!0,o.readyCbs.forEach((function(t){t(r)})))}),(function(t){n&&n(t),t&&!o.ready&&(Sa(t,ya.redirected)&&i===vi||(o.ready=!0,o.readyErrorCbs.forEach((function(e){e(t)}))))}))},Aa.prototype.confirmTransition=function(t,e,n){var r=this,o=this.current;this.pending=t;var i,a,s=function(t){!Sa(t)&&Oa(t)&&(r.errorCbs.length?r.errorCbs.forEach((function(e){e(t)})):console.error(t)),n&&n(t)},c=t.matched.length-1,u=o.matched.length-1;if(yi(t,o)&&c===u&&t.matched[c]===o.matched[u])return this.ensureURL(),t.hash&&aa(this.router,o,t,!1),s(((a=wa(i=o,t,ya.duplicated,'Avoided redundant navigation to current location: "'+i.fullPath+'".')).name="NavigationDuplicated",a));var l=function(t,e){var n,r=Math.max(t.length,e.length);for(n=0;n0)){var e=this.router,n=e.options.scrollBehavior,r=va&&n;r&&this.listeners.push(ia());var o=function(){var n=t.current,o=Ra(t.base);t.current===vi&&o===t._startLocation||t.transitionTo(o,(function(t){r&&aa(e,t,n,!0)}))};window.addEventListener("popstate",o),this.listeners.push((function(){window.removeEventListener("popstate",o)}))}},e.prototype.go=function(t){window.history.go(t)},e.prototype.push=function(t,e,n){var r=this,o=this.current;this.transitionTo(t,(function(t){ma(Si(r.base+t.fullPath)),aa(r.router,t,o,!1),e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var r=this,o=this.current;this.transitionTo(t,(function(t){ga(Si(r.base+t.fullPath)),aa(r.router,t,o,!1),e&&e(t)}),n)},e.prototype.ensureURL=function(t){if(Ra(this.base)!==this.current.fullPath){var e=Si(this.base+this.current.fullPath);t?ma(e):ga(e)}},e.prototype.getCurrentLocation=function(){return Ra(this.base)},e}(Aa);function Ra(t){var e=window.location.pathname,n=e.toLowerCase(),r=t.toLowerCase();return!t||n!==r&&0!==n.indexOf(Si(r+"/"))||(e=e.slice(t.length)),(e||"/")+window.location.search+window.location.hash}var Ma=function(t){function e(e,n,r){t.call(this,e,n),r&&function(t){var e=Ra(t);if(!/^\/#/.test(e))return window.location.replace(Si(t+"/#"+e)),!0}(this.base)||Ia()}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.setupListeners=function(){var t=this;if(!(this.listeners.length>0)){var e=this.router.options.scrollBehavior,n=va&&e;n&&this.listeners.push(ia());var r=function(){var e=t.current;Ia()&&t.transitionTo(Na(),(function(r){n&&aa(t.router,r,e,!0),va||Ua(r.fullPath)}))},o=va?"popstate":"hashchange";window.addEventListener(o,r),this.listeners.push((function(){window.removeEventListener(o,r)}))}},e.prototype.push=function(t,e,n){var r=this,o=this.current;this.transitionTo(t,(function(t){Ha(t.fullPath),aa(r.router,t,o,!1),e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var r=this,o=this.current;this.transitionTo(t,(function(t){Ua(t.fullPath),aa(r.router,t,o,!1),e&&e(t)}),n)},e.prototype.go=function(t){window.history.go(t)},e.prototype.ensureURL=function(t){var e=this.current.fullPath;Na()!==e&&(t?Ha(e):Ua(e))},e.prototype.getCurrentLocation=function(){return Na()},e}(Aa);function Ia(){var t=Na();return"/"===t.charAt(0)||(Ua("/"+t),!1)}function Na(){var t=window.location.href,e=t.indexOf("#");return e<0?"":t=t.slice(e+1)}function Da(t){var e=window.location.href,n=e.indexOf("#");return(n>=0?e.slice(0,n):e)+"#"+t}function Ha(t){va?ma(Da(t)):window.location.hash=t}function Ua(t){va?ga(Da(t)):window.location.replace(Da(t))}var Ba=function(t){function e(e,n){t.call(this,e,n),this.stack=[],this.index=-1}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.push=function(t,e,n){var r=this;this.transitionTo(t,(function(t){r.stack=r.stack.slice(0,r.index+1).concat(t),r.index++,e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var r=this;this.transitionTo(t,(function(t){r.stack=r.stack.slice(0,r.index).concat(t),e&&e(t)}),n)},e.prototype.go=function(t){var e=this,n=this.index+t;if(!(n<0||n>=this.stack.length)){var r=this.stack[n];this.confirmTransition(r,(function(){var t=e.current;e.index=n,e.updateRoute(r),e.router.afterHooks.forEach((function(e){e&&e(r,t)}))}),(function(t){Sa(t,ya.duplicated)&&(e.index=n)}))}},e.prototype.getCurrentLocation=function(){var t=this.stack[this.stack.length-1];return t?t.fullPath:"/"},e.prototype.ensureURL=function(){},e}(Aa),Fa=function(t){void 0===t&&(t={}),this.app=null,this.apps=[],this.options=t,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=Ji(t.routes||[],this);var e=t.mode||"hash";switch(this.fallback="history"===e&&!va&&!1!==t.fallback,this.fallback&&(e="hash"),Yi||(e="abstract"),this.mode=e,e){case"history":this.history=new za(this,t.base);break;case"hash":this.history=new Ma(this,t.base,this.fallback);break;case"abstract":this.history=new Ba(this,t.base);break;default:0}},Va={currentRoute:{configurable:!0}};Fa.prototype.match=function(t,e,n){return this.matcher.match(t,e,n)},Va.currentRoute.get=function(){return this.history&&this.history.current},Fa.prototype.init=function(t){var e=this;if(this.apps.push(t),t.$once("hook:destroyed",(function(){var n=e.apps.indexOf(t);n>-1&&e.apps.splice(n,1),e.app===t&&(e.app=e.apps[0]||null),e.app||e.history.teardown()})),!this.app){this.app=t;var n=this.history;if(n instanceof za||n instanceof Ma){var r=function(t){n.setupListeners(),function(t){var r=n.current,o=e.options.scrollBehavior;va&&o&&"fullPath"in t&&aa(e,t,r,!1)}(t)};n.transitionTo(n.getCurrentLocation(),r,r)}n.listen((function(t){e.apps.forEach((function(e){e._route=t}))}))}},Fa.prototype.beforeEach=function(t){return Wa(this.beforeHooks,t)},Fa.prototype.beforeResolve=function(t){return Wa(this.resolveHooks,t)},Fa.prototype.afterEach=function(t){return Wa(this.afterHooks,t)},Fa.prototype.onReady=function(t,e){this.history.onReady(t,e)},Fa.prototype.onError=function(t){this.history.onError(t)},Fa.prototype.push=function(t,e,n){var r=this;if(!e&&!n&&"undefined"!=typeof Promise)return new Promise((function(e,n){r.history.push(t,e,n)}));this.history.push(t,e,n)},Fa.prototype.replace=function(t,e,n){var r=this;if(!e&&!n&&"undefined"!=typeof Promise)return new Promise((function(e,n){r.history.replace(t,e,n)}));this.history.replace(t,e,n)},Fa.prototype.go=function(t){this.history.go(t)},Fa.prototype.back=function(){this.go(-1)},Fa.prototype.forward=function(){this.go(1)},Fa.prototype.getMatchedComponents=function(t){var e=t?t.matched?t:this.resolve(t).route:this.currentRoute;return e?[].concat.apply([],e.matched.map((function(t){return Object.keys(t.components).map((function(e){return t.components[e]}))}))):[]},Fa.prototype.resolve=function(t,e,n){var r=Fi(t,e=e||this.history.current,n,this),o=this.match(r,e),i=o.redirectedFrom||o.fullPath;return{location:r,route:o,href:function(t,e,n){var r="hash"===n?"#"+e:e;return t?Si(t+"/"+r):r}(this.history.base,i,this.mode),normalizedTo:r,resolved:o}},Fa.prototype.getRoutes=function(){return this.matcher.getRoutes()},Fa.prototype.addRoute=function(t,e){this.matcher.addRoute(t,e),this.history.current!==vi&&this.history.transitionTo(this.history.getCurrentLocation())},Fa.prototype.addRoutes=function(t){this.matcher.addRoutes(t),this.history.current!==vi&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(Fa.prototype,Va);var qa=Fa;function Wa(t,e){return t.push(e),function(){var n=t.indexOf(e);n>-1&&t.splice(n,1)}}Fa.install=function t(e){if(!t.installed||Vi!==e){t.installed=!0,Vi=e;var n=function(t){return void 0!==t},r=function(t,e){var r=t.$options._parentVnode;n(r)&&n(r=r.data)&&n(r=r.registerRouteInstance)&&r(t,e)};e.mixin({beforeCreate:function(){n(this.$options.router)?(this._routerRoot=this,this._router=this.$options.router,this._router.init(this),e.util.defineReactive(this,"_route",this._router.history.current)):this._routerRoot=this.$parent&&this.$parent._routerRoot||this,r(this,this)},destroyed:function(){r(this)}}),Object.defineProperty(e.prototype,"$router",{get:function(){return this._routerRoot._router}}),Object.defineProperty(e.prototype,"$route",{get:function(){return this._routerRoot._route}}),e.component("RouterView",wi),e.component("RouterLink",Wi);var o=e.config.optionMergeStrategies;o.beforeRouteEnter=o.beforeRouteLeave=o.beforeRouteUpdate=o.created}},Fa.version="3.6.5",Fa.isNavigationFailure=Sa,Fa.NavigationFailureType=ya,Fa.START_LOCATION=vi,Yi&&window.Vue&&window.Vue.use(Fa);n(99);n(126),n(92);var Ka={"components/AlgoliaSearchBox":()=>Promise.all([n.e(0),n.e(15)]).then(n.bind(null,333)),"components/DropdownLink":()=>Promise.all([n.e(0),n.e(16)]).then(n.bind(null,261)),"components/DropdownTransition":()=>Promise.all([n.e(0),n.e(23)]).then(n.bind(null,249)),"components/Home":()=>Promise.all([n.e(0),n.e(18)]).then(n.bind(null,287)),"components/NavLink":()=>n.e(26).then(n.bind(null,248)),"components/NavLinks":()=>Promise.all([n.e(0),n.e(12)]).then(n.bind(null,272)),"components/Navbar":()=>Promise.all([n.e(0),n.e(1)]).then(n.bind(null,330)),"components/Page":()=>Promise.all([n.e(0),n.e(11)]).then(n.bind(null,288)),"components/PageEdit":()=>Promise.all([n.e(0),n.e(19)]).then(n.bind(null,274)),"components/PageNav":()=>Promise.all([n.e(0),n.e(17)]).then(n.bind(null,275)),"components/Sidebar":()=>Promise.all([n.e(0),n.e(10)]).then(n.bind(null,289)),"components/SidebarButton":()=>Promise.all([n.e(0),n.e(24)]).then(n.bind(null,290)),"components/SidebarGroup":()=>Promise.all([n.e(0),n.e(3)]).then(n.bind(null,273)),"components/SidebarLink":()=>Promise.all([n.e(0),n.e(20)]).then(n.bind(null,262)),"components/SidebarLinks":()=>Promise.all([n.e(0),n.e(3)]).then(n.bind(null,260)),"global-components/Badge":()=>Promise.all([n.e(0),n.e(4)]).then(n.bind(null,338)),"global-components/CodeBlock":()=>Promise.all([n.e(0),n.e(5)]).then(n.bind(null,334)),"global-components/CodeGroup":()=>Promise.all([n.e(0),n.e(6)]).then(n.bind(null,335)),"layouts/404":()=>n.e(7).then(n.bind(null,336)),"layouts/Layout":()=>Promise.all([n.e(0),n.e(1),n.e(2)]).then(n.bind(null,337)),NotFound:()=>n.e(7).then(n.bind(null,336)),Layout:()=>Promise.all([n.e(0),n.e(1),n.e(2)]).then(n.bind(null,337))},Ya={"v-373877d6":()=>n.e(27).then(n.bind(null,339)),"v-391d91be":()=>n.e(28).then(n.bind(null,340)),"v-20bf683c":()=>n.e(30).then(n.bind(null,341)),"v-08613eba":()=>n.e(29).then(n.bind(null,342)),"v-1ff9d590":()=>n.e(25).then(n.bind(null,343)),"v-50b62894":()=>n.e(21).then(n.bind(null,344)),"v-81727b98":()=>n.e(22).then(n.bind(null,345)),"v-b22ece9c":()=>n.e(13).then(n.bind(null,346)),"v-e2eb21a0":()=>n.e(14).then(n.bind(null,347)),"v-762c45ae":()=>n.e(31).then(n.bind(null,348))};function Xa(t){const e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}const Ga=/-(\w)/g,Ja=Xa(t=>t.replace(Ga,(t,e)=>e?e.toUpperCase():"")),Za=/\B([A-Z])/g,Qa=Xa(t=>t.replace(Za,"-$1").toLowerCase()),ts=Xa(t=>t.charAt(0).toUpperCase()+t.slice(1));function es(t,e){if(!e)return;if(t(e))return t(e);return e.includes("-")?t(ts(Ja(e))):t(ts(e))||t(Qa(e))}const ns=Object.assign({},Ka,Ya),rs=t=>ns[t],os=t=>Ya[t],is=t=>Ka[t],as=t=>Kn.component(t);function ss(t){return es(os,t)}function cs(t){return es(is,t)}function us(t){return es(rs,t)}function ls(t){return es(as,t)}function fs(...t){return Promise.all(t.filter(t=>t).map(async t=>{if(!ls(t)&&us(t)){const e=await us(t)();Kn.component(t,e.default)}}))}function ps(t,e){"undefined"!=typeof window&&window.__VUEPRESS__&&(window.__VUEPRESS__[t]=e)}var ds=n(89),hs=n.n(ds),vs=n(90),ms=n.n(vs),gs={created(){if(this.siteMeta=this.$site.headTags.filter(([t])=>"meta"===t).map(([t,e])=>e),this.$ssrContext){const e=this.getMergedMetaTags();this.$ssrContext.title=this.$title,this.$ssrContext.lang=this.$lang,this.$ssrContext.pageMeta=(t=e)?t.map(t=>{let e="{e+=` ${n}="${ms()(t[n])}"`}),e+">"}).join("\n "):"",this.$ssrContext.canonicalLink=bs(this.$canonicalUrl)}var t},mounted(){this.currentMetaTags=[...document.querySelectorAll("meta")],this.updateMeta(),this.updateCanonicalLink()},methods:{updateMeta(){document.title=this.$title,document.documentElement.lang=this.$lang;const t=this.getMergedMetaTags();this.currentMetaTags=_s(t,this.currentMetaTags)},getMergedMetaTags(){const t=this.$page.frontmatter.meta||[];return hs()([{name:"description",content:this.$description}],t,this.siteMeta,ws)},updateCanonicalLink(){ys(),this.$canonicalUrl&&document.head.insertAdjacentHTML("beforeend",bs(this.$canonicalUrl))}},watch:{$page(){this.updateMeta(),this.updateCanonicalLink()}},beforeDestroy(){_s(null,this.currentMetaTags),ys()}};function ys(){const t=document.querySelector("link[rel='canonical']");t&&t.remove()}function bs(t=""){return t?``:""}function _s(t,e){if(e&&[...e].filter(t=>t.parentNode===document.head).forEach(t=>document.head.removeChild(t)),t)return t.map(t=>{const e=document.createElement("meta");return Object.keys(t).forEach(n=>{e.setAttribute(n,t[n])}),document.head.appendChild(e),e})}function ws(t){for(const e of["name","property","itemprop"])if(t.hasOwnProperty(e))return t[e]+e;return JSON.stringify(t)}var xs=n(22),Os=n.n(xs),Ss={mounted(){window.addEventListener("scroll",this.onScroll)},methods:{onScroll:Os()((function(){this.setActiveHash()}),300),setActiveHash(){const t=[].slice.call(document.querySelectorAll(".sidebar-link")),e=[].slice.call(document.querySelectorAll(".header-anchor")).filter(e=>t.some(t=>t.hash===e.hash)),n=Math.max(window.pageYOffset,document.documentElement.scrollTop,document.body.scrollTop),r=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight),o=window.innerHeight+n;for(let t=0;t=i.parentElement.offsetTop+10&&(!a||n{this.$nextTick(()=>{this.$vuepress.$set("disableScrollBehavior",!1)})})}}}},beforeDestroy(){window.removeEventListener("scroll",this.onScroll)}},Cs=n(23),$s=n.n(Cs),ks={mounted(){$s.a.configure({showSpinner:!1}),this.$router.beforeEach((t,e,n)=>{t.path===e.path||Kn.component(t.name)||$s.a.start(),n()}),this.$router.afterEach(()=>{$s.a.done(),this.isSidebarOpen=!1})}},Es=(n(237),Object.assign||function(t){for(var e=1;e1&&void 0!==arguments[1]?arguments[1]:{},r=window.Promise||function(t){function e(){}t(e,e)},o=function(t){var e=t.target;e!==C?-1!==b.indexOf(e)&&v({target:e}):h()},i=function(){if(!w&&S.original){var t=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;Math.abs(x-t)>O.scrollOffset&&setTimeout(h,150)}},a=function(t){var e=t.key||t.keyCode;"Escape"!==e&&"Esc"!==e&&27!==e||h()},s=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=t;if(t.background&&(C.style.background=t.background),t.container&&t.container instanceof Object&&(e.container=Es({},O.container,t.container)),t.template){var n=Ts(t.template)?t.template:document.querySelector(t.template);e.template=n}return O=Es({},O,e),b.forEach((function(t){t.dispatchEvent(Rs("medium-zoom:update",{detail:{zoom:$}}))})),$},c=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return t(Es({},O,e))},u=function(){for(var t=arguments.length,e=Array(t),n=0;n0?e.reduce((function(t,e){return[].concat(t,Ps(e))}),[]):b;return r.forEach((function(t){t.classList.remove("medium-zoom-image"),t.dispatchEvent(Rs("medium-zoom:detach",{detail:{zoom:$}}))})),b=b.filter((function(t){return-1===r.indexOf(t)})),$},f=function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return b.forEach((function(r){r.addEventListener("medium-zoom:"+t,e,n)})),_.push({type:"medium-zoom:"+t,listener:e,options:n}),$},p=function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return b.forEach((function(r){r.removeEventListener("medium-zoom:"+t,e,n)})),_=_.filter((function(n){return!(n.type==="medium-zoom:"+t&&n.listener.toString()===e.toString())})),$},d=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=t.target,n=function(){var t={width:document.documentElement.clientWidth,height:document.documentElement.clientHeight,left:0,top:0,right:0,bottom:0},e=void 0,n=void 0;if(O.container)if(O.container instanceof Object)e=(t=Es({},t,O.container)).width-t.left-t.right-2*O.margin,n=t.height-t.top-t.bottom-2*O.margin;else{var r=(Ts(O.container)?O.container:document.querySelector(O.container)).getBoundingClientRect(),o=r.width,i=r.height,a=r.left,s=r.top;t=Es({},t,{width:o,height:i,left:a,top:s})}e=e||t.width-2*O.margin,n=n||t.height-2*O.margin;var c=S.zoomedHd||S.original,u=As(c)?e:c.naturalWidth||e,l=As(c)?n:c.naturalHeight||n,f=c.getBoundingClientRect(),p=f.top,d=f.left,h=f.width,v=f.height,m=Math.min(Math.max(h,u),e)/h,g=Math.min(Math.max(v,l),n)/v,y=Math.min(m,g),b="scale("+y+") translate3d("+((e-h)/2-d+O.margin+t.left)/y+"px, "+((n-v)/2-p+O.margin+t.top)/y+"px, 0)";S.zoomed.style.transform=b,S.zoomedHd&&(S.zoomedHd.style.transform=b)};return new r((function(t){if(e&&-1===b.indexOf(e))t($);else{if(S.zoomed)t($);else{if(e)S.original=e;else{if(!(b.length>0))return void t($);var r=b;S.original=r[0]}if(S.original.dispatchEvent(Rs("medium-zoom:open",{detail:{zoom:$}})),x=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,w=!0,S.zoomed=zs(S.original),document.body.appendChild(C),O.template){var o=Ts(O.template)?O.template:document.querySelector(O.template);S.template=document.createElement("div"),S.template.appendChild(o.content.cloneNode(!0)),document.body.appendChild(S.template)}if(S.original.parentElement&&"PICTURE"===S.original.parentElement.tagName&&S.original.currentSrc&&(S.zoomed.src=S.original.currentSrc),document.body.appendChild(S.zoomed),window.requestAnimationFrame((function(){document.body.classList.add("medium-zoom--opened")})),S.original.classList.add("medium-zoom-image--hidden"),S.zoomed.classList.add("medium-zoom-image--opened"),S.zoomed.addEventListener("click",h),S.zoomed.addEventListener("transitionend",(function e(){w=!1,S.zoomed.removeEventListener("transitionend",e),S.original.dispatchEvent(Rs("medium-zoom:opened",{detail:{zoom:$}})),t($)})),S.original.getAttribute("data-zoom-src")){S.zoomedHd=S.zoomed.cloneNode(),S.zoomedHd.removeAttribute("srcset"),S.zoomedHd.removeAttribute("sizes"),S.zoomedHd.removeAttribute("loading"),S.zoomedHd.src=S.zoomed.getAttribute("data-zoom-src"),S.zoomedHd.onerror=function(){clearInterval(i),console.warn("Unable to reach the zoom image target "+S.zoomedHd.src),S.zoomedHd=null,n()};var i=setInterval((function(){S.zoomedHd.complete&&(clearInterval(i),S.zoomedHd.classList.add("medium-zoom-image--opened"),S.zoomedHd.addEventListener("click",h),document.body.appendChild(S.zoomedHd),n())}),10)}else if(S.original.hasAttribute("srcset")){S.zoomedHd=S.zoomed.cloneNode(),S.zoomedHd.removeAttribute("sizes"),S.zoomedHd.removeAttribute("loading");var a=S.zoomedHd.addEventListener("load",(function(){S.zoomedHd.removeEventListener("load",a),S.zoomedHd.classList.add("medium-zoom-image--opened"),S.zoomedHd.addEventListener("click",h),document.body.appendChild(S.zoomedHd),n()}))}else n()}}}))},h=function(){return new r((function(t){if(!w&&S.original){w=!0,document.body.classList.remove("medium-zoom--opened"),S.zoomed.style.transform="",S.zoomedHd&&(S.zoomedHd.style.transform=""),S.template&&(S.template.style.transition="opacity 150ms",S.template.style.opacity=0),S.original.dispatchEvent(Rs("medium-zoom:close",{detail:{zoom:$}})),S.zoomed.addEventListener("transitionend",(function e(){S.original.classList.remove("medium-zoom-image--hidden"),document.body.removeChild(S.zoomed),S.zoomedHd&&document.body.removeChild(S.zoomedHd),document.body.removeChild(C),S.zoomed.classList.remove("medium-zoom-image--opened"),S.template&&document.body.removeChild(S.template),w=!1,S.zoomed.removeEventListener("transitionend",e),S.original.dispatchEvent(Rs("medium-zoom:closed",{detail:{zoom:$}})),S.original=null,S.zoomed=null,S.zoomedHd=null,S.template=null,t($)}))}else t($)}))},v=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=t.target;return S.original?h():d({target:e})},m=function(){return O},g=function(){return b},y=function(){return S.original},b=[],_=[],w=!1,x=0,O=n,S={original:null,zoomed:null,zoomedHd:null,template:null};"[object Object]"===Object.prototype.toString.call(e)?O=e:(e||"string"==typeof e)&&u(e),O=Es({margin:0,background:"#fff",scrollOffset:40,container:null,template:null},O);var C=Ls(O.background);document.addEventListener("click",o),document.addEventListener("keyup",a),document.addEventListener("scroll",i),window.addEventListener("resize",h);var $={open:d,close:h,toggle:v,update:s,clone:c,attach:u,detach:l,on:f,off:p,getOptions:m,getImages:g,getZoomedImage:y};return $},Is={data:()=>({zoom:null}),mounted(){this.updateZoom()},updated(){this.updateZoom()},methods:{updateZoom(){setTimeout(()=>{this.zoom&&this.zoom.detach(),this.zoom=Ms(".theme-default-content :not(a) > img",void 0)},1e3)}}},Ns=n(91),Ds=n.n(Ns),Hs=(n(238),[gs,Ss,ks,Is,{mounted(){Ds.a.polyfill()}}]),Us={name:"GlobalLayout",computed:{layout(){const t=this.getLayout();return ps("layout",t),Kn.component(t)}},methods:{getLayout(){if(this.$page.path){const t=this.$page.frontmatter.layout;return t&&(this.$vuepress.getLayoutAsyncComponent(t)||this.$vuepress.getVueComponent(t))?t:"Layout"}return"NotFound"}}},Bs=n(8),Fs=Object(Bs.a)(Us,(function(){return(0,this._self._c)(this.layout,{tag:"component"})}),[],!1,null,null,null).exports;!function(t,e,n){switch(e){case"components":t[e]||(t[e]={}),Object.assign(t[e],n);break;case"mixins":t[e]||(t[e]=[]),t[e].push(...n);break;default:throw new Error("Unknown option name.")}}(Fs,"mixins",Hs);const Vs=[{name:"v-373877d6",path:"/",component:Fs,beforeEnter:(t,e,n)=>{fs("Layout","v-373877d6").then(n)}},{path:"/index.html",redirect:"/"},{name:"v-391d91be",path:"/part-01/",component:Fs,beforeEnter:(t,e,n)=>{fs("Layout","v-391d91be").then(n)}},{path:"/part-01/index.html",redirect:"/part-01/"},{name:"v-20bf683c",path:"/part-02/",component:Fs,beforeEnter:(t,e,n)=>{fs("Layout","v-20bf683c").then(n)}},{path:"/part-02/index.html",redirect:"/part-02/"},{name:"v-08613eba",path:"/part-03/",component:Fs,beforeEnter:(t,e,n)=>{fs("Layout","v-08613eba").then(n)}},{path:"/part-03/index.html",redirect:"/part-03/"},{name:"v-1ff9d590",path:"/part-04/",component:Fs,beforeEnter:(t,e,n)=>{fs("Layout","v-1ff9d590").then(n)}},{path:"/part-04/index.html",redirect:"/part-04/"},{name:"v-50b62894",path:"/part-05/",component:Fs,beforeEnter:(t,e,n)=>{fs("Layout","v-50b62894").then(n)}},{path:"/part-05/index.html",redirect:"/part-05/"},{name:"v-81727b98",path:"/part-06/",component:Fs,beforeEnter:(t,e,n)=>{fs("Layout","v-81727b98").then(n)}},{path:"/part-06/index.html",redirect:"/part-06/"},{name:"v-b22ece9c",path:"/part-07/",component:Fs,beforeEnter:(t,e,n)=>{fs("Layout","v-b22ece9c").then(n)}},{path:"/part-07/index.html",redirect:"/part-07/"},{name:"v-e2eb21a0",path:"/part-08/",component:Fs,beforeEnter:(t,e,n)=>{fs("Layout","v-e2eb21a0").then(n)}},{path:"/part-08/index.html",redirect:"/part-08/"},{name:"v-762c45ae",path:"/part-09/",component:Fs,beforeEnter:(t,e,n)=>{fs("Layout","v-762c45ae").then(n)}},{path:"/part-09/index.html",redirect:"/part-09/"},{path:"*",component:Fs}],qs={title:"Kubernetes and Harbor",description:"Kubernetes and Harbor",base:"/k8s-harbor/",headTags:[["link",{rel:"icon",href:"/k8s-harbor/favicon.ico"}]],pages:[{title:"Kubernetes + Harbor",frontmatter:{readingShow:"top"},regularPath:"/",relativePath:"README.md",key:"v-373877d6",path:"/",headers:[{level:2,title:"Requirements",slug:"requirements"},{level:2,title:"Objectives",slug:"objectives"},{level:2,title:"Lab Architecture",slug:"lab-architecture"},{level:2,title:"Content",slug:"content"},{level:2,title:"Links",slug:"links"}],lastUpdated:"6/2/2024, 2:37:39 AM",lastUpdatedTimestamp:1717295859e3},{title:"Create EKS cluster",frontmatter:{readingShow:"top"},regularPath:"/part-01/",relativePath:"part-01/README.md",key:"v-391d91be",path:"/part-01/",headers:[{level:2,title:"Prepare the local working environment",slug:"prepare-the-local-working-environment"},{level:2,title:"Configure AWS",slug:"configure-aws"},{level:2,title:"Create Amazon EKS",slug:"create-amazon-eks"}],lastUpdated:"6/2/2024, 2:37:39 AM",lastUpdatedTimestamp:1717295859e3},{title:"Install Helm",frontmatter:{readingShow:"top"},regularPath:"/part-02/",relativePath:"part-02/README.md",key:"v-20bf683c",path:"/part-02/",lastUpdated:"6/2/2024, 2:37:39 AM",lastUpdatedTimestamp:1717295859e3},{title:"Nginx + cert-manager + kubed installation",frontmatter:{readingShow:"top"},regularPath:"/part-03/",relativePath:"part-03/README.md",key:"v-08613eba",path:"/part-03/",headers:[{level:2,title:"Install cert-manager",slug:"install-cert-manager"},{level:3,title:"Create ClusterIssuer for Let's Encrypt",slug:"create-clusterissuer-for-let-s-encrypt"},{level:2,title:"Generate TLS certificate",slug:"generate-tls-certificate"},{level:2,title:"Install kubed",slug:"install-kubed"},{level:2,title:"Install nginx-ingress",slug:"install-nginx-ingress"},{level:2,title:"Create DNS records",slug:"create-dns-records"}],lastUpdated:"6/2/2024, 2:37:39 AM",lastUpdatedTimestamp:1717295859e3},{title:"Install Harbor",frontmatter:{readingShow:"top"},regularPath:"/part-04/",relativePath:"part-04/README.md",key:"v-1ff9d590",path:"/part-04/",headers:[{level:2,title:"Install Harbor using Helm",slug:"install-harbor-using-helm"}],lastUpdated:"6/2/2024, 2:37:39 AM",lastUpdatedTimestamp:1717295859e3},{title:"Initial Harbor tasks",frontmatter:{readingShow:"top"},regularPath:"/part-05/",relativePath:"part-05/README.md",key:"v-50b62894",path:"/part-05/",headers:[{level:2,title:"LDAP Authentication",slug:"ldap-authentication"}],lastUpdated:"6/2/2024, 2:37:39 AM",lastUpdatedTimestamp:1717295859e3},{title:"Harbor and Helm charts",frontmatter:{readingShow:"top"},regularPath:"/part-06/",relativePath:"part-06/README.md",key:"v-81727b98",path:"/part-06/",headers:[{level:2,title:"Add Project",slug:"add-project"},{level:2,title:"Upload Helm Chart using CLI",slug:"upload-helm-chart-using-cli"},{level:2,title:"Upload signed Helm Chart using CLI",slug:"upload-signed-helm-chart-using-cli"},{level:2,title:"Use Harbor Helm Chart repository",slug:"use-harbor-helm-chart-repository"}],lastUpdated:"6/2/2024, 2:37:39 AM",lastUpdatedTimestamp:1717295859e3},{title:"Harbor and container images",frontmatter:{readingShow:"top"},regularPath:"/part-07/",relativePath:"part-07/README.md",key:"v-b22ece9c",path:"/part-07/",headers:[{level:2,title:"Upload docker image",slug:"upload-docker-image"},{level:2,title:"Signed container image",slug:"signed-container-image"},{level:2,title:"Vulnerability scan",slug:"vulnerability-scan"},{level:2,title:"Replication",slug:"replication"}],lastUpdated:"6/2/2024, 2:37:39 AM",lastUpdatedTimestamp:1717295859e3},{title:"Project settings",frontmatter:{readingShow:"top"},regularPath:"/part-08/",relativePath:"part-08/README.md",key:"v-e2eb21a0",path:"/part-08/",headers:[{level:2,title:"Automatically scan images on push",slug:"automatically-scan-images-on-push"},{level:2,title:"Scan existing application",slug:"scan-existing-application"},{level:2,title:"Prevent vulnerable images from running",slug:"prevent-vulnerable-images-from-running"},{level:2,title:"Use image hosted by Harbor in k8s deployment",slug:"use-image-hosted-by-harbor-in-k8s-deployment"},{level:2,title:"Project RBAC settings",slug:"project-rbac-settings"}],lastUpdated:"6/2/2024, 2:37:39 AM",lastUpdatedTimestamp:1717295859e3},{title:"Clean-up",frontmatter:{readingShow:"top"},regularPath:"/part-09/",relativePath:"part-09/README.md",key:"v-762c45ae",path:"/part-09/",lastUpdated:"6/2/2024, 2:37:39 AM",lastUpdatedTimestamp:1717295859e3}],themeConfig:{displayAllHeaders:!0,lastUpdated:!0,repo:"ruzickap/k8s-harbor",docsDir:"docs",editLinks:!0,logo:"/harbor-horizontal-color.svg",nav:[{text:"Home",link:"/"},{text:"Harbor links",items:[{text:"Harbor",link:"https://goharbor.io/"},{text:"Harbor Blog",link:"https://goharbor.io/blog/"},{text:"Harbor Docs",link:"https://goharbor.io/docs/"},{text:"Harbor GitHub",link:"https://github.com/goharbor/harbor/"},{text:"Harbor Community",link:"https://goharbor.io/community/"}]}],sidebar:["/","/part-01/","/part-02/","/part-03/","/part-04/","/part-05/","/part-06/","/part-07/","/part-08/","/part-09/"]}};n(239);Kn.component("Badge",()=>Promise.all([n.e(0),n.e(4)]).then(n.bind(null,338))),Kn.component("CodeBlock",()=>Promise.all([n.e(0),n.e(5)]).then(n.bind(null,334))),Kn.component("CodeGroup",()=>Promise.all([n.e(0),n.e(6)]).then(n.bind(null,335)));n(240);var Ws={name:"BackToTop",props:{threshold:{type:Number,default:300}},data:()=>({scrollTop:null}),computed:{show(){return this.scrollTop>this.threshold}},mounted(){this.scrollTop=this.getScrollTop(),window.addEventListener("scroll",Os()(()=>{this.scrollTop=this.getScrollTop()},100))},methods:{getScrollTop:()=>window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,scrollToTop(){window.scrollTo({top:0,behavior:"smooth"}),this.scrollTop=0}}},Ks=(n(241),Object(Bs.a)(Ws,(function(){var t=this._self._c;return t("transition",{attrs:{name:"fade"}},[this.show?t("svg",{staticClass:"go-to-top",attrs:{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 49.484 28.284"},on:{click:this.scrollToTop}},[t("g",{attrs:{transform:"translate(-229 -126.358)"}},[t("rect",{attrs:{fill:"currentColor",width:"35",height:"5",rx:"2",transform:"translate(229 151.107) rotate(-45)"}}),this._v(" "),t("rect",{attrs:{fill:"currentColor",width:"35",height:"5",rx:"2",transform:"translate(274.949 154.642) rotate(-135)"}})])]):this._e()])}),[],!1,null,"5fd4ef0c",null).exports),Ys={name:"ReadingProgress",data:()=>({readingTop:0,readingHeight:1,progressStyle:null,transform:void 0,running:!1}),watch:{$readingShow(){this.progressStyle=this.getProgressStyle(),this.$readingShow&&window.addEventListener("scroll",this.base)}},mounted(){this.transform=this.getTransform(),this.progressStyle=this.getProgressStyle(),this.$readingShow&&window.addEventListener("scroll",this.base)},beforeDestroy(){this.$readingShow&&window.removeEventListener("scroll",this.base)},methods:{base(){this.running||(this.running=!0,requestAnimationFrame(this.getReadingBase))},getReadingBase(){this.readingHeight=this.getReadingHeight()-this.getScreenHeight(),this.readingTop=this.getReadingTop(),this.progressStyle=this.getProgressStyle(),this.running=!1},getReadingHeight:()=>Math.max(document.body.scrollHeight,document.body.offsetHeight,0),getScreenHeight:()=>Math.max(window.innerHeight,document.documentElement.clientHeight,0),getReadingTop:()=>Math.max(window.pageYOffset,document.documentElement.scrollTop,0),getTransform(){const t=document.createElement("div");return["transform","-webkit-transform","-moz-transform","-o-transform","-ms-transform"].find(e=>e in t.style)||void 0},getProgressStyle(){const t=this.readingTop/this.readingHeight;switch(this.$readingShow){case"top":case"bottom":return this.transform?`${this.transform}: scaleX(${t})`:`width: ${100*t}%`;case"left":case"right":return this.transform?`${this.transform}: scaleY(${t})`:`height: ${100*t}%`;default:return null}}}},Xs=(n(242),Object(Bs.a)(Ys,(function(){var t=this._self._c;return t("ClientOnly",[this.$readingShow?t("div",{staticClass:"reading-progress",class:this.$readingShow},[t("div",{staticClass:"progress",style:this.progressStyle})]):this._e()])}),[],!1,null,"3640397f",null).exports);function Gs(t){const e=document.documentElement.getBoundingClientRect(),n=t.getBoundingClientRect();return{x:n.left-e.left,y:n.top-e.top}}var Js=[{},({Vue:t})=>{t.mixin({computed:{$dataBlock(){return this.$options.__data__block__}}})},{},{},({Vue:t})=>{t.component("BackToTop",Ks)},({Vue:t})=>{t.component(Xs.name,Xs),t.mixin({computed:{$readingShow(){return this.$page.frontmatter.readingShow}}})},({Vue:t,router:e})=>{e.options.scrollBehavior=(e,n,r)=>{if(r)return window.scrollTo({top:r.y,behavior:"smooth"});if(!e.hash)return window.scrollTo({top:0,behavior:"smooth"});{if(t.$vuepress.$get("disableScrollBehavior"))return;const n=e.hash.slice(1),r=document.getElementById(n)||document.querySelector(`[name='${n}']`);if(r)return window.scrollTo({top:Gs(r).y,behavior:"smooth"})}}}],Zs=["BackToTop","ReadingProgress"];class Qs extends class{constructor(){this.store=new Kn({data:{state:{}}})}$get(t){return this.store.state[t]}$set(t,e){Kn.set(this.store.state,t,e)}$emit(...t){this.store.$emit(...t)}$on(...t){this.store.$on(...t)}}{}Object.assign(Qs.prototype,{getPageAsyncComponent:ss,getLayoutAsyncComponent:cs,getAsyncComponent:us,getVueComponent:ls});var tc={install(t){const e=new Qs;t.$vuepress=e,t.prototype.$vuepress=e}};function ec(t,e){const n=e.toLowerCase();return t.options.routes.some(t=>t.path.toLowerCase()===n)}var nc={props:{pageKey:String,slotKey:{type:String,default:"default"}},render(t){const e=this.pageKey||this.$parent.$page.key;return ps("pageKey",e),Kn.component(e)||Kn.component(e,ss(e)),Kn.component(e)?t(e):t("")}},rc={functional:!0,props:{slotKey:String,required:!0},render:(t,{props:e,slots:n})=>t("div",{class:["content__"+e.slotKey]},n()[e.slotKey])},oc={computed:{openInNewWindowTitle(){return this.$themeLocaleConfig.openNewWindowText||"(opens new window)"}}},ic=(n(243),n(244),Object(Bs.a)(oc,(function(){var t=this._self._c;return t("span",[t("svg",{staticClass:"icon outbound",attrs:{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",x:"0px",y:"0px",viewBox:"0 0 100 100",width:"15",height:"15"}},[t("path",{attrs:{fill:"currentColor",d:"M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"}}),this._v(" "),t("polygon",{attrs:{fill:"currentColor",points:"45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"}})]),this._v(" "),t("span",{staticClass:"sr-only"},[this._v(this._s(this.openInNewWindowTitle))])])}),[],!1,null,null,null).exports),ac={functional:!0,render(t,{parent:e,children:n}){if(e._isMounted)return n;e.$once("hook:mounted",()=>{e.$forceUpdate()})}};Kn.config.productionTip=!1,Kn.use(qa),Kn.use(tc),Kn.mixin(function(t,e,n=Kn){!function(t){t.locales&&Object.keys(t.locales).forEach(e=>{t.locales[e].path=e});Object.freeze(t)}(e),n.$vuepress.$set("siteData",e);const r=new(t(n.$vuepress.$get("siteData"))),o=Object.getOwnPropertyDescriptors(Object.getPrototypeOf(r)),i={};return Object.keys(o).reduce((t,e)=>(e.startsWith("$")&&(t[e]=o[e].get),t),i),{computed:i}}(t=>class{setPage(t){this.__page=t}get $site(){return t}get $themeConfig(){return this.$site.themeConfig}get $frontmatter(){return this.$page.frontmatter}get $localeConfig(){const{locales:t={}}=this.$site;let e,n;for(const r in t)"/"===r?n=t[r]:0===this.$page.path.indexOf(r)&&(e=t[r]);return e||n||{}}get $siteTitle(){return this.$localeConfig.title||this.$site.title||""}get $canonicalUrl(){const{canonicalUrl:t}=this.$page.frontmatter;return"string"==typeof t&&t}get $title(){const t=this.$page,{metaTitle:e}=this.$page.frontmatter;if("string"==typeof e)return e;const n=this.$siteTitle,r=t.frontmatter.home?null:t.frontmatter.title||t.title;return n?r?r+" | "+n:n:r||"VuePress"}get $description(){const t=function(t){if(t){const e=t.filter(t=>"description"===t.name)[0];if(e)return e.content}}(this.$page.frontmatter.meta);return t||(this.$page.frontmatter.description||this.$localeConfig.description||this.$site.description||"")}get $lang(){return this.$page.frontmatter.lang||this.$localeConfig.lang||"en-US"}get $localePath(){return this.$localeConfig.path||"/"}get $themeLocaleConfig(){return(this.$site.themeConfig.locales||{})[this.$localePath]||{}}get $page(){return this.__page?this.__page:function(t,e){for(let n=0;nn||(t.hash?!Kn.$vuepress.$get("disableScrollBehavior")&&{selector:decodeURIComponent(t.hash)}:{x:0,y:0})});!function(t){t.beforeEach((e,n,r)=>{if(ec(t,e.path))r();else if(/(\/|\.html)$/.test(e.path))if(/\/$/.test(e.path)){const n=e.path.replace(/\/$/,"")+".html";ec(t,n)?r(n):r()}else r();else{const n=e.path+"/",o=e.path+".html";ec(t,o)?r(o):ec(t,n)?r(n):r()}})}(n);const r={};try{await Promise.all(Js.filter(t=>"function"==typeof t).map(e=>e({Vue:Kn,options:r,router:n,siteData:qs,isServer:t})))}catch(t){console.error(t)}return{app:new Kn(Object.assign(r,{router:n,render:t=>t("div",{attrs:{id:"app"}},[t("RouterView",{ref:"layout"}),t("div",{class:"global-ui"},Zs.map(e=>t(e)))])})),router:n}}(!1).then(({app:t,router:e})=>{e.onReady(()=>{t.$mount("#app")})})}]);
\ No newline at end of file
diff --git a/assets/js/vendors~docsearch.89026c5a.js b/assets/js/vendors~docsearch.89026c5a.js
new file mode 100644
index 00000000..89ed7fa8
--- /dev/null
+++ b/assets/js/vendors~docsearch.89026c5a.js
@@ -0,0 +1,3 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[9],{331:function(t,e,n){
+/*! docsearch 2.6.3 | © Algolia | github.com/algolia/docsearch */
+var r;"undefined"!=typeof self&&self,r=function(){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var i=e[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:r})},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=22)}([function(t,e,n){"use strict";var r,i=n(1);function s(t){return t.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}t.exports={isArray:null,isFunction:null,isObject:null,bind:null,each:null,map:null,mixin:null,isMsie:function(t){if(void 0===t&&(t=navigator.userAgent),/(msie|trident)/i.test(t)){var e=t.match(/(msie |rv:)(\d+(.\d+)?)/i);if(e)return e[2]}return!1},escapeRegExChars:function(t){return t.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},isNumber:function(t){return"number"==typeof t},toStr:function(t){return null==t?"":t+""},cloneDeep:function(t){var e=this.mixin({},t),n=this;return this.each(e,(function(t,r){t&&(n.isArray(t)?e[r]=[].concat(t):n.isObject(t)&&(e[r]=n.cloneDeep(t)))})),e},error:function(t){throw new Error(t)},every:function(t,e){var n=!0;return t?(this.each(t,(function(r,i){n&&(n=e.call(null,r,i,t)&&n)})),!!n):n},any:function(t,e){var n=!1;return t?(this.each(t,(function(r,i){if(e.call(null,r,i,t))return n=!0,!1})),n):n},getUniqueId:(r=0,function(){return r++}),templatify:function(t){if(this.isFunction(t))return t;var e=i.element(t);return"SCRIPT"===e.prop("tagName")?function(){return e.text()}:function(){return String(t)}},defer:function(t){setTimeout(t,0)},noop:function(){},formatPrefix:function(t,e){return e?"":t+"-"},className:function(t,e,n){return(n?"":".")+t+e},escapeHighlightedString:function(t,e,n){e=e||"";var r=document.createElement("div");r.appendChild(document.createTextNode(e)),n=n||"";var i=document.createElement("div");i.appendChild(document.createTextNode(n));var o=document.createElement("div");return o.appendChild(document.createTextNode(t)),o.innerHTML.replace(RegExp(s(r.innerHTML),"g"),e).replace(RegExp(s(i.innerHTML),"g"),n)}}},function(t,e,n){"use strict";t.exports={element:null}},function(t,e){var n=Object.prototype.hasOwnProperty,r=Object.prototype.toString;t.exports=function(t,e,i){if("[object Function]"!==r.call(e))throw new TypeError("iterator must be a function");var s=t.length;if(s===+s)for(var o=0;o was loaded but did not call our provided callback"),JSONPScriptError:s("JSONPScriptError","
+