diff --git a/assets/js/e1dfe4fe.4badf62e.js b/assets/js/e1dfe4fe.4badf62e.js
new file mode 100644
index 00000000..5f012385
--- /dev/null
+++ b/assets/js/e1dfe4fe.4badf62e.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4778],{3938:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>c,metadata:()=>d,toc:()=>h});var s=r(5893),i=r(1151);function o(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"docker-quickstart",children:"Docker Quickstart"}),"\n",(0,s.jsx)("iframe",{width:"100%",height:"315",src:"https://www.youtube.com/embed/zoWmTzTa1cg",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:!0}),"\n",(0,s.jsx)(n.h3,{id:"dns-configuration",children:"DNS Configuration"}),"\n",(0,s.jsx)(n.p,{children:"The quickstart makes these assumptions about your global DNS configuration."}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["A Caddy DNS plugin is available for your DNS provider (see ",(0,s.jsx)(n.a,{href:"https://github.com/orgs/caddy-dns/repositories?type=all&q=sort%3Aname-asc",children:"github.com/caddy-dns"}),")"]}),"\n",(0,s.jsxs)(n.li,{children:["You have designated A DNS zone for zrok, e.g. ",(0,s.jsx)(n.code,{children:"example.com"})," or ",(0,s.jsx)(n.code,{children:"share.example.com"})," and created (and delegated, if necessary) the zone on your DNS provider's platform."]}),"\n",(0,s.jsxs)(n.li,{children:["A wildcard record exists for the IP address where the zrok instance will run, e.g. if your DNS zone is ",(0,s.jsx)(n.code,{children:"share.example.com"}),", then your wildcard record is ",(0,s.jsx)(n.code,{children:"*.share.example.com"}),"."]}),"\n",(0,s.jsx)(n.li,{children:"You have created an API token in your DNS provider's platform and the token has permission to create DNS records in the DNS zone."}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"create-the-docker-compose-project",children:"Create the Docker Compose Project"}),"\n",(0,s.jsx)(n.p,{children:'Create a working directory on your Docker host and save these Docker Compose project files. A OpenZiti network is provided by the "quickstart" container and is managed exclusively by zrok.'}),"\n",(0,s.jsx)(n.h4,{id:"shortcut-option",children:"Shortcut Option"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Run this script to download the files in the current directory."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"curl https://get.openziti.io/zrok-instance/fetch.bash | bash\n"})}),"\n",(0,s.jsx)(n.p,{children:"Or, specify the Compose project directory."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"curl https://get.openziti.io/zrok-instance/fetch.bash | bash -s /path/to/compose/project/dir\n"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h4,{id:"manual-option",children:"Manual Option"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Get the zrok repo ZIP file."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"wget https://github.com/openziti/zrok/archive/refs/heads/main.zip\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Unzip the zrok-instance files into the project directory."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"unzip -j -d . main.zip '*/docker/compose/zrok-instance/*'\n"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"configure-the-docker-compose-project-environment",children:"Configure the Docker Compose Project Environment"}),"\n",(0,s.jsxs)(n.p,{children:["Create an ",(0,s.jsx)(n.code,{children:".env"})," file in the working directory."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title=".env required"',children:"ZROK_DNS_ZONE=share.example.com\n\nCADDY_DNS_PLUGIN=cloudflare\nCADDY_DNS_PLUGIN_TOKEN=abcd1234\nCADDY_ACME_EMAIL=me@example.com\n\nZITI_PWD=zitiadminpw\n\nZROK_ADMIN_TOKEN=zroktoken\nZROK_USER_PWD=zrokuserpw\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title=".env options"',children:"# ziti ports\nZITI_CTRL_ADVERTISED_PORT=1280\nZITI_ROUTER_PORT=3022\n\n# configure oauth for public shares\nZROK_OAUTH_HASH_KEY=oauthhashkeysecret\nZROK_OAUTH_GITHUB_CLIENT_ID=abcd1234\nZROK_OAUTH_GITHUB_CLIENT_SECRET=abcd1234\nZROK_OAUTH_GOOGLE_CLIENT_ID=abcd1234\nZROK_OAUTH_GOOGLE_CLIENT_SECRET=abcd1234\n\n# use the staging API until you're sure everything is working to avoid hitting the main CA's rate limit\nCADDY_ACME_API=https://acme-staging-v02.api.letsencrypt.org/directory\n"})}),"\n",(0,s.jsx)(n.h3,{id:"start-the-docker-compose-project",children:"Start the Docker Compose Project"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Start the zrok instance."}),"\n",(0,s.jsxs)(n.p,{children:["The container images for zrok (including caddy) are built in this step. This provides a simple configuration to get started. You can modify the templates named like ",(0,s.jsx)(n.code,{children:"*.envsubst"})," or mount a customized configuration file to mask the one that was built in."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"docker compose up --build --detach\n"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"set-up-a-user-account",children:"Set up a User Account"}),"\n",(0,s.jsxs)(n.p,{children:["This step creates a user account. You will log in to the zrok web console with the account password created in this step. The CADDY_ACME_EMAIL and ZROK_USER_PWD variables are set in the ",(0,s.jsx)(n.code,{children:".env"})," file. You can create more user accounts the same way by substituting a different email and password."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"docker compose exec zrok-controller bash -xc 'zrok admin create account /etc/zrok-controller/config.yml ${CADDY_ACME_EMAIL} ${ZROK_USER_PWD}'\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-buttonless",metastring:'title="Example output"',children:"+ zrok admin create account /etc/zrok-controller/config.yml me@example.com zrokuserpw\n[ 0.000] INFO zrok/controller/store.Open: database connected\n[ 0.002] INFO zrok/controller/store.(*Store).migrate: applied 0 migrations\nheMqncCyxZcx\n"})}),"\n",(0,s.jsx)(n.h3,{id:"enable-the-user-environment",children:"Enable the User Environment"}),"\n",(0,s.jsx)(n.p,{children:"You must enable each device environment with the account token obtained when the account was created. This is separate from the account password that's used to log in to the web console."}),"\n",(0,s.jsxs)(n.p,{children:["Follow ",(0,s.jsx)(n.a,{href:"/docs/getting-started#installing-the-zrok-command",children:"the getting started guide"})," to install the zrok CLI on some device and enable a zrok environment."]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Configure the environment with the zrok API. Substitute the API endpoint with the one you're using, e.g. ",(0,s.jsx)(n.code,{children:"https://zrok.${ZROK_DNS_ZONE}"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"zrok config set apiEndpoint https://zrok.share.example.com\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Enable an environment on this device with the account token from the previous step."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"zrok enable heMqncCyxZcx\n"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"firewall-configuration",children:"Firewall Configuration"}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"quickstart"})," and ",(0,s.jsx)(n.code,{children:"caddy"})," containers publish ports to all devices that use zrok shares. The ",(0,s.jsx)(n.code,{children:"zrok-controller"})," and ",(0,s.jsx)(n.code,{children:"zrok-frontend"})," containers expose ports only to the ",(0,s.jsx)(n.code,{children:"caddy"})," container and the Docker host's loopback interface."]}),"\n",(0,s.jsx)(n.h4,{id:"required",children:"Required"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"443/tcp"})," - reverse proxy handles HTTPS requests for zrok API, OAuth, and public shares (published by container ",(0,s.jsx)(n.code,{children:"caddy"}),")"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"1280/tcp"})," - ziti ctrl plane (published by container ",(0,s.jsx)(n.code,{children:"quickstart"}),")"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"3022/tcp"})," - ziti data plane (published by container ",(0,s.jsx)(n.code,{children:"quickstart"}),")"]}),"\n"]}),"\n",(0,s.jsx)(n.h4,{id:"optional",children:"Optional"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"80/tcp"})," - reverse proxy redirects non-HTTPS requests to ",(0,s.jsx)(n.code,{children:"443/tcp"})," (published by container ",(0,s.jsx)(n.code,{children:"caddy"}),")"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Check the ziti and zrok logs."}),"\n",(0,s.jsxs)(n.p,{children:["You can substitute the service container name of each to check their logs individually: ",(0,s.jsx)(n.code,{children:"quickstart"})," (ziti container), ",(0,s.jsx)(n.code,{children:"zrok-controller"}),", ",(0,s.jsx)(n.code,{children:"zrok-frontend"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"docker compose logs zrok-controller\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Check the caddy logs."}),"\n",(0,s.jsxs)(n.p,{children:["It can take a few minutes for Caddy to obtain the wildcard certificate. You can check the logs to see if there were any errors completing the DNS challenge which involves using the Caddy DNS plugin to create a TXT record in your DNS zone. This leverages the API token you provided in the ",(0,s.jsx)(n.code,{children:".env"})," file, which must have permission to create DNS records in the zrok DNS zone."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"docker compose logs caddy\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"zrok enable"})," fails certificate verification: ensure you are not using the staging API for Let's Encrypt."]}),"\n",(0,s.jsxs)(n.p,{children:["If you are using the staging API, you will see an error about the API certificate when you use the zrok CLI. You can switch to the production API by removing the overriding assignment of the ",(0,s.jsx)(n.code,{children:"CADDY_ACME_API"})," variable."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-buttonless",metastring:'title="Example output"',children:'there was a problem enabling your environment!\nyou are trying to use the zrok service at: https://zrok.share.example.com\nyou can change your zrok service endpoint using this command:\n\n$ zrok config set apiEndpoint \n\n(where newEndpoint is something like: https://some.zrok.io)\n[ERROR]: error creating service client (error getting version from api endpoint \'https://zrok.share.example.com\': Get "https://zrok.share.example.com/api/v1/version": tls: failed to verify certificate: x509: certificate signed by unknown authority: Get "https://zrok.share.example.com/api/v1/version": tls: failed to verify certificate: x509: certificate signed by unknown authority)\n'})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Validate the Caddyfile."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"docker compose exec caddy caddy validate --config /etc/caddy/Caddyfile\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Verify the correct DNS provider module was built-in to Caddy."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"docker compose exec caddy caddy list-modules | grep dns.providers\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-buttonless",metastring:'title="Example output"',children:"dns.providers.cloudflare\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Verify certificates."}),"\n",(0,s.jsx)(n.p,{children:"You can check the certificates that Caddy has obtained."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"docker compose exec caddy caddy list-certificates\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Use the Caddy admin API."}),"\n",(0,s.jsxs)(n.p,{children:["You can use the Caddy admin API to check the status of the Caddy instance. The admin API is available on port ",(0,s.jsx)(n.code,{children:"2019/tcp"})," inside the Docker Compose project. You can modify ",(0,s.jsx)(n.code,{children:"compose.override.yml"})," to publish the port if you want to access the admin API from the Docker host or elsewhere."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"docker compose exec caddy curl http://localhost:2019/config/ | jq\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"My provider, e.g., Route53 doesn't give me a single API token."}),"\n",(0,s.jsxs)(n.p,{children:["As long as your DNS provider is supported by Caddy then it will work. You can modify the Caddyfile to use a different set of properties than the example. Here's how the ",(0,s.jsx)(n.code,{children:"tls"})," section should look for Route53."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:"tls {\n dns {$CADDY_DNS_PLUGIN} {\n access_key_id {$AWS_ACCESS_KEY_ID}\n secret_access_key {$AWS_SECRET_ACCESS_KEY}\n }\n}\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title=".env"',children:"CADDY_DNS_PLUGIN=route53\nAWS_ACCESS_KEY_ID=abcd1234\nAWS_SECRET_ACCESS_KEY=abcd1234\n"})}),"\n"]}),"\n"]})]})}function t(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(o,{...e})}):o(e)}const c={title:"Self-hosting guide for Docker",sidebar_label:"Docker",sidebar_position:45},a=void 0,d={id:"guides/self-hosting/docker",title:"Self-hosting guide for Docker",description:"",source:"@site/../docs/guides/self-hosting/docker.mdx",sourceDirName:"guides/self-hosting",slug:"/guides/self-hosting/docker",permalink:"/docs/guides/self-hosting/docker",draft:!1,unlisted:!1,editUrl:"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/self-hosting/docker.mdx",tags:[],version:"current",sidebarPosition:45,frontMatter:{title:"Self-hosting guide for Docker",sidebar_label:"Docker",sidebar_position:45},sidebar:"tutorialSidebar",previous:{title:"Linux",permalink:"/docs/guides/self-hosting/linux"},next:{title:"NGINX TLS",permalink:"/docs/guides/self-hosting/nginx_tls_guide"}},l={},h=[];function p(e){return(0,s.jsx)(t,{})}function u(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(p,{...e})}):p()}},1151:(e,n,r)=>{r.d(n,{Z:()=>c,a:()=>t});var s=r(7294);const i={},o=s.createContext(i);function t(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/e1dfe4fe.f856f53b.js b/assets/js/e1dfe4fe.f856f53b.js
deleted file mode 100644
index 738adec9..00000000
--- a/assets/js/e1dfe4fe.f856f53b.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4778],{3938:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>c,metadata:()=>d,toc:()=>h});var r=s(5893),i=s(1151);function o(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",...(0,i.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"docker-quickstart",children:"Docker Quickstart"}),"\n",(0,r.jsx)(n.h3,{id:"dns-configuration",children:"DNS Configuration"}),"\n",(0,r.jsx)(n.p,{children:"The quickstart makes these assumptions about your global DNS configuration."}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["A Caddy DNS plugin is available for your DNS provider (see ",(0,r.jsx)(n.a,{href:"https://github.com/orgs/caddy-dns/repositories?type=all&q=sort%3Aname-asc",children:"github.com/caddy-dns"}),")"]}),"\n",(0,r.jsxs)(n.li,{children:["You have designated A DNS zone for zrok, e.g. ",(0,r.jsx)(n.code,{children:"example.com"})," or ",(0,r.jsx)(n.code,{children:"share.example.com"})," and created (and delegated, if necessary) the zone on your DNS provider's platform."]}),"\n",(0,r.jsxs)(n.li,{children:["A wildcard record exists for the IP address where the zrok instance will run, e.g. if your DNS zone is ",(0,r.jsx)(n.code,{children:"share.example.com"}),", then your wildcard record is ",(0,r.jsx)(n.code,{children:"*.share.example.com"}),"."]}),"\n",(0,r.jsx)(n.li,{children:"You have created an API token in your DNS provider's platform and the token has permission to create DNS records in the DNS zone."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"create-the-docker-compose-project",children:"Create the Docker Compose Project"}),"\n",(0,r.jsx)(n.p,{children:'Create a working directory on your Docker host and save these Docker Compose project files. A OpenZiti network is provided by the "quickstart" container and is managed exclusively by zrok.'}),"\n",(0,r.jsx)(n.h4,{id:"shortcut-option",children:"Shortcut Option"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Run this script to download the files in the current directory."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"curl https://get.openziti.io/zrok-instance/fetch.bash | bash\n"})}),"\n",(0,r.jsx)(n.p,{children:"Or, specify the Compose project directory."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"curl https://get.openziti.io/zrok-instance/fetch.bash | bash -s /path/to/compose/project/dir\n"})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h4,{id:"manual-option",children:"Manual Option"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Get the zrok repo ZIP file."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"wget https://github.com/openziti/zrok/archive/refs/heads/main.zip\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Unzip the zrok-instance files into the project directory."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"unzip -j -d . main.zip '*/docker/compose/zrok-instance/*'\n"})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"configure-the-docker-compose-project-environment",children:"Configure the Docker Compose Project Environment"}),"\n",(0,r.jsxs)(n.p,{children:["Create an ",(0,r.jsx)(n.code,{children:".env"})," file in the working directory."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title=".env required"',children:"ZROK_DNS_ZONE=share.example.com\n\nCADDY_DNS_PLUGIN=cloudflare\nCADDY_DNS_PLUGIN_TOKEN=abcd1234\nCADDY_ACME_EMAIL=me@example.com\n\nZITI_PWD=zitiadminpw\n\nZROK_ADMIN_TOKEN=zroktoken\nZROK_USER_PWD=zrokuserpw\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title=".env options"',children:"# ziti ports\nZITI_CTRL_ADVERTISED_PORT=1280\nZITI_ROUTER_PORT=3022\n\n# configure oauth for public shares\nZROK_OAUTH_HASH_KEY=oauthhashkeysecret\nZROK_OAUTH_GITHUB_CLIENT_ID=abcd1234\nZROK_OAUTH_GITHUB_CLIENT_SECRET=abcd1234\nZROK_OAUTH_GOOGLE_CLIENT_ID=abcd1234\nZROK_OAUTH_GOOGLE_CLIENT_SECRET=abcd1234\n\n# use the staging API until you're sure everything is working to avoid hitting the main CA's rate limit\nCADDY_ACME_API=https://acme-staging-v02.api.letsencrypt.org/directory\n"})}),"\n",(0,r.jsx)(n.h3,{id:"start-the-docker-compose-project",children:"Start the Docker Compose Project"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Start the zrok instance."}),"\n",(0,r.jsxs)(n.p,{children:["The container images for zrok (including caddy) are built in this step. This provides a simple configuration to get started. You can modify the templates named like ",(0,r.jsx)(n.code,{children:"*.envsubst"})," or mount a customized configuration file to mask the one that was built in."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker compose up --build --detach\n"})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"set-up-a-user-account",children:"Set up a User Account"}),"\n",(0,r.jsxs)(n.p,{children:["This step creates a user account. You will log in to the zrok web console with the account password created in this step. The CADDY_ACME_EMAIL and ZROK_USER_PWD variables are set in the ",(0,r.jsx)(n.code,{children:".env"})," file. You can create more user accounts the same way by substituting a different email and password."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker compose exec zrok-controller bash -xc 'zrok admin create account /etc/zrok-controller/config.yml ${CADDY_ACME_EMAIL} ${ZROK_USER_PWD}'\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-buttonless",metastring:'title="Example output"',children:"+ zrok admin create account /etc/zrok-controller/config.yml me@example.com zrokuserpw\n[ 0.000] INFO zrok/controller/store.Open: database connected\n[ 0.002] INFO zrok/controller/store.(*Store).migrate: applied 0 migrations\nheMqncCyxZcx\n"})}),"\n",(0,r.jsx)(n.h3,{id:"enable-the-user-environment",children:"Enable the User Environment"}),"\n",(0,r.jsx)(n.p,{children:"You must enable each device environment with the account token obtained when the account was created. This is separate from the account password that's used to log in to the web console."}),"\n",(0,r.jsxs)(n.p,{children:["Follow ",(0,r.jsx)(n.a,{href:"/docs/getting-started#installing-the-zrok-command",children:"the getting started guide"})," to install the zrok CLI on some device and enable a zrok environment."]}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Configure the environment with the zrok API. Substitute the API endpoint with the one you're using, e.g. ",(0,r.jsx)(n.code,{children:"https://zrok.${ZROK_DNS_ZONE}"}),"."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"zrok config set apiEndpoint https://zrok.share.example.com\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Enable an environment on this device with the account token from the previous step."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"zrok enable heMqncCyxZcx\n"})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"firewall-configuration",children:"Firewall Configuration"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"quickstart"})," and ",(0,r.jsx)(n.code,{children:"caddy"})," containers publish ports to all devices that use zrok shares. The ",(0,r.jsx)(n.code,{children:"zrok-controller"})," and ",(0,r.jsx)(n.code,{children:"zrok-frontend"})," containers expose ports only to the ",(0,r.jsx)(n.code,{children:"caddy"})," container and the Docker host's loopback interface."]}),"\n",(0,r.jsx)(n.h4,{id:"required",children:"Required"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"443/tcp"})," - reverse proxy handles HTTPS requests for zrok API, OAuth, and public shares (published by container ",(0,r.jsx)(n.code,{children:"caddy"}),")"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"1280/tcp"})," - ziti ctrl plane (published by container ",(0,r.jsx)(n.code,{children:"quickstart"}),")"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"3022/tcp"})," - ziti data plane (published by container ",(0,r.jsx)(n.code,{children:"quickstart"}),")"]}),"\n"]}),"\n",(0,r.jsx)(n.h4,{id:"optional",children:"Optional"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"80/tcp"})," - reverse proxy redirects non-HTTPS requests to ",(0,r.jsx)(n.code,{children:"443/tcp"})," (published by container ",(0,r.jsx)(n.code,{children:"caddy"}),")"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Check the ziti and zrok logs."}),"\n",(0,r.jsxs)(n.p,{children:["You can substitute the service container name of each to check their logs individually: ",(0,r.jsx)(n.code,{children:"quickstart"})," (ziti container), ",(0,r.jsx)(n.code,{children:"zrok-controller"}),", ",(0,r.jsx)(n.code,{children:"zrok-frontend"}),"."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker compose logs zrok-controller\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Check the caddy logs."}),"\n",(0,r.jsxs)(n.p,{children:["It can take a few minutes for Caddy to obtain the wildcard certificate. You can check the logs to see if there were any errors completing the DNS challenge which involves using the Caddy DNS plugin to create a TXT record in your DNS zone. This leverages the API token you provided in the ",(0,r.jsx)(n.code,{children:".env"})," file, which must have permission to create DNS records in the zrok DNS zone."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker compose logs caddy\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"zrok enable"})," fails certificate verification: ensure you are not using the staging API for Let's Encrypt."]}),"\n",(0,r.jsxs)(n.p,{children:["If you are using the staging API, you will see an error about the API certificate when you use the zrok CLI. You can switch to the production API by removing the overriding assignment of the ",(0,r.jsx)(n.code,{children:"CADDY_ACME_API"})," variable."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-buttonless",metastring:'title="Example output"',children:'there was a problem enabling your environment!\nyou are trying to use the zrok service at: https://zrok.share.example.com\nyou can change your zrok service endpoint using this command:\n\n$ zrok config set apiEndpoint \n\n(where newEndpoint is something like: https://some.zrok.io)\n[ERROR]: error creating service client (error getting version from api endpoint \'https://zrok.share.example.com\': Get "https://zrok.share.example.com/api/v1/version": tls: failed to verify certificate: x509: certificate signed by unknown authority: Get "https://zrok.share.example.com/api/v1/version": tls: failed to verify certificate: x509: certificate signed by unknown authority)\n'})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Validate the Caddyfile."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker compose exec caddy caddy validate --config /etc/caddy/Caddyfile\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Verify the correct DNS provider module was built-in to Caddy."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker compose exec caddy caddy list-modules | grep dns.providers\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-buttonless",metastring:'title="Example output"',children:"dns.providers.cloudflare\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Verify certificates."}),"\n",(0,r.jsx)(n.p,{children:"You can check the certificates that Caddy has obtained."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker compose exec caddy caddy list-certificates\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Use the Caddy admin API."}),"\n",(0,r.jsxs)(n.p,{children:["You can use the Caddy admin API to check the status of the Caddy instance. The admin API is available on port ",(0,r.jsx)(n.code,{children:"2019/tcp"})," inside the Docker Compose project. You can modify ",(0,r.jsx)(n.code,{children:"compose.override.yml"})," to publish the port if you want to access the admin API from the Docker host or elsewhere."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker compose exec caddy curl http://localhost:2019/config/ | jq\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"My provider, e.g., Route53 doesn't give me a single API token."}),"\n",(0,r.jsxs)(n.p,{children:["As long as your DNS provider is supported by Caddy then it will work. You can modify the Caddyfile to use a different set of properties than the example. Here's how the ",(0,r.jsx)(n.code,{children:"tls"})," section should look for Route53."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:"tls {\n dns {$CADDY_DNS_PLUGIN} {\n access_key_id {$AWS_ACCESS_KEY_ID}\n secret_access_key {$AWS_SECRET_ACCESS_KEY}\n }\n}\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title=".env"',children:"CADDY_DNS_PLUGIN=route53\nAWS_ACCESS_KEY_ID=abcd1234\nAWS_SECRET_ACCESS_KEY=abcd1234\n"})}),"\n"]}),"\n"]})]})}function t(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(o,{...e})}):o(e)}const c={title:"Self-hosting guide for Docker",sidebar_label:"Docker",sidebar_position:45},a=void 0,d={id:"guides/self-hosting/docker",title:"Self-hosting guide for Docker",description:"",source:"@site/../docs/guides/self-hosting/docker.mdx",sourceDirName:"guides/self-hosting",slug:"/guides/self-hosting/docker",permalink:"/docs/guides/self-hosting/docker",draft:!1,unlisted:!1,editUrl:"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/self-hosting/docker.mdx",tags:[],version:"current",sidebarPosition:45,frontMatter:{title:"Self-hosting guide for Docker",sidebar_label:"Docker",sidebar_position:45},sidebar:"tutorialSidebar",previous:{title:"Linux",permalink:"/docs/guides/self-hosting/linux"},next:{title:"NGINX TLS",permalink:"/docs/guides/self-hosting/nginx_tls_guide"}},l={},h=[];function p(e){return(0,r.jsx)(t,{})}function u(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(p,{...e})}):p()}},1151:(e,n,s)=>{s.d(n,{Z:()=>c,a:()=>t});var r=s(7294);const i={},o=r.createContext(i);function t(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/runtime~main.b08ee78d.js b/assets/js/runtime~main.76c6fb62.js
similarity index 98%
rename from assets/js/runtime~main.b08ee78d.js
rename to assets/js/runtime~main.76c6fb62.js
index dd544f38..abcd435c 100644
--- a/assets/js/runtime~main.b08ee78d.js
+++ b/assets/js/runtime~main.76c6fb62.js
@@ -1 +1 @@
-(()=>{"use strict";var e,a,t,r,d,c={},b={};function f(e){var a=b[e];if(void 0!==a)return a.exports;var t=b[e]={id:e,loaded:!1,exports:{}};return c[e].call(t.exports,t,t.exports,f),t.loaded=!0,t.exports}f.m=c,f.c=b,f.amdO={},e=[],f.O=(a,t,r,d)=>{if(!t){var c=1/0;for(i=0;i=d)&&Object.keys(f.O).every((e=>f.O[e](t[o])))?t.splice(o--,1):(b=!1,d0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[t,r,d]},f.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return f.d(a,{a:a}),a},t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,f.t=function(e,r){if(1&r&&(e=this(e)),8&r)return e;if("object"==typeof e&&e){if(4&r&&e.__esModule)return e;if(16&r&&"function"==typeof e.then)return e}var d=Object.create(null);f.r(d);var c={};a=a||[null,t({}),t([]),t(t)];for(var b=2&r&&e;"object"==typeof b&&!~a.indexOf(b);b=t(b))Object.getOwnPropertyNames(b).forEach((a=>c[a]=()=>e[a]));return c.default=()=>e,f.d(d,c),d},f.d=(e,a)=>{for(var t in a)f.o(a,t)&&!f.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:a[t]})},f.f={},f.e=e=>Promise.all(Object.keys(f.f).reduce(((a,t)=>(f.f[t](e,a),a)),[])),f.u=e=>"assets/js/"+({53:"935f2afb",58:"0c66edb9",318:"8ef4b25e",826:"47881d5c",848:"e6ffb4b4",1055:"613b9d03",1360:"34e1d3b9",1364:"60d45520",1387:"4555b262",1711:"9a9d4214",1889:"339d500a",2108:"288b1075",2732:"c015c796",2992:"f2348458",3182:"6e881e32",4195:"c4f5d8e4",4196:"bbbe662c",4368:"a94703ab",4778:"e1dfe4fe",4838:"75b20590",4900:"600b2345",5079:"8d96318d",5327:"c304be44",5889:"cda0d2e5",5893:"2da89d45",6913:"b6569025",7076:"2e812224",7142:"1ba5bc99",7176:"6272ba0e",7209:"881eafa3",7918:"17896441",7920:"1a4e3797",8156:"21880a4d",8198:"50ef9c44",8518:"a7bd4aaa",8905:"07d0b302",8938:"f888b719",8945:"bc747cac",8993:"5cd0a723",9212:"8ae7f3b1",9661:"5e95c892",9817:"14eb3368",9828:"48230885"}[e]||e)+"."+{53:"ba8aa67a",58:"025d65ff",174:"7183a347",318:"8506f920",826:"ae1dcb33",848:"6ca3ea1c",1055:"92144e15",1272:"43cc57fb",1360:"01c3d2bc",1364:"959abb1d",1387:"b9b6d978",1426:"be67a35e",1711:"ba902093",1772:"2df7b54f",1889:"039a1491",2108:"a9435f23",2312:"770b46eb",2732:"c04c1507",2992:"19be6454",3182:"e03d93bb",4195:"ef51316b",4196:"b1bdc9a0",4368:"f7cf84b1",4778:"f856f53b",4838:"3455a494",4900:"9d8edfd8",5079:"d13d21dc",5327:"4a777c27",5889:"a85a9a83",5893:"84ef86b3",6913:"e0ac939e",6945:"8e8e2060",7076:"5284992e",7142:"37030d6d",7176:"35172d6c",7209:"e2d2035c",7918:"d85d0af9",7920:"53ce30cb",8156:"7b76c508",8198:"00b81556",8518:"45274bc2",8894:"46125374",8905:"2f581655",8938:"74db6bc3",8945:"d3154f01",8993:"e3585e3a",9212:"34b8ead1",9661:"d1615a49",9817:"4a22ad2e",9828:"23704b76"}[e]+".js",f.miniCssF=e=>{},f.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),f.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),r={},d="website:",f.l=(e,a,t,c)=>{if(r[e])r[e].push(a);else{var b,o;if(void 0!==t)for(var n=document.getElementsByTagName("script"),i=0;i{b.onerror=b.onload=null,clearTimeout(s);var d=r[e];if(delete r[e],b.parentNode&&b.parentNode.removeChild(b),d&&d.forEach((e=>e(t))),a)return a(t)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:b}),12e4);b.onerror=l.bind(null,b.onerror),b.onload=l.bind(null,b.onload),o&&document.head.appendChild(b)}},f.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},f.p="/",f.gca=function(e){return e={17896441:"7918",48230885:"9828","935f2afb":"53","0c66edb9":"58","8ef4b25e":"318","47881d5c":"826",e6ffb4b4:"848","613b9d03":"1055","34e1d3b9":"1360","60d45520":"1364","4555b262":"1387","9a9d4214":"1711","339d500a":"1889","288b1075":"2108",c015c796:"2732",f2348458:"2992","6e881e32":"3182",c4f5d8e4:"4195",bbbe662c:"4196",a94703ab:"4368",e1dfe4fe:"4778","75b20590":"4838","600b2345":"4900","8d96318d":"5079",c304be44:"5327",cda0d2e5:"5889","2da89d45":"5893",b6569025:"6913","2e812224":"7076","1ba5bc99":"7142","6272ba0e":"7176","881eafa3":"7209","1a4e3797":"7920","21880a4d":"8156","50ef9c44":"8198",a7bd4aaa:"8518","07d0b302":"8905",f888b719:"8938",bc747cac:"8945","5cd0a723":"8993","8ae7f3b1":"9212","5e95c892":"9661","14eb3368":"9817"}[e]||e,f.p+f.u(e)},(()=>{var e={1303:0,532:0};f.f.j=(a,t)=>{var r=f.o(e,a)?e[a]:void 0;if(0!==r)if(r)t.push(r[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var d=new Promise(((t,d)=>r=e[a]=[t,d]));t.push(r[2]=d);var c=f.p+f.u(a),b=new Error;f.l(c,(t=>{if(f.o(e,a)&&(0!==(r=e[a])&&(e[a]=void 0),r)){var d=t&&("load"===t.type?"missing":t.type),c=t&&t.target&&t.target.src;b.message="Loading chunk "+a+" failed.\n("+d+": "+c+")",b.name="ChunkLoadError",b.type=d,b.request=c,r[1](b)}}),"chunk-"+a,a)}},f.O.j=a=>0===e[a];var a=(a,t)=>{var r,d,c=t[0],b=t[1],o=t[2],n=0;if(c.some((a=>0!==e[a]))){for(r in b)f.o(b,r)&&(f.m[r]=b[r]);if(o)var i=o(f)}for(a&&a(t);n{"use strict";var e,a,t,r,d,c={},b={};function f(e){var a=b[e];if(void 0!==a)return a.exports;var t=b[e]={id:e,loaded:!1,exports:{}};return c[e].call(t.exports,t,t.exports,f),t.loaded=!0,t.exports}f.m=c,f.c=b,f.amdO={},e=[],f.O=(a,t,r,d)=>{if(!t){var c=1/0;for(i=0;i=d)&&Object.keys(f.O).every((e=>f.O[e](t[o])))?t.splice(o--,1):(b=!1,d0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[t,r,d]},f.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return f.d(a,{a:a}),a},t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,f.t=function(e,r){if(1&r&&(e=this(e)),8&r)return e;if("object"==typeof e&&e){if(4&r&&e.__esModule)return e;if(16&r&&"function"==typeof e.then)return e}var d=Object.create(null);f.r(d);var c={};a=a||[null,t({}),t([]),t(t)];for(var b=2&r&&e;"object"==typeof b&&!~a.indexOf(b);b=t(b))Object.getOwnPropertyNames(b).forEach((a=>c[a]=()=>e[a]));return c.default=()=>e,f.d(d,c),d},f.d=(e,a)=>{for(var t in a)f.o(a,t)&&!f.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:a[t]})},f.f={},f.e=e=>Promise.all(Object.keys(f.f).reduce(((a,t)=>(f.f[t](e,a),a)),[])),f.u=e=>"assets/js/"+({53:"935f2afb",58:"0c66edb9",318:"8ef4b25e",826:"47881d5c",848:"e6ffb4b4",1055:"613b9d03",1360:"34e1d3b9",1364:"60d45520",1387:"4555b262",1711:"9a9d4214",1889:"339d500a",2108:"288b1075",2732:"c015c796",2992:"f2348458",3182:"6e881e32",4195:"c4f5d8e4",4196:"bbbe662c",4368:"a94703ab",4778:"e1dfe4fe",4838:"75b20590",4900:"600b2345",5079:"8d96318d",5327:"c304be44",5889:"cda0d2e5",5893:"2da89d45",6913:"b6569025",7076:"2e812224",7142:"1ba5bc99",7176:"6272ba0e",7209:"881eafa3",7918:"17896441",7920:"1a4e3797",8156:"21880a4d",8198:"50ef9c44",8518:"a7bd4aaa",8905:"07d0b302",8938:"f888b719",8945:"bc747cac",8993:"5cd0a723",9212:"8ae7f3b1",9661:"5e95c892",9817:"14eb3368",9828:"48230885"}[e]||e)+"."+{53:"ba8aa67a",58:"025d65ff",174:"7183a347",318:"8506f920",826:"ae1dcb33",848:"6ca3ea1c",1055:"92144e15",1272:"43cc57fb",1360:"01c3d2bc",1364:"959abb1d",1387:"b9b6d978",1426:"be67a35e",1711:"ba902093",1772:"2df7b54f",1889:"039a1491",2108:"a9435f23",2312:"770b46eb",2732:"c04c1507",2992:"19be6454",3182:"e03d93bb",4195:"ef51316b",4196:"b1bdc9a0",4368:"f7cf84b1",4778:"4badf62e",4838:"3455a494",4900:"9d8edfd8",5079:"d13d21dc",5327:"4a777c27",5889:"a85a9a83",5893:"84ef86b3",6913:"e0ac939e",6945:"8e8e2060",7076:"5284992e",7142:"37030d6d",7176:"35172d6c",7209:"e2d2035c",7918:"d85d0af9",7920:"53ce30cb",8156:"7b76c508",8198:"00b81556",8518:"45274bc2",8894:"46125374",8905:"2f581655",8938:"74db6bc3",8945:"d3154f01",8993:"e3585e3a",9212:"34b8ead1",9661:"d1615a49",9817:"4a22ad2e",9828:"23704b76"}[e]+".js",f.miniCssF=e=>{},f.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),f.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),r={},d="website:",f.l=(e,a,t,c)=>{if(r[e])r[e].push(a);else{var b,o;if(void 0!==t)for(var n=document.getElementsByTagName("script"),i=0;i{b.onerror=b.onload=null,clearTimeout(s);var d=r[e];if(delete r[e],b.parentNode&&b.parentNode.removeChild(b),d&&d.forEach((e=>e(t))),a)return a(t)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:b}),12e4);b.onerror=l.bind(null,b.onerror),b.onload=l.bind(null,b.onload),o&&document.head.appendChild(b)}},f.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},f.p="/",f.gca=function(e){return e={17896441:"7918",48230885:"9828","935f2afb":"53","0c66edb9":"58","8ef4b25e":"318","47881d5c":"826",e6ffb4b4:"848","613b9d03":"1055","34e1d3b9":"1360","60d45520":"1364","4555b262":"1387","9a9d4214":"1711","339d500a":"1889","288b1075":"2108",c015c796:"2732",f2348458:"2992","6e881e32":"3182",c4f5d8e4:"4195",bbbe662c:"4196",a94703ab:"4368",e1dfe4fe:"4778","75b20590":"4838","600b2345":"4900","8d96318d":"5079",c304be44:"5327",cda0d2e5:"5889","2da89d45":"5893",b6569025:"6913","2e812224":"7076","1ba5bc99":"7142","6272ba0e":"7176","881eafa3":"7209","1a4e3797":"7920","21880a4d":"8156","50ef9c44":"8198",a7bd4aaa:"8518","07d0b302":"8905",f888b719:"8938",bc747cac:"8945","5cd0a723":"8993","8ae7f3b1":"9212","5e95c892":"9661","14eb3368":"9817"}[e]||e,f.p+f.u(e)},(()=>{var e={1303:0,532:0};f.f.j=(a,t)=>{var r=f.o(e,a)?e[a]:void 0;if(0!==r)if(r)t.push(r[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var d=new Promise(((t,d)=>r=e[a]=[t,d]));t.push(r[2]=d);var c=f.p+f.u(a),b=new Error;f.l(c,(t=>{if(f.o(e,a)&&(0!==(r=e[a])&&(e[a]=void 0),r)){var d=t&&("load"===t.type?"missing":t.type),c=t&&t.target&&t.target.src;b.message="Loading chunk "+a+" failed.\n("+d+": "+c+")",b.name="ChunkLoadError",b.type=d,b.request=c,r[1](b)}}),"chunk-"+a,a)}},f.O.j=a=>0===e[a];var a=(a,t)=>{var r,d,c=t[0],b=t[1],o=t[2],n=0;if(c.some((a=>0!==e[a]))){for(r in b)f.o(b,r)&&(f.m[r]=b[r]);if(o)var i=o(f)}for(a&&a(t);n
-
+
diff --git a/docs/category/metrics-and-limits/index.html b/docs/category/metrics-and-limits/index.html
index 19d10eda..9f5d85ee 100644
--- a/docs/category/metrics-and-limits/index.html
+++ b/docs/category/metrics-and-limits/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/docs/category/oauth/index.html b/docs/category/oauth/index.html
index ec18b27a..9915f77a 100644
--- a/docs/category/oauth/index.html
+++ b/docs/category/oauth/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/docs/category/self-hosting/index.html b/docs/category/self-hosting/index.html
index b5369241..59823365 100644
--- a/docs/category/self-hosting/index.html
+++ b/docs/category/self-hosting/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/docs/concepts/files/index.html b/docs/concepts/files/index.html
index e1e2fe58..d3ebe9e9 100644
--- a/docs/concepts/files/index.html
+++ b/docs/concepts/files/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/docs/concepts/hosting/index.html b/docs/concepts/hosting/index.html
index 8036b077..5fd57580 100644
--- a/docs/concepts/hosting/index.html
+++ b/docs/concepts/hosting/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/docs/concepts/http/index.html b/docs/concepts/http/index.html
index 3c9118a3..81450dcc 100644
--- a/docs/concepts/http/index.html
+++ b/docs/concepts/http/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/docs/concepts/index.html b/docs/concepts/index.html
index 8689e497..fc0a9aee 100644
--- a/docs/concepts/index.html
+++ b/docs/concepts/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/docs/concepts/opensource/index.html b/docs/concepts/opensource/index.html
index a9267d39..e8403eae 100644
--- a/docs/concepts/opensource/index.html
+++ b/docs/concepts/opensource/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/docs/concepts/sharing-private/index.html b/docs/concepts/sharing-private/index.html
index 3a1ff9ba..651bc461 100644
--- a/docs/concepts/sharing-private/index.html
+++ b/docs/concepts/sharing-private/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/docs/concepts/sharing-public/index.html b/docs/concepts/sharing-public/index.html
index 856a39b1..457b44ea 100644
--- a/docs/concepts/sharing-public/index.html
+++ b/docs/concepts/sharing-public/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/docs/concepts/sharing-reserved/index.html b/docs/concepts/sharing-reserved/index.html
index 40c6a97c..482832b0 100644
--- a/docs/concepts/sharing-reserved/index.html
+++ b/docs/concepts/sharing-reserved/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/docs/concepts/tunnels/index.html b/docs/concepts/tunnels/index.html
index 44c39847..6450ac3d 100644
--- a/docs/concepts/tunnels/index.html
+++ b/docs/concepts/tunnels/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/docs/getting-started/index.html b/docs/getting-started/index.html
index cc6f1daa..f7667e19 100644
--- a/docs/getting-started/index.html
+++ b/docs/getting-started/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/docs/guides/docker-share/docker_private_share_guide/index.html b/docs/guides/docker-share/docker_private_share_guide/index.html
index 69cf9344..3070c3de 100644
--- a/docs/guides/docker-share/docker_private_share_guide/index.html
+++ b/docs/guides/docker-share/docker_private_share_guide/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/docs/guides/docker-share/docker_public_share_guide/index.html b/docs/guides/docker-share/docker_public_share_guide/index.html
index ee0b3954..db129f29 100644
--- a/docs/guides/docker-share/docker_public_share_guide/index.html
+++ b/docs/guides/docker-share/docker_public_share_guide/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/docs/guides/docker-share/index.html b/docs/guides/docker-share/index.html
index 0466046e..709258a5 100644
--- a/docs/guides/docker-share/index.html
+++ b/docs/guides/docker-share/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/docs/guides/drives/cli/index.html b/docs/guides/drives/cli/index.html
index 58c85a14..04e56005 100644
--- a/docs/guides/drives/cli/index.html
+++ b/docs/guides/drives/cli/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/docs/guides/frontdoor/index.html b/docs/guides/frontdoor/index.html
index cb94c910..0df4a653 100644
--- a/docs/guides/frontdoor/index.html
+++ b/docs/guides/frontdoor/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/docs/guides/install/index.html b/docs/guides/install/index.html
index 2b4051a1..be2c2c5d 100644
--- a/docs/guides/install/index.html
+++ b/docs/guides/install/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/docs/guides/install/linux/index.html b/docs/guides/install/linux/index.html
index 0534ff69..d8f4353a 100644
--- a/docs/guides/install/linux/index.html
+++ b/docs/guides/install/linux/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/docs/guides/install/macos/index.html b/docs/guides/install/macos/index.html
index 6eb0e6e7..2b6b0d70 100644
--- a/docs/guides/install/macos/index.html
+++ b/docs/guides/install/macos/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/docs/guides/install/windows/index.html b/docs/guides/install/windows/index.html
index 85fa04f6..cd951095 100644
--- a/docs/guides/install/windows/index.html
+++ b/docs/guides/install/windows/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/docs/guides/permission-modes/index.html b/docs/guides/permission-modes/index.html
index 7663914f..6edeb408 100644
--- a/docs/guides/permission-modes/index.html
+++ b/docs/guides/permission-modes/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/docs/guides/self-hosting/docker/index.html b/docs/guides/self-hosting/docker/index.html
index e242c140..f038c74f 100644
--- a/docs/guides/self-hosting/docker/index.html
+++ b/docs/guides/self-hosting/docker/index.html
@@ -9,13 +9,14 @@
-
+