From 54794fa0521f8cdd96468c776a19d95d54bce74b Mon Sep 17 00:00:00 2001 From: Kenneth Bingham Date: Fri, 20 Oct 2023 13:46:36 -0400 Subject: [PATCH] add docker project for reserved public share --- CHANGELOG.md | 75 ++-- docker/compose/.gitignore | 3 +- .../{docker-compose.yml => compose.yml} | 31 +- .../{docker-compose.yml => compose.yml} | 32 +- .../compose/zrok-public-reserved/compose.yml | 173 ++++++++ docker/compose/zrok-public-share/compose.yml | 69 ++++ .../zrok-public-share/docker-compose.yml | 53 --- docker/images/cross-build/Dockerfile | 2 +- .../docker_private_share_guide.md | 4 +- .../docker-share/docker_public_share_guide.md | 152 +++++-- website/package.json | 8 +- website/src/css/custom.css | 7 +- website/yarn.lock | 386 +++++++++--------- 13 files changed, 635 insertions(+), 360 deletions(-) rename docker/compose/zrok-private-access/{docker-compose.yml => compose.yml} (65%) rename docker/compose/zrok-private-share/{docker-compose.yml => compose.yml} (54%) create mode 100644 docker/compose/zrok-public-reserved/compose.yml create mode 100644 docker/compose/zrok-public-share/compose.yml delete mode 100644 docker/compose/zrok-public-share/docker-compose.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c460360d..05147e467 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,26 +1,32 @@ -# v0.4.13 +# Changelog + +## v0.4.14 + +FEATURE: Docker Compose project for a reserved public share in docker/compose/zrok-public-share-reserved/compose.yml is described in the [public share guide](https://docs.zrok.io/docs/guides/docker-share/docker_public_share_guide/). + +## v0.4.13 FIX: Update to Homebrew automation to properly integrate with the latest version of the Homebrew release process. -# v0.4.12 +## v0.4.12 -FIX: The `zrok reserve` command was not properly recording the reserved share status of the shares that it created, preventing the `zrok release` command from properly releasing them (https://github.com/openziti/zrok/issues/427) If a user encounters reserved shares that cannot be released with the `zrok release` command, they can be deleted through the web console. +FIX: The `zrok reserve` command was not properly recording the reserved share status of the shares that it created, preventing the `zrok release` command from properly releasing them (https://github.com/openziti/zrok/issues/427) If a user encounters reserved shares that cannot be released with the `zrok release` command, they can be deleted through the web console. -# v0.4.11 +## v0.4.11 FEATURE: The `zrok reserve` command now incorporates the `--json-output|-j` flag, which outputs the reservation details as JSON, rather than as human-consumable log messages. Other commands will produce similar output in the future (https://github.com/openziti/zrok/issues/422) FIX: Include `--oauth-provider` and associated flags for the `zrok reserve` command, allowing reserved shares to specify OAuth authentication (https://github.com/openziti/zrok/issues/421) -# v0.4.10 +## v0.4.10 CHANGE: The public frontend configuration has been bumped from `v: 2` to `v: 3`. The `redirect_host`, `redirect_port` and `redirect_http_only` parameters have been removed. These three configuration options have been replaced with `bind_address`, `redirect_url` and `cookie_domain`. See the OAuth configuration guide at `docs/guides/self-hosting/oauth/configuring-oauth.md` for more details (https://github.com/openziti/zrok/issues/411) -# v0.4.9 +## v0.4.9 FIX: Remove extraneous share token prepended to OAuth frontend redirect. -# v0.4.8 +## v0.4.8 FEATURE: The `sdk` package now includes a `sdk.Overview` function, which returns a complete description of the account attached to the enabled environment. Useful for inventorying the deployed shares and environments (https://github.com/openziti/zrok/issues/407) @@ -34,13 +40,13 @@ CHANGE: Improvements to email invitation sent in response to `zrok invite` to co CHANGE: Added warning message after `zrok invite` submit directing the user to check their "spam" folder if they do not receive the invite message. -# v0.4.7 +## v0.4.7 FEATURE: OAuth authentication with the ability to restrict authenticated users to specified domains for `zrok share public`. Supports both Google and GitHub authentication in this version. More authentication providers, and extensibility to come in future `zrok` releases. See the OAuth configuration guide at `docs/guides/self-hosting/oauth/configuring-oauth.md` for details (https://github.com/openziti/zrok/issues/45, https://github.com/openziti/zrok/issues/404) CHANGE: `--basic-auth` realm now presented as the share token rather than as `zrok` in `publicProxy` frontend implementation -# v0.4.6 +## v0.4.6 FEATURE: New `--backend-mode caddy`, which pre-processes a `Caddyfile` allowing a `bind` statement to work like this: `bind {{ .ZrokBindAddress }}`. Allows development of complicated API gateways and multi-backend shares, while maintaining the simple, ephemeral sharing model provided by `zrok` (https://github.com/openziti/zrok/issues/391) @@ -52,7 +58,7 @@ CHANGE: Added `FrontendEndponts` to `sdk.Share`, returning selected frontend URL CHANGE: Added a short alias `-b` for `--backend-mode` to improve CLI ergonomics (https://github.com/openziti/zrok/issues/397) -# v0.4.5 +## v0.4.5 FEATURE: New health check endpoint (`/health`), which verifies that the underlying SQL store and metrics repository (InfluxDB, if configured) are operating correctly (https://github.com/openziti/zrok/issues/372) @@ -60,27 +66,27 @@ CHANGE: Updated to golang v1.21.0 and node v18.x FIX: `zrok admin bootstrap` and `zrok enable` both broken with latest OpenZiti releases (tested with `v0.30.0`); updated to latest OpenZiti golang SDK (https://github.com/openziti/zrok/issues/389) -# v0.4.4 +## v0.4.4 FIX: `zrok status`, `zrok enable`, `zrok config`, etc. were all causing a panic when used on systems that had no previous `~/.zrok` directory (https://github.com/openziti/zrok/issues/383) -# v0.4.3 +## v0.4.3 FEATURE: New `zrok overview` command, which returns all of the account details as a single JSON structure. See the OpenAPI spec at `specs/zrok.yml` for more details of the `/api/v1/overview` endpoint (https://github.com/openziti/zrok/issues/374) FEATURE: New `zrok` SDK (https://github.com/openziti/zrok/issues/34). `pastebin` example illustrates basic SDK usage (see `sdk/examples/pastebin/README.md` for details) ((https://github.com/openziti/zrok/issues/379) -# v0.4.2 +## v0.4.2 Some days are just like this. `v0.4.2` is a re-do of `v0.4.1`. Trying to get Homebrew working and had a bad release. Hopefully this is the one. -# v0.4.1 +## v0.4.1 FEATURE: New `zrok console` command to open the currently configured web console in the local web browser (https://github.com/openziti/zrok/issues/170) CHANGE: Further tweaks to the release process to automatically get the latest release into Homebrew (https://github.com/openziti/zrok/issues/264) -# v0.4.0 +## v0.4.0 FEATURE: New `tcpTunnel` backend mode allowing for private sharing of local TCP sockets with other `zrok` users (https://github.com/openziti/zrok/issues/170) @@ -104,21 +110,21 @@ CHANGE: Updated to latest `github.com/openziti/sdk-golang` (https://github.com/o FIX: `zrok share reserved --override-endpoint` now works correctly; `--override-endpoint` was being incorrectly ignore previously (https://github.com/openziti/zrok/pull/348) -# v0.3.7 +## v0.3.7 FIX: Improved TUI word-wrapping (https://github.com/openziti/zrok/issues/180) -# v0.3.6 +## v0.3.6 CHANGE: Additional change to support branch builds (for CI purposes) and additional containerization efforts around k8s. -# v0.3.5 +## v0.3.5 CHANGE: `zrok config set apiEndpoint` now validates that the new API endpoint correctly starts with `http://` or `https://` (https://github.com/openziti/zrok/issues/258) CHANGE: Additional linting to support homebrew (https://github.com/openziti/zrok/issues/264) -# v0.3.4 +## v0.3.4 CHANGE: `zrok test endpoint` incorporates `--ziti` mode (and related flags) to allow direct endpoint listening on a Ziti service @@ -126,13 +132,13 @@ CHANGE: `zrok test websocket` command to test websockets, whether over TCP or ov FIX: Websocket support now functional -# v0.3.3 +## v0.3.3 CHANGE: `zrok test loop` has been moved to `zrok test loop public`, making way for additional types of loopback testing tools. The `zrok test endpoint` server now includes an `/echo` endpoint, which provides a simple echo websocket (https://github.com/openziti/zrok/issues/237) -# v0.3.2 +## v0.3.2 -FEATURE: New docker infrastructure, including `docker-compose.yml` examples (and documentation) illustrating how to deploy `zrok` in `docker`-based environments +FEATURE: New docker infrastructure, including `compose.yml` examples (and documentation) illustrating how to deploy `zrok` in `docker`-based environments CHANGE: Include missing `--headless` flag for `zrok enable` and `zrok access private` (https://github.com/openziti/zrok/issues/246) @@ -140,19 +146,20 @@ CHANGE: Fix for `zrok enable` error path handling (https://github.com/openziti/z FEATURE: `zrok controller validate` and `zrok access public validate` will both perform a quick syntax validation on controller and public frontend configuration documents (https://github.com/openziti/zrok/issues/238) - $ zrok controller validate etc/dev.yml + $ zrok controller validate etc/dev.yml + [ERROR]: controller config validation failed (error loading controller config 'etc/dev.yml': field 'maintenance': field 'registration': field 'expiration_timeout': got [bool], expected [time.Duration]) CHANGE: `zrok status` no longer shows secrets (secret token, ziti identity) unless the `--secrets` flag is passed (https://github.com/openziti/zrok/issues/243) -# v0.3.1 +## v0.3.1 CHANGE: Incorporate initial docker image build (https://github.com/openziti/zrok/issues/217) CHANGE: Improve target URL parsing for `zrok share` when using `--backend-mode` proxy (https://github.com/openziti/zrok/issues/211) New and improved URL handling for proxy backends: - + 9090 -> http://127.0.0.1:9090 localhost:9090 -> http://127.0.0.1:9090 https://localhost:9090 -> https://localhost:9090 @@ -161,11 +168,11 @@ CHANGE: Improve usability of `zrok invite` TUI in low-color environments (https: CHANGE: Better error responses when `zrok invite` fails due to missing token (https://github.com/openziti/zrok/issues/207) -# v0.3.0 +## v0.3.0 CHANGE: Removed some minor web console lint and warnings (https://github.com/openziti/zrok/issues/205) -# v0.3.0-rc6 +## v0.3.0-rc6 CHANGE: Better error message when `zrok admin create frontend` runs into a duplicate name collision (https://github.com/openziti/zrok/issues/168) @@ -179,7 +186,7 @@ CHANGE: Prevent multiple `zrok enable` commands from succeeding (https://github. CHANGE: New `--insecure` flag for `share ` commands (https://github.com/openziti/zrok/issues/195) -# v0.3.0-rc5 +## v0.3.0-rc5 CHANGE: Improvements to controller log messages to assist in operations (https://github.com/openziti/zrok/issues/186) @@ -187,11 +194,11 @@ CHANGE: `armv7` builds for Linux are now shipped with releases; these builds wer CHANGE: `zrok config set` now includes a warning when the `apiEndpoint` config is changed and an environment is already enabled; the user will not see the change until `zrok disable` is run. The CLI now includes a `zrok config unset` command (https://github.com/openziti/zrok/issues/188) -# v0.3.0-rc4 +## v0.3.0-rc4 CHANGE: Enable notarization for macos binaries (https://github.com/openziti/zrok/issues/92) -# v0.3.0-rc3 +## v0.3.0-rc3 > This release increments the configuration version from `1` to `2`. See the note below. @@ -207,7 +214,7 @@ FIX: Fixed log message in `resetPasswordRequest.go` (https://github.com/openziti FIX: Fixed `-v` (verbose mode) on in TUI-based `zrok share` and `zrok access` (https://github.com/openziti/zrok/issues/174) -# v0.3.0-rc2 +## v0.3.0-rc2 FEATURE: Allow users to reset their password (https://github.com/openziti/zrok/issues/65) @@ -221,16 +228,16 @@ FIX: Fixed PostgreSQL migration issue where sequences got reset and resulted in FIX: Remove `frontend` instances when `zrok disable`-ing an environment containing them (https://github.com/openziti/zrok/issues/171) -# v0.3.x Series +## v0.3.x Series The `v0.2` series was a _proof-of-concept_ implementation for the overall `zrok` architecture and the concept. -`v0.3` is a massive elaboration of the concept, pivoting it from being a simple ephemeral reverse proxy solution, to being the beginnings of a comprehensive sharing platform, complete with public and private sharing (built on top of OpenZiti). +`v0.3` is a massive elaboration of the concept, pivoting it from being a simple ephemeral reverse proxy solution, to being the beginnings of a comprehensive sharing platform, complete with public and private sharing (built on top of OpenZiti). `v0.3.0` includes the minimal functionality required to produce an early, preview version of the elaborated `zrok` concept, suitable for both production use at `zrok.io`, and also suitable for private self-hosting. From `v0.3.0` forward, we will begin tracking notable changes in this document. -# v0.2.18 +## v0.2.18 * DEFECT: Token generation has been improved to use an alphabet consisting of `[a-zA-Z0-9]`. Service token generation continues to use a case-insensitive alphabet consisting of `[a-z0-9]` to be DNS-safe. diff --git a/docker/compose/.gitignore b/docker/compose/.gitignore index 2eea525d8..849392039 100644 --- a/docker/compose/.gitignore +++ b/docker/compose/.gitignore @@ -1 +1,2 @@ -.env \ No newline at end of file +.env +compose.override.yml \ No newline at end of file diff --git a/docker/compose/zrok-private-access/docker-compose.yml b/docker/compose/zrok-private-access/compose.yml similarity index 65% rename from docker/compose/zrok-private-access/docker-compose.yml rename to docker/compose/zrok-private-access/compose.yml index 88baa15d3..c3bbef4d5 100644 --- a/docker/compose/zrok-private-access/docker-compose.yml +++ b/docker/compose/zrok-private-access/compose.yml @@ -1,37 +1,37 @@ -version: '3' services: - zrok-enable-init: + zrok-init: image: busybox # matches uid:gid of "nobody" in zrok container image command: chown -Rc 65534:65534 /mnt/.zrok user: root volumes: - zrok_env:/mnt/.zrok + zrok-enable: - image: docker.io/openziti/zrok + image: ${ZROK_CONTAINER_IMAGE:-docker.io/openziti/zrok} depends_on: - zrok-enable-init: + zrok-init: condition: service_completed_successfully entrypoint: - bash - - -c + - -euc - | - if [[ -s /mnt/.zrok/environment.json ]]; then - echo "INFO: noop: zrok environment is already enabled" + if [[ -n "$(jq '.ziti_identity' ~/.zrok/environment.json 2>/dev/null)" ]]; then + echo "INFO: zrok environment is already enabled" exit 0 else + zrok config set apiEndpoint ${ZROK_API_ENDPOINT:-https://api.zrok.io} echo "INFO: running: zrok $$(sed -E "s/${ZROK_ENABLE_TOKEN}/************/" <<< $${@})" - exec zrok $${@} + exec zrok "$${@}" fi - command: -- enable --headless ${ZROK_ENABLE_TOKEN} + command: -- enable --headless --description "${ZROK_ENVIRONMENT_NAME:-docker private access}" ${ZROK_ENABLE_TOKEN} volumes: - zrok_env:/mnt/.zrok environment: HOME: /mnt - ZROK_ENABLE_TOKEN: - ZROK_API_ENDPOINT: ${ZROK_API_ENDPOINT:-https://api.zrok.io/} - zrok-private-access: - image: docker.io/openziti/zrok + + zrok-access: + image: ${ZROK_CONTAINER_IMAGE:-docker.io/openziti/zrok} command: access private --headless --bind 0.0.0.0:9191 ${ZROK_ACCESS_TOKEN} depends_on: zrok-enable: @@ -43,12 +43,11 @@ services: environment: HOME: /mnt PFXLOG_NO_JSON: "true" - ZROK_ACCESS_TOKEN: # alternatively, access the zrok private access proxy from another container demo-client: depends_on: - - zrok-private-access + - zrok-access image: busybox entrypoint: - sh @@ -56,7 +55,7 @@ services: - | while true; do echo 'INFO: trying wget'; - wget -q -O - http://zrok-private-access:9191/ip; + wget -q -O - http://zrok-access:9191/ip; sleep 3; done diff --git a/docker/compose/zrok-private-share/docker-compose.yml b/docker/compose/zrok-private-share/compose.yml similarity index 54% rename from docker/compose/zrok-private-share/docker-compose.yml rename to docker/compose/zrok-private-share/compose.yml index d0a2647a0..77d7d38e7 100644 --- a/docker/compose/zrok-private-share/docker-compose.yml +++ b/docker/compose/zrok-private-share/compose.yml @@ -1,38 +1,38 @@ -version: '3' services: - zrok-enable-init: + zrok-init: image: busybox # matches uid:gid of "nobody" in zrok container image command: chown -Rc 65534:65534 /mnt/.zrok user: root volumes: - zrok_env:/mnt/.zrok + zrok-enable: - image: docker.io/openziti/zrok + image: ${ZROK_CONTAINER_IMAGE:-docker.io/openziti/zrok} depends_on: - zrok-enable-init: + zrok-init: condition: service_completed_successfully entrypoint: - bash - - -c + - -euc - | - if [[ -s /mnt/.zrok/environment.json ]]; then - echo "INFO: noop: zrok environment is already enabled" + if [[ -n "$(jq '.ziti_identity' ~/.zrok/environment.json 2>/dev/null)" ]]; then + echo "INFO: zrok environment is already enabled" exit 0 else + zrok config set apiEndpoint ${ZROK_API_ENDPOINT:-https://api.zrok.io} echo "INFO: running: zrok $$(sed -E "s/${ZROK_ENABLE_TOKEN}/************/" <<< $${@})" - exec zrok $${@} + exec zrok "$${@}" fi - command: -- enable --headless ${ZROK_ENABLE_TOKEN} + command: -- enable --headless --description "${ZROK_ENVIRONMENT_NAME:-docker private share}" ${ZROK_ENABLE_TOKEN} volumes: - zrok_env:/mnt/.zrok environment: HOME: /mnt - ZROK_ENABLE_TOKEN: - ZROK_API_ENDPOINT: ${ZROK_API_ENDPOINT:-https://api.zrok.io/} - zrok-private-share: - image: docker.io/openziti/zrok - command: share private --headless http://zrok-test:9090 + + zrok-share: + image: ${ZROK_CONTAINER_IMAGE:-docker.io/openziti/zrok} + command: share private --headless --backend-mode proxy ${ZROK_BACKEND:-http://zrok-test:9090/} depends_on: zrok-enable: condition: service_completed_successfully @@ -44,10 +44,8 @@ services: # demo servers you can share with zrok zrok-test: - image: docker.io/openziti/zrok + image: ${ZROK_CONTAINER_IMAGE:-docker.io/openziti/zrok} command: test endpoint --address 0.0.0.0 # 9090 - httpbin-test: - image: mccutchen/go-httpbin # 8080/tcp volumes: zrok_env: diff --git a/docker/compose/zrok-public-reserved/compose.yml b/docker/compose/zrok-public-reserved/compose.yml new file mode 100644 index 000000000..5f281b4f9 --- /dev/null +++ b/docker/compose/zrok-public-reserved/compose.yml @@ -0,0 +1,173 @@ +services: + # create Caddyfile + zrok-caddyfile: + image: busybox + # create Caddyfile + entrypoint: + - sh + - -euc + - | + ZROK_UPSTREAM_URL="${ZROK_BACKEND:-http://zrok-test:9090}" + ZROK_UPSTREAM_HOST="$(echo $${ZROK_UPSTREAM_URL}|sed -E 's#^https?://([^/:]+).*#\1#')" + mkdir -p /mnt/.zrok + cat <| /mnt/.zrok/Caddyfile + { + # GET /config/ and POST /load on this API to reload Caddy config + admin 0.0.0.0:2019 + } + http:// { + bind {{ .ZrokBindAddress }} + handle_path /zrok-test/* { + reverse_proxy http://zrok-test:9090 { + header_up Host zrok-test + } + } + handle_path /zrok-static/* { + root * /mnt/.zrok/html + file_server browse + } + reverse_proxy /* $${ZROK_UPSTREAM_URL} { + header_up Host $${ZROK_UPSTREAM_HOST} + } + } + CADDYFILE + user: root + volumes: + - zrok_env:/mnt + + # set file ownership + zrok-init: + image: busybox + depends_on: + zrok-caddyfile: + condition: service_completed_successfully + # matches uid:gid of "nobody" in zrok container image + command: chown -Rc 65534:65534 /mnt/ + user: root + volumes: + - zrok_env:/mnt + + # enable zrok environment + zrok-enable: + image: ${ZROK_CONTAINER_IMAGE:-docker.io/openziti/zrok} + depends_on: + zrok-init: + condition: service_completed_successfully + entrypoint: + - bash + - -euc + - | + if [[ -s ~/.zrok/environment.json ]]; then + ZITI_ID="$(jq '.ziti_identity' ~/.zrok/environment.json 2>/dev/null)" + if [[ -z "$${ZITI_ID}" || "$${ZITI_ID}" == null ]]; then + echo "ERROR: invalid environment; consider a reset with 'docker compose down --volumes'" >&2 + exit 1 + else + echo "INFO: zrok environment is already enabled" + exit 0 + fi + else + if [[ -z "${ZROK_ENABLE_TOKEN}" ]]; then + echo "ERROR: ZROK_ENABLE_TOKEN is not defined" >&2 + exit 1 + else + zrok config set apiEndpoint ${ZROK_API_ENDPOINT:-https://api.zrok.io} + echo "INFO: running: zrok $(sed -E "s/${ZROK_ENABLE_TOKEN}/************/" <<< $${@})" + exec zrok "$${@}" + fi + fi + command: -- enable --headless --description "${ZROK_ENVIRONMENT_NAME:-docker reserved public share}" ${ZROK_ENABLE_TOKEN} + volumes: + - zrok_env:/mnt + environment: + HOME: /mnt + + # reserve zrok frontend url for the zrok backend config + zrok-reserve: + image: ${ZROK_CONTAINER_IMAGE:-docker.io/openziti/zrok} + entrypoint: + - bash + - -euc + - | + if [[ -s ~/.zrok/reserved.json ]]; then + ZROK_RESERVE_TOKEN="$(jq '.token' ~/.zrok/reserved.json 2>/dev/null)" + if [[ -z "$${ZROK_RESERVE_TOKEN}" || "$${ZROK_RESERVE_TOKEN}" == null ]]; then + echo "ERROR: invalid reserved.json: $(jq -c . ~/.zrok/reserved.json)" >&2 + exit 1 + else + echo "INFO: zrok backend is already reserved: $${ZROK_RESERVE_TOKEN}" + exit 0 + fi + else + set -o pipefail + ZROK_CMD="reserve public --json-output" + if [[ -n "${ZROK_SHARE_OPTS:-}" ]]; then + ZROK_CMD+=" ${ZROK_SHARE_OPTS}" + fi + if [[ -n "${ZROK_OAUTH_PROVIDER:-}" ]]; then + ZROK_CMD+=" --oauth-provider ${ZROK_OAUTH_PROVIDER}" + fi + if [[ -n "${ZROK_BACKEND_MODE:-}" && "${ZROK_BACKEND_MODE}" != caddy ]]; then + ZROK_CMD+=" --backend-mode ${ZROK_BACKEND_MODE} ${ZROK_BACKEND:-http://zrok-test:9090}" + else + ZROK_CMD+=" --backend-mode caddy /mnt/.zrok/Caddyfile" + fi + echo "INFO: running: zrok $${ZROK_CMD}" + zrok $${ZROK_CMD} | jq -rc | tee ~/.zrok/reserved.json + fi + depends_on: + zrok-enable: + condition: service_completed_successfully + volumes: + - zrok_env:/mnt + environment: + HOME: /mnt + + # start share on reserved public frontend url + zrok-share: + image: ${ZROK_CONTAINER_IMAGE:-docker.io/openziti/zrok} + entrypoint: + - bash + - -euc + - | + if ! [[ -s ~/.zrok/reserved.json ]]; then + echo "ERROR: empty or missing reserved.json" >&2 + exit 1 + else + ZROK_PUBLIC_URLS=$(jq -cr '.frontend_endpoints' ~/.zrok/reserved.json 2>/dev/null) + if [[ -z "$${ZROK_PUBLIC_URLS}" || "$${ZROK_PUBLIC_URLS}" == null ]]; then + echo "ERROR: frontend endpoints not defined" >&2 + exit 1 + else + echo "INFO: zrok public URLs: $${ZROK_PUBLIC_URLS}" + fi + ZROK_RESERVE_TOKEN=$(jq -r '.token' ~/.zrok/reserved.json 2>/dev/null) + if [[ -z "$${ZROK_RESERVE_TOKEN}" && "$${ZROK_RESERVE_TOKEN}" == null ]]; then + echo "ERROR: zrok reservation token not defined" >&2 + exit 1 + else + echo "INFO: zrok reservation token: $${ZROK_RESERVE_TOKEN}" + fi + + echo "INFO: running: zrok $${@} $${ZROK_RESERVE_TOKEN}" + exec zrok "$${@}" $${ZROK_RESERVE_TOKEN} + fi + command: -- share reserved --headless + depends_on: + zrok-reserve: + condition: service_completed_successfully + volumes: + - zrok_env:/mnt + ports: + - 127.0.0.1:2019:2019 + environment: + HOME: /mnt + PFXLOG_NO_JSON: "true" + + # demo server + zrok-test: + image: ${ZROK_CONTAINER_IMAGE:-docker.io/openziti/zrok} + command: test endpoint --address 0.0.0.0 # 9090 + +volumes: + zrok_env: diff --git a/docker/compose/zrok-public-share/compose.yml b/docker/compose/zrok-public-share/compose.yml new file mode 100644 index 000000000..527f0e147 --- /dev/null +++ b/docker/compose/zrok-public-share/compose.yml @@ -0,0 +1,69 @@ +services: + + # set file ownership + zrok-init: + image: busybox + # matches uid:gid of "nobody" in zrok container image + command: chown -Rc 65534:65534 /mnt/.zrok + user: root + volumes: + - zrok_env:/mnt/.zrok + + # enable zrok environment + zrok-enable: + image: ${ZROK_CONTAINER_IMAGE:-docker.io/openziti/zrok} + depends_on: + zrok-init: + condition: service_completed_successfully + entrypoint: + - bash + - -euc + - | + if [[ -n "$(jq '.ziti_identity' ~/.zrok/environment.json 2>/dev/null)" ]]; then + echo "INFO: zrok environment is already enabled" + exit 0 + else + zrok config set apiEndpoint ${ZROK_API_ENDPOINT:-https://api.zrok.io} + echo "INFO: running: zrok $$(sed -E "s/${ZROK_ENABLE_TOKEN}/************/" <<< $${@})" + exec zrok "$${@}" + fi + command: -- enable --headless --description "${ZROK_ENVIRONMENT_NAME:-docker temp public share}" ${ZROK_ENABLE_TOKEN} + volumes: + - zrok_env:/mnt/.zrok + environment: + HOME: /mnt + + # start share on temporary public frontend url + zrok-share: + image: ${ZROK_CONTAINER_IMAGE:-docker.io/openziti/zrok} + entrypoint: + - bash + - -euc + - | + set -o pipefail + ZROK_CMD="share public --headless" + if [[ -n "${ZROK_SHARE_OPTS:-}" ]]; then + ZROK_CMD+=" ${ZROK_SHARE_OPTS}" + fi + if [[ -n "${ZROK_OAUTH_PROVIDER:-}" ]]; then + ZROK_CMD+=" --oauth-provider ${ZROK_OAUTH_PROVIDER}" + fi + ZROK_CMD+=" --backend-mode proxy ${ZROK_BACKEND:-http://zrok-test:9090/}" + echo "INFO: running: zrok $${ZROK_CMD}" + exec zrok $${ZROK_CMD} + depends_on: + zrok-enable: + condition: service_completed_successfully + volumes: + - zrok_env:/mnt/.zrok + environment: + HOME: /mnt + PFXLOG_NO_JSON: "true" + + # demo servers you can share with zrok + zrok-test: + image: ${ZROK_CONTAINER_IMAGE:-docker.io/openziti/zrok} + command: test endpoint --address 0.0.0.0 # 9090 + +volumes: + zrok_env: diff --git a/docker/compose/zrok-public-share/docker-compose.yml b/docker/compose/zrok-public-share/docker-compose.yml deleted file mode 100644 index 53f710179..000000000 --- a/docker/compose/zrok-public-share/docker-compose.yml +++ /dev/null @@ -1,53 +0,0 @@ -version: '3' -services: - zrok-enable-init: - image: busybox - # matches uid:gid of "nobody" in zrok container image - command: chown -Rc 65534:65534 /mnt/.zrok - user: root - volumes: - - zrok_env:/mnt/.zrok - zrok-enable: - image: docker.io/openziti/zrok - depends_on: - zrok-enable-init: - condition: service_completed_successfully - entrypoint: - - bash - - -c - - | - if [[ -s /mnt/.zrok/environment.json ]]; then - echo "INFO: noop: zrok environment is already enabled" - exit 0 - else - echo "INFO: running: zrok $$(sed -E "s/${ZROK_ENABLE_TOKEN}/************/" <<< $${@})" - exec zrok $${@} - fi - command: -- enable --headless ${ZROK_ENABLE_TOKEN} - volumes: - - zrok_env:/mnt/.zrok - environment: - HOME: /mnt - ZROK_ENABLE_TOKEN: - ZROK_API_ENDPOINT: ${ZROK_API_ENDPOINT:-https://api.zrok.io/} - zrok-public-share: - image: docker.io/openziti/zrok - command: share public --headless http://zrok-test:9090 - depends_on: - zrok-enable: - condition: service_completed_successfully - volumes: - - zrok_env:/mnt/.zrok - environment: - HOME: /mnt - PFXLOG_NO_JSON: "true" - - # demo servers you can share with zrok - zrok-test: - image: docker.io/openziti/zrok - command: test endpoint --address 0.0.0.0 # 9090 - httpbin-test: - image: mccutchen/go-httpbin # 8080/tcp - -volumes: - zrok_env: diff --git a/docker/images/cross-build/Dockerfile b/docker/images/cross-build/Dockerfile index 0bff4478e..7f377aede 100644 --- a/docker/images/cross-build/Dockerfile +++ b/docker/images/cross-build/Dockerfile @@ -5,7 +5,7 @@ FROM debian:bullseye-slim # ARG TARGETARCH -ARG golang_version=1.19.5 +ARG golang_version=1.20 ARG go_distribution_file=go${golang_version}.linux-${TARGETARCH}.tar.gz ARG go_path=/usr/share/go ARG go_root=/usr/local/go diff --git a/docs/guides/docker-share/docker_private_share_guide.md b/docs/guides/docker-share/docker_private_share_guide.md index d3ef83232..d573d2709 100644 --- a/docs/guides/docker-share/docker_private_share_guide.md +++ b/docs/guides/docker-share/docker_private_share_guide.md @@ -24,7 +24,7 @@ First, let's create the private share. 1. Make a folder on your computer to use as a Docker Compose project for your zrok private share. 1. In your terminal, change directory to your newly-created project folder. -1. Download [the zrok-private-share Docker Compose project file](pathname:///zrok-private-share/docker-compose.yml) into your new project folder and make sure it's named `docker-compose.yml`. +1. Download [the zrok-private-share Docker Compose project file](pathname:///zrok-private-share/compose.yml) into your new project folder and make sure it's named `compose.yml`. 1. Copy your zrok environment token from the zrok web console to your clipboard and paste it in a file named `.env` in the same folder like this: ```bash @@ -59,7 +59,7 @@ Now that we have a private share we can access it with zrok running in Docker. N 1. Make a folder on your computer to use as a Docker Compose project for your zrok private access. 1. In your terminal, change directory to your newly-created project folder. -1. Download [the zrok-private-access Docker Compose project file](pathname:///zrok-private-access/docker-compose.yml) into your new project folder and make sure it's named `docker-compose.yml`. +1. Download [the zrok-private-access Docker Compose project file](pathname:///zrok-private-access/compose.yml) into your new project folder and make sure it's named `compose.yml`. 1. Copy your zrok environment token from the zrok web console to your clipboard and paste it in a file named `.env` in the same folder like this: ```bash diff --git a/docs/guides/docker-share/docker_public_share_guide.md b/docs/guides/docker-share/docker_public_share_guide.md index 9bb6db0e2..2b8ebe11a 100644 --- a/docs/guides/docker-share/docker_public_share_guide.md +++ b/docs/guides/docker-share/docker_public_share_guide.md @@ -5,7 +5,7 @@ sidebar_label: Public Share # Docker Public Share -With zrok, you can publicly share a server app that's running in another Docker container, or any server that's reachable by the zrok container. +With zrok and Docker, you can publicly share a web server that's running in a local container or anywhere that's reachable by the zrok container. The share can be reached through a public URL thats temporary or reserved (reusable). ## Walkthrough Video @@ -15,61 +15,137 @@ With zrok, you can publicly share a server app that's running in another Docker To follow this guide you will need [Docker](https://docs.docker.com/get-docker/) and [the Docker Compose plugin](https://docs.docker.com/compose/install/) for running `docker compose` commands in your terminal. -## Public Share with Docker Compose +## Temporary or Reserved Public Share + +A temporary public share is a great way to share a web server running in a container with someone else for a short time. A reserved public share is a great way to share a reliable web server running in a container with someone else for a long time. 1. Make a folder on your computer to use as a Docker Compose project for your zrok public share. -1. In your terminal, change directory to your newly-created project folder. -1. Download [the zrok-public-share Docker Compose project file](pathname:///zrok-public-share/docker-compose.yml) into your new project folder. +1. In your terminal, change directory to the newly-created project folder. +1. Download either [the temporary public share project file](pathname:///zrok-public-share/compose.yml) or [the reserved public share project file](pathname:///zrok-public-reserved/compose.yml) into the project folder. 1. Copy your zrok environment token from the zrok web console to your clipboard and paste it in a file named `.env` in the same folder like this: - ```bash - # file name ".env" - ZROK_ENABLE_TOKEN="8UL9-48rN0ua" - ``` + ```bash title=".env" + ZROK_ENABLE_TOKEN="8UL9-48rN0ua" + ``` -1. If you are self-hosting zrok then it's important to set your API endpoint URL too. If you're using the hosted zrok service then you can skip this step. +1. Set the zrok API endpoint if self-hosting zrok. Skip this if using zrok.io. - ```bash - # file name ".env" - ZROK_API_ENDPOINT="https://zrok.example.com" - ``` + ```bash title=".env" + ZROK_API_ENDPOINT="https://zrok.example.com" + ``` -1. Run your Compose project to start sharing the built-in demo web server: +1. Run the Compose project to start sharing the built-in demo web server. - ```bash - docker compose up - ``` + ```bash + docker compose up --detach + ``` -1. Read the public share URL from the output. One of the last lines is like this: +1. Get the public share URL from the output of the `zrok-share` service or by peeking in the zrok console where the share will be graphed. - ```bash - zrok-public-share-1 | https://w6r1vesearkj.in.zrok.io/ - ``` + ```bash + docker compose logs zrok-share + ``` - You can swap in a different server app container instead of the demo server, or you could change the Docker network to "host" and share something running on the Docker host's localhost interface. + ```buttonless title="Output" + zrok-public-share-1 | https://w6r1vesearkj.in.zrok.io/ + ``` -1. Edit the file `docker-compose.yml`. Replace the following line: +This concludes sharing the demo web server. Read on to learn how to pivot to sharing any web server leveraging additional zrok backend modes. - ```yaml - command: share public --headless http://zrok-test:9090 - ``` +## Proxy Any Web Server - Replace that line with this to start sharing the HTTPBin server app container instead of the zrok test endpoint. +The simplest way to share your web server is to set `ZROK_BACKEND` (e.g. `https://example.com`) in the environment of the `docker compose up` command. When you restart the share will auto-configure for that upstream server URL. This applies to both temporary and reserved public shares. - ```yaml - command: share public --headless http://httpbin-test:8080 - ``` +```bash title=".env" +ZROK_BACKEND="http://example.com:8080" +``` -1. Re-run your project to load the new server configuration. +## Require Authentication - ```bash - docker-compose up --force-recreate - ``` +You can require authentication for your public share by setting `ZROK_OAUTH_PROVIDER` to `github` or `google` if you're using our hosted zrok.io, and any OIDC provider you've configured if self-hosting. You can parse the authenticated email address from the request cookie. Read more about the OAuth features in [this blog post](https://blog.openziti.io/the-zrok-oauth-public-frontend). This applies to both temporary and reserved public shares. + +```bash title=".env" +ZROK_OAUTH_PROVIDER="github" +``` + +## Customize Temporary Public Share + +1. Create a file `compose.override.yml`. This example demonstrates sharing a static HTML directory `/tmp/html` from the Docker host's filesystem. + + ```yaml title="compose.override.yml" + services: + zrok-share: + command: share public --headless --backend-mode web /tmp/html + volumes: + - /tmp/html:/tmp/html + ``` + +1. Re-run the project to load the new configuration. + + ```bash + docker compose up --force-recreate --detach + ``` - Now you'll have a new public share URL for the `httpbin` API testing server. +1. Get the new tempoary public share URL for the `zrok-share` container. -1. Run "down" to destroy the Compose project when you're done. Then delete the selected zrok environment by clicking "Actions" in the web console. + ```bash + docker compose logs zrok-share + ``` - ```bash - docker compose down --remove-orphans --volumes + ```buttonless title="Output" + zrok-public-share-1 | https://w6r1vesearkj.in.zrok.io/ ``` + +## Customize Reserved Public Share + +The reserved public share project uses zrok's `caddy` mode. Caddy accepts configuration as a Caddyfile that is mounted into the container ([zrok Caddyfile examples](https://github.com/openziti/zrok/tree/main/etc/caddy)). + +1. Create a Caddyfile. This example demonstrates proxying two HTTP servers with a weighted round-robin load balancer. + + ```console title="Caddyfile" + http:// { + # zrok requires this bind address template + bind {{ .ZrokBindAddress }} + reverse_proxy /* { + to http://httpbin1:8080 http://httpbin2:8080 + lb_policy weighted_round_robin 3 2 + } + } + ``` + +1. Create a file `compose.override.yml`. This example adds two `httpbin` containers for Caddy load balance, and masks the default Caddyfile with our custom one. + + ```yaml title="compose.override.yml" + services: + httpbin1: + image: mccutchen/go-httpbin # 8080/tcp + httpbin2: + image: mccutchen/go-httpbin # 8080/tcp + zrok-share: + volumes: + - ./Caddyfile:/mnt/.zrok/Caddyfile + ``` + +1. Re-run the project to load the new configuration. + + ```bash + docker compose up --force-recreate --detach + ``` + +1. Recall the reserved share URL from the log. + + ```bash + docker compose logs zrok-share + ``` + + ```buttonless title="Output" + INFO: zrok public URL: https://88s803f2qvao.in.zrok.io/ + ``` + +## Destroy the zrok Environment + +This destroys the Docker volumes containing the zrok environment secrets. The zrok environment can also be destroyed in the web console. + +```bash +docker compose down --volumes +``` diff --git a/website/package.json b/website/package.json index 71e743f6d..7b237480c 100644 --- a/website/package.json +++ b/website/package.json @@ -14,9 +14,9 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@docusaurus/core": "^2.4.1", - "@docusaurus/plugin-client-redirects": "^2.4.1", - "@docusaurus/preset-classic": "^2.4.1", + "@docusaurus/core": "^2.4.3", + "@docusaurus/plugin-client-redirects": "^2.4.3", + "@docusaurus/preset-classic": "^2.4.3", "@mdx-js/react": "^1.6.22", "clsx": "^1.2.1", "prism-react-renderer": "^1.3.5", @@ -25,7 +25,7 @@ "remark-math": "^5.1.1" }, "devDependencies": { - "@docusaurus/module-type-aliases": "^2.4.1" + "@docusaurus/module-type-aliases": "^2.4.3" }, "browserslist": { "production": [ diff --git a/website/src/css/custom.css b/website/src/css/custom.css index f3c884a8c..eabf4337c 100644 --- a/website/src/css/custom.css +++ b/website/src/css/custom.css @@ -177,4 +177,9 @@ a code { .navbar__link { color: var(--ifm-navbar-link-color); font-weight: var(--ifm-font-weight-semibold); -} \ No newline at end of file +} + +/* hide the clipboard copy button on code blocks of type "buttonless" */ +.language-buttonless div > button { + display: none; +} diff --git a/website/yarn.lock b/website/yarn.lock index af8d67b06..0257beec2 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -1254,10 +1254,10 @@ "@docsearch/css" "3.5.1" algoliasearch "^4.0.0" -"@docusaurus/core@2.4.1", "@docusaurus/core@^2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-2.4.1.tgz#4b8ff5766131ce3fbccaad0b1daf2ad4dc76f62d" - integrity sha512-SNsY7PshK3Ri7vtsLXVeAJGS50nJN3RgF836zkyUfAD01Fq+sAk5EwWgLw+nnm5KVNGDu7PRR2kRGDsWvqpo0g== +"@docusaurus/core@2.4.3", "@docusaurus/core@^2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-2.4.3.tgz#d86624901386fd8164ce4bff9cc7f16fde57f523" + integrity sha512-dWH5P7cgeNSIg9ufReX6gaCl/TmrGKD38Orbwuz05WPhAQtFXHd5B8Qym1TiXfvUNvwoYKkAJOJuGe8ou0Z7PA== dependencies: "@babel/core" "^7.18.6" "@babel/generator" "^7.18.7" @@ -1269,13 +1269,13 @@ "@babel/runtime" "^7.18.6" "@babel/runtime-corejs3" "^7.18.6" "@babel/traverse" "^7.18.8" - "@docusaurus/cssnano-preset" "2.4.1" - "@docusaurus/logger" "2.4.1" - "@docusaurus/mdx-loader" "2.4.1" + "@docusaurus/cssnano-preset" "2.4.3" + "@docusaurus/logger" "2.4.3" + "@docusaurus/mdx-loader" "2.4.3" "@docusaurus/react-loadable" "5.5.2" - "@docusaurus/utils" "2.4.1" - "@docusaurus/utils-common" "2.4.1" - "@docusaurus/utils-validation" "2.4.1" + "@docusaurus/utils" "2.4.3" + "@docusaurus/utils-common" "2.4.3" + "@docusaurus/utils-validation" "2.4.3" "@slorber/static-site-generator-webpack-plugin" "^4.0.7" "@svgr/webpack" "^6.2.1" autoprefixer "^10.4.7" @@ -1331,33 +1331,33 @@ webpack-merge "^5.8.0" webpackbar "^5.0.2" -"@docusaurus/cssnano-preset@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-2.4.1.tgz#eacadefb1e2e0f59df3467a0fe83e4ff79eed163" - integrity sha512-ka+vqXwtcW1NbXxWsh6yA1Ckii1klY9E53cJ4O9J09nkMBgrNX3iEFED1fWdv8wf4mJjvGi5RLZ2p9hJNjsLyQ== +"@docusaurus/cssnano-preset@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-2.4.3.tgz#1d7e833c41ce240fcc2812a2ac27f7b862f32de0" + integrity sha512-ZvGSRCi7z9wLnZrXNPG6DmVPHdKGd8dIn9pYbEOFiYihfv4uDR3UtxogmKf+rT8ZlKFf5Lqne8E8nt08zNM8CA== dependencies: cssnano-preset-advanced "^5.3.8" postcss "^8.4.14" postcss-sort-media-queries "^4.2.1" tslib "^2.4.0" -"@docusaurus/logger@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-2.4.1.tgz#4d2c0626b40752641f9fdd93ad9b5a7a0792f767" - integrity sha512-5h5ysIIWYIDHyTVd8BjheZmQZmEgWDR54aQ1BX9pjFfpyzFo5puKXKYrYJXbjEHGyVhEzmB9UXwbxGfaZhOjcg== +"@docusaurus/logger@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-2.4.3.tgz#518bbc965fb4ebe8f1d0b14e5f4161607552d34c" + integrity sha512-Zxws7r3yLufk9xM1zq9ged0YHs65mlRmtsobnFkdZTxWXdTYlWWLWdKyNKAsVC+D7zg+pv2fGbyabdOnyZOM3w== dependencies: chalk "^4.1.2" tslib "^2.4.0" -"@docusaurus/mdx-loader@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-2.4.1.tgz#6425075d7fc136dbfdc121349060cedd64118393" - integrity sha512-4KhUhEavteIAmbBj7LVFnrVYDiU51H5YWW1zY6SmBSte/YLhDutztLTBE0PQl1Grux1jzUJeaSvAzHpTn6JJDQ== +"@docusaurus/mdx-loader@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-2.4.3.tgz#e8ff37f30a060eaa97b8121c135f74cb531a4a3e" + integrity sha512-b1+fDnWtl3GiqkL0BRjYtc94FZrcDDBV1j8446+4tptB9BAOlePwG2p/pK6vGvfL53lkOsszXMghr2g67M0vCw== dependencies: "@babel/parser" "^7.18.8" "@babel/traverse" "^7.18.8" - "@docusaurus/logger" "2.4.1" - "@docusaurus/utils" "2.4.1" + "@docusaurus/logger" "2.4.3" + "@docusaurus/utils" "2.4.3" "@mdx-js/mdx" "^1.6.22" escape-html "^1.0.3" file-loader "^6.2.0" @@ -1372,13 +1372,13 @@ url-loader "^4.1.1" webpack "^5.73.0" -"@docusaurus/module-type-aliases@2.4.1", "@docusaurus/module-type-aliases@^2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-2.4.1.tgz#38b3c2d2ae44bea6d57506eccd84280216f0171c" - integrity sha512-gLBuIFM8Dp2XOCWffUDSjtxY7jQgKvYujt7Mx5s4FCTfoL5dN1EVbnrn+O2Wvh8b0a77D57qoIDY7ghgmatR1A== +"@docusaurus/module-type-aliases@2.4.3", "@docusaurus/module-type-aliases@^2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-2.4.3.tgz#d08ef67e4151e02f352a2836bcf9ecde3b9c56ac" + integrity sha512-cwkBkt1UCiduuvEAo7XZY01dJfRn7UR/75mBgOdb1hKknhrabJZ8YH+7savd/y9kLExPyrhe0QwdS9GuzsRRIA== dependencies: "@docusaurus/react-loadable" "5.5.2" - "@docusaurus/types" "2.4.1" + "@docusaurus/types" "2.4.3" "@types/history" "^4.7.11" "@types/react" "*" "@types/react-router-config" "*" @@ -1386,33 +1386,33 @@ react-helmet-async "*" react-loadable "npm:@docusaurus/react-loadable@5.5.2" -"@docusaurus/plugin-client-redirects@^2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-2.4.1.tgz#a28afcc4a1cb7657168ce37a57efd3194c20a53a" - integrity sha512-tp0j16gaLIJ4p+IR0P6KDOFsTOGGMY54MNPnmM61Vaqqt5omLqsuKUO8UlCGU1oW/4EIQOhXYy99XYY5MjE+7A== - dependencies: - "@docusaurus/core" "2.4.1" - "@docusaurus/logger" "2.4.1" - "@docusaurus/utils" "2.4.1" - "@docusaurus/utils-common" "2.4.1" - "@docusaurus/utils-validation" "2.4.1" +"@docusaurus/plugin-client-redirects@^2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-2.4.3.tgz#0da7e6facadbca3bd7cb8d0453f21bea7f4f1721" + integrity sha512-iCwc/zH8X6eNtLYdyUJFY6+GbsbRgMgvAC/TmSmCYTmwnoN5Y1Bc5OwUkdtoch0XKizotJMRAmGIAhP8sAetdQ== + dependencies: + "@docusaurus/core" "2.4.3" + "@docusaurus/logger" "2.4.3" + "@docusaurus/utils" "2.4.3" + "@docusaurus/utils-common" "2.4.3" + "@docusaurus/utils-validation" "2.4.3" eta "^2.0.0" fs-extra "^10.1.0" lodash "^4.17.21" tslib "^2.4.0" -"@docusaurus/plugin-content-blog@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.4.1.tgz#c705a8b1a36a34f181dcf43b7770532e4dcdc4a3" - integrity sha512-E2i7Knz5YIbE1XELI6RlTnZnGgS52cUO4BlCiCUCvQHbR+s1xeIWz4C6BtaVnlug0Ccz7nFSksfwDpVlkujg5Q== - dependencies: - "@docusaurus/core" "2.4.1" - "@docusaurus/logger" "2.4.1" - "@docusaurus/mdx-loader" "2.4.1" - "@docusaurus/types" "2.4.1" - "@docusaurus/utils" "2.4.1" - "@docusaurus/utils-common" "2.4.1" - "@docusaurus/utils-validation" "2.4.1" +"@docusaurus/plugin-content-blog@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.4.3.tgz#6473b974acab98e967414d8bbb0d37e0cedcea14" + integrity sha512-PVhypqaA0t98zVDpOeTqWUTvRqCEjJubtfFUQ7zJNYdbYTbS/E/ytq6zbLVsN/dImvemtO/5JQgjLxsh8XLo8Q== + dependencies: + "@docusaurus/core" "2.4.3" + "@docusaurus/logger" "2.4.3" + "@docusaurus/mdx-loader" "2.4.3" + "@docusaurus/types" "2.4.3" + "@docusaurus/utils" "2.4.3" + "@docusaurus/utils-common" "2.4.3" + "@docusaurus/utils-validation" "2.4.3" cheerio "^1.0.0-rc.12" feed "^4.2.2" fs-extra "^10.1.0" @@ -1423,18 +1423,18 @@ utility-types "^3.10.0" webpack "^5.73.0" -"@docusaurus/plugin-content-docs@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.4.1.tgz#ed94d9721b5ce7a956fb01cc06c40d8eee8dfca7" - integrity sha512-Lo7lSIcpswa2Kv4HEeUcGYqaasMUQNpjTXpV0N8G6jXgZaQurqp7E8NGYeGbDXnb48czmHWbzDL4S3+BbK0VzA== - dependencies: - "@docusaurus/core" "2.4.1" - "@docusaurus/logger" "2.4.1" - "@docusaurus/mdx-loader" "2.4.1" - "@docusaurus/module-type-aliases" "2.4.1" - "@docusaurus/types" "2.4.1" - "@docusaurus/utils" "2.4.1" - "@docusaurus/utils-validation" "2.4.1" +"@docusaurus/plugin-content-docs@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.4.3.tgz#aa224c0512351e81807adf778ca59fd9cd136973" + integrity sha512-N7Po2LSH6UejQhzTCsvuX5NOzlC+HiXOVvofnEPj0WhMu1etpLEXE6a4aTxrtg95lQ5kf0xUIdjX9sh3d3G76A== + dependencies: + "@docusaurus/core" "2.4.3" + "@docusaurus/logger" "2.4.3" + "@docusaurus/mdx-loader" "2.4.3" + "@docusaurus/module-type-aliases" "2.4.3" + "@docusaurus/types" "2.4.3" + "@docusaurus/utils" "2.4.3" + "@docusaurus/utils-validation" "2.4.3" "@types/react-router-config" "^5.0.6" combine-promises "^1.1.0" fs-extra "^10.1.0" @@ -1445,95 +1445,95 @@ utility-types "^3.10.0" webpack "^5.73.0" -"@docusaurus/plugin-content-pages@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.4.1.tgz#c534f7e49967699a45bbe67050d1605ebbf3d285" - integrity sha512-/UjuH/76KLaUlL+o1OvyORynv6FURzjurSjvn2lbWTFc4tpYY2qLYTlKpTCBVPhlLUQsfyFnshEJDLmPneq2oA== - dependencies: - "@docusaurus/core" "2.4.1" - "@docusaurus/mdx-loader" "2.4.1" - "@docusaurus/types" "2.4.1" - "@docusaurus/utils" "2.4.1" - "@docusaurus/utils-validation" "2.4.1" +"@docusaurus/plugin-content-pages@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.4.3.tgz#7f285e718b53da8c8d0101e70840c75b9c0a1ac0" + integrity sha512-txtDVz7y3zGk67q0HjG0gRttVPodkHqE0bpJ+7dOaTH40CQFLSh7+aBeGnPOTl+oCPG+hxkim4SndqPqXjQ8Bg== + dependencies: + "@docusaurus/core" "2.4.3" + "@docusaurus/mdx-loader" "2.4.3" + "@docusaurus/types" "2.4.3" + "@docusaurus/utils" "2.4.3" + "@docusaurus/utils-validation" "2.4.3" fs-extra "^10.1.0" tslib "^2.4.0" webpack "^5.73.0" -"@docusaurus/plugin-debug@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-2.4.1.tgz#461a2c77b0c5a91b2c05257c8f9585412aaa59dc" - integrity sha512-7Yu9UPzRShlrH/G8btOpR0e6INFZr0EegWplMjOqelIwAcx3PKyR8mgPTxGTxcqiYj6hxSCRN0D8R7YrzImwNA== +"@docusaurus/plugin-debug@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-2.4.3.tgz#2f90eb0c9286a9f225444e3a88315676fe02c245" + integrity sha512-LkUbuq3zCmINlFb+gAd4ZvYr+bPAzMC0hwND4F7V9bZ852dCX8YoWyovVUBKq4er1XsOwSQaHmNGtObtn8Av8Q== dependencies: - "@docusaurus/core" "2.4.1" - "@docusaurus/types" "2.4.1" - "@docusaurus/utils" "2.4.1" + "@docusaurus/core" "2.4.3" + "@docusaurus/types" "2.4.3" + "@docusaurus/utils" "2.4.3" fs-extra "^10.1.0" react-json-view "^1.21.3" tslib "^2.4.0" -"@docusaurus/plugin-google-analytics@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.4.1.tgz#30de1c35773bf9d52bb2d79b201b23eb98022613" - integrity sha512-dyZJdJiCoL+rcfnm0RPkLt/o732HvLiEwmtoNzOoz9MSZz117UH2J6U2vUDtzUzwtFLIf32KkeyzisbwUCgcaQ== +"@docusaurus/plugin-google-analytics@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.4.3.tgz#0d19993136ade6f7a7741251b4f617400d92ab45" + integrity sha512-KzBV3k8lDkWOhg/oYGxlK5o9bOwX7KpPc/FTWoB+SfKhlHfhq7qcQdMi1elAaVEIop8tgK6gD1E58Q+XC6otSQ== dependencies: - "@docusaurus/core" "2.4.1" - "@docusaurus/types" "2.4.1" - "@docusaurus/utils-validation" "2.4.1" + "@docusaurus/core" "2.4.3" + "@docusaurus/types" "2.4.3" + "@docusaurus/utils-validation" "2.4.3" tslib "^2.4.0" -"@docusaurus/plugin-google-gtag@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.4.1.tgz#6a3eb91022714735e625c7ca70ef5188fa7bd0dc" - integrity sha512-mKIefK+2kGTQBYvloNEKtDmnRD7bxHLsBcxgnbt4oZwzi2nxCGjPX6+9SQO2KCN5HZbNrYmGo5GJfMgoRvy6uA== +"@docusaurus/plugin-google-gtag@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.4.3.tgz#e1a80b0696771b488562e5b60eff21c9932d9e1c" + integrity sha512-5FMg0rT7sDy4i9AGsvJC71MQrqQZwgLNdDetLEGDHLfSHLvJhQbTCUGbGXknUgWXQJckcV/AILYeJy+HhxeIFA== dependencies: - "@docusaurus/core" "2.4.1" - "@docusaurus/types" "2.4.1" - "@docusaurus/utils-validation" "2.4.1" + "@docusaurus/core" "2.4.3" + "@docusaurus/types" "2.4.3" + "@docusaurus/utils-validation" "2.4.3" tslib "^2.4.0" -"@docusaurus/plugin-google-tag-manager@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-2.4.1.tgz#b99f71aec00b112bbf509ef2416e404a95eb607e" - integrity sha512-Zg4Ii9CMOLfpeV2nG74lVTWNtisFaH9QNtEw48R5QE1KIwDBdTVaiSA18G1EujZjrzJJzXN79VhINSbOJO/r3g== +"@docusaurus/plugin-google-tag-manager@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-2.4.3.tgz#e41fbf79b0ffc2de1cc4013eb77798cff0ad98e3" + integrity sha512-1jTzp71yDGuQiX9Bi0pVp3alArV0LSnHXempvQTxwCGAEzUWWaBg4d8pocAlTpbP9aULQQqhgzrs8hgTRPOM0A== dependencies: - "@docusaurus/core" "2.4.1" - "@docusaurus/types" "2.4.1" - "@docusaurus/utils-validation" "2.4.1" + "@docusaurus/core" "2.4.3" + "@docusaurus/types" "2.4.3" + "@docusaurus/utils-validation" "2.4.3" tslib "^2.4.0" -"@docusaurus/plugin-sitemap@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.4.1.tgz#8a7a76ed69dc3e6b4474b6abb10bb03336a9de6d" - integrity sha512-lZx+ijt/+atQ3FVE8FOHV/+X3kuok688OydDXrqKRJyXBJZKgGjA2Qa8RjQ4f27V2woaXhtnyrdPop/+OjVMRg== - dependencies: - "@docusaurus/core" "2.4.1" - "@docusaurus/logger" "2.4.1" - "@docusaurus/types" "2.4.1" - "@docusaurus/utils" "2.4.1" - "@docusaurus/utils-common" "2.4.1" - "@docusaurus/utils-validation" "2.4.1" +"@docusaurus/plugin-sitemap@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.4.3.tgz#1b3930900a8f89670ce7e8f83fb4730cd3298c32" + integrity sha512-LRQYrK1oH1rNfr4YvWBmRzTL0LN9UAPxBbghgeFRBm5yloF6P+zv1tm2pe2hQTX/QP5bSKdnajCvfnScgKXMZQ== + dependencies: + "@docusaurus/core" "2.4.3" + "@docusaurus/logger" "2.4.3" + "@docusaurus/types" "2.4.3" + "@docusaurus/utils" "2.4.3" + "@docusaurus/utils-common" "2.4.3" + "@docusaurus/utils-validation" "2.4.3" fs-extra "^10.1.0" sitemap "^7.1.1" tslib "^2.4.0" -"@docusaurus/preset-classic@^2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-2.4.1.tgz#072f22d0332588e9c5f512d4bded8d7c99f91497" - integrity sha512-P4//+I4zDqQJ+UDgoFrjIFaQ1MeS9UD1cvxVQaI6O7iBmiHQm0MGROP1TbE7HlxlDPXFJjZUK3x3cAoK63smGQ== - dependencies: - "@docusaurus/core" "2.4.1" - "@docusaurus/plugin-content-blog" "2.4.1" - "@docusaurus/plugin-content-docs" "2.4.1" - "@docusaurus/plugin-content-pages" "2.4.1" - "@docusaurus/plugin-debug" "2.4.1" - "@docusaurus/plugin-google-analytics" "2.4.1" - "@docusaurus/plugin-google-gtag" "2.4.1" - "@docusaurus/plugin-google-tag-manager" "2.4.1" - "@docusaurus/plugin-sitemap" "2.4.1" - "@docusaurus/theme-classic" "2.4.1" - "@docusaurus/theme-common" "2.4.1" - "@docusaurus/theme-search-algolia" "2.4.1" - "@docusaurus/types" "2.4.1" +"@docusaurus/preset-classic@^2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-2.4.3.tgz#074c57ebf29fa43d23bd1c8ce691226f542bc262" + integrity sha512-tRyMliepY11Ym6hB1rAFSNGwQDpmszvWYJvlK1E+md4SW8i6ylNHtpZjaYFff9Mdk3i/Pg8ItQq9P0daOJAvQw== + dependencies: + "@docusaurus/core" "2.4.3" + "@docusaurus/plugin-content-blog" "2.4.3" + "@docusaurus/plugin-content-docs" "2.4.3" + "@docusaurus/plugin-content-pages" "2.4.3" + "@docusaurus/plugin-debug" "2.4.3" + "@docusaurus/plugin-google-analytics" "2.4.3" + "@docusaurus/plugin-google-gtag" "2.4.3" + "@docusaurus/plugin-google-tag-manager" "2.4.3" + "@docusaurus/plugin-sitemap" "2.4.3" + "@docusaurus/theme-classic" "2.4.3" + "@docusaurus/theme-common" "2.4.3" + "@docusaurus/theme-search-algolia" "2.4.3" + "@docusaurus/types" "2.4.3" "@docusaurus/react-loadable@5.5.2", "react-loadable@npm:@docusaurus/react-loadable@5.5.2": version "5.5.2" @@ -1543,23 +1543,23 @@ "@types/react" "*" prop-types "^15.6.2" -"@docusaurus/theme-classic@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-2.4.1.tgz#0060cb263c1a73a33ac33f79bb6bc2a12a56ad9e" - integrity sha512-Rz0wKUa+LTW1PLXmwnf8mn85EBzaGSt6qamqtmnh9Hflkc+EqiYMhtUJeLdV+wsgYq4aG0ANc+bpUDpsUhdnwg== - dependencies: - "@docusaurus/core" "2.4.1" - "@docusaurus/mdx-loader" "2.4.1" - "@docusaurus/module-type-aliases" "2.4.1" - "@docusaurus/plugin-content-blog" "2.4.1" - "@docusaurus/plugin-content-docs" "2.4.1" - "@docusaurus/plugin-content-pages" "2.4.1" - "@docusaurus/theme-common" "2.4.1" - "@docusaurus/theme-translations" "2.4.1" - "@docusaurus/types" "2.4.1" - "@docusaurus/utils" "2.4.1" - "@docusaurus/utils-common" "2.4.1" - "@docusaurus/utils-validation" "2.4.1" +"@docusaurus/theme-classic@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-2.4.3.tgz#29360f2eb03a0e1686eb19668633ef313970ee8f" + integrity sha512-QKRAJPSGPfDY2yCiPMIVyr+MqwZCIV2lxNzqbyUW0YkrlmdzzP3WuQJPMGLCjWgQp/5c9kpWMvMxjhpZx1R32Q== + dependencies: + "@docusaurus/core" "2.4.3" + "@docusaurus/mdx-loader" "2.4.3" + "@docusaurus/module-type-aliases" "2.4.3" + "@docusaurus/plugin-content-blog" "2.4.3" + "@docusaurus/plugin-content-docs" "2.4.3" + "@docusaurus/plugin-content-pages" "2.4.3" + "@docusaurus/theme-common" "2.4.3" + "@docusaurus/theme-translations" "2.4.3" + "@docusaurus/types" "2.4.3" + "@docusaurus/utils" "2.4.3" + "@docusaurus/utils-common" "2.4.3" + "@docusaurus/utils-validation" "2.4.3" "@mdx-js/react" "^1.6.22" clsx "^1.2.1" copy-text-to-clipboard "^3.0.1" @@ -1574,18 +1574,18 @@ tslib "^2.4.0" utility-types "^3.10.0" -"@docusaurus/theme-common@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-2.4.1.tgz#03e16f7aa96455e952f3243ac99757b01a3c83d4" - integrity sha512-G7Zau1W5rQTaFFB3x3soQoZpkgMbl/SYNG8PfMFIjKa3M3q8n0m/GRf5/H/e5BqOvt8c+ZWIXGCiz+kUCSHovA== - dependencies: - "@docusaurus/mdx-loader" "2.4.1" - "@docusaurus/module-type-aliases" "2.4.1" - "@docusaurus/plugin-content-blog" "2.4.1" - "@docusaurus/plugin-content-docs" "2.4.1" - "@docusaurus/plugin-content-pages" "2.4.1" - "@docusaurus/utils" "2.4.1" - "@docusaurus/utils-common" "2.4.1" +"@docusaurus/theme-common@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-2.4.3.tgz#bb31d70b6b67d0bdef9baa343192dcec49946a2e" + integrity sha512-7KaDJBXKBVGXw5WOVt84FtN8czGWhM0lbyWEZXGp8AFfL6sZQfRTluFp4QriR97qwzSyOfQb+nzcDZZU4tezUw== + dependencies: + "@docusaurus/mdx-loader" "2.4.3" + "@docusaurus/module-type-aliases" "2.4.3" + "@docusaurus/plugin-content-blog" "2.4.3" + "@docusaurus/plugin-content-docs" "2.4.3" + "@docusaurus/plugin-content-pages" "2.4.3" + "@docusaurus/utils" "2.4.3" + "@docusaurus/utils-common" "2.4.3" "@types/history" "^4.7.11" "@types/react" "*" "@types/react-router-config" "*" @@ -1596,19 +1596,19 @@ use-sync-external-store "^1.2.0" utility-types "^3.10.0" -"@docusaurus/theme-search-algolia@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.4.1.tgz#906bd2cca3fced0241985ef502c892f58ff380fc" - integrity sha512-6BcqW2lnLhZCXuMAvPRezFs1DpmEKzXFKlYjruuas+Xy3AQeFzDJKTJFIm49N77WFCTyxff8d3E4Q9pi/+5McQ== +"@docusaurus/theme-search-algolia@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.4.3.tgz#32d4cbefc3deba4112068fbdb0bde11ac51ece53" + integrity sha512-jziq4f6YVUB5hZOB85ELATwnxBz/RmSLD3ksGQOLDPKVzat4pmI8tddNWtriPpxR04BNT+ZfpPUMFkNFetSW1Q== dependencies: "@docsearch/react" "^3.1.1" - "@docusaurus/core" "2.4.1" - "@docusaurus/logger" "2.4.1" - "@docusaurus/plugin-content-docs" "2.4.1" - "@docusaurus/theme-common" "2.4.1" - "@docusaurus/theme-translations" "2.4.1" - "@docusaurus/utils" "2.4.1" - "@docusaurus/utils-validation" "2.4.1" + "@docusaurus/core" "2.4.3" + "@docusaurus/logger" "2.4.3" + "@docusaurus/plugin-content-docs" "2.4.3" + "@docusaurus/theme-common" "2.4.3" + "@docusaurus/theme-translations" "2.4.3" + "@docusaurus/utils" "2.4.3" + "@docusaurus/utils-validation" "2.4.3" algoliasearch "^4.13.1" algoliasearch-helper "^3.10.0" clsx "^1.2.1" @@ -1618,18 +1618,18 @@ tslib "^2.4.0" utility-types "^3.10.0" -"@docusaurus/theme-translations@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-2.4.1.tgz#4d49df5865dae9ef4b98a19284ede62ae6f98726" - integrity sha512-T1RAGP+f86CA1kfE8ejZ3T3pUU3XcyvrGMfC/zxCtc2BsnoexuNI9Vk2CmuKCb+Tacvhxjv5unhxXce0+NKyvA== +"@docusaurus/theme-translations@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-2.4.3.tgz#91ac73fc49b8c652b7a54e88b679af57d6ac6102" + integrity sha512-H4D+lbZbjbKNS/Zw1Lel64PioUAIT3cLYYJLUf3KkuO/oc9e0QCVhIYVtUI2SfBCF2NNdlyhBDQEEMygsCedIg== dependencies: fs-extra "^10.1.0" tslib "^2.4.0" -"@docusaurus/types@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-2.4.1.tgz#d8e82f9e0f704984f98df1f93d6b4554d5458705" - integrity sha512-0R+cbhpMkhbRXX138UOc/2XZFF8hiZa6ooZAEEJFp5scytzCw4tC1gChMFXrpa3d2tYE6AX8IrOEpSonLmfQuQ== +"@docusaurus/types@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-2.4.3.tgz#4aead281ca09f721b3c0a9b926818450cfa3db31" + integrity sha512-W6zNLGQqfrp/EoPD0bhb9n7OobP+RHpmvVzpA+Z/IuU3Q63njJM24hmT0GYboovWcDtFmnIJC9wcyx4RVPQscw== dependencies: "@types/history" "^4.7.11" "@types/react" "*" @@ -1640,30 +1640,30 @@ webpack "^5.73.0" webpack-merge "^5.8.0" -"@docusaurus/utils-common@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-2.4.1.tgz#7f72e873e49bd5179588869cc3ab7449a56aae63" - integrity sha512-bCVGdZU+z/qVcIiEQdyx0K13OC5mYwxhSuDUR95oFbKVuXYRrTVrwZIqQljuo1fyJvFTKHiL9L9skQOPokuFNQ== +"@docusaurus/utils-common@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-2.4.3.tgz#30656c39ef1ce7e002af7ba39ea08330f58efcfb" + integrity sha512-/jascp4GbLQCPVmcGkPzEQjNaAk3ADVfMtudk49Ggb+131B1WDD6HqlSmDf8MxGdy7Dja2gc+StHf01kiWoTDQ== dependencies: tslib "^2.4.0" -"@docusaurus/utils-validation@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-2.4.1.tgz#19959856d4a886af0c5cfb357f4ef68b51151244" - integrity sha512-unII3hlJlDwZ3w8U+pMO3Lx3RhI4YEbY3YNsQj4yzrkZzlpqZOLuAiZK2JyULnD+TKbceKU0WyWkQXtYbLNDFA== +"@docusaurus/utils-validation@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-2.4.3.tgz#8122c394feef3e96c73f6433987837ec206a63fb" + integrity sha512-G2+Vt3WR5E/9drAobP+hhZQMaswRwDlp6qOMi7o7ZypB+VO7N//DZWhZEwhcRGepMDJGQEwtPv7UxtYwPL9PBw== dependencies: - "@docusaurus/logger" "2.4.1" - "@docusaurus/utils" "2.4.1" + "@docusaurus/logger" "2.4.3" + "@docusaurus/utils" "2.4.3" joi "^17.6.0" js-yaml "^4.1.0" tslib "^2.4.0" -"@docusaurus/utils@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-2.4.1.tgz#9c5f76eae37b71f3819c1c1f0e26e6807c99a4fc" - integrity sha512-1lvEZdAQhKNht9aPXPoh69eeKnV0/62ROhQeFKKxmzd0zkcuE/Oc5Gpnt00y/f5bIsmOsYMY7Pqfm/5rteT5GA== +"@docusaurus/utils@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-2.4.3.tgz#52b000d989380a2125831b84e3a7327bef471e89" + integrity sha512-fKcXsjrD86Smxv8Pt0TBFqYieZZCPh4cbf9oszUq/AMhZn3ujwpKaVYZACPX8mmjtYx0JOgNx52CREBfiGQB4A== dependencies: - "@docusaurus/logger" "2.4.1" + "@docusaurus/logger" "2.4.3" "@svgr/webpack" "^6.2.1" escape-string-regexp "^4.0.0" file-loader "^6.2.0"