@ -24,6 +24,35 @@ $ yarn build
|
||||
|
||||
This command generates static content into the `build` directory and can be served using any static contents hosting service.
|
||||
|
||||
|
||||
### Cutting a new doc version
|
||||
|
||||
New doc releases should only be cut when major revisions are coming and the current version is ready to be frozen.
|
||||
Cutting a new version will snapshot the current ./docs directory and copy it all into the ./website/versioned_docs directory based on the version that is tagged.
|
||||
|
||||
```
|
||||
$ yarn docusaurus docs:version 1.1`
|
||||
```
|
||||
|
||||
The default doc version that is displayed is managed in the `docusaurus.config.js` file.
|
||||
By default the last version that was cut will be displayed, but this can be overridden be updating the config to render
|
||||
the "current" doc version.
|
||||
|
||||
```
|
||||
presets: [
|
||||
[
|
||||
docs: {
|
||||
// These lines to show the current docs by default and assign them a label
|
||||
lastVersion: 'current',
|
||||
versions: {
|
||||
current: {
|
||||
label: '1.0',
|
||||
},
|
||||
},
|
||||
|
||||
},
|
||||
```
|
||||
|
||||
### Deployment
|
||||
|
||||
Using SSH:
|
||||
|
@ -6,7 +6,7 @@ const darkCodeTheme = require('prism-react-renderer/themes/dracula');
|
||||
|
||||
/** @type {import('@docusaurus/types').Config} */
|
||||
const config = {
|
||||
title: 'Zrok',
|
||||
title: 'zrok',
|
||||
staticDirectories: ['static', '../docs/images', '../docker/compose', '../etc/caddy'],
|
||||
tagline: 'Globally distributed reverse proxy',
|
||||
url: 'https://docs.zrok.io',
|
||||
@ -83,6 +83,15 @@ const config = {
|
||||
'https://github.com/openziti/zrok/blob/main/docs',
|
||||
path: '../docs',
|
||||
include: ['**/*.md', '**/*.mdx'],
|
||||
|
||||
// Uncomment these lines when we're ready to show the 1.0 docs by default
|
||||
// lastVersion: 'current',
|
||||
versions: {
|
||||
current: {
|
||||
label: '1.0',
|
||||
},
|
||||
},
|
||||
|
||||
},
|
||||
theme: {
|
||||
customCss: require.resolve('./src/css/custom.css'),
|
||||
@ -112,6 +121,9 @@ const config = {
|
||||
target: '_self',
|
||||
},
|
||||
items: [
|
||||
{
|
||||
type: 'docsVersionDropdown',
|
||||
},
|
||||
{
|
||||
href: 'https://zrok.io/pricing/',
|
||||
position: 'right',
|
||||
@ -138,7 +150,7 @@ const config = {
|
||||
position: 'right',
|
||||
className: 'header-discourse-link',
|
||||
title: 'Discourse'
|
||||
},
|
||||
}
|
||||
],
|
||||
},
|
||||
footer: {
|
||||
|
@ -0,0 +1,7 @@
|
||||
{
|
||||
"label": "Network",
|
||||
"position": 60,
|
||||
"link": {
|
||||
"type": "generated-index",
|
||||
}
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
[Unit]
|
||||
Description=ziti-ctrl
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
User=ubuntu
|
||||
WorkingDirectory=/home/ubuntu
|
||||
ExecStart=/home/ubuntu/local/ziti/bin/ziti-controller run /home/ubuntu/local/etc/zrok.io/ziti-ctrl.yml
|
||||
Restart=always
|
||||
RestartSec=2
|
||||
LimitNOFILE=65535
|
||||
Environment="PFXLOG_NO_JSON=true"
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
|
@ -0,0 +1,222 @@
|
||||
v: 3
|
||||
|
||||
#trace:
|
||||
# path: "controller.trace"
|
||||
|
||||
#profile:
|
||||
# memory:
|
||||
# path: ctrl.memprof
|
||||
|
||||
db: "/home/ubuntu/local/etc/zrok.io/db/ziti-ctrl.db"
|
||||
|
||||
identity:
|
||||
cert: "/home/ubuntu/local/etc/zrok.io/pki/intermediate/certs/ctrl-client.cert"
|
||||
server_cert: "/home/ubuntu/local/etc/zrok.io/pki/intermediate/certs/ctrl-server.chain.pem"
|
||||
key: "/home/ubuntu/local/etc/zrok.io/pki/intermediate/keys/ctrl-server.key"
|
||||
ca: "/home/ubuntu/local/etc/zrok.io/pki/cas.pem"
|
||||
|
||||
# Network Configuration
|
||||
#
|
||||
# Configure how the controller will establish and manage the overlay network, and routing operations on top of
|
||||
# the network.
|
||||
#
|
||||
#network:
|
||||
|
||||
# routeTimeoutSeconds controls the number of seconds the controller will wait for a route attempt to succeed.
|
||||
#routeTimeoutSeconds: 10
|
||||
|
||||
# createCircuitRetries controls the number of retries that will be attempted to create a path (and terminate it)
|
||||
# for new circuits.
|
||||
#createCircuitRetries: 2
|
||||
|
||||
# pendingLinkTimeoutSeconds controls how long we'll wait before creating a new link between routers where
|
||||
# there isn't an established link, but a link request has been sent
|
||||
#pendingLinkTimeoutSeconds: 10
|
||||
|
||||
# Defines the period that the controller re-evaluates the performance of all of the circuits
|
||||
# running on the network.
|
||||
#
|
||||
#cycleSeconds: 15
|
||||
|
||||
# Sets router minimum cost. Defaults to 10
|
||||
#minRouterCost: 10
|
||||
|
||||
# Sets how often a new control channel connection can take over for a router with an existing control channel connection
|
||||
# Defaults to 1 minute
|
||||
#routerConnectChurnLimit: 1m
|
||||
|
||||
# Sets the latency of link when it's first created. Will be overwritten as soon as latency from the link is actually
|
||||
# reported from the routers. Defaults to 65 seconds.
|
||||
#initialLinkLatency: 65s
|
||||
|
||||
#smart:
|
||||
#
|
||||
# Defines the fractional upper limit of underperforming circuits that are candidates to be re-routed. If
|
||||
# smart routing detects 100 circuits that are underperforming, and `smart.rerouteFraction` is set to `0.02`,
|
||||
# then the upper limit of circuits that will be re-routed in this `cycleSeconds` period will be limited to
|
||||
# 2 (2% of 100).
|
||||
#
|
||||
#rerouteFraction: 0.02
|
||||
#
|
||||
# Defines the hard upper limit of underperforming circuits that are candidates to be re-routed. If smart
|
||||
# routing detects 100 circuits that are underperforming, and `smart.rerouteCap` is set to `1`, and
|
||||
# `smart.rerouteFraction` is set to `0.02`, then the upper limit of circuits that will be re-routed in this
|
||||
# `cycleSeconds` period will be limited to 1.
|
||||
#
|
||||
#rerouteCap: 4
|
||||
|
||||
# the endpoint that routers will connect to the controller over.
|
||||
ctrl:
|
||||
#options:
|
||||
# (optional) settings
|
||||
# set the maximum number of connect requests that are buffered and waiting to be acknowledged (1 to 5000, default 1)
|
||||
#maxQueuedConnects: 1
|
||||
# the maximum number of connects that have begun hello synchronization (1 to 1000, default 16)
|
||||
#maxOutstandingConnects: 16
|
||||
# the number of milliseconds to wait before a hello synchronization fails and closes the connection (30ms to 60000ms, default: 1000ms)
|
||||
#connectTimeoutMs: 1000
|
||||
listener: tls:0.0.0.0:6262
|
||||
|
||||
# the endpoint that management tools connect to the controller over.
|
||||
mgmt:
|
||||
#options:
|
||||
# (optional) settings
|
||||
# set the maximum number of connect requests that are buffered and waiting to be acknowledged (1 to 5000, default 1)
|
||||
#maxQueuedConnects: 1
|
||||
# the maximum number of connects that have begun hello synchronization (1 to 1000, default 16)
|
||||
#maxOutstandingConnects: 16
|
||||
# the number of milliseconds to wait before a hello synchronization fails and closes the connection (30ms to 60000ms, default: 1000ms)
|
||||
#connectTimeoutMs: 1000
|
||||
listener: tls:0.0.0.0:10000
|
||||
|
||||
#metrics:
|
||||
# influxdb:
|
||||
# url: http://localhost:8086
|
||||
# database: ziti
|
||||
|
||||
# xctrl_example
|
||||
#
|
||||
#example:
|
||||
# enabled: false
|
||||
# delay: 5s
|
||||
|
||||
healthChecks:
|
||||
boltCheck:
|
||||
# How often to try entering a bolt read tx. Defaults to 30 seconds
|
||||
interval: 30s
|
||||
# When to time out the check. Defaults to 20 seconds
|
||||
timeout: 20s
|
||||
# How long to wait before starting the check. Defaults to 30 seconds
|
||||
initialDelay: 30s
|
||||
|
||||
# By having an 'edge' section defined, the ziti-controller will attempt to parse the edge configuration. Removing this
|
||||
# section, commenting out, or altering the name of the section will cause the edge to not run.
|
||||
edge:
|
||||
# This section represents the configuration of the Edge API that is served over HTTPS
|
||||
api:
|
||||
#(optional, default 90s) Alters how frequently heartbeat and last activity values are persisted
|
||||
# activityUpdateInterval: 90s
|
||||
#(optional, default 250) The number of API Sessions updated for last activity per transaction
|
||||
# activityUpdateBatchSize: 250
|
||||
# sessionTimeout - optional, default 30m
|
||||
# The number of minutes before an Edge API session will time out. Timeouts are reset by
|
||||
# API requests and connections that are maintained to Edge Routers
|
||||
sessionTimeout: 30m
|
||||
# address - required
|
||||
# The default address (host:port) to use for enrollment for the Client API. This value must match one of the addresses
|
||||
# defined in this Controller.WebListener.'s bindPoints.
|
||||
address: ziti.zrok.io:1280
|
||||
# This section is used to define option that are used during enrollment of Edge Routers, Ziti Edge Identities.
|
||||
enrollment:
|
||||
# signingCert - required
|
||||
# A Ziti Identity configuration section that specifically makes use of the cert and key fields to define
|
||||
# a signing certificate from the PKI that the Ziti environment is using to sign certificates. The signingCert.cert
|
||||
# will be added to the /.well-known CA store that is used to bootstrap trust with the Ziti Controller.
|
||||
signingCert:
|
||||
cert: /home/ubuntu/local/etc/zrok.io/pki/signing-intermediate/certs/signing-intermediate.cert
|
||||
key: /home/ubuntu/local/etc/zrok.io/pki/signing-intermediate/keys/signing-intermediate.key
|
||||
# edgeIdentity - optional
|
||||
# A section for identity enrollment specific settings
|
||||
edgeIdentity:
|
||||
# duration - optional, default 180m
|
||||
# The length of time that a Ziti Edge Identity enrollment should remain valid. After
|
||||
# this duration, the enrollment will expire and no longer be usable.
|
||||
duration: 180m
|
||||
# edgeRouter - Optional
|
||||
# A section for edge router enrollment specific settings.
|
||||
edgeRouter:
|
||||
# duration - optional, default 180m
|
||||
# The length of time that a Ziti Edge Router enrollment should remain valid. After
|
||||
# this duration, the enrollment will expire and no longer be usable.
|
||||
duration: 180m
|
||||
|
||||
# web
|
||||
# Defines webListeners that will be hosted by the controller. Each webListener can host many APIs and be bound to many
|
||||
# bind points.
|
||||
web:
|
||||
# name - required
|
||||
# Provides a name for this listener, used for logging output. Not required to be unique, but is highly suggested.
|
||||
- name: client-management
|
||||
# bindPoints - required
|
||||
# One or more bind points are required. A bind point specifies an interface (interface:port string) that defines
|
||||
# where on the host machine the webListener will listen and the address (host:port) that should be used to
|
||||
# publicly address the webListener(i.e. mydomain.com, localhost, 127.0.0.1). This public address may be used for
|
||||
# incoming address resolution as well as used in responses in the API.
|
||||
bindPoints:
|
||||
#interface - required
|
||||
# A host:port string on which network interface to listen on. 0.0.0.0 will listen on all interfaces
|
||||
- interface: 0.0.0.0:1280
|
||||
# address - required
|
||||
# The public address that external incoming requests will be able to resolve. Used in request processing and
|
||||
# response content that requires full host:port/path addresses.
|
||||
address: ziti.zrok.io:1280
|
||||
# identity - optional
|
||||
# Allows the webListener to have a specific identity instead of defaulting to the root 'identity' section.
|
||||
identity:
|
||||
ca: "/home/ubuntu/local/etc/zrok.io/pki/intermediate/certs/intermediate.cert"
|
||||
key: "/home/ubuntu/local/etc/zrok.io/pki/intermediate/keys/ctrl-server.key"
|
||||
server_cert: "/home/ubuntu/local/etc/zrok.io/pki/intermediate/certs/ctrl-server.chain.pem"
|
||||
cert: "/home/ubuntu/local/etc/zrok.io/pki/intermediate/certs/ctrl-client.cert"
|
||||
# options - optional
|
||||
# Allows the specification of webListener level options - mainly dealing with HTTP/TLS settings. These options are
|
||||
# used for all http servers started by the current webListener.
|
||||
options:
|
||||
# idleTimeoutMs - optional, default 5000ms
|
||||
# The maximum amount of idle time in milliseconds allowed for pipelined HTTP requests. Setting this too high
|
||||
# can cause resources on the host to be consumed as clients remain connected and idle. Lowering this value
|
||||
# will cause clients to reconnect on subsequent HTTPs requests.
|
||||
idleTimeout: 5000ms #http timeouts, new
|
||||
# readTimeoutMs - optional, default 5000ms
|
||||
# The maximum amount of time in milliseconds http servers will wait to read the first incoming requests. A higher
|
||||
# value risks consuming resources on the host with clients that are acting bad faith or suffering from high latency
|
||||
# or packet loss. A lower value can risk losing connections to high latency/packet loss clients.
|
||||
readTimeout: 5000ms
|
||||
# writeTimeoutMs - optional, default 100000ms
|
||||
# The total maximum time in milliseconds that the http server will wait for a single requests to be received and
|
||||
# responded too. A higher value can allow long-running requests to consume resources on the host. A lower value
|
||||
# can risk ending requests before the server has a chance to respond.
|
||||
writeTimeout: 100000ms
|
||||
# minTLSVersion - optional, default TLS1.2
|
||||
# The minimum version of TSL to support
|
||||
minTLSVersion: TLS1.2
|
||||
# maxTLSVersion - optional, default TLS1.3
|
||||
# The maximum version of TSL to support
|
||||
maxTLSVersion: TLS1.3
|
||||
# apis - required
|
||||
# Allows one or more APIs to be bound to this webListener
|
||||
apis:
|
||||
# binding - required
|
||||
# Specifies an API to bind to this webListener. Built-in APIs are
|
||||
# - edge-management
|
||||
# - edge-client
|
||||
# - fabric-management
|
||||
- binding: edge-management
|
||||
# options - arg optional/required
|
||||
# This section is used to define values that are specified by the API they are associated with.
|
||||
# These settings are per API. The example below is for the 'edge-api' and contains both optional values and
|
||||
# required values.
|
||||
options: { }
|
||||
- binding: edge-client
|
||||
options: { }
|
||||
- binding: fabric
|
||||
options: { }
|
@ -0,0 +1,15 @@
|
||||
[Unit]
|
||||
Description=ziti-router0
|
||||
After=ziti-ctrl
|
||||
|
||||
[Service]
|
||||
User=ubuntu
|
||||
WorkingDirectory=/home/ubuntu
|
||||
ExecStart=/home/ubuntu/local/ziti/bin/ziti-router run /home/ubuntu/local/etc/zrok.io/ziti-router0.yml
|
||||
Restart=always
|
||||
RestartSec=2
|
||||
LimitNOFILE=65535
|
||||
Environment="PFXLOG_NO_JSON=true"
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
@ -0,0 +1,69 @@
|
||||
v: 3
|
||||
|
||||
identity:
|
||||
cert: "/home/ubuntu/local/etc/zrok.io/pki/intermediate/certs/router0-client.cert"
|
||||
server_cert: "/home/ubuntu/local/etc/zrok.io/pki/intermediate/certs/router0-server.cert"
|
||||
key: "/home/ubuntu/local/etc/zrok.io/pki/intermediate/keys/router0-server.key"
|
||||
ca: "/home/ubuntu/local/etc/zrok.io/pki/cas.cert"
|
||||
|
||||
ctrl:
|
||||
endpoint: tls:0.0.0.0:6262
|
||||
|
||||
link:
|
||||
dialers:
|
||||
- binding: transport
|
||||
listeners:
|
||||
- binding: transport
|
||||
bind: tls:0.0.0.0:10080
|
||||
advertise: tls:api.zrok.io:10080
|
||||
options:
|
||||
outQueueSize: 4
|
||||
|
||||
listeners:
|
||||
# bindings of edge and tunnel requires an "edge" section below
|
||||
- binding: edge
|
||||
address: tls:0.0.0.0:3022
|
||||
options:
|
||||
advertise: ziti.zrok.io:3022
|
||||
connectTimeoutMs: 1000
|
||||
getSessionTimeout: 60s
|
||||
- binding: tunnel
|
||||
options:
|
||||
mode: host #tproxy|host
|
||||
|
||||
|
||||
edge:
|
||||
csr:
|
||||
country: US
|
||||
province: NC
|
||||
locality: Charlotte
|
||||
organization: NetFoundry
|
||||
organizationalUnit: Ziti
|
||||
sans:
|
||||
dns:
|
||||
- ziti.zrok.io
|
||||
- localhost
|
||||
ip:
|
||||
- "10.0.0.41"
|
||||
- "127.0.0.1"
|
||||
|
||||
#transport:
|
||||
# ws:
|
||||
# writeTimeout: 10
|
||||
# readTimeout: 5
|
||||
# idleTimeout: 5
|
||||
# pongTimeout: 60
|
||||
# pingInterval: 54
|
||||
# handshakeTimeout: 10
|
||||
# readBufferSize: 4096
|
||||
# writeBufferSize: 4096
|
||||
# enableCompression: true
|
||||
# server_cert: /home/ubuntu/.ziti/quickstart/zrok-ctrl-01/pki/routers/zrok-ctrl-01-edge-router/server.cert
|
||||
# key: /home/ubuntu/.ziti/quickstart/zrok-ctrl-01/pki/routers/zrok-ctrl-01-edge-router/server.key
|
||||
|
||||
forwarder:
|
||||
latencyProbeInterval: 10
|
||||
xgressDialQueueLength: 1000
|
||||
xgressDialWorkerCount: 128
|
||||
linkDialQueueLength: 1000
|
||||
linkDialWorkerCount: 32
|
@ -0,0 +1,15 @@
|
||||
[Unit]
|
||||
Description=zrok-http-frontend
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
User=ubuntu
|
||||
WorkingDirectory=/home/ubuntu
|
||||
ExecStart=/home/ubuntu/local/zrok/bin/zrok access public /home/ubuntu/.zrok/frontend.json
|
||||
Restart=always
|
||||
RestartSec=2
|
||||
LimitNOFILE=65535
|
||||
Environment="PFXLOG_NO_JSON=true"
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
@ -0,0 +1,15 @@
|
||||
[Unit]
|
||||
Description=zrok-ctrl
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
User=ubuntu
|
||||
WorkingDirectory=/home/ubuntu
|
||||
ExecStart=/home/ubuntu/local/zrok/bin/zrok ctrl /home/ubuntu/local/etc/zrok.io/zrok-ctrl.yml
|
||||
Restart=always
|
||||
RestartSec=2
|
||||
LimitNOFILE=65535
|
||||
Environment="PFXLOG_NO_JSON=true"
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
@ -0,0 +1,17 @@
|
||||
# _____ __ ___ | | __
|
||||
# |_ / '__/ _ \| |/ /
|
||||
# / /| | | (_) | <
|
||||
# /___|_| \___/|_|\_\
|
||||
# controller configuration
|
||||
|
||||
endpoint:
|
||||
host: 0.0.0.0
|
||||
port: 8080
|
||||
|
||||
store:
|
||||
path: /home/ubuntu/local/etc/zrok.io/db/zrok-ctrl.db
|
||||
|
||||
ziti:
|
||||
api_endpoint: "https://10.0.0.41:1280"
|
||||
username: admin
|
||||
password: admin
|
@ -0,0 +1,95 @@
|
||||
* create root ca
|
||||
|
||||
`pki_create_ca`:
|
||||
|
||||
```
|
||||
$ ziti pki create ca --pki-root=/home/ubuntu/local/etc/zrok.io/pki --ca-file=root-ca --ca-name="zrok.io Root CA"
|
||||
```
|
||||
|
||||
* signing root ca
|
||||
|
||||
`pki_create_ca`:
|
||||
|
||||
```
|
||||
$ ziti pki create ca --pki-root=/home/ubuntu/local/etc/zrok.io/pki --ca-file=signing-root-ca --ca-name="zrok.io Signing Root CA"
|
||||
```
|
||||
|
||||
* intermediate
|
||||
|
||||
`pki_create_intermediate`:
|
||||
|
||||
```
|
||||
$ ziti pki create intermediate --pki-root=/home/ubuntu/local/etc/zrok.io/pki --ca-name=root-ca --intermediate-name="zrok.io Intermediate" --intermediate-file=intermediate --max-path-len=1
|
||||
```
|
||||
|
||||
* signing intermediate
|
||||
|
||||
`pki_create_intermediate`:
|
||||
|
||||
```
|
||||
$ ziti pki create intermediate --pki-root=/home/ubuntu/local/etc/zrok.io/pki --ca-name=intermediate --intermediate-name="zrok.io Signing Intermediate" --intermediate-file=signing-intermediate --max-path-len=1
|
||||
```
|
||||
|
||||
* create controller client/server certs:
|
||||
|
||||
`pki_client_server`:
|
||||
|
||||
```
|
||||
$ ziti pki create server --pki-root=/home/ubuntu/local/etc/zrok.io/pki --ca-name=intermediate --server-file=ctrl-server --dns="ziti.dev.zrok.io,localhost" --ip="0.0.0.0,10.0.0.41,127.0.01" --server-name="zrok.io controller server"
|
||||
$ ziti pki create client --pki-root=/home/ubuntu/local/etc/zrok.io/pki --ca-name=intermediate --client-file=ctrl-client --key-file=ctrl-server --client-name="zrok.io controller client"
|
||||
```
|
||||
|
||||
* create edge router client/server certs:
|
||||
|
||||
`pki_client_server`:
|
||||
|
||||
```
|
||||
$ ziti pki create server --pki-root=/home/ubuntu/local/etc/zrok.io/pki --ca-name=intermediate --server-file=router0-server --dns="ziti.dev.zrok.io,localhost" --ip="0.0.0.0,10.0.0.41,127.0.01" --server-name="zrok.io router0 server"
|
||||
$ ziti pki create client --pki-root=/home/ubuntu/local/etc/zrok.io/pki --ca-name=intermediate --client-file=router0-client --key-file=router0-server --client-name="zrok.io router0 client"
|
||||
```
|
||||
|
||||
* `cas.pem`:
|
||||
|
||||
`createControllerConfig`:
|
||||
|
||||
```
|
||||
$ cat local/etc/zrok.io/pki/intermediate/certs/ctrl-server.chain.pem > local/etc/zrok.io/pki/cas.pem
|
||||
$ cat local/etc/zrok.io/pki/intermediate/certs/signing-intermediate.cert >> local/etc/zrok.io/pki/cas.pem
|
||||
```
|
||||
|
||||
* `ziti-controller edge init`:
|
||||
|
||||
```
|
||||
$ ~/local/ziti/ziti-controller edge init local/etc/zrok.io/ziti-ctrl.yml
|
||||
```
|
||||
|
||||
* start controller
|
||||
|
||||
* create and enroll edge router:
|
||||
|
||||
```
|
||||
$ ziti edge create edge-router router0 -o router0.jwt -t -a "public"
|
||||
New edge router router0 created with id: ZAbNbXUL6A
|
||||
Enrollment expires at 2022-08-29T21:56:37.418Z
|
||||
|
||||
$ ziti-router enroll local/etc/zrok.io/ziti-router0.yml --jwt router0.jwt
|
||||
[ 3.561] INFO edge/router/enroll.(*RestEnroller).Enroll: registration complete
|
||||
```
|
||||
|
||||
* configure zrok frontend identity
|
||||
|
||||
```
|
||||
$ ziti edge create identity device -o ~/.zrok/proxy.jwt proxy
|
||||
New identity proxy created with id: -zbBF8eVb-
|
||||
Enrollment expires at 2022-08-10T18:46:16.641Z
|
||||
```
|
||||
|
||||
```
|
||||
$ ziti edge enroll -j ~/.zrok/proxy.jwt -o ~/.zrok/proxy.json
|
||||
INFO generating 4096 bit RSA key
|
||||
INFO enrolled successfully. identity file written to: proxy.json
|
||||
```
|
||||
|
||||
```
|
||||
$ ziti edge create erp --edge-router-roles "#all" --identity-roles @proxy
|
||||
```
|
92
website/versioned_docs/version-0.4/_attic/overview.md
Normal file
@ -0,0 +1,92 @@
|
||||
---
|
||||
sidebar_position: 0
|
||||
sidebar_label: What is zrok
|
||||
---
|
||||
# What is `zrok`
|
||||
|
||||
## Overview
|
||||
|
||||
`zrok` is a super-lightweight tool for providing on-demand access to dark, unreachable resources.
|
||||
The super-power of `zrok` is providing a single-step solution to creating ephemeral network connectivity. From an end-user perspective, `zrok` is a tool packaged as a single executable, which can be used as a "shim" to quickly create public endpoints for dark resources.
|
||||
|
||||
`zrok` is also a service (which can be self-hosted) and runs on top of any OpenZiti network. The service provides one or more listening endpoints (typically on the public internet), that are designed to dynamically expose endpoints (HTTP(S)-only, as of v0.1.x), as requested by the end-user `zrok` tooling.
|
||||
|
||||
`zrok` listening endpoints, and `zrok` terminating endpoints are typically used together to create the streamlined, ephemeral connectivity solution for dark services. But listening endpoints and the terminating endpoints can be used orthogonally, interoperating with other OpenZiti SDK clients.
|
||||
|
||||
### The Primary Use Case
|
||||
|
||||
The primary use case for `zrok` is exposing dark resources across the public internet, for a multiplicity of reasons. Consider a developer, who is building a web application and wants to share work in progress with third parties for review. The developer already has signed up for a `zrok` account and has been issued a secret token.
|
||||
|
||||
The developer will have enabled `zrok` capabilities for their shell environment using the `zrok enable` command:
|
||||
|
||||
```
|
||||
$ zrok enable <secret-token>
|
||||
```
|
||||
|
||||
After enabling their environment, the developer can quickly create a publicly available URL for their application like this:
|
||||
|
||||
```
|
||||
$ zrok http http://localhost:3000
|
||||
```
|
||||
|
||||
`zrok` will then give them a public URL, like this:
|
||||
|
||||
```
|
||||
http://d9121e7cdfd2dd2f.zrok.io/
|
||||
```
|
||||
|
||||
This URL can be shared with anyone, anywhere, allowing access to the developer's application as long as the developer is running the `zrok http` command. Simply ending that process will destroy all of the public access, and clean up the associated resources in the underlying OpenZiti environment.
|
||||
|
||||
## How Does `zrok` Work?
|
||||
|
||||
At a high level, the `zrok` stack looks like this:
|
||||
|
||||

|
||||
|
||||
Let's discuss a couple of the flows through the above use case and talk about what's happening.
|
||||
|
||||
|
||||
### The `zrok enable` Flow
|
||||
|
||||
When a new `zrok` user signs up for an account, they are issued a "secret token". This secret token is used to enable shell access to `zrok http` from the command line.
|
||||
|
||||
When the user runs `zrok enable` from their shell, here's what happens:
|
||||
|
||||
1. The `zrok enable` client reaches out with an enable request to the `zrok` controller.
|
||||
2. The `zrok` controller creates a new OpenZiti identity for the environment and enrolls it.
|
||||
3. The `zrok` controller creates an edge router policy associating the new OpenZiti identity with `#all` edge routers.
|
||||
4. The `zrok` controller returns the entire SDK configuration back to the `zrok enable` client.
|
||||
5. The `zrok enable` client then stores the OpenZiti identity along with a few other housekeeping details in the user's `~/.zrok` folder.
|
||||
6. With the OpenZiti identity and configuration details stored in the user's `environment`, the user is then able to create any number of binding endpoints using the `zrok http` command.
|
||||
|
||||
|
||||
### The `zrok http` Flow
|
||||
|
||||
When a `zrok` user issues a `zrok http` command for an endpoint, here's what happens:
|
||||
|
||||
1. The `zrok http` client gathers the necessary identity details from the `environment` (this was all staged during `zrok enable`).
|
||||
2. The `zrok http` client reaches out to the `zrok` controller with an authenticated `tunnel` request, asking to have a new endpoint binding created.
|
||||
3. The `zrok` controller allocates a new "service name" for the binding.
|
||||
4. The `zrok` controller creates a `zrok.proxy.v1` configuration describing the user's requested authentication details (currently: `none` or `basic`).
|
||||
5. The `zrok` controller creates a new service, associating the service with the configuration.
|
||||
6. The `zrok` controller creates a bind service policy for the user's environment identity and the newly created OpenZiti service.
|
||||
7. The `zrok` controller creates a dial service policy allowing the configured listening endpoints (ingress proxies) to dial the newly created service.
|
||||
8. The `zrok` controller creates a service edge router policy associating the newly created service with `#all` edge routers.
|
||||
9. The URL for the new `zrok` service is constructed and returned to the `zrok http` client.
|
||||
10. The `zrok http` client then binds the OpenZiti service with an SDK client, and begins reverse-proxying traffic received from OpenZiti across to the dark service.
|
||||
|
||||
When the user terminates the `zrok http` client, these resources are removed from the OpenZiti network.
|
||||
|
||||
|
||||
### `zrok proxy` and HTTP Clients
|
||||
|
||||
When `zrok http` exposes a service and returns a URL, that URL is designed to be sent to a `zrok` listening endpoint (`zrok proxy`, currently). The `zrok proxy` is a stateless SDK client with an HTTP(S) listener exposed to the public internet.
|
||||
|
||||
When an HTTP request arrives as the `zrok proxy` listener, this happens:
|
||||
|
||||
1. The `zrok proxy` parses the `Host` header provided by the client, extracting the `zrok` service name from the URL.
|
||||
2. The service is refreshed (if necessary) and retrieved. The `zrok.proxy.v1` configuration details are retrieved.
|
||||
3. The `zrok.proxy.v1` configuration is used to do authentication processing. If authentication is required, such a response is returned to the client.
|
||||
4. The `zrok proxy` then dials the OpenZiti service, and the dialed service is used to reverse proxy the request from the end user across OpenZiti to the binding endpoint, and then dark service.
|
||||
|
||||
The `zrok proxy` does not require any communication with the `zrok` controller, and is stateless. They can be pooled behind a load balancer. It is currently a goal is to maintain this lightweight nature.
|
@ -0,0 +1,7 @@
|
||||
{
|
||||
"label": "Sharing",
|
||||
"position": 20,
|
||||
"link": {
|
||||
"type": "generated-index",
|
||||
}
|
||||
}
|
@ -0,0 +1,37 @@
|
||||
# Reserved Services
|
||||
|
||||
With v0.3, `zrok` introduced a concept of "reserving" services. The intention is that the `zrok` control plane will support limits on the number of reserved services (and eventually `frontend`instances) that an account is allowed to utilize. Service reservations could also be time-limited, or possibly even bandwidth-limited (the reservation expires after a bandwidth threshold is crossed).
|
||||
|
||||
## Reserved Services Example
|
||||
|
||||
With v0.3 `zrok` introduced the `zrok reserve` command:
|
||||
|
||||
```
|
||||
$ zrok reserve private http://localhost:9090
|
||||
[ 0.047] INFO main.(*reserveCommand).run: your reserved service token is 'x88xujrpk4k3'
|
||||
[ 0.048] INFO main.(*reserveCommand).run: your reserved service frontend is 'http://x88xujrpk4k3.zrok.quigley.com:8080/'
|
||||
```
|
||||
|
||||
The `reserve` command creates a service reservation that allows a service to become non-ephemeral. The service token `x88xujrpk4k3` is guaranteed to exist between `backend` executions.
|
||||
|
||||
Running a `backend` against a service reservation is done like this:
|
||||
|
||||
```
|
||||
$ zrok share reserved x88xujrpk4k3
|
||||
[ 0.005] INFO main.(*shareReservedCommand).run: sharing target endpoint: 'http://localhost:9090'
|
||||
[ 0.040] INFO main.(*shareReservedCommand).run: use this command to access your zrok service: 'zrok access private x88xujrpk4k3'
|
||||
^C
|
||||
$ zrok share reserved x88xujrpk4k3
|
||||
[ 0.007] INFO main.(*shareReservedCommand).run: sharing target endpoint: 'http://localhost:9090'
|
||||
[ 0.047] INFO main.(*shareReservedCommand).run: use this command to access your zrok service: 'zrok access private x88xujrpk4k3'
|
||||
```
|
||||
|
||||
The `share reserved` comand starts a backend process for the service. User-facing and public-facing `frontend` instances are allowed to come and go, just as if the service were ephemeral.
|
||||
|
||||
Releasing a reserved service is done with the `zrok release` command:
|
||||
|
||||
```
|
||||
$ zrok release x88xujrpk4k3
|
||||
[ 0.056] INFO main.(*releaseCommand).run: reserved service 'x88xujrpk4k3' released
|
||||
```
|
||||
|
@ -0,0 +1,53 @@
|
||||
# Public/Private Sharing
|
||||
|
||||
In `v0.3` new sharing modes and new types of built-in services were introduced.
|
||||
|
||||
## Share Modes
|
||||
|
||||
_Note: In `v0.3`, the `tunnel` and `untunnel` concepts get renamed to `share` and `unshare`._
|
||||
|
||||
_Note: We're going to continue using `frontend` and `backend` as concepts, even though those words will be changing in the `zrok` CLI. A `frontend` will continue to describe an "ingress" into the `zrok`service, and is the tool that is used by the user "consuming" or `access`-ing the the `zrok` service. A `backend` will continue to describe the "binding" created by a user that wants to `share` a resource._
|
||||
|
||||
### Public Sharing
|
||||
|
||||
In `v0.2`, `zrok` only offered a "public" sharing mode. The public sharing mode will allow any configured `frontend` instances to send traffic to any `backend`. The policy and permission model was very simple and flat. A `v0.2` deployment considers any available `frontend` instance to be allowed to send traffic to configured services. The access for `frontend` instances is controlled by identity provisioning within the underlying OpenZiti network.
|
||||
|
||||
In `v0.3`, `zrok` will offer both a "public" and a "private" sharing mode. When `v0.3` configures the policies for a service, a publicly-shared service will have policies created that allow whichever selected public `frontend` instances to access the shared `backend`. A `v0.3` deployment will have a collection of multi-tenant, high-capacity `frontend` instances available to be selected from. The `zrok` CLI will default to selecting the `public` `frontend` instances.
|
||||
|
||||
The `frontend` selection approach also gives us a clean implementation for picking public `frontend` instances based on geography (either network or physical). The production `zrok.io` service could easily offer multiple different fleets of `frontend` instances, and this mechanism will allow `backend` users to choose where they want to offer access to their service.
|
||||
|
||||
### Private Sharing
|
||||
|
||||
`v0.3` introduced "private" sharing mode. When provisioning a service for private sharing, `zrok` will not create any policies for the service, until a request for a `frontend` binding is created for the service (through the `v0.3` `zrok access` command).
|
||||
|
||||
The `v0.3` `zrok` API will support creating `frontend` instances for both identified users (where the `zrok` user has a provisioned `environment`), as well as ephemeral users (the `zrok` controller will create a single-use "ephemeral environment" for these `frontend` instances).
|
||||
|
||||
## Backend Modes
|
||||
|
||||
In `v0.2`, the only possible `backend` "mode" was used for reverse proxying HTTP traffic to a local endpoint. The `v0.3` `zrok` client will support several different `backend` modes, providing a number of built-in conveniences.
|
||||
|
||||
### Web Mode
|
||||
|
||||
A user has a collection of files on disk. Sharing with a `backend` mode of "web", will create a `backend` that shares a file tree as if it were a local web server. This effectively allows a user to bind a web-server backend to a document root with a single CLI command.
|
||||
|
||||
### DAV Mode
|
||||
|
||||
A user wants to operate a read/write repository of files accessible through either conventional WebDAV clients (through `public` `frontend` instances), or through the `zrok` CLI (a convenience wrapper, embedding WebDAV capabilities).
|
||||
|
||||
This allows users to create read/write repositories of files that can be shared with multiple users, and also allows for the creation of write-only "drop boxes" for receiving files from another user (often a tricky thing to do well and securely on the public internet).
|
||||
|
||||
### Proxy Mode
|
||||
|
||||
`v0.3` will retain the classic reverse proxy mode, as well. Will continue to allow a user to expose a local HTTP endpoint through `zrok`.
|
||||
|
||||
## Entities (SQL)
|
||||
|
||||
`zrok` v0.3 introduced a new `frontends` table to allow the `zrok` controller to track the frontend instances that are available to any account or environment.
|
||||
|
||||
The following illustration shows the possibilities available.
|
||||
|
||||

|
||||
|
||||
The `*.in.zrok.io` frontend is a "public" frontend, available to all `zrok` users. Most `zrok` installations will want to have at least one public, global frontend for all public, internet-facing ingress traffic for private backend instances. In the underlying data store, the public frontend will have a `name` set to `public` (or some other representative name), allowing users to reference that `frontend` using a friendly label.
|
||||
|
||||
The other two "private" frontends are configured with no `name` label (the lack of a `name` label signifies that these are "private" frontends). The ephemeral environment is allocated when a `zrok` frontend request is made without an account on behalf of a private share.
|
@ -0,0 +1,20 @@
|
||||
# Account Request Process
|
||||
|
||||
## In v0.1
|
||||
|
||||
The `v0.1` versions of `zrok` had an open-access `zrok create account` that allows any user to create an account. Useful for closed development environments only.
|
||||
|
||||
## In v0.2
|
||||
|
||||
* The `zrok create account` command now only takes an email address.
|
||||
* The email address is submitted to an open-ended API endpoint, which then records an "account request", allocating a request token.
|
||||
* An email is sent to the address offering a link with the request token, allowing the user to create the account.
|
||||
* The account request is marked complete.
|
||||
|
||||
### Invitations for Others
|
||||
|
||||
This open `zrok create account` command will allow any user to send a `zrok` invitation to any user with a valid email address.
|
||||
|
||||
### Garbage Collection
|
||||
|
||||
An background garbage collector in the controller scans the account requests, looking for unused requests, which are removed after a configurable amount of time.
|
694
website/versioned_docs/version-0.4/_attic/v0.4_limits.md
Normal file
@ -0,0 +1,694 @@
|
||||
# Testing the Limits
|
||||
|
||||
Consider the following `zrok controller` configuration stanza, describing the limits we'll be using for this testing scenario:
|
||||
|
||||
```yaml
|
||||
limits:
|
||||
environments: -1
|
||||
shares: -1
|
||||
bandwidth:
|
||||
per_account:
|
||||
period: 5m
|
||||
warning:
|
||||
rx: -1
|
||||
tx: -1
|
||||
total: -1
|
||||
limit:
|
||||
rx: -1
|
||||
tx: -1
|
||||
total: -1
|
||||
per_environment:
|
||||
period: 5m
|
||||
warning:
|
||||
rx: -1
|
||||
tx: -1
|
||||
total: -1
|
||||
limit:
|
||||
rx: -1
|
||||
tx: -1
|
||||
total: -1
|
||||
per_share:
|
||||
period: 5m
|
||||
warning:
|
||||
rx: -1
|
||||
tx: -1
|
||||
total: 1048576
|
||||
limit:
|
||||
rx: -1
|
||||
tx: -1
|
||||
total: 2097152
|
||||
enforcing: true
|
||||
cycle: 1m
|
||||
```
|
||||
|
||||
Any limit values set to `-1` are "unlimited". In this case, we're only enforcing a transfer limit on for shares. This limits configuration will send a warning when a share has transferred more than 1 megabyte in a 5 minute period, and will temporarily deactivate the share when it has transferred more than 2 megabytes in a 5 minute period.
|
||||
|
||||
We're going to use the `zrok test loop public` framework to create a number of `public` shares and generate traffic. Here are the parameters we'll be using:
|
||||
|
||||
```
|
||||
$ zrok test loop public -l 7 -i 10000 --min-pacing-ms 100 --max-pacing-ms 1500
|
||||
```
|
||||
|
||||
This configuration will create 7 shares. Each share will perform 10,000 iterations. The delay between iterations will be randomly generated with a floor of 100ms and a ceiling of 1500ms.
|
||||
|
||||
Let's look at the `zrok controller` log for this run:
|
||||
|
||||
First, our `zrok test loop public ` command will create the 7 shares:
|
||||
|
||||
```
|
||||
[ 2.047] INFO zrok/controller.(*shareHandler).Handle: added frontend selection 'public' with ziti identity 'rBayMvm7UI' for share '0evcupz5k410'
|
||||
[ 2.081] INFO zrok/controller.(*shareHandler).Handle: added frontend selection 'public' with ziti identity 'rBayMvm7UI' for share '8k6dnu7x7ag0'
|
||||
[ 2.082] INFO zrok/controller/zrokEdgeSdk.CreateConfig: created config '19cyxfHo32R6fhVsYHZ84g' for environment 'd.wJYlpt9'
|
||||
[ 2.083] INFO zrok/controller.(*shareHandler).Handle: added frontend selection 'public' with ziti identity 'rBayMvm7UI' for share '53z6mz4re7tu'
|
||||
[ 2.086] INFO zrok/controller/zrokEdgeSdk.CreateShareService: created share '0evcupz5k410' (with ziti id '3WHJGqUdxkDtPYLgEL5V3q') for environment 'd.wJYlpt9'
|
||||
[ 2.090] INFO zrok/controller.(*shareHandler).Handle: added frontend selection 'public' with ziti identity 'rBayMvm7UI' for share '7u9szn30ikh0'
|
||||
[ 2.090] INFO zrok/controller.(*shareHandler).Handle: added frontend selection 'public' with ziti identity 'rBayMvm7UI' for share 'dh3f3jj7zhig'
|
||||
[ 2.091] INFO zrok/controller.(*shareHandler).Handle: added frontend selection 'public' with ziti identity 'rBayMvm7UI' for share 'tr7vpyrzvmh0'
|
||||
[ 2.096] INFO zrok/controller/zrokEdgeSdk.CreateServicePolicyBind: created bind service policy '4V8FsgCt63ySkG2pFWG5fz' for service '3WHJGqUdxkDtPYLgEL5V3q' for identity 'd.wJYlpt9'
|
||||
[ 2.097] INFO zrok/controller/zrokEdgeSdk.CreateConfig: created config '5nG9jM8VNl0uBFcRRt3AvI' for environment 'd.wJYlpt9'
|
||||
[ 2.098] INFO zrok/controller/zrokEdgeSdk.CreateServicePolicyDial: created dial service policy '74f2gUotsC7DteqpsWrxp0' for service '3WHJGqUdxkDtPYLgEL5V3q' for identities '[rBayMvm7UI]'
|
||||
[ 2.099] INFO zrok/controller/zrokEdgeSdk.CreateShareService: created share '8k6dnu7x7ag0' (with ziti id '2J0I9dPe2JGnY1GwjmM6n7') for environment 'd.wJYlpt9'
|
||||
[ 2.100] INFO zrok/controller/zrokEdgeSdk.CreateShareServiceEdgeRouterPolicy: created service edge router policy '2AqCUMqNtarmglOfhvnkI' for service '3WHJGqUdxkDtPYLgEL5V3q' for environment 'd.wJYlpt9'
|
||||
[ 2.100] INFO zrok/controller/zrokEdgeSdk.CreateServicePolicyBind: created bind service policy '4vT5eEPahgWEVdAuKN91Sd' for service '2J0I9dPe2JGnY1GwjmM6n7' for identity 'd.wJYlpt9'
|
||||
[ 2.104] INFO zrok/controller/zrokEdgeSdk.CreateServicePolicyDial: created dial service policy '5UHCkXZabFHeWYHmF01Zoc' for service '2J0I9dPe2JGnY1GwjmM6n7' for identities '[rBayMvm7UI]'
|
||||
[ 2.106] INFO zrok/controller.(*shareHandler).Handle: recorded share '0evcupz5k410' with id '503' for 'michael@quigley.com'
|
||||
[ 2.106] INFO zrok/controller/zrokEdgeSdk.CreateConfig: created config '6U3XDGnBjtONN5H6pUze12' for environment 'd.wJYlpt9'
|
||||
[ 2.108] INFO zrok/controller/zrokEdgeSdk.CreateShareServiceEdgeRouterPolicy: created service edge router policy '2RIKOBMOckfbI2xMSLAKxC' for service '2J0I9dPe2JGnY1GwjmM6n7' for environment 'd.wJYlpt9'
|
||||
[ 2.109] INFO zrok/controller/zrokEdgeSdk.CreateShareService: created share '53z6mz4re7tu' (with ziti id '2NiotGOyBHBEbFZwbTFJ2u') for environment 'd.wJYlpt9'
|
||||
[ 2.109] INFO zrok/controller/zrokEdgeSdk.CreateConfig: created config '1FnBhnGNXDe58dwTpbFc1x' for environment 'd.wJYlpt9'
|
||||
[ 2.109] INFO zrok/controller.(*shareHandler).Handle: recorded share '8k6dnu7x7ag0' with id '504' for 'michael@quigley.com'
|
||||
[ 2.112] INFO zrok/controller/zrokEdgeSdk.CreateServicePolicyBind: created bind service policy 'RRfDaA5kjCqUBVC9LvN1H' for service '2NiotGOyBHBEbFZwbTFJ2u' for identity 'd.wJYlpt9'
|
||||
[ 2.112] INFO zrok/controller/zrokEdgeSdk.CreateConfig: created config '2gid15nP0GIUVuaFQ15GWV' for environment 'd.wJYlpt9'
|
||||
[ 2.115] INFO zrok/controller/zrokEdgeSdk.CreateShareService: created share '7u9szn30ikh0' (with ziti id '6FzYnK0RFJmT0rDSP1bzVE') for environment 'd.wJYlpt9'
|
||||
[ 2.115] INFO zrok/controller/zrokEdgeSdk.CreateServicePolicyDial: created dial service policy '1oo3LuBKxduKAs1wsKndtW' for service '2NiotGOyBHBEbFZwbTFJ2u' for identities '[rBayMvm7UI]'
|
||||
[ 2.117] INFO zrok/controller/zrokEdgeSdk.CreateServicePolicyBind: created bind service policy '1mabRt9jefSe52CJh6FmhB' for service '6FzYnK0RFJmT0rDSP1bzVE' for identity 'd.wJYlpt9'
|
||||
[ 2.117] INFO zrok/controller/zrokEdgeSdk.CreateShareServiceEdgeRouterPolicy: created service edge router policy '2CM03d1cNpG4rma38BLzCQ' for service '2NiotGOyBHBEbFZwbTFJ2u' for environment 'd.wJYlpt9'
|
||||
[ 2.118] INFO zrok/controller/zrokEdgeSdk.CreateServicePolicyDial: created dial service policy '3dBtc3v2G70aqqDSqujQOy' for service '6FzYnK0RFJmT0rDSP1bzVE' for identities '[rBayMvm7UI]'
|
||||
[ 2.119] INFO zrok/controller.(*shareHandler).Handle: recorded share '53z6mz4re7tu' with id '505' for 'michael@quigley.com'
|
||||
[ 2.121] INFO zrok/controller/zrokEdgeSdk.CreateShareServiceEdgeRouterPolicy: created service edge router policy '3xAG26zA9yska3LeZQUJ3N' for service '6FzYnK0RFJmT0rDSP1bzVE' for environment 'd.wJYlpt9'
|
||||
[ 2.122] INFO zrok/controller.(*shareHandler).Handle: added frontend selection 'public' with ziti identity 'rBayMvm7UI' for share 's0uzz1p7xjrr'
|
||||
[ 2.124] INFO zrok/controller.(*shareHandler).Handle: recorded share '7u9szn30ikh0' with id '506' for 'michael@quigley.com'
|
||||
[ 2.128] INFO zrok/controller/zrokEdgeSdk.CreateShareService: created share 'tr7vpyrzvmh0' (with ziti id '7jyiTZ0z2ediD5hZbxu7KH') for environment 'd.wJYlpt9'
|
||||
[ 2.130] INFO zrok/controller/zrokEdgeSdk.CreateServicePolicyBind: created bind service policy '6RwWEoIsb8gBVKJfZP3ur3' for service '7jyiTZ0z2ediD5hZbxu7KH' for identity 'd.wJYlpt9'
|
||||
[ 2.131] INFO zrok/controller/zrokEdgeSdk.CreateConfig: created config '76iBDASRcxOmGtdwjVHo26' for environment 'd.wJYlpt9'
|
||||
[ 2.132] INFO zrok/controller/zrokEdgeSdk.CreateServicePolicyDial: created dial service policy '1cURGP202D8n6fzpzWhcgK' for service '7jyiTZ0z2ediD5hZbxu7KH' for identities '[rBayMvm7UI]'
|
||||
[ 2.138] INFO zrok/controller/zrokEdgeSdk.CreateShareService: created share 'dh3f3jj7zhig' (with ziti id 'nyKOLlxUWWbCzD7h9Jhjq') for environment 'd.wJYlpt9'
|
||||
[ 2.139] INFO zrok/controller/zrokEdgeSdk.CreateShareServiceEdgeRouterPolicy: created service edge router policy '2nMZaiChQAPpFnblNn1ljP' for service '7jyiTZ0z2ediD5hZbxu7KH' for environment 'd.wJYlpt9'
|
||||
[ 2.142] INFO zrok/controller.(*shareHandler).Handle: recorded share 'tr7vpyrzvmh0' with id '507' for 'michael@quigley.com'
|
||||
[ 2.143] INFO zrok/controller/zrokEdgeSdk.CreateServicePolicyBind: created bind service policy '1xF4ky6cDJm63tzlNTqoLC' for service 'nyKOLlxUWWbCzD7h9Jhjq' for identity 'd.wJYlpt9'
|
||||
[ 2.143] INFO zrok/controller/zrokEdgeSdk.CreateConfig: created config '4AN4sOtdQv99uHmFn3erx4' for environment 'd.wJYlpt9'
|
||||
[ 2.145] INFO zrok/controller/zrokEdgeSdk.CreateServicePolicyDial: created dial service policy '7GerqbN5lVfcOng91J2J6I' for service 'nyKOLlxUWWbCzD7h9Jhjq' for identities '[rBayMvm7UI]'
|
||||
[ 2.145] INFO zrok/controller/zrokEdgeSdk.CreateShareService: created share 's0uzz1p7xjrr' (with ziti id 'KtK5E46HR93YIBrrwUlIN') for environment 'd.wJYlpt9'
|
||||
[ 2.147] INFO zrok/controller/zrokEdgeSdk.CreateShareServiceEdgeRouterPolicy: created service edge router policy '2ZnnIXSTQ3Zscha1kykqQr' for service 'nyKOLlxUWWbCzD7h9Jhjq' for environment 'd.wJYlpt9'
|
||||
[ 2.149] INFO zrok/controller.(*shareHandler).Handle: recorded share 'dh3f3jj7zhig' with id '508' for 'michael@quigley.com'
|
||||
[ 2.155] INFO zrok/controller/zrokEdgeSdk.CreateServicePolicyBind: created bind service policy '6oohOQFEo75yl9vnIbyzdj' for service 'KtK5E46HR93YIBrrwUlIN' for identity 'd.wJYlpt9'
|
||||
[ 2.156] INFO zrok/controller/zrokEdgeSdk.CreateServicePolicyDial: created dial service policy '7eB3ubrntSHxkeHBCGJcOY' for service 'KtK5E46HR93YIBrrwUlIN' for identities '[rBayMvm7UI]'
|
||||
[ 2.157] INFO zrok/controller/zrokEdgeSdk.CreateShareServiceEdgeRouterPolicy: created service edge router policy '2CGCz8dcquNvZC0ZUwDZ5F' for service 'KtK5E46HR93YIBrrwUlIN' for environment 'd.wJYlpt9'
|
||||
[ 2.159] INFO zrok/controller.(*shareHandler).Handle: recorded share 's0uzz1p7xjrr' with id '509' for 'michael@quigley.com'
|
||||
```
|
||||
|
||||
Next, we observe metrics being reported from OpenZiti into the `zrok` metrics infrastructure for each of the 7 shares:
|
||||
|
||||
```
|
||||
[ 10.183] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: ONzzjVS0w backend {rx: 32.4 kB, tx: 32.6 kB} frontend {rx: 32.6 kB, tx: 32.4 kB}
|
||||
[ 10.192] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: MZXXjVi0w backend {rx: 22.5 kB, tx: 22.8 kB} frontend {rx: 22.8 kB, tx: 22.5 kB}
|
||||
[ 10.196] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: SNXXjViuwU backend {rx: 15.1 kB, tx: 15.3 kB} frontend {rx: 15.3 kB, tx: 15.1 kB}
|
||||
[ 15.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: ONzzjVS0w backend {rx: 53.0 kB, tx: 53.4 kB} frontend {rx: 53.4 kB, tx: 53.0 kB}
|
||||
[ 15.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: cNzzH4i0w backend {rx: 50.3 kB, tx: 50.6 kB} frontend {rx: 50.6 kB, tx: 50.3 kB}
|
||||
[ 15.170] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: fNXXHVSuw backend {rx: 46.2 kB, tx: 46.6 kB} frontend {rx: 46.6 kB, tx: 46.2 kB}
|
||||
[ 15.172] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: MZXXjVi0w backend {rx: 26.4 kB, tx: 26.8 kB} frontend {rx: 26.8 kB, tx: 26.4 kB}
|
||||
[ 20.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: fNXXHVSuw backend {rx: 26.9 kB, tx: 27.1 kB} frontend {rx: 27.1 kB, tx: 26.9 kB}
|
||||
[ 20.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: MZXXjVi0w backend {rx: 26.0 kB, tx: 26.2 kB} frontend {rx: 26.2 kB, tx: 26.0 kB}
|
||||
[ 20.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: RZzXHVSuw backend {rx: 67.1 kB, tx: 67.6 kB} frontend {rx: 67.6 kB, tx: 67.1 kB}
|
||||
[ 25.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: fNXXHVSuw backend {rx: 38.1 kB, tx: 38.4 kB} frontend {rx: 38.4 kB, tx: 38.1 kB}
|
||||
[ 25.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: iNzXj4S0r backend {rx: 26.3 kB, tx: 26.7 kB} frontend {rx: 26.7 kB, tx: 26.3 kB}
|
||||
[ 25.169] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: MZXXjVi0w backend {rx: 18.2 kB, tx: 18.4 kB} frontend {rx: 18.4 kB, tx: 18.2 kB}
|
||||
[ 25.171] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: ONzzjVS0w backend {rx: 22.6 kB, tx: 23.0 kB} frontend {rx: 23.0 kB, tx: 22.6 kB}
|
||||
[ 30.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: ONzzjVS0w backend {rx: 45.1 kB, tx: 45.4 kB} frontend {rx: 45.4 kB, tx: 45.1 kB}
|
||||
[ 30.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: cNzzH4i0w backend {rx: 44.0 kB, tx: 44.3 kB} frontend {rx: 44.3 kB, tx: 44.0 kB}
|
||||
[ 30.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: fNXXHVSuw backend {rx: 65.1 kB, tx: 65.5 kB} frontend {rx: 65.5 kB, tx: 65.1 kB}
|
||||
[ 35.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: cNzzH4i0w backend {rx: 35.9 kB, tx: 36.1 kB} frontend {rx: 36.1 kB, tx: 35.9 kB}
|
||||
[ 35.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: SNXXjViuwU backend {rx: 36.4 kB, tx: 36.9 kB} frontend {rx: 36.9 kB, tx: 36.4 kB}
|
||||
[ 35.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: RZzXHVSuw backend {rx: 28.9 kB, tx: 29.3 kB} frontend {rx: 29.3 kB, tx: 28.9 kB}
|
||||
[ 35.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: fNXXHVSuw backend {rx: 40.9 kB, tx: 41.2 kB} frontend {rx: 41.2 kB, tx: 40.9 kB}
|
||||
[ 40.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: MZXXjVi0w backend {rx: 31.0 kB, tx: 31.3 kB} frontend {rx: 31.3 kB, tx: 31.0 kB}
|
||||
[ 40.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: iNzXj4S0r backend {rx: 28.5 kB, tx: 28.8 kB} frontend {rx: 28.8 kB, tx: 28.5 kB}
|
||||
[ 40.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: fNXXHVSuw backend {rx: 40.4 kB, tx: 40.8 kB} frontend {rx: 40.8 kB, tx: 40.4 kB}
|
||||
[ 45.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: cNzzH4i0w backend {rx: 60.1 kB, tx: 60.4 kB} frontend {rx: 60.4 kB, tx: 60.1 kB}
|
||||
[ 45.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: SNXXjViuwU backend {rx: 64.8 kB, tx: 65.2 kB} frontend {rx: 65.2 kB, tx: 64.8 kB}
|
||||
[ 45.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: iNzXj4S0r backend {rx: 39.2 kB, tx: 39.5 kB} frontend {rx: 39.5 kB, tx: 39.2 kB}
|
||||
[ 45.170] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: fNXXHVSuw backend {rx: 23.9 kB, tx: 24.1 kB} frontend {rx: 24.1 kB, tx: 23.9 kB}
|
||||
[ 50.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: ONzzjVS0w backend {rx: 23.0 kB, tx: 23.2 kB} frontend {rx: 23.2 kB, tx: 23.0 kB}
|
||||
[ 50.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: MZXXjVi0w backend {rx: 41.4 kB, tx: 41.8 kB} frontend {rx: 41.8 kB, tx: 41.4 kB}
|
||||
[ 50.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: SNXXjViuwU backend {rx: 50.8 kB, tx: 51.2 kB} frontend {rx: 51.2 kB, tx: 50.8 kB}
|
||||
[ 55.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: ONzzjVS0w backend {rx: 29.2 kB, tx: 29.5 kB} frontend {rx: 29.5 kB, tx: 29.2 kB}
|
||||
[ 55.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: cNzzH4i0w backend {rx: 27.8 kB, tx: 28.0 kB} frontend {rx: 28.0 kB, tx: 27.8 kB}
|
||||
[ 55.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: fNXXHVSuw backend {rx: 21.7 kB, tx: 21.9 kB} frontend {rx: 21.9 kB, tx: 21.7 kB}
|
||||
[ 55.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: MZXXjVi0w backend {rx: 30.0 kB, tx: 30.3 kB} frontend {rx: 30.3 kB, tx: 30.0 kB}
|
||||
[ 60.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: MZXXjVi0w backend {rx: 43.4 kB, tx: 43.7 kB} frontend {rx: 43.7 kB, tx: 43.4 kB}
|
||||
[ 60.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: SNXXjViuwU backend {rx: 44.7 kB, tx: 44.9 kB} frontend {rx: 44.9 kB, tx: 44.7 kB}
|
||||
[ 60.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: fNXXHVSuw backend {rx: 30.6 kB, tx: 30.8 kB} frontend {rx: 30.8 kB, tx: 30.6 kB}
|
||||
[ 65.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: RZzXHVSuw backend {rx: 41.9 kB, tx: 42.2 kB} frontend {rx: 42.2 kB, tx: 41.9 kB}
|
||||
[ 65.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: ONzzjVS0w backend {rx: 38.1 kB, tx: 38.4 kB} frontend {rx: 38.4 kB, tx: 38.1 kB}
|
||||
[ 65.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: cNzzH4i0w backend {rx: 42.8 kB, tx: 43.3 kB} frontend {rx: 43.3 kB, tx: 42.8 kB}
|
||||
[ 65.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: MZXXjVi0w backend {rx: 28.9 kB, tx: 29.2 kB} frontend {rx: 29.2 kB, tx: 28.9 kB}
|
||||
[ 70.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: cNzzH4i0w backend {rx: 43.6 kB, tx: 43.9 kB} frontend {rx: 43.9 kB, tx: 43.6 kB}
|
||||
[ 70.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: MZXXjVi0w backend {rx: 30.3 kB, tx: 30.7 kB} frontend {rx: 30.7 kB, tx: 30.3 kB}
|
||||
[ 70.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: SNXXjViuwU backend {rx: 58.9 kB, tx: 59.5 kB} frontend {rx: 59.5 kB, tx: 58.9 kB}
|
||||
[ 75.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: RZzXHVSuw backend {rx: 32.5 kB, tx: 32.7 kB} frontend {rx: 32.7 kB, tx: 32.5 kB}
|
||||
[ 75.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: SNXXjViuwU backend {rx: 31.7 kB, tx: 32.2 kB} frontend {rx: 32.2 kB, tx: 31.7 kB}
|
||||
[ 75.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: MZXXjVi0w backend {rx: 42.2 kB, tx: 42.6 kB} frontend {rx: 42.6 kB, tx: 42.2 kB}
|
||||
[ 75.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: ONzzjVS0w backend {rx: 61.7 kB, tx: 62.0 kB} frontend {rx: 62.0 kB, tx: 61.7 kB}
|
||||
[ 80.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: fNXXHVSuw backend {rx: 48.3 kB, tx: 48.7 kB} frontend {rx: 48.7 kB, tx: 48.3 kB}
|
||||
[ 80.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: RZzXHVSuw backend {rx: 54.5 kB, tx: 55.2 kB} frontend {rx: 55.2 kB, tx: 54.5 kB}
|
||||
[ 80.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: MZXXjVi0w backend {rx: 21.3 kB, tx: 21.5 kB} frontend {rx: 21.5 kB, tx: 21.3 kB}
|
||||
[ 85.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: ONzzjVS0w backend {rx: 47.7 kB, tx: 48.1 kB} frontend {rx: 48.1 kB, tx: 47.7 kB}
|
||||
[ 85.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: fNXXHVSuw backend {rx: 27.0 kB, tx: 27.4 kB} frontend {rx: 27.4 kB, tx: 27.0 kB}
|
||||
[ 85.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: RZzXHVSuw backend {rx: 72.9 kB, tx: 73.4 kB} frontend {rx: 73.4 kB, tx: 72.9 kB}
|
||||
[ 85.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: MZXXjVi0w backend {rx: 78.6 kB, tx: 79.1 kB} frontend {rx: 79.1 kB, tx: 78.6 kB}
|
||||
[ 90.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: fNXXHVSuw backend {rx: 58.7 kB, tx: 59.1 kB} frontend {rx: 59.1 kB, tx: 58.7 kB}
|
||||
[ 90.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: SNXXjViuwU backend {rx: 48.9 kB, tx: 49.3 kB} frontend {rx: 49.3 kB, tx: 48.9 kB}
|
||||
[ 90.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: MZXXjVi0w backend {rx: 63.4 kB, tx: 63.7 kB} frontend {rx: 63.7 kB, tx: 63.4 kB}
|
||||
[ 95.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: cNzzH4i0w backend {rx: 59.0 kB, tx: 59.4 kB} frontend {rx: 59.4 kB, tx: 59.0 kB}
|
||||
[ 95.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: ONzzjVS0w backend {rx: 65.9 kB, tx: 66.2 kB} frontend {rx: 66.2 kB, tx: 65.9 kB}
|
||||
[ 95.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: RZzXHVSuw backend {rx: 48.9 kB, tx: 49.3 kB} frontend {rx: 49.3 kB, tx: 48.9 kB}
|
||||
[ 95.169] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: iNzXj4S0r backend {rx: 27.5 kB, tx: 27.8 kB} frontend {rx: 27.8 kB, tx: 27.5 kB}
|
||||
[ 100.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: RZzXHVSuw backend {rx: 56.3 kB, tx: 56.8 kB} frontend {rx: 56.8 kB, tx: 56.3 kB}
|
||||
[ 100.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: ONzzjVS0w backend {rx: 25.8 kB, tx: 26.2 kB} frontend {rx: 26.2 kB, tx: 25.8 kB}
|
||||
[ 100.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: iNzXj4S0r backend {rx: 33.9 kB, tx: 34.2 kB} frontend {rx: 34.2 kB, tx: 33.9 kB}
|
||||
[ 105.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: ONzzjVS0w backend {rx: 30.7 kB, tx: 31.0 kB} frontend {rx: 31.0 kB, tx: 30.7 kB}
|
||||
[ 105.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: MZXXjVi0w backend {rx: 64.6 kB, tx: 64.9 kB} frontend {rx: 64.9 kB, tx: 64.6 kB}
|
||||
[ 105.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: cNzzH4i0w backend {rx: 49.0 kB, tx: 49.3 kB} frontend {rx: 49.3 kB, tx: 49.0 kB}
|
||||
[ 105.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: RZzXHVSuw backend {rx: 36.2 kB, tx: 36.6 kB} frontend {rx: 36.6 kB, tx: 36.2 kB}
|
||||
```
|
||||
|
||||
Our first share receives a bandwidth warning, after transferring more than 1 megabyte:
|
||||
|
||||
```
|
||||
[ 105.189] INFO zrok/controller/limits.(*shareWarningAction).HandleShare: warning 'tr7vpyrzvmh0'
|
||||
[ 106.192] INFO zrok/controller/limits.sendLimitWarningEmail: limit warning email sent to 'michael@quigley.com'
|
||||
[ 110.162] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: ONzzjVS0w backend {rx: 30.6 kB, tx: 30.9 kB} frontend {rx: 30.9 kB, tx: 30.6 kB}
|
||||
[ 110.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: fNXXHVSuw backend {rx: 42.9 kB, tx: 43.3 kB} frontend {rx: 43.3 kB, tx: 42.9 kB}
|
||||
[ 110.170] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: cNzzH4i0w backend {rx: 31.5 kB, tx: 31.7 kB} frontend {rx: 31.7 kB, tx: 31.5 kB}
|
||||
[ 115.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: iNzXj4S0r backend {rx: 45.3 kB, tx: 45.7 kB} frontend {rx: 45.7 kB, tx: 45.3 kB}
|
||||
[ 115.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: MZXXjVi0w backend {rx: 36.4 kB, tx: 36.8 kB} frontend {rx: 36.8 kB, tx: 36.4 kB}
|
||||
[ 115.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: RZzXHVSuw backend {rx: 46.5 kB, tx: 46.9 kB} frontend {rx: 46.9 kB, tx: 46.5 kB}
|
||||
[ 115.170] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: fNXXHVSuw backend {rx: 63.9 kB, tx: 64.4 kB} frontend {rx: 64.4 kB, tx: 63.9 kB}
|
||||
```
|
||||
|
||||
More shares start receiving bandwidth warnings:
|
||||
|
||||
```
|
||||
[ 115.230] INFO zrok/controller/limits.(*shareWarningAction).HandleShare: warning 'dh3f3jj7zhig'
|
||||
[ 116.575] INFO zrok/controller/limits.sendLimitWarningEmail: limit warning email sent to 'michael@quigley.com'
|
||||
[ 120.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: ONzzjVS0w backend {rx: 58.4 kB, tx: 58.8 kB} frontend {rx: 58.8 kB, tx: 58.4 kB}
|
||||
[ 120.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: RZzXHVSuw backend {rx: 30.5 kB, tx: 30.8 kB} frontend {rx: 30.8 kB, tx: 30.5 kB}
|
||||
[ 120.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: SNXXjViuwU backend {rx: 29.9 kB, tx: 30.2 kB} frontend {rx: 30.2 kB, tx: 29.9 kB}
|
||||
[ 120.180] INFO zrok/controller/limits.(*shareWarningAction).HandleShare: warning '53z6mz4re7tu'
|
||||
[ 122.733] INFO zrok/controller/limits.sendLimitWarningEmail: limit warning email sent to 'michael@quigley.com'
|
||||
[ 125.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: MZXXjVi0w backend {rx: 47.0 kB, tx: 47.3 kB} frontend {rx: 47.3 kB, tx: 47.0 kB}
|
||||
[ 125.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: cNzzH4i0w backend {rx: 55.5 kB, tx: 56.0 kB} frontend {rx: 56.0 kB, tx: 55.5 kB}
|
||||
[ 125.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: RZzXHVSuw backend {rx: 49.6 kB, tx: 49.9 kB} frontend {rx: 49.9 kB, tx: 49.6 kB}
|
||||
[ 125.170] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: fNXXHVSuw backend {rx: 17.6 kB, tx: 17.8 kB} frontend {rx: 17.8 kB, tx: 17.6 kB}
|
||||
[ 125.211] INFO zrok/controller/limits.(*shareWarningAction).HandleShare: warning 's0uzz1p7xjrr'
|
||||
[ 126.117] INFO zrok/controller/limits.sendLimitWarningEmail: limit warning email sent to 'michael@quigley.com'
|
||||
[ 130.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: cNzzH4i0w backend {rx: 38.8 kB, tx: 39.0 kB} frontend {rx: 39.0 kB, tx: 38.8 kB}
|
||||
[ 130.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: SNXXjViuwU backend {rx: 76.6 kB, tx: 76.9 kB} frontend {rx: 76.9 kB, tx: 76.6 kB}
|
||||
[ 130.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: RZzXHVSuw backend {rx: 50.1 kB, tx: 50.5 kB} frontend {rx: 50.5 kB, tx: 50.1 kB}
|
||||
[ 130.178] INFO zrok/controller/limits.(*shareWarningAction).HandleShare: warning '0evcupz5k410'
|
||||
[ 130.921] INFO zrok/controller/limits.sendLimitWarningEmail: limit warning email sent to 'michael@quigley.com'
|
||||
[ 135.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: ONzzjVS0w backend {rx: 32.8 kB, tx: 33.2 kB} frontend {rx: 33.2 kB, tx: 32.8 kB}
|
||||
[ 135.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: iNzXj4S0r backend {rx: 34.7 kB, tx: 35.0 kB} frontend {rx: 35.0 kB, tx: 34.7 kB}
|
||||
[ 135.169] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: MZXXjVi0w backend {rx: 38.9 kB, tx: 39.2 kB} frontend {rx: 39.2 kB, tx: 38.9 kB}
|
||||
[ 135.170] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: cNzzH4i0w backend {rx: 51.4 kB, tx: 51.8 kB} frontend {rx: 51.8 kB, tx: 51.4 kB}
|
||||
[ 140.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: iNzXj4S0r backend {rx: 52.8 kB, tx: 53.2 kB} frontend {rx: 53.2 kB, tx: 52.8 kB}
|
||||
[ 140.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: MZXXjVi0w backend {rx: 33.1 kB, tx: 33.4 kB} frontend {rx: 33.4 kB, tx: 33.1 kB}
|
||||
[ 140.169] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: fNXXHVSuw backend {rx: 35.6 kB, tx: 36.0 kB} frontend {rx: 36.0 kB, tx: 35.6 kB}
|
||||
[ 145.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: iNzXj4S0r backend {rx: 27.5 kB, tx: 27.8 kB} frontend {rx: 27.8 kB, tx: 27.5 kB}
|
||||
[ 145.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: ONzzjVS0w backend {rx: 24.6 kB, tx: 25.1 kB} frontend {rx: 25.1 kB, tx: 24.6 kB}
|
||||
[ 145.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: cNzzH4i0w backend {rx: 30.1 kB, tx: 30.5 kB} frontend {rx: 30.5 kB, tx: 30.1 kB}
|
||||
[ 145.169] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: RZzXHVSuw backend {rx: 24.7 kB, tx: 25.1 kB} frontend {rx: 25.1 kB, tx: 24.7 kB}
|
||||
[ 150.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: MZXXjVi0w backend {rx: 72.0 kB, tx: 72.4 kB} frontend {rx: 72.4 kB, tx: 72.0 kB}
|
||||
[ 150.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: RZzXHVSuw backend {rx: 31.8 kB, tx: 32.1 kB} frontend {rx: 32.1 kB, tx: 31.8 kB}
|
||||
[ 150.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: iNzXj4S0r backend {rx: 43.7 kB, tx: 43.9 kB} frontend {rx: 43.9 kB, tx: 43.7 kB}
|
||||
[ 155.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: fNXXHVSuw backend {rx: 49.4 kB, tx: 49.8 kB} frontend {rx: 49.8 kB, tx: 49.4 kB}
|
||||
[ 155.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: ONzzjVS0w backend {rx: 46.4 kB, tx: 46.6 kB} frontend {rx: 46.6 kB, tx: 46.4 kB}
|
||||
[ 155.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: iNzXj4S0r backend {rx: 50.7 kB, tx: 51.0 kB} frontend {rx: 51.0 kB, tx: 50.7 kB}
|
||||
[ 155.169] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: RZzXHVSuw backend {rx: 58.5 kB, tx: 58.9 kB} frontend {rx: 58.9 kB, tx: 58.5 kB}
|
||||
[ 160.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: cNzzH4i0w backend {rx: 43.0 kB, tx: 43.3 kB} frontend {rx: 43.3 kB, tx: 43.0 kB}
|
||||
[ 160.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: ONzzjVS0w backend {rx: 66.0 kB, tx: 66.4 kB} frontend {rx: 66.4 kB, tx: 66.0 kB}
|
||||
[ 160.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: SNXXjViuwU backend {rx: 31.5 kB, tx: 31.9 kB} frontend {rx: 31.9 kB, tx: 31.5 kB}
|
||||
[ 165.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: RZzXHVSuw backend {rx: 60.0 kB, tx: 60.3 kB} frontend {rx: 60.3 kB, tx: 60.0 kB}
|
||||
[ 165.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: fNXXHVSuw backend {rx: 47.3 kB, tx: 47.6 kB} frontend {rx: 47.6 kB, tx: 47.3 kB}
|
||||
[ 165.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: SNXXjViuwU backend {rx: 41.1 kB, tx: 41.3 kB} frontend {rx: 41.3 kB, tx: 41.1 kB}
|
||||
[ 165.170] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: iNzXj4S0r backend {rx: 37.2 kB, tx: 37.5 kB} frontend {rx: 37.5 kB, tx: 37.2 kB}
|
||||
[ 165.216] INFO zrok/controller/limits.(*shareWarningAction).HandleShare: warning '8k6dnu7x7ag0'
|
||||
[ 165.930] INFO zrok/controller/limits.sendLimitWarningEmail: limit warning email sent to 'michael@quigley.com'
|
||||
[ 170.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: cNzzH4i0w backend {rx: 43.1 kB, tx: 43.5 kB} frontend {rx: 43.5 kB, tx: 43.1 kB}
|
||||
[ 170.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: ONzzjVS0w backend {rx: 45.4 kB, tx: 45.8 kB} frontend {rx: 45.8 kB, tx: 45.4 kB}
|
||||
[ 170.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: RZzXHVSuw backend {rx: 58.0 kB, tx: 58.3 kB} frontend {rx: 58.3 kB, tx: 58.0 kB}
|
||||
[ 175.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: MZXXjVi0w backend {rx: 63.5 kB, tx: 63.9 kB} frontend {rx: 63.9 kB, tx: 63.5 kB}
|
||||
[ 175.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: RZzXHVSuw backend {rx: 45.0 kB, tx: 45.3 kB} frontend {rx: 45.3 kB, tx: 45.0 kB}
|
||||
[ 175.169] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: cNzzH4i0w backend {rx: 35.0 kB, tx: 35.2 kB} frontend {rx: 35.2 kB, tx: 35.0 kB}
|
||||
[ 175.171] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: fNXXHVSuw backend {rx: 22.8 kB, tx: 23.2 kB} frontend {rx: 23.2 kB, tx: 22.8 kB}
|
||||
[ 180.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: SNXXjViuwU backend {rx: 42.3 kB, tx: 42.6 kB} frontend {rx: 42.6 kB, tx: 42.3 kB}
|
||||
[ 180.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: iNzXj4S0r backend {rx: 39.6 kB, tx: 40.1 kB} frontend {rx: 40.1 kB, tx: 39.6 kB}
|
||||
[ 180.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: cNzzH4i0w backend {rx: 53.1 kB, tx: 53.4 kB} frontend {rx: 53.4 kB, tx: 53.1 kB}
|
||||
[ 185.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: MZXXjVi0w backend {rx: 74.1 kB, tx: 74.6 kB} frontend {rx: 74.6 kB, tx: 74.1 kB}
|
||||
[ 185.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: fNXXHVSuw backend {rx: 71.0 kB, tx: 71.4 kB} frontend {rx: 71.4 kB, tx: 71.0 kB}
|
||||
[ 185.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: iNzXj4S0r backend {rx: 78.8 kB, tx: 79.2 kB} frontend {rx: 79.2 kB, tx: 78.8 kB}
|
||||
[ 185.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: RZzXHVSuw backend {rx: 37.8 kB, tx: 38.2 kB} frontend {rx: 38.2 kB, tx: 37.8 kB}
|
||||
[ 185.213] INFO zrok/controller/limits.(*shareWarningAction).HandleShare: warning '7u9szn30ikh0'
|
||||
[ 186.862] INFO zrok/controller/limits.sendLimitWarningEmail: limit warning email sent to 'michael@quigley.com'
|
||||
[ 190.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: ONzzjVS0w backend {rx: 43.3 kB, tx: 43.8 kB} frontend {rx: 43.8 kB, tx: 43.3 kB}
|
||||
[ 190.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: cNzzH4i0w backend {rx: 39.6 kB, tx: 39.9 kB} frontend {rx: 39.9 kB, tx: 39.6 kB}
|
||||
[ 190.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: MZXXjVi0w backend {rx: 38.6 kB, tx: 38.9 kB} frontend {rx: 38.9 kB, tx: 38.6 kB}
|
||||
[ 195.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: ONzzjVS0w backend {rx: 44.0 kB, tx: 44.4 kB} frontend {rx: 44.4 kB, tx: 44.0 kB}
|
||||
[ 195.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: iNzXj4S0r backend {rx: 45.2 kB, tx: 45.5 kB} frontend {rx: 45.5 kB, tx: 45.2 kB}
|
||||
[ 195.170] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: SNXXjViuwU backend {rx: 67.1 kB, tx: 67.5 kB} frontend {rx: 67.5 kB, tx: 67.1 kB}
|
||||
[ 195.172] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: fNXXHVSuw backend {rx: 44.4 kB, tx: 44.8 kB} frontend {rx: 44.8 kB, tx: 44.4 kB}
|
||||
[ 200.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: SNXXjViuwU backend {rx: 23.7 kB, tx: 23.9 kB} frontend {rx: 23.9 kB, tx: 23.7 kB}
|
||||
[ 200.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: fNXXHVSuw backend {rx: 46.7 kB, tx: 47.1 kB} frontend {rx: 47.1 kB, tx: 46.7 kB}
|
||||
[ 200.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: iNzXj4S0r backend {rx: 48.7 kB, tx: 49.1 kB} frontend {rx: 49.1 kB, tx: 48.7 kB}
|
||||
[ 205.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: MZXXjVi0w backend {rx: 47.8 kB, tx: 48.1 kB} frontend {rx: 48.1 kB, tx: 47.8 kB}
|
||||
[ 205.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: cNzzH4i0w backend {rx: 57.2 kB, tx: 57.6 kB} frontend {rx: 57.6 kB, tx: 57.2 kB}
|
||||
[ 205.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: fNXXHVSuw backend {rx: 47.7 kB, tx: 47.9 kB} frontend {rx: 47.9 kB, tx: 47.7 kB}
|
||||
[ 205.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: SNXXjViuwU backend {rx: 38.9 kB, tx: 39.3 kB} frontend {rx: 39.3 kB, tx: 38.9 kB}
|
||||
[ 210.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: fNXXHVSuw backend {rx: 37.5 kB, tx: 37.8 kB} frontend {rx: 37.8 kB, tx: 37.5 kB}
|
||||
[ 210.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: SNXXjViuwU backend {rx: 15.3 kB, tx: 15.5 kB} frontend {rx: 15.5 kB, tx: 15.3 kB}
|
||||
[ 210.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: RZzXHVSuw backend {rx: 41.3 kB, tx: 41.5 kB} frontend {rx: 41.5 kB, tx: 41.3 kB}
|
||||
[ 215.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: fNXXHVSuw backend {rx: 28.0 kB, tx: 28.4 kB} frontend {rx: 28.4 kB, tx: 28.0 kB}
|
||||
[ 215.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: iNzXj4S0r backend {rx: 42.5 kB, tx: 42.8 kB} frontend {rx: 42.8 kB, tx: 42.5 kB}
|
||||
[ 215.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: SNXXjViuwU backend {rx: 47.6 kB, tx: 48.0 kB} frontend {rx: 48.0 kB, tx: 47.6 kB}
|
||||
[ 215.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: ONzzjVS0w backend {rx: 43.4 kB, tx: 43.8 kB} frontend {rx: 43.8 kB, tx: 43.4 kB}
|
||||
[ 220.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: MZXXjVi0w backend {rx: 19.4 kB, tx: 19.7 kB} frontend {rx: 19.7 kB, tx: 19.4 kB}
|
||||
[ 220.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: fNXXHVSuw backend {rx: 37.1 kB, tx: 37.4 kB} frontend {rx: 37.4 kB, tx: 37.1 kB}
|
||||
[ 220.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: RZzXHVSuw backend {rx: 69.1 kB, tx: 69.5 kB} frontend {rx: 69.5 kB, tx: 69.1 kB}
|
||||
```
|
||||
|
||||
Our first share crosses the 2 megabyte boundary and the system limits its ability to transfer additional data by removing its dial service policy:
|
||||
|
||||
```
|
||||
[ 220.195] INFO zrok/controller/limits.(*shareLimitAction).HandleShare: limiting 'dh3f3jj7zhig'
|
||||
[ 220.211] INFO zrok/controller/zrokEdgeSdk.DeleteServicePolicy: deleted service policy '7GerqbN5lVfcOng91J2J6I' for environment 'd.wJYlpt9'
|
||||
[ 220.211] INFO zrok/controller/limits.(*shareLimitAction).HandleShare: removed dial service policy for 'dh3f3jj7zhig'
|
||||
[ 225.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: cNzzH4i0w backend {rx: 45.1 kB, tx: 45.5 kB} frontend {rx: 45.5 kB, tx: 45.1 kB}
|
||||
[ 225.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: iNzXj4S0r backend {rx: 26.9 kB, tx: 27.3 kB} frontend {rx: 27.3 kB, tx: 26.9 kB}
|
||||
[ 225.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: fNXXHVSuw backend {rx: 40.9 kB, tx: 41.0 kB} frontend {rx: 41.0 kB, tx: 40.9 kB}
|
||||
[ 225.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: SNXXjViuwU backend {rx: 28.8 kB, tx: 29.1 kB} frontend {rx: 29.1 kB, tx: 28.8 kB}
|
||||
[ 230.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: cNzzH4i0w backend {rx: 55.4 kB, tx: 55.8 kB} frontend {rx: 55.8 kB, tx: 55.4 kB}
|
||||
[ 230.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: iNzXj4S0r backend {rx: 44.8 kB, tx: 45.2 kB} frontend {rx: 45.2 kB, tx: 44.8 kB}
|
||||
[ 230.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: ONzzjVS0w backend {rx: 52.2 kB, tx: 52.5 kB} frontend {rx: 52.5 kB, tx: 52.2 kB}
|
||||
[ 235.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: SNXXjViuwU backend {rx: 53.2 kB, tx: 53.6 kB} frontend {rx: 53.6 kB, tx: 53.2 kB}
|
||||
[ 235.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: cNzzH4i0w backend {rx: 43.1 kB, tx: 43.4 kB} frontend {rx: 43.4 kB, tx: 43.1 kB}
|
||||
[ 235.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: ONzzjVS0w backend {rx: 45.9 kB, tx: 46.2 kB} frontend {rx: 46.2 kB, tx: 45.9 kB}
|
||||
[ 240.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: SNXXjViuwU backend {rx: 50.6 kB, tx: 51.0 kB} frontend {rx: 51.0 kB, tx: 50.6 kB}
|
||||
[ 240.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: cNzzH4i0w backend {rx: 49.7 kB, tx: 50.0 kB} frontend {rx: 50.0 kB, tx: 49.7 kB}
|
||||
[ 240.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: iNzXj4S0r backend {rx: 37.3 kB, tx: 37.6 kB} frontend {rx: 37.6 kB, tx: 37.3 kB}
|
||||
```
|
||||
|
||||
More shares become limited and are prevented from transferring data. Notice the metrics output reducing in the logs. As more shares become limited, we're naturally seeing less data transfer occurring on the OpenZiti network:
|
||||
|
||||
```
|
||||
[ 240.188] INFO zrok/controller/limits.(*shareLimitAction).HandleShare: limiting '0evcupz5k410'
|
||||
[ 240.203] INFO zrok/controller/zrokEdgeSdk.DeleteServicePolicy: deleted service policy '74f2gUotsC7DteqpsWrxp0' for environment 'd.wJYlpt9'
|
||||
[ 240.203] INFO zrok/controller/limits.(*shareLimitAction).HandleShare: removed dial service policy for '0evcupz5k410'
|
||||
[ 245.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: SNXXjViuwU backend {rx: 28.2 kB, tx: 28.5 kB} frontend {rx: 28.5 kB, tx: 28.2 kB}
|
||||
[ 245.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: dev-h4iuwD backend {rx: 47.3 kB, tx: 47.9 kB} frontend {rx: 47.9 kB, tx: 47.3 kB}
|
||||
[ 245.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: iNzXj4S0r backend {rx: 48.2 kB, tx: 48.5 kB} frontend {rx: 48.5 kB, tx: 48.2 kB}
|
||||
[ 245.194] INFO zrok/controller/limits.(*shareLimitAction).HandleShare: limiting '53z6mz4re7tu'
|
||||
[ 245.196] INFO zrok/controller/zrokEdgeSdk.DeleteServicePolicy: deleted service policy '1oo3LuBKxduKAs1wsKndtW' for environment 'd.wJYlpt9'
|
||||
[ 245.197] INFO zrok/controller/limits.(*shareLimitAction).HandleShare: removed dial service policy for '53z6mz4re7tu'
|
||||
[ 250.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: dev-h4iuwD backend {rx: 33.2 kB, tx: 33.5 kB} frontend {rx: 33.5 kB, tx: 33.2 kB}
|
||||
[ 250.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: RZzXHVSuw backend {rx: 48.2 kB, tx: 48.4 kB} frontend {rx: 48.4 kB, tx: 48.2 kB}
|
||||
[ 250.191] INFO zrok/controller/limits.(*shareLimitAction).HandleShare: limiting 's0uzz1p7xjrr'
|
||||
[ 250.194] INFO zrok/controller/zrokEdgeSdk.DeleteServicePolicy: deleted service policy '7eB3ubrntSHxkeHBCGJcOY' for environment 'd.wJYlpt9'
|
||||
[ 250.194] INFO zrok/controller/limits.(*shareLimitAction).HandleShare: removed dial service policy for 's0uzz1p7xjrr'
|
||||
[ 255.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: MZXXjVi0w backend {rx: 35.8 kB, tx: 36.0 kB} frontend {rx: 36.0 kB, tx: 35.8 kB}
|
||||
[ 255.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: RZzXHVSuw backend {rx: 50.4 kB, tx: 50.6 kB} frontend {rx: 50.6 kB, tx: 50.4 kB}
|
||||
[ 255.179] INFO zrok/controller/limits.(*shareLimitAction).HandleShare: limiting 'tr7vpyrzvmh0'
|
||||
[ 255.182] INFO zrok/controller/zrokEdgeSdk.DeleteServicePolicy: deleted service policy '1cURGP202D8n6fzpzWhcgK' for environment 'd.wJYlpt9'
|
||||
[ 255.182] INFO zrok/controller/limits.(*shareLimitAction).HandleShare: removed dial service policy for 'tr7vpyrzvmh0'
|
||||
[ 260.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: SNXXjViuwU backend {rx: 37.3 kB, tx: 47.7 kB} frontend {rx: 47.7 kB, tx: 37.3 kB}
|
||||
[ 260.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: MZXXjVi0w backend {rx: 69.2 kB, tx: 69.7 kB} frontend {rx: 69.7 kB, tx: 69.2 kB}
|
||||
[ 265.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: iNzXj4S0r backend {rx: 59.7 kB, tx: 60.1 kB} frontend {rx: 60.1 kB, tx: 59.7 kB}
|
||||
[ 270.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: iNzXj4S0r backend {rx: 46.9 kB, tx: 47.2 kB} frontend {rx: 47.2 kB, tx: 46.9 kB}
|
||||
[ 275.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: iNzXj4S0r backend {rx: 32.9 kB, tx: 33.2 kB} frontend {rx: 33.2 kB, tx: 32.9 kB}
|
||||
[ 280.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: iNzXj4S0r backend {rx: 43.2 kB, tx: 43.7 kB} frontend {rx: 43.7 kB, tx: 43.2 kB}
|
||||
[ 285.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: SNXXjViuwU backend {rx: 50.0 kB, tx: 50.4 kB} frontend {rx: 50.4 kB, tx: 50.0 kB}
|
||||
[ 290.162] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: SNXXjViuwU backend {rx: 51.8 kB, tx: 52.3 kB} frontend {rx: 52.3 kB, tx: 51.8 kB}
|
||||
```
|
||||
|
||||
By this point, we're seeing very little traffic on the OpenZiti network:
|
||||
|
||||
```
|
||||
[ 290.176] INFO zrok/controller/limits.(*shareLimitAction).HandleShare: limiting '8k6dnu7x7ag0'
|
||||
[ 290.190] INFO zrok/controller/zrokEdgeSdk.DeleteServicePolicy: deleted service policy '5UHCkXZabFHeWYHmF01Zoc' for environment 'd.wJYlpt9'
|
||||
[ 290.191] INFO zrok/controller/limits.(*shareLimitAction).HandleShare: removed dial service policy for '8k6dnu7x7ag0'
|
||||
[ 295.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: iNzXj4S0r backend {rx: 44.0 kB, tx: 44.4 kB} frontend {rx: 44.4 kB, tx: 44.0 kB}
|
||||
[ 295.178] INFO zrok/controller/limits.(*shareLimitAction).HandleShare: limiting '7u9szn30ikh0'
|
||||
[ 295.181] INFO zrok/controller/zrokEdgeSdk.DeleteServicePolicy: deleted service policy '3dBtc3v2G70aqqDSqujQOy' for environment 'd.wJYlpt9'
|
||||
[ 295.181] INFO zrok/controller/limits.(*shareLimitAction).HandleShare: removed dial service policy for '7u9szn30ikh0'
|
||||
```
|
||||
Notice the timestamps on the log messages. There have been no metrics messages for 60 seconds.
|
||||
|
||||
The limits agent runs a periodic process to look for limited resources to re-enable. It produces messages like this when there are no resources to re-enable:
|
||||
|
||||
```
|
||||
[ 355.183] INFO zrok/controller/limits.(*Agent).relax: relaxing
|
||||
[ 355.188] INFO zrok/controller/limits.(*Agent).relax: share 'dh3f3jj7zhig' still over limit
|
||||
[ 355.192] INFO zrok/controller/limits.(*Agent).relax: share '0evcupz5k410' still over limit
|
||||
[ 355.196] INFO zrok/controller/limits.(*Agent).relax: share '53z6mz4re7tu' still over limit
|
||||
[ 355.199] INFO zrok/controller/limits.(*Agent).relax: share 's0uzz1p7xjrr' still over limit
|
||||
[ 355.203] INFO zrok/controller/limits.(*Agent).relax: share 'tr7vpyrzvmh0' still over limit
|
||||
[ 355.207] INFO zrok/controller/limits.(*Agent).relax: share '8k6dnu7x7ag0' still over limit
|
||||
[ 355.220] INFO zrok/controller/limits.(*Agent).relax: share '7u9szn30ikh0' still over limit
|
||||
[ 415.223] INFO zrok/controller/limits.(*Agent).relax: relaxing
|
||||
[ 415.228] INFO zrok/controller/limits.(*Agent).relax: share 'dh3f3jj7zhig' still over limit
|
||||
[ 415.232] INFO zrok/controller/limits.(*Agent).relax: share '0evcupz5k410' still over limit
|
||||
[ 415.236] INFO zrok/controller/limits.(*Agent).relax: share '53z6mz4re7tu' still over limit
|
||||
[ 415.240] INFO zrok/controller/limits.(*Agent).relax: share 's0uzz1p7xjrr' still over limit
|
||||
[ 415.245] INFO zrok/controller/limits.(*Agent).relax: share 'tr7vpyrzvmh0' still over limit
|
||||
[ 415.250] INFO zrok/controller/limits.(*Agent).relax: share '8k6dnu7x7ag0' still over limit
|
||||
[ 415.253] INFO zrok/controller/limits.(*Agent).relax: share '7u9szn30ikh0' still over limit
|
||||
```
|
||||
Enough time has finally passed that the agent is able to remove the restrictions on some of the services:
|
||||
|
||||
```
|
||||
[ 475.255] INFO zrok/controller/limits.(*Agent).relax: relaxing
|
||||
[ 475.260] INFO zrok/controller/limits.(*shareRelaxAction).HandleShare: relaxing 'dh3f3jj7zhig'
|
||||
[ 475.274] INFO zrok/controller/zrokEdgeSdk.CreateServicePolicyDial: created dial service policy '3LQG2ptwUxIuWtRzTLAqAc' for service 'nyKOLlxUWWbCzD7h9Jhjq' for identities '[rBayMvm7UI]'
|
||||
[ 475.274] INFO zrok/controller/limits.(*shareRelaxAction).HandleShare: added dial service policy for 'dh3f3jj7zhig'
|
||||
[ 475.279] INFO zrok/controller/limits.(*shareRelaxAction).HandleShare: relaxing '0evcupz5k410'
|
||||
[ 475.281] INFO zrok/controller/zrokEdgeSdk.CreateServicePolicyDial: created dial service policy '4BPqQhFsGGmoBsqFDIWlWA' for service '3WHJGqUdxkDtPYLgEL5V3q' for identities '[rBayMvm7UI]'
|
||||
[ 475.281] INFO zrok/controller/limits.(*shareRelaxAction).HandleShare: added dial service policy for '0evcupz5k410'
|
||||
[ 475.285] INFO zrok/controller/limits.(*shareRelaxAction).HandleShare: relaxing '53z6mz4re7tu'
|
||||
[ 475.287] INFO zrok/controller/zrokEdgeSdk.CreateServicePolicyDial: created dial service policy '64Kz6F7CluxH1drfyMkzDx' for service '2NiotGOyBHBEbFZwbTFJ2u' for identities '[rBayMvm7UI]'
|
||||
[ 475.287] INFO zrok/controller/limits.(*shareRelaxAction).HandleShare: added dial service policy for '53z6mz4re7tu'
|
||||
[ 475.292] INFO zrok/controller/limits.(*shareRelaxAction).HandleShare: relaxing 's0uzz1p7xjrr'
|
||||
[ 475.295] INFO zrok/controller/zrokEdgeSdk.CreateServicePolicyDial: created dial service policy '6MZ8i9sqvom96P70P24FJQ' for service 'KtK5E46HR93YIBrrwUlIN' for identities '[rBayMvm7UI]'
|
||||
[ 475.295] INFO zrok/controller/limits.(*shareRelaxAction).HandleShare: added dial service policy for 's0uzz1p7xjrr'
|
||||
[ 475.299] INFO zrok/controller/limits.(*shareRelaxAction).HandleShare: relaxing 'tr7vpyrzvmh0'
|
||||
[ 475.301] INFO zrok/controller/zrokEdgeSdk.CreateServicePolicyDial: created dial service policy '1kfuMP2APitf3qC2tsOC1b' for service '7jyiTZ0z2ediD5hZbxu7KH' for identities '[rBayMvm7UI]'
|
||||
[ 475.301] INFO zrok/controller/limits.(*shareRelaxAction).HandleShare: added dial service policy for 'tr7vpyrzvmh0'
|
||||
[ 475.305] INFO zrok/controller/limits.(*shareRelaxAction).HandleShare: relaxing '8k6dnu7x7ag0'
|
||||
[ 475.308] INFO zrok/controller/zrokEdgeSdk.CreateServicePolicyDial: created dial service policy '12jWOvjIIuvYRW9vXfkRKw' for service '2J0I9dPe2JGnY1GwjmM6n7' for identities '[rBayMvm7UI]'
|
||||
[ 475.308] INFO zrok/controller/limits.(*shareRelaxAction).HandleShare: added dial service policy for '8k6dnu7x7ag0'
|
||||
[ 475.313] INFO zrok/controller/limits.(*Agent).relax: share '7u9szn30ikh0' still over limit
|
||||
```
|
||||
And notice that we're now starting to see traffic on those shares again:
|
||||
|
||||
```
|
||||
[ 485.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: CjNBpViur backend {rx: 59.7 kB, tx: 60.0 kB} frontend {rx: 60.0 kB, tx: 59.7 kB}
|
||||
[ 485.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: qwlLhVS0w backend {rx: 50.1 kB, tx: 50.4 kB} frontend {rx: 50.4 kB, tx: 50.1 kB}
|
||||
[ 485.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: fMNBpVi0w backend {rx: 80.3 kB, tx: 80.7 kB} frontend {rx: 80.7 kB, tx: 80.3 kB}
|
||||
[ 485.200] INFO zrok/controller/limits.(*shareWarningAction).HandleShare: warning '8k6dnu7x7ag0'
|
||||
[ 486.095] INFO zrok/controller/limits.sendLimitWarningEmail: limit warning email sent to 'michael@quigley.com'
|
||||
[ 490.162] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: CjNBpViur backend {rx: 40.6 kB, tx: 40.9 kB} frontend {rx: 40.9 kB, tx: 40.6 kB}
|
||||
[ 490.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: 5TNBhVS0r backend {rx: 44.5 kB, tx: 45.0 kB} frontend {rx: 45.0 kB, tx: 44.5 kB}
|
||||
[ 490.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: fMNBpVi0w backend {rx: 60.7 kB, tx: 61.1 kB} frontend {rx: 61.1 kB, tx: 60.7 kB}
|
||||
[ 495.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: CjNBpViur backend {rx: 45.3 kB, tx: 45.6 kB} frontend {rx: 45.6 kB, tx: 45.3 kB}
|
||||
[ 495.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: 5TNBhVS0r backend {rx: 42.0 kB, tx: 42.4 kB} frontend {rx: 42.4 kB, tx: 42.0 kB}
|
||||
[ 495.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: qwlLhVS0w backend {rx: 33.3 kB, tx: 33.8 kB} frontend {rx: 33.8 kB, tx: 33.3 kB}
|
||||
[ 500.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: LdZLhVSuw backend {rx: 28.2 kB, tx: 28.5 kB} frontend {rx: 28.5 kB, tx: 28.2 kB}
|
||||
[ 500.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: qwlLhVS0w backend {rx: 40.0 kB, tx: 40.3 kB} frontend {rx: 40.3 kB, tx: 40.0 kB}
|
||||
[ 500.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: 5TNBhVS0r backend {rx: 53.6 kB, tx: 54.0 kB} frontend {rx: 54.0 kB, tx: 53.6 kB}
|
||||
[ 505.201] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: 5TNBhVS0r backend {rx: 38.4 kB, tx: 38.6 kB} frontend {rx: 38.6 kB, tx: 38.4 kB}
|
||||
[ 505.208] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: CjNBpViur backend {rx: 33.8 kB, tx: 34.2 kB} frontend {rx: 34.2 kB, tx: 33.8 kB}
|
||||
[ 505.210] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: LdZLhVSuw backend {rx: 39.7 kB, tx: 40.0 kB} frontend {rx: 40.0 kB, tx: 39.7 kB}
|
||||
[ 510.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: fMNBpVi0w backend {rx: 74.0 kB, tx: 74.5 kB} frontend {rx: 74.5 kB, tx: 74.0 kB}
|
||||
[ 510.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: qwlLhVS0w backend {rx: 51.5 kB, tx: 51.8 kB} frontend {rx: 51.8 kB, tx: 51.5 kB}
|
||||
[ 510.169] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: OJyBpVS0w backend {rx: 33.5 kB, tx: 33.9 kB} frontend {rx: 33.9 kB, tx: 33.5 kB}
|
||||
[ 515.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: LdZLhVSuw backend {rx: 62.7 kB, tx: 63.0 kB} frontend {rx: 63.0 kB, tx: 62.7 kB}
|
||||
[ 515.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: CjNBpViur backend {rx: 32.5 kB, tx: 32.9 kB} frontend {rx: 32.9 kB, tx: 32.5 kB}
|
||||
[ 515.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: qwlLhVS0w backend {rx: 47.4 kB, tx: 47.7 kB} frontend {rx: 47.7 kB, tx: 47.4 kB}
|
||||
[ 520.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: OJyBpVS0w backend {rx: 48.2 kB, tx: 48.5 kB} frontend {rx: 48.5 kB, tx: 48.2 kB}
|
||||
[ 520.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: CjNBpViur backend {rx: 45.8 kB, tx: 46.1 kB} frontend {rx: 46.1 kB, tx: 45.8 kB}
|
||||
[ 520.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: LdZLhVSuw backend {rx: 34.2 kB, tx: 34.4 kB} frontend {rx: 34.4 kB, tx: 34.2 kB}
|
||||
[ 525.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: qwlLhVS0w backend {rx: 35.0 kB, tx: 35.4 kB} frontend {rx: 35.4 kB, tx: 35.0 kB}
|
||||
[ 525.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: CjNBpViur backend {rx: 40.1 kB, tx: 40.4 kB} frontend {rx: 40.4 kB, tx: 40.1 kB}
|
||||
[ 525.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: LdZLhVSuw backend {rx: 24.7 kB, tx: 25.0 kB} frontend {rx: 25.0 kB, tx: 24.7 kB}
|
||||
[ 530.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: qwlLhVS0w backend {rx: 57.3 kB, tx: 57.9 kB} frontend {rx: 57.9 kB, tx: 57.3 kB}
|
||||
[ 530.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: OJyBpVS0w backend {rx: 51.4 kB, tx: 51.7 kB} frontend {rx: 51.7 kB, tx: 51.4 kB}
|
||||
[ 530.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: CjNBpViur backend {rx: 40.6 kB, tx: 41.0 kB} frontend {rx: 41.0 kB, tx: 40.6 kB}
|
||||
[ 535.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: LdZLhVSuw backend {rx: 41.5 kB, tx: 41.9 kB} frontend {rx: 41.9 kB, tx: 41.5 kB}
|
||||
[ 535.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: OJyBpVS0w backend {rx: 61.4 kB, tx: 61.9 kB} frontend {rx: 61.9 kB, tx: 61.4 kB}
|
||||
[ 535.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: 5TNBhVS0r backend {rx: 33.3 kB, tx: 33.6 kB} frontend {rx: 33.6 kB, tx: 33.3 kB}
|
||||
[ 540.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: LdZLhVSuw backend {rx: 37.2 kB, tx: 37.5 kB} frontend {rx: 37.5 kB, tx: 37.2 kB}
|
||||
[ 540.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: qwlLhVS0w backend {rx: 53.8 kB, tx: 54.3 kB} frontend {rx: 54.3 kB, tx: 53.8 kB}
|
||||
[ 540.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: 5TNBhVS0r backend {rx: 75.8 kB, tx: 76.4 kB} frontend {rx: 76.4 kB, tx: 75.8 kB}
|
||||
[ 545.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: LdZLhVSuw backend {rx: 69.9 kB, tx: 70.2 kB} frontend {rx: 70.2 kB, tx: 69.9 kB}
|
||||
[ 545.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: fMNBpVi0w backend {rx: 24.9 kB, tx: 25.2 kB} frontend {rx: 25.2 kB, tx: 24.9 kB}
|
||||
[ 545.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: CjNBpViur backend {rx: 39.4 kB, tx: 39.6 kB} frontend {rx: 39.6 kB, tx: 39.4 kB}
|
||||
[ 550.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: OJyBpVS0w backend {rx: 64.0 kB, tx: 64.3 kB} frontend {rx: 64.3 kB, tx: 64.0 kB}
|
||||
[ 550.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: 5TNBhVS0r backend {rx: 39.2 kB, tx: 39.6 kB} frontend {rx: 39.6 kB, tx: 39.2 kB}
|
||||
[ 550.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: fMNBpVi0w backend {rx: 47.6 kB, tx: 47.9 kB} frontend {rx: 47.9 kB, tx: 47.6 kB}
|
||||
[ 555.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: CjNBpViur backend {rx: 54.2 kB, tx: 54.8 kB} frontend {rx: 54.8 kB, tx: 54.2 kB}
|
||||
[ 555.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: LdZLhVSuw backend {rx: 44.5 kB, tx: 44.8 kB} frontend {rx: 44.8 kB, tx: 44.5 kB}
|
||||
[ 555.169] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: OJyBpVS0w backend {rx: 66.3 kB, tx: 66.7 kB} frontend {rx: 66.7 kB, tx: 66.3 kB}
|
||||
[ 560.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: 5TNBhVS0r backend {rx: 18.9 kB, tx: 19.2 kB} frontend {rx: 19.2 kB, tx: 18.9 kB}
|
||||
[ 560.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: qwlLhVS0w backend {rx: 51.5 kB, tx: 51.8 kB} frontend {rx: 51.8 kB, tx: 51.5 kB}
|
||||
[ 560.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: OJyBpVS0w backend {rx: 36.3 kB, tx: 36.7 kB} frontend {rx: 36.7 kB, tx: 36.3 kB}
|
||||
[ 565.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: OJyBpVS0w backend {rx: 70.7 kB, tx: 71.0 kB} frontend {rx: 71.0 kB, tx: 70.7 kB}
|
||||
[ 565.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: 5TNBhVS0r backend {rx: 58.7 kB, tx: 59.1 kB} frontend {rx: 59.1 kB, tx: 58.7 kB}
|
||||
[ 565.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: LdZLhVSuw backend {rx: 33.8 kB, tx: 34.0 kB} frontend {rx: 34.0 kB, tx: 33.8 kB}
|
||||
[ 570.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: qwlLhVS0w backend {rx: 35.4 kB, tx: 35.7 kB} frontend {rx: 35.7 kB, tx: 35.4 kB}
|
||||
[ 570.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: 5TNBhVS0r backend {rx: 47.2 kB, tx: 47.6 kB} frontend {rx: 47.6 kB, tx: 47.2 kB}
|
||||
[ 570.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: CjNBpViur backend {rx: 75.5 kB, tx: 75.8 kB} frontend {rx: 75.8 kB, tx: 75.5 kB}
|
||||
[ 575.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: CjNBpViur backend {rx: 34.3 kB, tx: 34.6 kB} frontend {rx: 34.6 kB, tx: 34.3 kB}
|
||||
[ 575.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: LdZLhVSuw backend {rx: 36.2 kB, tx: 36.6 kB} frontend {rx: 36.6 kB, tx: 36.2 kB}
|
||||
[ 575.169] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: OJyBpVS0w backend {rx: 53.9 kB, tx: 54.2 kB} frontend {rx: 54.2 kB, tx: 53.9 kB}
|
||||
[ 575.178] INFO zrok/controller/limits.(*shareWarningAction).HandleShare: warning '53z6mz4re7tu'
|
||||
[ 575.953] INFO zrok/controller/limits.sendLimitWarningEmail: limit warning email sent to 'michael@quigley.com'
|
||||
[ 580.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: qwlLhVS0w backend {rx: 50.3 kB, tx: 50.7 kB} frontend {rx: 50.7 kB, tx: 50.3 kB}
|
||||
[ 580.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: CjNBpViur backend {rx: 55.7 kB, tx: 56.1 kB} frontend {rx: 56.1 kB, tx: 55.7 kB}
|
||||
[ 580.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: LdZLhVSuw backend {rx: 41.0 kB, tx: 41.3 kB} frontend {rx: 41.3 kB, tx: 41.0 kB}
|
||||
[ 585.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: fMNBpVi0w backend {rx: 32.3 kB, tx: 32.6 kB} frontend {rx: 32.6 kB, tx: 32.3 kB}
|
||||
[ 585.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: LdZLhVSuw backend {rx: 18.5 kB, tx: 18.8 kB} frontend {rx: 18.8 kB, tx: 18.5 kB}
|
||||
[ 585.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: CjNBpViur backend {rx: 43.2 kB, tx: 43.6 kB} frontend {rx: 43.6 kB, tx: 43.2 kB}
|
||||
[ 590.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: 5TNBhVS0r backend {rx: 32.8 kB, tx: 33.0 kB} frontend {rx: 33.0 kB, tx: 32.8 kB}
|
||||
[ 590.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: CjNBpViur backend {rx: 63.4 kB, tx: 63.7 kB} frontend {rx: 63.7 kB, tx: 63.4 kB}
|
||||
[ 590.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: LdZLhVSuw backend {rx: 18.1 kB, tx: 18.3 kB} frontend {rx: 18.3 kB, tx: 18.1 kB}
|
||||
[ 590.208] INFO zrok/controller/limits.(*shareWarningAction).HandleShare: warning 'tr7vpyrzvmh0'
|
||||
[ 591.168] INFO zrok/controller/limits.sendLimitWarningEmail: limit warning email sent to 'michael@quigley.com'
|
||||
[ 595.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: 5TNBhVS0r backend {rx: 34.1 kB, tx: 34.5 kB} frontend {rx: 34.5 kB, tx: 34.1 kB}
|
||||
[ 595.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: CjNBpViur backend {rx: 46.0 kB, tx: 46.3 kB} frontend {rx: 46.3 kB, tx: 46.0 kB}
|
||||
[ 595.169] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: qwlLhVS0w backend {rx: 49.1 kB, tx: 49.4 kB} frontend {rx: 49.4 kB, tx: 49.1 kB}
|
||||
[ 600.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: fMNBpVi0w backend {rx: 34.0 kB, tx: 34.3 kB} frontend {rx: 34.3 kB, tx: 34.0 kB}
|
||||
[ 600.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: OJyBpVS0w backend {rx: 46.6 kB, tx: 47.1 kB} frontend {rx: 47.1 kB, tx: 46.6 kB}
|
||||
[ 600.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: CjNBpViur backend {rx: 23.2 kB, tx: 23.5 kB} frontend {rx: 23.5 kB, tx: 23.2 kB}
|
||||
[ 600.189] INFO zrok/controller/limits.(*shareWarningAction).HandleShare: warning 's0uzz1p7xjrr'
|
||||
[ 600.949] INFO zrok/controller/limits.sendLimitWarningEmail: limit warning email sent to 'michael@quigley.com'
|
||||
[ 605.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: CjNBpViur backend {rx: 61.5 kB, tx: 61.8 kB} frontend {rx: 61.8 kB, tx: 61.5 kB}
|
||||
[ 605.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: LdZLhVSuw backend {rx: 38.3 kB, tx: 38.7 kB} frontend {rx: 38.7 kB, tx: 38.3 kB}
|
||||
[ 605.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: fMNBpVi0w backend {rx: 35.1 kB, tx: 35.5 kB} frontend {rx: 35.5 kB, tx: 35.1 kB}
|
||||
[ 610.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: qwlLhVS0w backend {rx: 37.7 kB, tx: 38.1 kB} frontend {rx: 38.1 kB, tx: 37.7 kB}
|
||||
[ 610.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: fMNBpVi0w backend {rx: 50.4 kB, tx: 50.7 kB} frontend {rx: 50.7 kB, tx: 50.4 kB}
|
||||
[ 610.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: CjNBpViur backend {rx: 27.9 kB, tx: 28.2 kB} frontend {rx: 28.2 kB, tx: 27.9 kB}
|
||||
[ 615.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: qwlLhVS0w backend {rx: 25.7 kB, tx: 26.0 kB} frontend {rx: 26.0 kB, tx: 25.7 kB}
|
||||
[ 615.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: fMNBpVi0w backend {rx: 32.2 kB, tx: 32.5 kB} frontend {rx: 32.5 kB, tx: 32.2 kB}
|
||||
[ 615.169] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: OJyBpVS0w backend {rx: 47.2 kB, tx: 47.6 kB} frontend {rx: 47.6 kB, tx: 47.2 kB}
|
||||
[ 620.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: 5TNBhVS0r backend {rx: 35.7 kB, tx: 36.2 kB} frontend {rx: 36.2 kB, tx: 35.7 kB}
|
||||
[ 620.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: OJyBpVS0w backend {rx: 60.6 kB, tx: 60.9 kB} frontend {rx: 60.9 kB, tx: 60.6 kB}
|
||||
[ 620.169] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: CjNBpViur backend {rx: 51.8 kB, tx: 52.3 kB} frontend {rx: 52.3 kB, tx: 51.8 kB}
|
||||
[ 620.178] INFO zrok/controller/limits.(*shareWarningAction).HandleShare: warning 'dh3f3jj7zhig'
|
||||
[ 620.929] INFO zrok/controller/limits.sendLimitWarningEmail: limit warning email sent to 'michael@quigley.com'
|
||||
[ 625.162] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: OJyBpVS0w backend {rx: 41.6 kB, tx: 42.0 kB} frontend {rx: 42.0 kB, tx: 41.6 kB}
|
||||
[ 625.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: 5TNBhVS0r backend {rx: 46.4 kB, tx: 46.7 kB} frontend {rx: 46.7 kB, tx: 46.4 kB}
|
||||
[ 625.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: CjNBpViur backend {rx: 48.4 kB, tx: 48.7 kB} frontend {rx: 48.7 kB, tx: 48.4 kB}
|
||||
[ 630.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: qwlLhVS0w backend {rx: 29.3 kB, tx: 29.5 kB} frontend {rx: 29.5 kB, tx: 29.3 kB}
|
||||
[ 630.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: OJyBpVS0w backend {rx: 49.7 kB, tx: 50.2 kB} frontend {rx: 50.2 kB, tx: 49.7 kB}
|
||||
[ 630.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: LdZLhVSuw backend {rx: 47.7 kB, tx: 48.0 kB} frontend {rx: 48.0 kB, tx: 47.7 kB}
|
||||
[ 635.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: OJyBpVS0w backend {rx: 69.2 kB, tx: 69.6 kB} frontend {rx: 69.6 kB, tx: 69.2 kB}
|
||||
[ 635.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: fMNBpVi0w backend {rx: 45.8 kB, tx: 46.2 kB} frontend {rx: 46.2 kB, tx: 45.8 kB}
|
||||
[ 635.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: 5TNBhVS0r backend {rx: 38.6 kB, tx: 39.1 kB} frontend {rx: 39.1 kB, tx: 38.6 kB}
|
||||
[ 640.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: CjNBpViur backend {rx: 41.7 kB, tx: 42.0 kB} frontend {rx: 42.0 kB, tx: 41.7 kB}
|
||||
[ 640.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: LdZLhVSuw backend {rx: 27.5 kB, tx: 28.0 kB} frontend {rx: 28.0 kB, tx: 27.5 kB}
|
||||
[ 640.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: qwlLhVS0w backend {rx: 28.4 kB, tx: 28.7 kB} frontend {rx: 28.7 kB, tx: 28.4 kB}
|
||||
[ 645.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: LdZLhVSuw backend {rx: 39.8 kB, tx: 40.0 kB} frontend {rx: 40.0 kB, tx: 39.8 kB}
|
||||
[ 645.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: fMNBpVi0w backend {rx: 52.2 kB, tx: 52.5 kB} frontend {rx: 52.5 kB, tx: 52.2 kB}
|
||||
[ 645.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: CjNBpViur backend {rx: 39.3 kB, tx: 39.6 kB} frontend {rx: 39.6 kB, tx: 39.3 kB}
|
||||
[ 645.300] INFO zrok/controller/limits.(*shareWarningAction).HandleShare: warning '0evcupz5k410'
|
||||
[ 647.031] INFO zrok/controller/limits.sendLimitWarningEmail: limit warning email sent to 'michael@quigley.com'
|
||||
[ 650.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: 5TNBhVS0r backend {rx: 36.3 kB, tx: 36.7 kB} frontend {rx: 36.7 kB, tx: 36.3 kB}
|
||||
[ 650.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: fMNBpVi0w backend {rx: 50.7 kB, tx: 51.0 kB} frontend {rx: 51.0 kB, tx: 50.7 kB}
|
||||
[ 650.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: LdZLhVSuw backend {rx: 48.5 kB, tx: 48.8 kB} frontend {rx: 48.8 kB, tx: 48.5 kB}
|
||||
[ 655.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: CjNBpViur backend {rx: 24.6 kB, tx: 24.9 kB} frontend {rx: 24.9 kB, tx: 24.6 kB}
|
||||
[ 655.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: OJyBpVS0w backend {rx: 45.6 kB, tx: 46.0 kB} frontend {rx: 46.0 kB, tx: 45.6 kB}
|
||||
[ 655.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: qwlLhVS0w backend {rx: 51.8 kB, tx: 52.1 kB} frontend {rx: 52.1 kB, tx: 51.8 kB}
|
||||
[ 655.284] INFO zrok/controller/limits.(*shareLimitAction).HandleShare: limiting '53z6mz4re7tu'
|
||||
[ 655.299] INFO zrok/controller/zrokEdgeSdk.DeleteServicePolicy: deleted service policy '64Kz6F7CluxH1drfyMkzDx' for environment 'd.wJYlpt9'
|
||||
[ 655.299] INFO zrok/controller/limits.(*shareLimitAction).HandleShare: removed dial service policy for '53z6mz4re7tu'
|
||||
[ 660.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: qwlLhVS0w backend {rx: 70.9 kB, tx: 71.4 kB} frontend {rx: 71.4 kB, tx: 70.9 kB}
|
||||
[ 660.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: CjNBpViur backend {rx: 49.0 kB, tx: 49.5 kB} frontend {rx: 49.5 kB, tx: 49.0 kB}
|
||||
[ 660.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: LdZLhVSuw backend {rx: 36.2 kB, tx: 36.5 kB} frontend {rx: 36.5 kB, tx: 36.2 kB}
|
||||
[ 665.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: OJyBpVS0w backend {rx: 48.3 kB, tx: 48.7 kB} frontend {rx: 48.7 kB, tx: 48.3 kB}
|
||||
[ 665.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: LdZLhVSuw backend {rx: 42.1 kB, tx: 42.4 kB} frontend {rx: 42.4 kB, tx: 42.1 kB}
|
||||
[ 665.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: 5TNBhVS0r backend {rx: 47.4 kB, tx: 47.7 kB} frontend {rx: 47.7 kB, tx: 47.4 kB}
|
||||
[ 670.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: LdZLhVSuw backend {rx: 40.2 kB, tx: 40.6 kB} frontend {rx: 40.6 kB, tx: 40.2 kB}
|
||||
[ 670.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: OJyBpVS0w backend {rx: 62.1 kB, tx: 62.4 kB} frontend {rx: 62.4 kB, tx: 62.1 kB}
|
||||
[ 675.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: fMNBpVi0w backend {rx: 13.8 kB, tx: 14.1 kB} frontend {rx: 14.1 kB, tx: 13.8 kB}
|
||||
[ 675.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: LdZLhVSuw backend {rx: 36.6 kB, tx: 36.8 kB} frontend {rx: 36.8 kB, tx: 36.6 kB}
|
||||
[ 675.168] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: qwlLhVS0w backend {rx: 35.3 kB, tx: 35.6 kB} frontend {rx: 35.6 kB, tx: 35.3 kB}
|
||||
[ 680.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: 5TNBhVS0r backend {rx: 55.3 kB, tx: 55.8 kB} frontend {rx: 55.8 kB, tx: 55.3 kB}
|
||||
[ 680.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: LdZLhVSuw backend {rx: 46.6 kB, tx: 46.9 kB} frontend {rx: 46.9 kB, tx: 46.6 kB}
|
||||
[ 685.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: LdZLhVSuw backend {rx: 56.2 kB, tx: 56.5 kB} frontend {rx: 56.5 kB, tx: 56.2 kB}
|
||||
[ 685.172] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: fMNBpVi0w backend {rx: 42.4 kB, tx: 42.8 kB} frontend {rx: 42.8 kB, tx: 42.4 kB}
|
||||
[ 685.175] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: 5TNBhVS0r backend {rx: 46.8 kB, tx: 47.1 kB} frontend {rx: 47.1 kB, tx: 46.8 kB}
|
||||
[ 690.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: 5TNBhVS0r backend {rx: 72.4 kB, tx: 72.8 kB} frontend {rx: 72.8 kB, tx: 72.4 kB}
|
||||
[ 690.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: qwlLhVS0w backend {rx: 58.5 kB, tx: 58.7 kB} frontend {rx: 58.7 kB, tx: 58.5 kB}
|
||||
[ 695.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: fMNBpVi0w backend {rx: 21.1 kB, tx: 21.4 kB} frontend {rx: 21.4 kB, tx: 21.1 kB}
|
||||
[ 695.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: LdZLhVSuw backend {rx: 41.5 kB, tx: 41.8 kB} frontend {rx: 41.8 kB, tx: 41.5 kB}
|
||||
[ 695.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: OJyBpVS0w backend {rx: 49.5 kB, tx: 49.8 kB} frontend {rx: 49.8 kB, tx: 49.5 kB}
|
||||
[ 700.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: fMNBpVi0w backend {rx: 28.6 kB, tx: 28.9 kB} frontend {rx: 28.9 kB, tx: 28.6 kB}
|
||||
[ 700.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: OJyBpVS0w backend {rx: 58.6 kB, tx: 59.0 kB} frontend {rx: 59.0 kB, tx: 58.6 kB}
|
||||
[ 700.193] INFO zrok/controller/limits.(*shareLimitAction).HandleShare: limiting 's0uzz1p7xjrr'
|
||||
[ 700.208] INFO zrok/controller/zrokEdgeSdk.DeleteServicePolicy: deleted service policy '6MZ8i9sqvom96P70P24FJQ' for environment 'd.wJYlpt9'
|
||||
[ 700.208] INFO zrok/controller/limits.(*shareLimitAction).HandleShare: removed dial service policy for 's0uzz1p7xjrr'
|
||||
[ 705.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: fMNBpVi0w backend {rx: 40.1 kB, tx: 40.6 kB} frontend {rx: 40.6 kB, tx: 40.1 kB}
|
||||
[ 705.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: qwlLhVS0w backend {rx: 55.7 kB, tx: 56.1 kB} frontend {rx: 56.1 kB, tx: 55.7 kB}
|
||||
[ 705.169] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: OJyBpVS0w backend {rx: 46.0 kB, tx: 46.2 kB} frontend {rx: 46.2 kB, tx: 46.0 kB}
|
||||
[ 710.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: LdZLhVSuw backend {rx: 20.4 kB, tx: 20.6 kB} frontend {rx: 20.6 kB, tx: 20.4 kB}
|
||||
[ 710.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: fMNBpVi0w backend {rx: 74.0 kB, tx: 74.4 kB} frontend {rx: 74.4 kB, tx: 74.0 kB}
|
||||
[ 710.178] INFO zrok/controller/limits.(*shareLimitAction).HandleShare: limiting 'tr7vpyrzvmh0'
|
||||
[ 710.192] INFO zrok/controller/zrokEdgeSdk.DeleteServicePolicy: deleted service policy '1kfuMP2APitf3qC2tsOC1b' for environment 'd.wJYlpt9'
|
||||
[ 710.192] INFO zrok/controller/limits.(*shareLimitAction).HandleShare: removed dial service policy for 'tr7vpyrzvmh0'
|
||||
[ 715.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: fMNBpVi0w backend {rx: 59.7 kB, tx: 60.2 kB} frontend {rx: 60.2 kB, tx: 59.7 kB}
|
||||
[ 715.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: LdZLhVSuw backend {rx: 67.5 kB, tx: 67.8 kB} frontend {rx: 67.8 kB, tx: 67.5 kB}
|
||||
[ 720.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: qwlLhVS0w backend {rx: 43.7 kB, tx: 44.1 kB} frontend {rx: 44.1 kB, tx: 43.7 kB}
|
||||
[ 725.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: qwlLhVS0w backend {rx: 36.4 kB, tx: 36.6 kB} frontend {rx: 36.6 kB, tx: 36.4 kB}
|
||||
[ 725.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: 5TNBhVS0r backend {rx: 72.2 kB, tx: 72.7 kB} frontend {rx: 72.7 kB, tx: 72.2 kB}
|
||||
[ 730.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: 5TNBhVS0r backend {rx: 41.0 kB, tx: 41.4 kB} frontend {rx: 41.4 kB, tx: 41.0 kB}
|
||||
[ 735.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: 5TNBhVS0r backend {rx: 31.3 kB, tx: 31.6 kB} frontend {rx: 31.6 kB, tx: 31.3 kB}
|
||||
[ 735.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: fMNBpVi0w backend {rx: 39.1 kB, tx: 39.4 kB} frontend {rx: 39.4 kB, tx: 39.1 kB}
|
||||
[ 740.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: dh3f3jj7zhig, circuit: 5TNBhVS0r backend {rx: 30.7 kB, tx: 31.0 kB} frontend {rx: 31.0 kB, tx: 30.7 kB}
|
||||
[ 740.177] INFO zrok/controller/limits.(*shareLimitAction).HandleShare: limiting 'dh3f3jj7zhig'
|
||||
[ 740.192] INFO zrok/controller/zrokEdgeSdk.DeleteServicePolicy: deleted service policy '3LQG2ptwUxIuWtRzTLAqAc' for environment 'd.wJYlpt9'
|
||||
[ 740.192] INFO zrok/controller/limits.(*shareLimitAction).HandleShare: removed dial service policy for 'dh3f3jj7zhig'
|
||||
[ 745.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: fMNBpVi0w backend {rx: 38.2 kB, tx: 38.5 kB} frontend {rx: 38.5 kB, tx: 38.2 kB}
|
||||
[ 745.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: qwlLhVS0w backend {rx: 42.3 kB, tx: 42.7 kB} frontend {rx: 42.7 kB, tx: 42.3 kB}
|
||||
[ 745.192] INFO zrok/controller/limits.(*shareLimitAction).HandleShare: limiting '8k6dnu7x7ag0'
|
||||
[ 745.195] INFO zrok/controller/zrokEdgeSdk.DeleteServicePolicy: deleted service policy '12jWOvjIIuvYRW9vXfkRKw' for environment 'd.wJYlpt9'
|
||||
[ 745.195] INFO zrok/controller/limits.(*shareLimitAction).HandleShare: removed dial service policy for '8k6dnu7x7ag0'
|
||||
[ 750.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: fMNBpVi0w backend {rx: 36.4 kB, tx: 36.7 kB} frontend {rx: 36.7 kB, tx: 36.4 kB}
|
||||
[ 760.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: fMNBpVi0w backend {rx: 57.5 kB, tx: 58.0 kB} frontend {rx: 58.0 kB, tx: 57.5 kB}
|
||||
[ 760.178] INFO zrok/controller/limits.(*shareLimitAction).HandleShare: limiting '0evcupz5k410'
|
||||
[ 760.194] INFO zrok/controller/zrokEdgeSdk.DeleteServicePolicy: deleted service policy '4BPqQhFsGGmoBsqFDIWlWA' for environment 'd.wJYlpt9'
|
||||
[ 760.194] INFO zrok/controller/limits.(*shareLimitAction).HandleShare: removed dial service policy for '0evcupz5k410'
|
||||
[ 820.195] INFO zrok/controller/limits.(*Agent).relax: relaxing
|
||||
[ 820.200] ERROR zrok/controller/limits.(*Agent).checkShareLimit: expected 2 results; got '0' (from(bucket: "zrok")|> range(start: -5m0s)|> filter(fn: (r) => r["_measurement"] == "xfer")|> filter(fn: (r) => r["_field"] == "rx" or r["_field"] == "tx")|> filter(fn: (r) => r["namespace"] == "backend")|> filter(fn: (r) => r["share"] == "7u9szn30ikh0")|> sum())
|
||||
[ 820.201] INFO zrok/controller/limits.(*shareRelaxAction).HandleShare: relaxing '7u9szn30ikh0'
|
||||
[ 820.215] INFO zrok/controller/zrokEdgeSdk.CreateServicePolicyDial: created dial service policy '4yz1WSGg04BeARMuVkmxf7' for service '6FzYnK0RFJmT0rDSP1bzVE' for identities '[rBayMvm7UI]'
|
||||
[ 820.215] INFO zrok/controller/limits.(*shareRelaxAction).HandleShare: added dial service policy for '7u9szn30ikh0'
|
||||
[ 820.219] INFO zrok/controller/limits.(*Agent).relax: share '53z6mz4re7tu' still over limit
|
||||
[ 820.223] INFO zrok/controller/limits.(*Agent).relax: share 's0uzz1p7xjrr' still over limit
|
||||
[ 820.227] INFO zrok/controller/limits.(*Agent).relax: share 'tr7vpyrzvmh0' still over limit
|
||||
[ 820.231] INFO zrok/controller/limits.(*Agent).relax: share 'dh3f3jj7zhig' still over limit
|
||||
[ 820.236] INFO zrok/controller/limits.(*Agent).relax: share '8k6dnu7x7ag0' still over limit
|
||||
[ 820.240] INFO zrok/controller/limits.(*Agent).relax: share '0evcupz5k410' still over limit
|
||||
[ 830.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: ESgSh4i0r backend {rx: 61.6 kB, tx: 61.9 kB} frontend {rx: 61.9 kB, tx: 61.6 kB}
|
||||
[ 840.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: ESgSh4i0r backend {rx: 61.4 kB, tx: 61.7 kB} frontend {rx: 61.7 kB, tx: 61.4 kB}
|
||||
[ 850.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: ESgSh4i0r backend {rx: 30.4 kB, tx: 30.7 kB} frontend {rx: 30.7 kB, tx: 30.4 kB}
|
||||
[ 860.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: ESgSh4i0r backend {rx: 52.6 kB, tx: 53.0 kB} frontend {rx: 53.0 kB, tx: 52.6 kB}
|
||||
[ 870.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: ESgSh4i0r backend {rx: 42.2 kB, tx: 42.6 kB} frontend {rx: 42.6 kB, tx: 42.2 kB}
|
||||
[ 880.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: ESgSh4i0r backend {rx: 27.1 kB, tx: 27.4 kB} frontend {rx: 27.4 kB, tx: 27.1 kB}
|
||||
[ 890.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: ESgSh4i0r backend {rx: 49.9 kB, tx: 50.3 kB} frontend {rx: 50.3 kB, tx: 49.9 kB}
|
||||
[ 900.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: ESgSh4i0r backend {rx: 51.5 kB, tx: 51.8 kB} frontend {rx: 51.8 kB, tx: 51.5 kB}
|
||||
[ 910.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: ESgSh4i0r backend {rx: 44.0 kB, tx: 44.5 kB} frontend {rx: 44.5 kB, tx: 44.0 kB}
|
||||
[ 920.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: ESgSh4i0r backend {rx: 43.5 kB, tx: 43.8 kB} frontend {rx: 43.8 kB, tx: 43.5 kB}
|
||||
[ 930.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: ESgSh4i0r backend {rx: 61.3 kB, tx: 61.7 kB} frontend {rx: 61.7 kB, tx: 61.3 kB}
|
||||
[ 930.177] INFO zrok/controller/limits.(*shareWarningAction).HandleShare: warning '7u9szn30ikh0'
|
||||
[ 931.057] INFO zrok/controller/limits.sendLimitWarningEmail: limit warning email sent to 'michael@quigley.com'
|
||||
[ 940.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: ESgSh4i0r backend {rx: 30.2 kB, tx: 30.5 kB} frontend {rx: 30.5 kB, tx: 30.2 kB}
|
||||
[ 950.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: ESgSh4i0r backend {rx: 56.2 kB, tx: 56.6 kB} frontend {rx: 56.6 kB, tx: 56.2 kB}
|
||||
[ 960.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: ESgSh4i0r backend {rx: 73.1 kB, tx: 73.6 kB} frontend {rx: 73.6 kB, tx: 73.1 kB}
|
||||
[ 970.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: ESgSh4i0r backend {rx: 35.1 kB, tx: 35.4 kB} frontend {rx: 35.4 kB, tx: 35.1 kB}
|
||||
[ 980.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: ESgSh4i0r backend {rx: 63.6 kB, tx: 64.0 kB} frontend {rx: 64.0 kB, tx: 63.6 kB}
|
||||
[ 990.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: ESgSh4i0r backend {rx: 46.6 kB, tx: 47.0 kB} frontend {rx: 47.0 kB, tx: 46.6 kB}
|
||||
[1000.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: ESgSh4i0r backend {rx: 36.8 kB, tx: 37.3 kB} frontend {rx: 37.3 kB, tx: 36.8 kB}
|
||||
[1010.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: ESgSh4i0r backend {rx: 24.5 kB, tx: 24.9 kB} frontend {rx: 24.9 kB, tx: 24.5 kB}
|
||||
[1020.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: ESgSh4i0r backend {rx: 47.3 kB, tx: 47.7 kB} frontend {rx: 47.7 kB, tx: 47.3 kB}
|
||||
[1030.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: ESgSh4i0r backend {rx: 29.6 kB, tx: 29.9 kB} frontend {rx: 29.9 kB, tx: 29.6 kB}
|
||||
[1040.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: ESgSh4i0r backend {rx: 48.7 kB, tx: 49.1 kB} frontend {rx: 49.1 kB, tx: 48.7 kB}
|
||||
[1050.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 7u9szn30ikh0, circuit: ESgSh4i0r backend {rx: 41.8 kB, tx: 42.0 kB} frontend {rx: 42.0 kB, tx: 41.8 kB}
|
||||
[1050.284] INFO zrok/controller/limits.(*shareLimitAction).HandleShare: limiting '7u9szn30ikh0'
|
||||
[1050.300] INFO zrok/controller/zrokEdgeSdk.DeleteServicePolicy: deleted service policy '4yz1WSGg04BeARMuVkmxf7' for environment 'd.wJYlpt9'
|
||||
[1050.300] INFO zrok/controller/limits.(*shareLimitAction).HandleShare: removed dial service policy for '7u9szn30ikh0'
|
||||
[1110.301] INFO zrok/controller/limits.(*Agent).relax: relaxing
|
||||
[1110.307] ERROR zrok/controller/limits.(*Agent).checkShareLimit: expected 2 results; got '0' (from(bucket: "zrok")|> range(start: -5m0s)|> filter(fn: (r) => r["_measurement"] == "xfer")|> filter(fn: (r) => r["_field"] == "rx" or r["_field"] == "tx")|> filter(fn: (r) => r["namespace"] == "backend")|> filter(fn: (r) => r["share"] == "53z6mz4re7tu")|> sum())
|
||||
[1110.307] INFO zrok/controller/limits.(*shareRelaxAction).HandleShare: relaxing '53z6mz4re7tu'
|
||||
[1110.321] INFO zrok/controller/zrokEdgeSdk.CreateServicePolicyDial: created dial service policy 'WxOiC60VDWvHHlbtcaJ6D' for service '2NiotGOyBHBEbFZwbTFJ2u' for identities '[rBayMvm7UI]'
|
||||
[1110.321] INFO zrok/controller/limits.(*shareRelaxAction).HandleShare: added dial service policy for '53z6mz4re7tu'
|
||||
[1110.325] ERROR zrok/controller/limits.(*Agent).checkShareLimit: expected 2 results; got '0' (from(bucket: "zrok")|> range(start: -5m0s)|> filter(fn: (r) => r["_measurement"] == "xfer")|> filter(fn: (r) => r["_field"] == "rx" or r["_field"] == "tx")|> filter(fn: (r) => r["namespace"] == "backend")|> filter(fn: (r) => r["share"] == "s0uzz1p7xjrr")|> sum())
|
||||
[1110.325] INFO zrok/controller/limits.(*shareRelaxAction).HandleShare: relaxing 's0uzz1p7xjrr'
|
||||
[1110.327] INFO zrok/controller/zrokEdgeSdk.CreateServicePolicyDial: created dial service policy '2ubWYvKo2EOnrn1U4MQ4Cu' for service 'KtK5E46HR93YIBrrwUlIN' for identities '[rBayMvm7UI]'
|
||||
[1110.327] INFO zrok/controller/limits.(*shareRelaxAction).HandleShare: added dial service policy for 's0uzz1p7xjrr'
|
||||
[1110.331] ERROR zrok/controller/limits.(*Agent).checkShareLimit: expected 2 results; got '0' (from(bucket: "zrok")|> range(start: -5m0s)|> filter(fn: (r) => r["_measurement"] == "xfer")|> filter(fn: (r) => r["_field"] == "rx" or r["_field"] == "tx")|> filter(fn: (r) => r["namespace"] == "backend")|> filter(fn: (r) => r["share"] == "tr7vpyrzvmh0")|> sum())
|
||||
[1110.331] INFO zrok/controller/limits.(*shareRelaxAction).HandleShare: relaxing 'tr7vpyrzvmh0'
|
||||
[1110.343] INFO zrok/controller/zrokEdgeSdk.CreateServicePolicyDial: created dial service policy '1Q2DMHZ9AFsBA8D2SNzC4l' for service '7jyiTZ0z2ediD5hZbxu7KH' for identities '[rBayMvm7UI]'
|
||||
[1110.343] INFO zrok/controller/limits.(*shareRelaxAction).HandleShare: added dial service policy for 'tr7vpyrzvmh0'
|
||||
[1110.348] ERROR zrok/controller/limits.(*Agent).checkShareLimit: expected 2 results; got '0' (from(bucket: "zrok")|> range(start: -5m0s)|> filter(fn: (r) => r["_measurement"] == "xfer")|> filter(fn: (r) => r["_field"] == "rx" or r["_field"] == "tx")|> filter(fn: (r) => r["namespace"] == "backend")|> filter(fn: (r) => r["share"] == "dh3f3jj7zhig")|> sum())
|
||||
[1110.349] INFO zrok/controller/limits.(*shareRelaxAction).HandleShare: relaxing 'dh3f3jj7zhig'
|
||||
[1110.351] INFO zrok/controller/zrokEdgeSdk.CreateServicePolicyDial: created dial service policy 'BrG9wKvUsajfhPkVfz44g' for service 'nyKOLlxUWWbCzD7h9Jhjq' for identities '[rBayMvm7UI]'
|
||||
[1110.351] INFO zrok/controller/limits.(*shareRelaxAction).HandleShare: added dial service policy for 'dh3f3jj7zhig'
|
||||
[1110.356] ERROR zrok/controller/limits.(*Agent).checkShareLimit: expected 2 results; got '0' (from(bucket: "zrok")|> range(start: -5m0s)|> filter(fn: (r) => r["_measurement"] == "xfer")|> filter(fn: (r) => r["_field"] == "rx" or r["_field"] == "tx")|> filter(fn: (r) => r["namespace"] == "backend")|> filter(fn: (r) => r["share"] == "8k6dnu7x7ag0")|> sum())
|
||||
[1110.356] INFO zrok/controller/limits.(*shareRelaxAction).HandleShare: relaxing '8k6dnu7x7ag0'
|
||||
[1110.364] INFO zrok/controller/zrokEdgeSdk.CreateServicePolicyDial: created dial service policy '1kbYWDgPbtk0JYjIPsRGOC' for service '2J0I9dPe2JGnY1GwjmM6n7' for identities '[rBayMvm7UI]'
|
||||
[1110.364] INFO zrok/controller/limits.(*shareRelaxAction).HandleShare: added dial service policy for '8k6dnu7x7ag0'
|
||||
[1110.372] ERROR zrok/controller/limits.(*Agent).checkShareLimit: expected 2 results; got '0' (from(bucket: "zrok")|> range(start: -5m0s)|> filter(fn: (r) => r["_measurement"] == "xfer")|> filter(fn: (r) => r["_field"] == "rx" or r["_field"] == "tx")|> filter(fn: (r) => r["namespace"] == "backend")|> filter(fn: (r) => r["share"] == "0evcupz5k410")|> sum())
|
||||
[1110.372] INFO zrok/controller/limits.(*shareRelaxAction).HandleShare: relaxing '0evcupz5k410'
|
||||
[1110.374] INFO zrok/controller/zrokEdgeSdk.CreateServicePolicyDial: created dial service policy 'E30643mY9M6vU6bQSQHa9' for service '3WHJGqUdxkDtPYLgEL5V3q' for identities '[rBayMvm7UI]'
|
||||
[1110.374] INFO zrok/controller/limits.(*shareRelaxAction).HandleShare: added dial service policy for '0evcupz5k410'
|
||||
[1110.378] INFO zrok/controller/limits.(*Agent).relax: share '7u9szn30ikh0' still over limit
|
||||
[1115.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: gaSGp4i0r backend {rx: 3.4 kB, tx: 3.4 kB} frontend {rx: 3.4 kB, tx: 3.4 kB}
|
||||
[1120.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: gaSGp4i0r backend {rx: 26.5 kB, tx: 26.7 kB} frontend {rx: 26.7 kB, tx: 26.5 kB}
|
||||
[1120.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: nESTh4iur backend {rx: 65.6 kB, tx: 66.1 kB} frontend {rx: 66.1 kB, tx: 65.6 kB}
|
||||
[1120.169] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: GGiTp4S0w backend {rx: 53.5 kB, tx: 54.0 kB} frontend {rx: 54.0 kB, tx: 53.5 kB}
|
||||
[1125.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: gaSGp4i0r backend {rx: 43.7 kB, tx: 44.1 kB} frontend {rx: 44.1 kB, tx: 43.7 kB}
|
||||
[1125.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: fSiGh4iur backend {rx: 17.8 kB, tx: 18.0 kB} frontend {rx: 18.0 kB, tx: 17.8 kB}
|
||||
[1125.169] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 0evcupz5k410, circuit: k4SGhVSuw backend {rx: 51.9 kB, tx: 52.3 kB} frontend {rx: 52.3 kB, tx: 51.9 kB}
|
||||
[1130.163] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: gaSGp4i0r backend {rx: 50.9 kB, tx: 51.2 kB} frontend {rx: 51.2 kB, tx: 50.9 kB}
|
||||
[1130.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: GGiTp4S0w backend {rx: 48.6 kB, tx: 49.0 kB} frontend {rx: 49.0 kB, tx: 48.6 kB}
|
||||
[1130.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: fSiGh4iur backend {rx: 37.8 kB, tx: 38.0 kB} frontend {rx: 38.0 kB, tx: 37.8 kB}
|
||||
[1135.164] INFO zrok/controller/metrics.(*influxWriter).Handle: share: tr7vpyrzvmh0, circuit: gaSGp4i0r backend {rx: 57.6 kB, tx: 58.1 kB} frontend {rx: 58.1 kB, tx: 57.6 kB}
|
||||
[1135.166] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: fSiGh4iur backend {rx: 43.6 kB, tx: 44.1 kB} frontend {rx: 44.1 kB, tx: 43.6 kB}
|
||||
[1135.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: GGiTp4S0w backend {rx: 51.0 kB, tx: 51.4 kB} frontend {rx: 51.4 kB, tx: 51.0 kB}
|
||||
[1140.165] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 8k6dnu7x7ag0, circuit: nESTh4iur backend {rx: 28.4 kB, tx: 28.6 kB} frontend {rx: 28.6 kB, tx: 28.4 kB}
|
||||
[1140.167] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 53z6mz4re7tu, circuit: fSiGh4iur backend {rx: 31.6 kB, tx: 32.0 kB} frontend {rx: 32.0 kB, tx: 31.6 kB}
|
||||
[1140.169] INFO zrok/controller/metrics.(*influxWriter).Handle: share: s0uzz1p7xjrr, circuit: GGiTp4S0w backend {rx: 23.8 kB, tx: 24.2 kB} frontend {rx: 24.2 kB, tx: 23.8 kB}
|
||||
[1141.514] INFO zrok/controller/zrokEdgeSdk.DeleteServiceEdgeRouterPolicy: deleted service edge router policy '2RIKOBMOckfbI2xMSLAKxC' for environment 'd.wJYlpt9'
|
||||
[1141.517] INFO zrok/controller/zrokEdgeSdk.DeleteServicePolicy: deleted service policy '1kbYWDgPbtk0JYjIPsRGOC' for environment 'd.wJYlpt9'
|
||||
[1141.519] INFO zrok/controller/zrokEdgeSdk.DeleteServicePolicy: deleted service policy '4vT5eEPahgWEVdAuKN91Sd' for environment 'd.wJYlpt9'
|
||||
[1141.521] INFO zrok/controller/zrokEdgeSdk.DeleteConfig: deleted config '5nG9jM8VNl0uBFcRRt3AvI' for 'd.wJYlpt9'
|
||||
[1141.522] INFO zrok/controller/zrokEdgeSdk.DeleteService: deleted service '2J0I9dPe2JGnY1GwjmM6n7' for environment 'd.wJYlpt9'
|
||||
[1141.599] INFO zrok/controller/zrokEdgeSdk.DeleteServiceEdgeRouterPolicy: deleted service edge router policy '2CM03d1cNpG4rma38BLzCQ' for environment 'd.wJYlpt9'
|
||||
[1141.602] INFO zrok/controller/zrokEdgeSdk.DeleteServicePolicy: deleted service policy 'WxOiC60VDWvHHlbtcaJ6D' for environment 'd.wJYlpt9'
|
||||
[1141.635] INFO zrok/controller/zrokEdgeSdk.DeleteServicePolicy: deleted service policy 'RRfDaA5kjCqUBVC9LvN1H' for environment 'd.wJYlpt9'
|
||||
[1141.639] INFO zrok/controller/zrokEdgeSdk.DeleteConfig: deleted config '6U3XDGnBjtONN5H6pUze12' for 'd.wJYlpt9'
|
||||
[1141.645] INFO zrok/controller/zrokEdgeSdk.DeleteService: deleted service '2NiotGOyBHBEbFZwbTFJ2u' for environment 'd.wJYlpt9'
|
||||
[1141.701] INFO zrok/controller/zrokEdgeSdk.DeleteServiceEdgeRouterPolicy: deleted service edge router policy '2ZnnIXSTQ3Zscha1kykqQr' for environment 'd.wJYlpt9'
|
||||
[1141.704] INFO zrok/controller/zrokEdgeSdk.DeleteServicePolicy: deleted service policy 'BrG9wKvUsajfhPkVfz44g' for environment 'd.wJYlpt9'
|
||||
[1141.706] INFO zrok/controller/zrokEdgeSdk.DeleteServicePolicy: deleted service policy '1xF4ky6cDJm63tzlNTqoLC' for environment 'd.wJYlpt9'
|
||||
[1141.707] INFO zrok/controller/zrokEdgeSdk.DeleteConfig: deleted config '76iBDASRcxOmGtdwjVHo26' for 'd.wJYlpt9'
|
||||
[1141.708] INFO zrok/controller/zrokEdgeSdk.DeleteService: deleted service 'nyKOLlxUWWbCzD7h9Jhjq' for environment 'd.wJYlpt9'
|
||||
[1141.926] INFO zrok/controller/zrokEdgeSdk.DeleteServiceEdgeRouterPolicy: deleted service edge router policy '3xAG26zA9yska3LeZQUJ3N' for environment 'd.wJYlpt9'
|
||||
[1141.927] INFO zrok/controller/zrokEdgeSdk.DeleteServicePolicy: did not find a service policy
|
||||
[1141.929] INFO zrok/controller/zrokEdgeSdk.DeleteServicePolicy: deleted service policy '1mabRt9jefSe52CJh6FmhB' for environment 'd.wJYlpt9'
|
||||
[1141.931] INFO zrok/controller/zrokEdgeSdk.DeleteConfig: deleted config '2gid15nP0GIUVuaFQ15GWV' for 'd.wJYlpt9'
|
||||
[1141.932] INFO zrok/controller/zrokEdgeSdk.DeleteService: deleted service '6FzYnK0RFJmT0rDSP1bzVE' for environment 'd.wJYlpt9'
|
||||
[1142.053] INFO zrok/controller/zrokEdgeSdk.DeleteServiceEdgeRouterPolicy: deleted service edge router policy '2nMZaiChQAPpFnblNn1ljP' for environment 'd.wJYlpt9'
|
||||
[1142.056] INFO zrok/controller/zrokEdgeSdk.DeleteServicePolicy: deleted service policy '1Q2DMHZ9AFsBA8D2SNzC4l' for environment 'd.wJYlpt9'
|
||||
[1142.058] INFO zrok/controller/zrokEdgeSdk.DeleteServicePolicy: deleted service policy '6RwWEoIsb8gBVKJfZP3ur3' for environment 'd.wJYlpt9'
|
||||
[1142.064] INFO zrok/controller/zrokEdgeSdk.DeleteConfig: deleted config '1FnBhnGNXDe58dwTpbFc1x' for 'd.wJYlpt9'
|
||||
[1142.066] INFO zrok/controller/zrokEdgeSdk.DeleteService: deleted service '7jyiTZ0z2ediD5hZbxu7KH' for environment 'd.wJYlpt9'
|
||||
[1142.320] INFO zrok/controller/zrokEdgeSdk.DeleteServiceEdgeRouterPolicy: deleted service edge router policy '2AqCUMqNtarmglOfhvnkI' for environment 'd.wJYlpt9'
|
||||
[1142.324] INFO zrok/controller/zrokEdgeSdk.DeleteServicePolicy: deleted service policy 'E30643mY9M6vU6bQSQHa9' for environment 'd.wJYlpt9'
|
||||
[1142.326] INFO zrok/controller/zrokEdgeSdk.DeleteServicePolicy: deleted service policy '4V8FsgCt63ySkG2pFWG5fz' for environment 'd.wJYlpt9'
|
||||
[1142.329] INFO zrok/controller/zrokEdgeSdk.DeleteConfig: deleted config '19cyxfHo32R6fhVsYHZ84g' for 'd.wJYlpt9'
|
||||
[1142.330] INFO zrok/controller/zrokEdgeSdk.DeleteService: deleted service '3WHJGqUdxkDtPYLgEL5V3q' for environment 'd.wJYlpt9'
|
||||
[1142.701] INFO zrok/controller/zrokEdgeSdk.DeleteServiceEdgeRouterPolicy: deleted service edge router policy '2CGCz8dcquNvZC0ZUwDZ5F' for environment 'd.wJYlpt9'
|
||||
[1142.704] INFO zrok/controller/zrokEdgeSdk.DeleteServicePolicy: deleted service policy '2ubWYvKo2EOnrn1U4MQ4Cu' for environment 'd.wJYlpt9'
|
||||
[1142.708] INFO zrok/controller/zrokEdgeSdk.DeleteServicePolicy: deleted service policy '6oohOQFEo75yl9vnIbyzdj' for environment 'd.wJYlpt9'
|
||||
[1142.709] INFO zrok/controller/zrokEdgeSdk.DeleteConfig: deleted config '4AN4sOtdQv99uHmFn3erx4' for 'd.wJYlpt9'
|
||||
[1142.710] INFO zrok/controller/zrokEdgeSdk.DeleteService: deleted service 'KtK5E46HR93YIBrrwUlIN' for environment 'd.wJYlpt9'
|
||||
```
|
@ -0,0 +1,5 @@
|
||||
|
||||
- `proxy` mode forwards requests received by the frontend to the target server ([more](/concepts/http.md))
|
||||
- `web` mode serves a target folder as a file index web page ([more](/concepts/files.md))
|
||||
- `drive` mode serves a target folder with WebDAV ([guide](/guides/drives.mdx))
|
||||
- `caddy` mode runs the built-in Caddy server with the targeted Caddyfile ([example](pathname:///simple_reverse_proxy.Caddyfile))
|
@ -0,0 +1,8 @@
|
||||
{
|
||||
"label": "Concepts",
|
||||
"position": 30,
|
||||
"link": {
|
||||
"type": "doc",
|
||||
"id": "concepts/index"
|
||||
}
|
||||
}
|
52
website/versioned_docs/version-0.4/concepts/files.md
Normal file
@ -0,0 +1,52 @@
|
||||
---
|
||||
title: Sharing Websites and Files
|
||||
sidebar_position: 30
|
||||
---
|
||||
|
||||
With `zrok` it is possible to share files quickly and easily as well. To share files using `zrok` use
|
||||
the `--backend-mode web`, for example: `zrok share private . --backend-mode web`.
|
||||
|
||||
Running with this mode will make it trivially easy to share files from the directory which the command
|
||||
was run from.
|
||||
|
||||
For example if you have a directory with a structure like this:
|
||||
|
||||
```shell
|
||||
-rw-r--r--+ 1 Michael None 7090 Apr 17 12:53 CHANGELOG.md
|
||||
-rw-r--r--+ 1 Michael None 11346 Apr 17 12:53 LICENSE
|
||||
-rw-r--r--+ 1 Michael None 2885 Apr 17 12:53 README.md
|
||||
-rwxr-xr-x+ 1 Michael None 44250624 Apr 17 13:00 zrok.exe*
|
||||
```
|
||||
|
||||
The files can be shared using a command such as:
|
||||
|
||||
```shell
|
||||
zrok share public --backend-mode web .
|
||||
```
|
||||
|
||||
Then the files can be access with a `private` or `public` share, for example as shown:
|
||||
|
||||

|
||||
|
||||
`zrok` will automatically provide a stock website, which will allow the accessing user to browse and navigate the file tree. Clicking the files allows the user to download them.
|
||||
|
||||
`zrok` can also share a pre-rendered static HTML website. If you have a directory like this:
|
||||
|
||||
```shell
|
||||
-rw-rw-r--+ 1 Michael None 56 Jun 26 13:23 index.html
|
||||
```
|
||||
|
||||
If `index.html` contains valid HTML, like this:
|
||||
|
||||
```html
|
||||
<html>
|
||||
<body>
|
||||
<h1>Hello <code>zrok</code></h1>
|
||||
</html>
|
||||
```
|
||||
|
||||
Sharing the directory will result in the following when you access the share in a web browser:
|
||||
|
||||

|
||||
|
||||
`zrok` contains a built-in web server, which you can use to serve static websites as a share.
|
16
website/versioned_docs/version-0.4/concepts/hosting.md
Normal file
@ -0,0 +1,16 @@
|
||||
---
|
||||
sidebar_position: 200
|
||||
---
|
||||
|
||||
# Hosting
|
||||
|
||||
## Self-Hosted
|
||||
|
||||
`zrok` is not limited to a managed offering. You can [host your own](/guides/self-hosting/linux/index.mdx) instance of `zrok` as well. `zrok` is
|
||||
also freely available as open source software hosted by GitHub under a very permissive Apache v2 license.
|
||||
|
||||
## Managed Service
|
||||
|
||||
`zrok` is also offered as a cloud service, making it instantly accessible to a large population immediately.
|
||||
NetFoundry provides a manged version of `zrok` at https://zrok.io. This provides the easy-to-use,
|
||||
quick to demonstrate features of `zrok` without needing to deploy and host `zrok` yourself.
|
32
website/versioned_docs/version-0.4/concepts/http.md
Normal file
@ -0,0 +1,32 @@
|
||||
---
|
||||
sidebar_position: 22
|
||||
---
|
||||
|
||||
# Sharing HTTP Servers
|
||||
|
||||
`zrok` can share HTTP and HTTPS resources natively. If you have an existing web server that you want to share with other users, you can use the `zrok share` command using the `--backend-mode proxy` flag.
|
||||
|
||||
The `--backend-mode proxy` is the default backend mode, so if you do not specify a `--backend-mode` you will get the `proxy` mode by default.
|
||||
|
||||
If you have a web server running on `localhost` that you want to expose to other users using `zrok`, you can execute a command like the following:
|
||||
|
||||
```
|
||||
$ zrok share public localhost:8080
|
||||
```
|
||||
When you execute this command, you'll get a `zrok` bridge like the following:
|
||||
|
||||
```
|
||||
╭───────────────────────────────────────────────────────────────╮╭────────────────╮
|
||||
│ http://cht7gj4g5pjf.share.zrok.io ││[PUBLIC] [PROXY]│
|
||||
╰───────────────────────────────────────────────────────────────╯╰────────────────╯
|
||||
╭─────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰─────────────────────────────────────────────────────────────────────────────────╯
|
||||
```
|
||||
|
||||
The URL shown at the top of the bridge shows the address where you can access your `public` share.
|
||||
|
||||
Hit `CTRL-C` or `q` in the bridge to exit it and delete the `public` share.
|
13
website/versioned_docs/version-0.4/concepts/index.md
Normal file
@ -0,0 +1,13 @@
|
||||
---
|
||||
sidebar_title: Core Features
|
||||
sidebar_position: 25
|
||||
---
|
||||
|
||||
# Concepts
|
||||
|
||||
`zrok` was designed to make sharing local resources both secure and easy. In this section of the `zrok` documentation, we'll tour through all of the most important features.
|
||||
|
||||
Sharing with `zrok` can be either [`public`](./sharing-public.mdx) or [`private`](./sharing-private.mdx).
|
||||
Naturally, regular web-based resources can be shared but `zrok` also includes support for sharing raw [TCP](./tunnels.md) and [UDP](./tunnels.md) network connections, and also includes a [website and file sharing](./files.md) feature.
|
||||
|
||||
Learn about `zrok` [hosting here](./hosting.md), including instructions on how to [install your own `zrok` instance](/guides/self-hosting/linux/index.mdx).
|
24
website/versioned_docs/version-0.4/concepts/opensource.md
Normal file
@ -0,0 +1,24 @@
|
||||
---
|
||||
sidebar_position: 100
|
||||
---
|
||||
|
||||
# Open Source
|
||||
|
||||
It's important to the `zrok` project that it remain free and open source software. The code is available on [GitHub](https://github.com/openziti/zrok)
|
||||
for the world to use, inspect, and build upon!
|
||||
|
||||
Check out the repository over on GitHub at [https://github.com/openziti/zrok](https://github.com/openziti/zrok). If you find `zrok` to be useful, and
|
||||
you want to help spread the word of `zrok` give the project a star. It really does help get the word out about the
|
||||
project.
|
||||
|
||||
The project also uses a very permissive license: Apache v2. We encourage people to fork the repo and use `zrok` for your own purposes how you see fit or contribute back to the project.
|
||||
|
||||
## Built on OpenZiti
|
||||
|
||||
The power of `zrok` really lies in `private` sharing. It's increasingly clear that security needs to be a first-class
|
||||
member of any organization. To enable `private` sharing, `zrok` was built on top of another excellent open source project named OpenZiti.
|
||||
|
||||
OpenZiti is a secure overlay network focusing on bringing zero trust to applications. It is the __backbone__ of `zrok`.
|
||||
In fact, `zrok` proudly proclaims itself as an Ziti _native_ application.
|
||||
|
||||
If you are interested in learning more about OpenZiti head over to [the docs](https://docs.openziti.io/docs/learn/introduction/), try the quickstart, and don't forget to star that project too. We couldn't build `zrok` without OpenZiti!
|
@ -0,0 +1,45 @@
|
||||
---
|
||||
sidebar_position: 0
|
||||
---
|
||||
|
||||
import BackendHttp from '/../docs/concepts/_backend_http.mdx'
|
||||
|
||||
# Private Shares
|
||||
|
||||
`zrok` was built to share and access digital resources. A `private` share allows a resource to be
|
||||
accessed on another user's system as if it were local to them. Privately shared resources can only be accessed by another `zrok` user who has the details of your unique share. You are in control of who can access your `private` shares by sharing the share token.
|
||||
|
||||
Peer-to-peer private resource sharing is one of the things that makes `zrok` unique.
|
||||
|
||||
`zrok` also provides `public` sharing of resources with non-`zrok` users. Public resource sharing is limited to only resources that can be accessed over `HTTP` or `HTTPS`. `private` sharing works with all of the resources types that `zrok` supports.
|
||||
|
||||
Here's how private sharing works:
|
||||
|
||||
## Peer to Peer
|
||||
|
||||

|
||||
|
||||
`private` shares are accessed using the `zrok access` command, and require the accessing user to have a `zrok enable`-d account on the same service instance where the share was created.
|
||||
|
||||
The `private` share is identified by a _share token_. The accessing user will use the share token, along with the `zrok access` command to create a local endpoint on their system, which lets them use the shared resource as if it were local to their system.
|
||||
|
||||
`zrok` does not require you to open any firewall ports or otherwise compromise the security of your local system; there is never an attack surface open to the public internet. As soon as you terminate the `zrok share` process, you immediately terminate any possible access to your shared resource.
|
||||
|
||||
The shared resource can be a development web server to share with friends and colleagues, a webhook from a server running in the cloud which has `zrok` running and has been instructed to `access` the private resource. `zrok` can also share files, websites, and low-level TCP and UDP network connections using the `tunnel` backend. What matters is that the access to the shared resource is not done in a public way, and can only be accessed by other `zrok` users that have access to your share token.
|
||||
|
||||
The peer-to-peer capabilities of `zrok` are an important property of the underlying [OpenZiti](https://docs.openziti.io/docs/learn/introduction/) network that `zrok` uses to provide connectivity between users and resources.
|
||||
|
||||
Creating `private` shares is easy and is accomplished using the `zrok share private` command. Run `zrok share private` to see the usage output and to further learn how to use the command.
|
||||
|
||||
## Private Backend Modes
|
||||
|
||||
The default backend mode is `proxy` which targets an HTTP URL that must be reachable by the backend.
|
||||
|
||||
```bash title="proxy example"
|
||||
zrok share private 80
|
||||
```
|
||||
|
||||
<BackendHttp/>
|
||||
- `tcpTunnel`, `udpTunnel` modes forward the data payload to the target server ([more](/concepts/tunnels.md))
|
||||
- `socks` mode provides a SOCKS5 dynamic proxy on the private access bind port that tunnels TCP payloads to the share backend where they are forwarded to their destinations ([blog](https://blog.openziti.io/the-zrok-socks-backend))
|
||||
- `vpn` mode provides a network layer tunnel between the private access and the share backend ([guide](guides/vpn/vpn.md))
|
@ -0,0 +1,29 @@
|
||||
---
|
||||
sidebar_position: 10
|
||||
---
|
||||
|
||||
import BackendHttp from '/../docs/concepts/_backend_http.mdx'
|
||||
|
||||
# Public Shares
|
||||
|
||||
`zrok` supports `public` sharing for web-based (HTTP and HTTPS) resources. These resources are easily shared with the general internet through public access points.
|
||||
|
||||
## Peer to Public
|
||||
|
||||

|
||||
|
||||
`public` sharing is most useful when the person or service accessing your resources does not have `zrok` running locally and cannot make use of the `private` sharing mode built into `zrok`. Many users share development web servers, webhooks, and other HTTP/HTTPS resources.
|
||||
|
||||
As with `private` sharing, `public` sharing does not require you to open any firewall ports or otherwise compromise the security of your local environments. A `public` share goes away as soon as you terminate the `zrok share` command.
|
||||
|
||||
Using `public` shares is easy and is accomplished using the `zrok share public` command. Run `zrok share public` to see the command-line help and to learn how to use `public` shares.
|
||||
|
||||
## Public Backend Modes
|
||||
|
||||
The default backend mode is `proxy` which targets an HTTP URL that must be reachable by the backend.
|
||||
|
||||
```bash title="proxy example"
|
||||
zrok share public 80
|
||||
```
|
||||
|
||||
<BackendHttp/>
|
@ -0,0 +1,31 @@
|
||||
---
|
||||
sidebar_position: 10
|
||||
---
|
||||
|
||||
# Reserved Shares
|
||||
|
||||
By default, a `public` or `private` share is assigned a _share token_ when you create a share using the `zrok share` command. The `zrok share` command is the bridge between your local environment and the users you are sharing with. When you terminate the `zrok share`, the bridge is eliminated and the _share token_ is deleted. If you run `zrok share` again, you will be allocated a brand new _share token_.
|
||||
|
||||
You can use a `reserved` share to persist your _share token_ across multiple runs of the `zrok share` bridge. When you use a `reserved` share, the share token will not be deleted between multiple runs of `zrok share`.
|
||||
|
||||
To use a `reserved` share, you will first run the `zrok reserve` command to create the reserved share (see `zrok reserve --help` for details). Once you've created your `reserved` share, you will use the `zrok share reserved` command (see `--help` for details) to run the bridge for the shared resource.
|
||||
|
||||
This pattern works for both `public` and `private` shares, and for all resource types supported by `zrok`.
|
||||
|
||||
To delete your `reserved` share use the `zrok release` command or click the delete button in the share's _Actions_ tab in the web console.
|
||||
|
||||
## Unique Names
|
||||
|
||||
The default is to generate a random _share token_ and you may specify a _unique name_.
|
||||
|
||||
This reserves public share token "myshare."
|
||||
|
||||
```bash title="Reserve with the Command Line"
|
||||
zrok reserve public 80 --unique-name "myshare"
|
||||
```
|
||||
|
||||
This shares `127.0.0.1:80` as `https://myshare.zrok.example.com` where `https://{token}.zrok.example.com` is the frontend's template.
|
||||
|
||||
```bash title="Share a Reserved Token"
|
||||
zrok share reserved "myshare"
|
||||
```
|
85
website/versioned_docs/version-0.4/concepts/tunnels.md
Normal file
@ -0,0 +1,85 @@
|
||||
---
|
||||
sidebar_position: 25
|
||||
---
|
||||
|
||||
# Sharing TCP and UDP Servers
|
||||
|
||||
`zrok` includes support for sharing low-level TCP and UDP network resources using the `tcpTunnel` and `udpTunnel` backend modes.
|
||||
|
||||
As of version `v0.4`, `zrok` supports sharing TCP and UDP network resources using `private` sharing.
|
||||
|
||||
To share a raw network resource using `zrok`, you'll want to use the `zrok share private` command from your `enable`-d environment, like this:
|
||||
|
||||
```
|
||||
$ zrok share private --backend-mode tcpTunnel 192.168.9.1:22
|
||||
```
|
||||
|
||||
This will result in a share client starting, which looks like this:
|
||||
|
||||
```
|
||||
╭───────────────────────────────────────────────────────────╮╭────────────────────╮
|
||||
│ access your share with: zrok access private 5adagwfl888k ││[PRIVATE][TCPTUNNEL]│
|
||||
╰───────────────────────────────────────────────────────────╯╰────────────────────╯
|
||||
╭─────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰─────────────────────────────────────────────────────────────────────────────────╯
|
||||
```
|
||||
|
||||
Then on the system where you want to access your shared resource (an SSH endpoint in this case), you'll need an `enable`-d `zrok` environment. Run the following command (shown in the banner at the top of the `zrok share` client above):
|
||||
|
||||
```
|
||||
$ zrok access private 5adagwfl888k
|
||||
```
|
||||
|
||||
This will start an `access` client on this system:
|
||||
```
|
||||
╭─────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ tcp://127.0.0.1:9191 -> 5adagwfl888k │
|
||||
╰─────────────────────────────────────────────────────────────────────────────────╯
|
||||
╭─────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰─────────────────────────────────────────────────────────────────────────────────╯
|
||||
```
|
||||
|
||||
The `access` client shows the endpoint at the top where the service can be accessed. In this case, you'll want to connect your SSH client to `127.0.0.1:9191`. We'll just use `nc` (netcat) to access the shared TCP port:
|
||||
```
|
||||
$ nc 127.0.0.1 9191
|
||||
SSH-2.0-OpenSSH_9.2 FreeBSD-openssh-portable-9.2.p1,1
|
||||
```
|
||||
|
||||
And both the `share` client and the `access` client show the traffic:
|
||||
|
||||
```
|
||||
╭──────────────────────────────────────────────────────────╮╭─────────────────────╮
|
||||
│ access your share with: zrok access private 5adagwfl888k ││[PRIVATE] [TCPTUNNEL]│
|
||||
╰──────────────────────────────────────────────────────────╯╰─────────────────────╯
|
||||
╭─────────────────────────────────────────────────────────────────────────────────╮
|
||||
│Friday, 23-Jun-23 15:33:10 EDT ziti-edge-router │
|
||||
│connId=2147483648, logical=ziti- │
|
||||
│sdk[router=tls:ziti-lx:3022] -> ACCEPT 192.168.9.1:22 │
|
||||
│ │
|
||||
│ │
|
||||
╰─────────────────────────────────────────────────────────────────────────────────╯
|
||||
```
|
||||
|
||||
```
|
||||
╭─────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ tcp://127.0.0.1:9191 -> 5adagwfl888k │
|
||||
╰─────────────────────────────────────────────────────────────────────────────────╯
|
||||
╭─────────────────────────────────────────────────────────────────────────────────╮
|
||||
│Friday, 23-Jun-23 15:33:10 EDT 127.0.0.1:42312 -> ACCEPT 5adagwfl888k │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰─────────────────────────────────────────────────────────────────────────────────╯
|
||||
```
|
||||
|
||||
Exit the `access` client to remove the local access to the shared TCP port. Exit the `share` client to disable further accesses to the shared resource.
|
||||
|
||||
For UDP network resources just use the `zrok share private --backend-mode udpTunnel` instead of `tcpTunnel`.
|
396
website/versioned_docs/version-0.4/getting-started.mdx
Normal file
@ -0,0 +1,396 @@
|
||||
---
|
||||
title: Getting Started
|
||||
sidebar_label: Getting Started
|
||||
sidebar_position: 10
|
||||
---
|
||||
|
||||
import { AssetsProvider } from '@site/src/components/assets-context';
|
||||
import DownloadCard from '@site/src/components/download-card';
|
||||
import DownloadCardStyles from '@site/src/css/download-card.module.css';
|
||||
|
||||
## Your Secure Internet Sharing Perimeter
|
||||
|
||||
`zrok` (*/ziːɹɒk/ ZEE-rock*) is a secure, open-source, self-hostable sharing platform that simplifies shielding and sharing network services or files.
|
||||
There's a hardened zrok-as-a-service offering available at [myzrok.io](https://myzrok.io) with a generous free tier.
|
||||
|
||||
### Your First Share
|
||||
|
||||
1. Get an account token
|
||||
<Columns className='text--center getting-started-cards' style={{marginLeft: 1}}>
|
||||
<Column style={{paddingBottom: 20}}>
|
||||
<Card shadow='tl'>
|
||||
<CardHeader>
|
||||
<h3>Hosted zrok</h3>
|
||||
</CardHeader>
|
||||
<CardBody>
|
||||
Use NetFoundry's public zrok instance.
|
||||
</CardBody>
|
||||
<CardFooter>
|
||||
<a href="https://myzrok.io/">
|
||||
<button className='button button--secondary button--block'>Get an Account</button>
|
||||
</a>
|
||||
</CardFooter>
|
||||
</Card>
|
||||
</Column>
|
||||
<Column style={{paddingBottom: 20}}>
|
||||
<Card shadow='tl'>
|
||||
<CardHeader>
|
||||
<h3>Self-Hosted zrok</h3>
|
||||
</CardHeader>
|
||||
<CardBody>
|
||||
Run a zrok instance on Linux, Docker, or Kubernetes.
|
||||
</CardBody>
|
||||
<CardFooter>
|
||||
<a href="/docs/category/self-hosting/">
|
||||
<button className='button button--secondary button--block'>Guides</button>
|
||||
</a>
|
||||
</CardFooter>
|
||||
</Card>
|
||||
</Column>
|
||||
</Columns>
|
||||
|
||||
2. [Download the zrok binary](#installing-the-zrok-command)
|
||||
3. Enable zrok for your [user environment](#enabling-your-zrok-environment)
|
||||
|
||||
```bash
|
||||
zrok enable <your_account_token>
|
||||
```
|
||||
|
||||
4. Share `http://localhost:8080`
|
||||
|
||||
```bash
|
||||
zrok share public 8080
|
||||
```
|
||||
|
||||
5. Visit the public URL displayed in your terminal
|
||||
|
||||

|
||||
|
||||
## Share Backend Modes
|
||||
|
||||
zrok shares can be public or private, with different options for backend modes, including:
|
||||
|
||||
* [Public shares](./concepts/sharing-public.mdx) for [web services](./concepts/http.md) or [files](./concepts/files.md)
|
||||
* [Private shares for web services or files](./concepts/sharing-private.mdx)
|
||||
* [TCP Tunnels](./concepts/tunnels.md)
|
||||
* [UDP Tunnels](./concepts/tunnels.md)
|
||||
* [File Drives](./guides/drives.mdx)
|
||||
* [VPN](./guides/vpn/vpn.md)
|
||||
|
||||
|
||||
## Open Source
|
||||
|
||||
`zrok` is licensed under Apache 2.0.
|
||||
|
||||
Check [the roadmap](https://github.com/orgs/openziti/projects/16) if you're thinking about the future. We would love to hear your ideas for `zrok`!
|
||||
|
||||
The best ways to engage are [Discourse](https://openziti.discourse.group/) for questions and [GitHub Issues](https://github.com/openziti/zrok/issues) for documenting problems.
|
||||
|
||||
[Read more about zrok open source](/concepts/opensource.md).
|
||||
|
||||
### Ziti native
|
||||
|
||||
`zrok` is a _Ziti Native Application_, built on the [OpenZiti](https://openziti.io) platform, and supported by the OpenZiti community and NetFoundry team.
|
||||
|
||||
## What's it for?
|
||||
|
||||
Use `zrok` to share a running service, like a web server or a network socket, or to share a directory of static files.
|
||||
|
||||
If [sharing publicly](./concepts/sharing-public.mdx), you can reserve a subdomain, enable authentication options, or both. Public shares proxy HTTPS to your service or files.
|
||||
|
||||
If [sharing privately](./concepts/sharing-private.mdx), only users with the share token can access your share. In addition to what you can share publicly, private shares can include TCP and UDP services.
|
||||
|
||||
## Installing the zrok Command
|
||||
|
||||
<AssetsProvider>
|
||||
<div className={DownloadCardStyles.downloadContainer}>
|
||||
<DownloadCard
|
||||
osName="Windows"
|
||||
osLogo="/img/logo-windows.svg"
|
||||
infoText="Binary executable"
|
||||
guideLink="/docs/guides/install/windows"
|
||||
/>
|
||||
<DownloadCard
|
||||
osName="macOS"
|
||||
osLogo="/img/logo-apple.svg"
|
||||
infoText="Binary executable"
|
||||
guideLink="/docs/guides/install/macos"
|
||||
/>
|
||||
<DownloadCard
|
||||
osName="Linux"
|
||||
osLogo="/img/logo-linux.svg"
|
||||
infoText="DEB, RPM packages"
|
||||
guideLink="/docs/guides/install/linux"
|
||||
/>
|
||||
</div>
|
||||
</AssetsProvider>
|
||||
|
||||
## Enabling Your zrok Environment
|
||||
|
||||
After you have [an account](#your-first-share), you can enable your `zrok` environment.
|
||||
|
||||
A zrok environment usually refers to an enabled device where shares and accesses can be created, .e.g., `~/.zrok` on a Unix machine. It can be a specific user's environment or a system-wide agent's environment owned by the administrator.
|
||||
|
||||
When your `zrok` account was created, the service generated a _secret token_ that identifies and authenticates in a single step. Protect your secret token as if it were a password, or an important account number; it's a _secret_, protect it.
|
||||
|
||||
When we left off you had downloaded, extracted, and configured your `zrok` environment. In order to use that environment with your account, you'll need to `enable` it. Enabling an environment generates a secure identity and the necessary underlying security policies with the OpenZiti network hosting the `zrok` service.
|
||||
|
||||
From the web console, click on your email address in the upper right corner of the header. That drop down menu contains an `Enable Your Environment` link. Click that link and a modal dialog will be shown like this:
|
||||
|
||||

|
||||
|
||||
This dialog box shows you the `zrok enable` command that you can use to enable any shell to work with your `zrok` account with a single command.
|
||||
|
||||
Let's copy that command and paste it into your shell:
|
||||
|
||||
```buttonless title="Example"
|
||||
$ zrok enable klFEoIi0QAg7
|
||||
⣻ contacting the zrok service...
|
||||
```
|
||||
|
||||
After a few seconds, the message will change and indicate that the enable operation succeeded:
|
||||
|
||||
```buttonless title="Example"
|
||||
$ zrok enable klFEoIi0QAg7
|
||||
⣻ the zrok environment was successfully enabled...
|
||||
```
|
||||
|
||||
Now, if we run a `zrok status` command, you will see the details of your environment:
|
||||
|
||||
```txt
|
||||
zrok status
|
||||
```
|
||||
|
||||
```buttonless title="Output"
|
||||
Config:
|
||||
|
||||
CONFIG VALUE SOURCE
|
||||
apiEndpoint https://api.staging.zrok.io env
|
||||
|
||||
Environment:
|
||||
|
||||
PROPERTY VALUE
|
||||
Secret Token <<SET>>
|
||||
Ziti Identity <<SET>>
|
||||
```
|
||||
|
||||
Excellent... our environment is now fully enabled.
|
||||
|
||||
If we return to the _web console_, we'll now see the new environment reflected in the explorer view:
|
||||
|
||||

|
||||
|
||||
In my case, the environment is named `michael@ziti-lx`, which is the username of my shell and the hostname of the system the shell is running on.
|
||||
|
||||
:::note
|
||||
Should you want to use a non-default name for your environment, you can pass the `-d` option to the `zrok enable` command. See `zrok enable --help` for details.
|
||||
:::
|
||||
|
||||
If you click on the environment node in the explorer in the _web console_, the details panel shown at the bottom of the page will change:
|
||||
|
||||

|
||||
|
||||
The explorer supports clicking, dragging, mouse wheel zooming, and selecting the nodes in the graph for more information (and available actions) for the selected node. If you ever get lost in the explorer, click the  _zoom to fit_ icon in the lower right corner of the explorer.
|
||||
|
||||
If we click on the `Detail` tab for our environment, we'll see something like:
|
||||
|
||||

|
||||
|
||||
:::note
|
||||
With your `zrok` account you can `zrok enable` multiple environments. This will allow you to run `zrok share` in one environment, and `zrok access` in other environments.
|
||||
:::
|
||||
|
||||
Your environment is fully ready to go. Now we can move on to the fun stuff...
|
||||
|
||||
## Sharing
|
||||
|
||||
`zrok` is designed to make sharing resources as effortless as possible, while providing a high degree of security and control.
|
||||
|
||||
### Ephemeral by Default
|
||||
|
||||
Shared resources are _ephemeral_ by default; as soon as you terminate the `zrok share` command, the entire share is removed and is no longer available to any users. Identifiers for shared resources are randomly allocated when the share is created.
|
||||
|
||||
### Public Shares and Frontends
|
||||
|
||||
Resources that are shared _publicly_ are exposed to any users on the internet who have access to the `zrok` instance's "frontend".
|
||||
|
||||
A frontend is an HTTPS listener exposed to the internet, that lets any user with your ephemeral share token access your publicly shared resources.
|
||||
|
||||
For example, I might create a public share using the `zrok share public` command, which results in my `zrok` instance exposing a URL like `https://2ptgbr8tlfvk.share.zrok.io` to access my resources.
|
||||
|
||||
In this case, my share was given the "share token" of `2ptgbr8tlfvk`. That URL can be given to any user, allowing them to immediately access the shared resources directly from my local environment, all without exposing any access to my private, secure environment. The physical network location of my environment is not exposed to anonymous consumers of my resources.
|
||||
|
||||
:::note
|
||||
Here is the `--help` output from `zrok share public`:
|
||||
|
||||
```text
|
||||
zrok share public
|
||||
```
|
||||
|
||||
```buttonless title="Output"
|
||||
Error: accepts 1 arg(s), received 0
|
||||
Usage:
|
||||
zrok share public <target> [flags]
|
||||
|
||||
Flags:
|
||||
--backend-mode string The backend mode {proxy, web, caddy, drive} (default "proxy")
|
||||
--basic-auth stringArray Basic authentication users (<username:password>,...)
|
||||
--frontends stringArray Selected frontends to use for the share (default [public])
|
||||
--headless Disable TUI and run headless
|
||||
-h, --help help for public
|
||||
--insecure Enable insecure TLS certificate validation for <target>
|
||||
|
||||
Global Flags:
|
||||
-p, --panic Panic instead of showing pretty errors
|
||||
-v, --verbose Enable verbose logging
|
||||
|
||||
[ERROR]: an error occurred (accepts 1 arg(s), received 0)
|
||||
```
|
||||
|
||||
`<target>` defines the path to the local resource that you intend to share. The form of `<target>` depends on the `--backend-mode` that you're using.
|
||||
|
||||
In the case of `--backend-mode proxy`, `<target>` should be a URL to an HTTP endpoint.
|
||||
|
||||
In the case of `--backend-mode web`, `<target>` is the path to a file on disk that serves as the "root" of the file tree to be shared.
|
||||
:::
|
||||
|
||||
If we return to the web console, we see our share in the explorer:
|
||||
|
||||

|
||||
|
||||
If we click on our new share in the explorer, we can see the share details:
|
||||

|
||||
|
||||
If we click on the _frontend endpoint_ a new browser tab opens and we see the content of our share:
|
||||

|
||||
|
||||
If we click on the environment in the explorer, we're shown all of the shares for that environment (including our new share), along with a spark line that shows the activity:
|
||||
|
||||

|
||||
|
||||
And as soon as I terminate the `zrok share` client, the resources are removed from the `zrok` environment.
|
||||
|
||||
If we try to reload the frontend endpoint in our web browser, we'll see:
|
||||
|
||||

|
||||
|
||||
[More about public shares](/concepts/sharing-public.mdx)
|
||||
|
||||
### Private Shares
|
||||
|
||||
`zrok` also provides a powerful _private_ sharing model. If I execute the following command:
|
||||
|
||||
```buttonless title="Example"
|
||||
$ zrok share private http://localhost:8080
|
||||
```
|
||||
|
||||
The `zrok` service will respond with the following:
|
||||
|
||||
```buttonless title="Output"
|
||||
access your share with: zrok access private wvszln4dyz9q
|
||||
```
|
||||
|
||||
Rather than allowing access to your service through a public frontend, a _private_ share is only exposed to the underlying OpenZiti network, and can only be accessed using the `zrok access` command.
|
||||
|
||||
The `zrok access private wvszln4dyz9q` command can be run by any `zrok` user, allowing them to create and bind a local HTTP listener, that allows for private access to your shared resources.
|
||||
|
||||
[More about private shares](/concepts/sharing-private.mdx)
|
||||
|
||||
### Proxy Backend Mode
|
||||
|
||||
Without specifying a _backend mode_, the `zrok share` command will assume that you're trying to share a `proxy` resource. A `proxy` resource is usually some private HTTP/HTTPS endpoint (like a development server, or a private application) running in your local environment. Usually such an endpoint would have no inbound connectivity except for however it is reachable from your local environment. It might be running on `localhost`, or only listening on a private LAN segment behind a firewall.
|
||||
|
||||
For these services a `proxy` share will allow those endpoints to be reached, either _publicly_ or _privately_ through the `zrok` service.
|
||||
|
||||
### Web Backend Mode
|
||||
|
||||
The `zrok share` command accepts a `--backend-mode` option. Besides `proxy`, the current `v0.3` release (as of this writing) also supports a `web` mode. The `web` mode allows you to specify a local folder on your filesystem, and instantly turns your `zrok` client into a web server, exposing your web content either _publicly_ or _privately_ without having to a configure a web server.
|
||||
|
||||
### Reserved Shares
|
||||
|
||||
`zrok` shares are _ephemeral_ unless you specifically create a "reserved" share.
|
||||
|
||||
A reserved share can be re-used multiple times; it will survive termination of the `zrok share` command, allowing for longer-lasting semi-permanent access to shared resources.
|
||||
|
||||
The first step is to create the reserved share:
|
||||
|
||||
```txt title="Example"
|
||||
$ zrok reserve public --backend-mode web v0.3_getting_started
|
||||
[ 0.275] INFO main.(*reserveCommand).run: your reserved share token is 'mltwsinym1s2'
|
||||
[ 0.275] INFO main.(*reserveCommand).run: reserved frontend endpoint: https://mltwsinym1s2.share.zrok.io
|
||||
```
|
||||
|
||||
I'm asking the `zrok` service to reserve a share with a `web` backend mode, pointing at my local `docs` folder.
|
||||
|
||||
You'll want to remember the share token (`mltwsinym1s2` in this case), and the frontend endpoint URL. If this were a _private_ reserved share, there would not be a frontend URL.
|
||||
|
||||
If we do nothing else, and then point a web browser at the frontend endpoint, we get:
|
||||
|
||||

|
||||
|
||||
This is the `404` error message returned by the `zrok` frontend. We're getting this because we haven't yet started up a `zrok share` for the service. Let's do that:
|
||||
|
||||
This command:
|
||||
|
||||
```txt title="Example"
|
||||
$ zrok share reserved mltwsinym1s2
|
||||
```
|
||||
|
||||
...results in a new share backend starting up and connecting to the existing reserved share:
|
||||
|
||||

|
||||
|
||||
And now if we refresh the frontend endpoint URL in the web browser, we'll see an index of the `docs` directory:
|
||||
|
||||

|
||||
|
||||
With the reserved share, we're free to stop and restart the `zrok share reserved` command as many times as we want, without losing the token for our share.
|
||||
|
||||
When we're done with the reserved share, we can _release_ it using this command:
|
||||
|
||||
```txt title="Example"
|
||||
$ zrok release mltwsinym1s2
|
||||
[ 0.230] INFO main.(*releaseCommand).run: reserved share 'mltwsinym1s2' released
|
||||
```
|
||||
|
||||
[More about reserved shares](/concepts/sharing-reserved.md)
|
||||
|
||||
## Concepts Review
|
||||
|
||||
In summary, `zrok` lets you easily and securely share resources with both general internet users (through _public_ sharing) and also with other `zrok` users (through _private_ sharing).
|
||||
|
||||
Here's a quick review of the `zrok` mental model and the vocabulary.
|
||||
|
||||
### Instance and Account
|
||||
|
||||
You create an _account_ with a `zrok` _instance_. Your account is identified by a username and a password, which you use to log into the _web console_. Your account also has a _secret token_, which you will use to authenticate from the `zrok` command-line to interact with the _instance_.
|
||||
|
||||
You create a new _account_ with NetFoundry's `zrok` _instance_ by subscribing in [myzrok.io](https://myzrok.io) or in a self-hosted `zrok` _instance_ by running [the `zrok invite` command](/guides/self-hosting/self-service-invite.mdx) or the `zrok admin create account` command.
|
||||
|
||||
### Environment
|
||||
|
||||
Using your _secret token_ you use the `zrok` command-line interface to create an _environment_. An _environment_ corresponds to a single command-line user on a specific _host system_.
|
||||
|
||||
You create a new _environment_ by using the `zrok enable` command.
|
||||
|
||||
### Shares
|
||||
|
||||
Once you've enabled an _environment_, you then create one or more _shares_. Shares have either a _public_ or _private_ _sharing mode_. _Shares_ share a specific type of resource using a _backend mode_. As of this writing `zrok` supports a `proxy` _backend mode_ to share local HTTP resources as a _reverse proxy_. `zrok` also supports a `web` _backend mode_ to share local file and HTML resources by enabling a basic HTTP server.
|
||||
|
||||
Every _share_ is identified by a _share token_. _Public shares_ can be accessed through either a _frontend_ instance offered through the `zrok` _instance_, or through the `zrok access` command. _Private shares_ can only be accessed through the `zrok access` command.
|
||||
|
||||
You use the `zrok share` command to create and enable _ephemeral shares_.
|
||||
|
||||
### Reserved Shares
|
||||
|
||||
`zrok` supports creating _shares_ that have a consistent _share token_ that survives restarts of the `zrok share` command. These are considered _non-ephemeral_, and is callled a _reserved share_.
|
||||
|
||||
You use the `zrok reserve` command to create _reserved shares_. Reserved shares last until you use the `zrok release` command to delete them.
|
||||
|
||||
## Self-Hosting an Instance
|
||||
|
||||
Interested in self-hosting your own `zrok` instance? See the [self-hosting guides](/docs/category/self-hosting/)!
|
||||
|
||||
## Resources
|
||||
|
||||
- Learn about [OpenZiti](https://openziti.io/)
|
@ -0,0 +1,7 @@
|
||||
{
|
||||
"label": "Guides",
|
||||
"position": 50,
|
||||
"link": {
|
||||
"type": "generated-index"
|
||||
}
|
||||
}
|
166
website/versioned_docs/version-0.4/guides/_frontdoor-linux.mdx
Normal file
@ -0,0 +1,166 @@
|
||||
import LinuxShareInstall from './_linux-share-install.mdx'
|
||||
import AnsibleRepoSetup from './install/_ansible_repo_setup.yaml'
|
||||
import ConcatenateYamlSnippets from '@site/src/components/cat-yaml.jsx'
|
||||
|
||||
## Installation
|
||||
|
||||
<LinuxShareInstall />
|
||||
|
||||
<Details>
|
||||
<summary>Ansible Playbook</summary>
|
||||
|
||||
<ConcatenateYamlSnippets
|
||||
title="Set up package repository and install zrok-share"
|
||||
>
|
||||
{AnsibleRepoSetup}
|
||||
{`
|
||||
- name: Install zrok-share package
|
||||
gather_facts: false
|
||||
hosts: all
|
||||
become: true
|
||||
tasks:
|
||||
- name: Install zrok-share
|
||||
ansible.builtin.package:
|
||||
name: zrok-share
|
||||
state: present
|
||||
|
||||
- name: Copy env config from Ansible controller to target
|
||||
copy:
|
||||
dest: /opt/openziti/etc/zrok/zrok-share.env
|
||||
src: /opt/openziti/etc/zrok/zrok-share.env
|
||||
|
||||
- name: Enable and restart service
|
||||
systemd:
|
||||
name: zrok-share
|
||||
enabled: yes
|
||||
state: restarted
|
||||
daemon_reload: yes
|
||||
|
||||
- name: Wait for service
|
||||
systemd:
|
||||
name: zrok-share
|
||||
state: started
|
||||
register: service_status
|
||||
until: service_status.status.ActiveState == 'active'
|
||||
retries: 30
|
||||
delay: 1
|
||||
`}
|
||||
</ConcatenateYamlSnippets>
|
||||
|
||||
</Details>
|
||||
|
||||
## Enable
|
||||
|
||||
Save the enable token from the zrok console in the configuration file.
|
||||
|
||||
```bash title="/opt/openziti/etc/zrok/zrok-share.env"
|
||||
ZROK_ENABLE_TOKEN="14cbfca9772f"
|
||||
```
|
||||
|
||||
## Name your Share
|
||||
|
||||
This unique name becomes part of the domain name of the share, e.g. `https://my-prod-app.in.zrok.io`. A random name is generated if you don't specify one.
|
||||
|
||||
```bash title="/opt/openziti/etc/zrok/zrok-share.env"
|
||||
ZROK_UNIQUE_NAME="my-prod-app"
|
||||
```
|
||||
|
||||
## Use Cases
|
||||
|
||||
You may change the target for the current backend mode, e.g. `proxy`, by editing the configuration file and restarting the service. The reserved subdomain will remain the same.
|
||||
|
||||
You may switch between backend modes or change authentication options by deleting `/var/lib/zrok-share/.zrok/reserved.json` and restarting the service. A new subdomain will be reserved.
|
||||
|
||||
### Proxy a Web Server
|
||||
|
||||
Proxy a reserved subdomain to an existing web server. The web server could be on a private network or on the same host as zrok.
|
||||
|
||||
```bash title="/opt/openziti/etc/zrok/zrok-share.env"
|
||||
ZROK_TARGET="http://127.0.0.1:3000"
|
||||
ZROK_BACKEND_MODE="proxy"
|
||||
```
|
||||
|
||||
If your HTTPS server has an unverifiable TLS server certificate then you must set `--insecure`.
|
||||
|
||||
```bash title="/opt/openziti/etc/zrok/zrok-share.env"
|
||||
ZROK_INSECURE="--insecure"
|
||||
```
|
||||
|
||||
### Serve Static Files
|
||||
|
||||
Run zrok's embedded web server to serve the files in a directory. If there's an `index.html` file in the directory then visitors will see that web page in their browser, otherwise they'll see a generated index of the files. The directory must be readable by 'other', e.g. `chmod -R o+rX /var/www/html`.
|
||||
|
||||
```bash title="/opt/openziti/etc/zrok/zrok-share.env"
|
||||
ZROK_TARGET="/var/www/html"
|
||||
ZROK_BACKEND_MODE="web"
|
||||
```
|
||||
|
||||
### Caddy Server
|
||||
|
||||
Use zrok's built-in Caddy server to serve static files or as a reverse proxy to multiple web servers with various HTTP routes or as a load-balanced set. A sample Caddyfile is available in the path shown.
|
||||
|
||||
```bash title="/opt/openziti/etc/zrok/zrok-share.env"
|
||||
ZROK_TARGET="/opt/openziti/etc/zrok/multiple_upstream.Caddyfile"
|
||||
ZROK_BACKEND_MODE="caddy"
|
||||
```
|
||||
|
||||
### Network Drive
|
||||
|
||||
This uses zrok's `drive` backend mode to serve a directory of static files as a virtual network drive. The directory must be readable by 'other', e.g. `chmod -R o+rX /usr/share/doc`.
|
||||
|
||||
```bash title="/opt/openziti/etc/zrok/zrok-share.env"
|
||||
ZROK_TARGET="/usr/share/doc"
|
||||
ZROK_BACKEND_MODE="drive"
|
||||
```
|
||||
|
||||
[Learn more about this feature in this blog post](https://blog.openziti.io/zrok-drives-an-early-preview).
|
||||
|
||||
## Authentication
|
||||
|
||||
You can limit access to certain email addresses with OAuth or require a password.
|
||||
|
||||
### OAuth
|
||||
|
||||
You can require that visitors authenticate with an email address that matches at least one of the suffixes you specify. Add the following to the configuration file.
|
||||
|
||||
```bash title="/opt/openziti/etc/zrok/zrok-share.env"
|
||||
ZROK_OAUTH_PROVIDER="github" # or google
|
||||
ZROK_OAUTH_EMAILS="alice@example.com *@acme.example.com"
|
||||
```
|
||||
|
||||
### Password
|
||||
|
||||
Enable HTTP basic authentication by adding the following to the configuration file.
|
||||
|
||||
```bash title="/opt/openziti/etc/zrok/zrok-share.env"
|
||||
ZROK_BASIC_AUTH="user:passwd"
|
||||
```
|
||||
|
||||
## Start the Service
|
||||
|
||||
Start the service, and check the zrok console or the service log for the reserved subdomain.
|
||||
|
||||
```bash title="run now and at startup"
|
||||
sudo systemctl enable --now zrok-share.service
|
||||
```
|
||||
|
||||
```bash title="run now"
|
||||
sudo systemctl restart zrok-share.service
|
||||
```
|
||||
|
||||
```bash
|
||||
journalctl -u zrok-share.service
|
||||
```
|
||||
|
||||
## Compatibility
|
||||
|
||||
The Linux distribution must have a package manager that understands the `.deb` or `.rpm` format and be running systemd v232 or newer. The service was tested with:
|
||||
|
||||
* Ubuntu 20.04, 22.04, 23.04
|
||||
* Debian 11 12
|
||||
* Rocky 8, 9
|
||||
* Fedora 37, 38
|
||||
|
||||
## Package Contents
|
||||
|
||||
The files included in the `zrok-share` package are sourced [here in GitHub](https://github.com/openziti/zrok/tree/main/nfpm).
|
@ -0,0 +1,17 @@
|
||||
|
||||
1. Set up `zrok`'s Linux package repository by following [the Linux install guide](/guides/install/linux.mdx#install-zrok-from-the-repository), or run this one-liner to complete the repo setup and install packages.
|
||||
|
||||
```bash
|
||||
curl -sSLf https://get.openziti.io/install.bash \
|
||||
| sudo bash -s zrok-share
|
||||
```
|
||||
|
||||
1. If you set up the repository by following the guide, then also install the `zrok-share` package. This package provides the systemd service.
|
||||
|
||||
```bash title="Ubuntu, Debian"
|
||||
sudo apt install zrok-share
|
||||
```
|
||||
|
||||
```bash title="Fedora, Rocky"
|
||||
sudo dnf install zrok-share
|
||||
```
|
@ -0,0 +1,8 @@
|
||||
{
|
||||
"label": "Docker Share",
|
||||
"position": 40,
|
||||
"link": {
|
||||
"type": "doc",
|
||||
"id": "guides/docker-share/index"
|
||||
}
|
||||
}
|
@ -0,0 +1,143 @@
|
||||
---
|
||||
title: Docker Private Share
|
||||
sidebar_position: 20
|
||||
sidebar_label: Private Share
|
||||
---
|
||||
|
||||
## Goal
|
||||
|
||||
Privately share a Docker Compose service with a separate zrok environment and a permanent zrok share token.
|
||||
|
||||
## Overview
|
||||
|
||||
With zrok, you can privately share a service that's running in Docker. You need a zrok private share running somewhere that it can reach the service you're sharing, and a zrok private access running somewhere else where you want to use the private share. Together, the private share and private access form a private point-to-point tunnel.
|
||||
|
||||
Here's a short article with an overview of [private sharing with zrok](/concepts/sharing-private.mdx).
|
||||
|
||||
## Walkthrough Video
|
||||
|
||||
<iframe width="100%" height="315" src="https://www.youtube.com/embed/HxyvtFAvwUE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
|
||||
|
||||
## How it Works
|
||||
|
||||
The Docker Compose project uses your zrok account token to reserve a private share token and keep sharing the backend target.
|
||||
|
||||
When the project runs it will:
|
||||
|
||||
1. enable a zrok environment unless `/mnt/.zrok/environment.json` exists in the `zrok_env` volume
|
||||
1. reserve a private share token for the service unless `/mnt/.zrok/reserved.json` exists
|
||||
1. start sharing the target specified in the `ZROK_TARGET` environment variable
|
||||
|
||||
## Before You Begin
|
||||
|
||||
To follow this guide you will need [Docker](https://docs.docker.com/get-docker/).
|
||||
|
||||
If you have installed Docker Desktop on macOS or Windows then you are all set.
|
||||
|
||||
## Begin Sharing Privately with zrok in Docker
|
||||
|
||||
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/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
|
||||
# file name ".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.
|
||||
|
||||
```bash
|
||||
# file name ".env"
|
||||
ZROK_API_ENDPOINT="https://zrok.example.com"
|
||||
```
|
||||
|
||||
1. Run your Compose project to start sharing the built-in demo web server:
|
||||
|
||||
```bash
|
||||
docker compose up
|
||||
```
|
||||
|
||||
1. Read the private share token from the output. One of the last lines is like this:
|
||||
|
||||
```bash
|
||||
zrok-private-share-1 | zrok access private wr3hpf2z5fiy
|
||||
```
|
||||
|
||||
Keep track of this token so you can use it in your zrok private access project.
|
||||
|
||||
## Access the Private Share
|
||||
|
||||
Now that we have a private share we can access it with the zrok command or by running a separate Docker Compose project.
|
||||
|
||||
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/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
|
||||
# file name ".env"
|
||||
ZROK_ENABLE_TOKEN="8UL9-48rN0ua"
|
||||
```
|
||||
|
||||
1. Now copy the zrok private access token from the zrok private share project's output to your clipboard and paste it in the same file named `.env` here in your private share project folder like this:
|
||||
|
||||
```bash
|
||||
# file name ".env"
|
||||
ZROK_ENABLE_TOKEN="8UL9-48rN0ua"
|
||||
ZROK_ACCESS_TOKEN="wr3hpf2z5fiy"
|
||||
```
|
||||
|
||||
1. Run your Compose project to start accessing the private share:
|
||||
|
||||
```bash
|
||||
docker compose up zrok-access
|
||||
```
|
||||
|
||||
1. Now your zrok private access proxy is ready on http://127.0.0.1:9191. You can visit the demo web server in your browser.
|
||||
|
||||
## Closed Permission Mode
|
||||
|
||||
Normally, you need only the share token to access a private share. You can further restrict access with "closed" permission mode.
|
||||
|
||||
You must set the permission mode before you reserve the share.
|
||||
|
||||
Only your own account can access the private share.
|
||||
|
||||
```bash
|
||||
ZROK_PERMISSION_MODE="closed"
|
||||
```
|
||||
|
||||
Grant access to additional zrok accounts.
|
||||
|
||||
```bash
|
||||
ZROK_ACCESS_GRANTS="bob@example.com alice@example.org"
|
||||
```
|
||||
|
||||
You can adjust the access grants by running the CLI inside the `zrok-share` container.
|
||||
|
||||
```bash
|
||||
docker compose exec zrok-share zrok modify ${ZROK_UNIQUE_NAME} --remove-access-grant bob@example.com
|
||||
```
|
||||
|
||||
## Going Further with Private Access
|
||||
|
||||
1. Try changing the demo web server used in the private share project. One alternative demo server is provided: `httpbin`.
|
||||
1. Try accessing the private share from _inside_ a container running in the private access project. One demo client is provided: `demo-client`. You can run it like this.
|
||||
|
||||
```bash
|
||||
docker compose up demo-client
|
||||
```
|
||||
|
||||
1. You'll see in the terminal output that the demo-client container is getting a response from the private share indicating the source IP of the request from the perspective of the demo server: `httpbin` that's running in the private share project.
|
||||
|
||||
## Cleaning Up
|
||||
|
||||
Run the "down" command in both Compose projects to destroy them when you're all done. This will stop the running containers and delete zrok environments' storage volumes. Then delete the selected zrok environment by clicking "Actions" in the web console.
|
||||
|
||||
```bash
|
||||
docker compose down --remove-orphans --volumes
|
||||
```
|
@ -0,0 +1,153 @@
|
||||
---
|
||||
title: Docker Compose Public Share
|
||||
sidebar_position: 10
|
||||
sidebar_label: Public Share
|
||||
---
|
||||
|
||||
## Goal
|
||||
|
||||
Publicly share a Docker Compose service with a separate zrok environment and a permanent zrok share URL.
|
||||
|
||||
## Overview
|
||||
|
||||
With zrok, you can publicly share a service that's running in Docker. You need a zrok public share running somewhere that it can reach the service you're sharing. As long as that public share is running and your service is available, anyone with the address can use your service.
|
||||
|
||||
Here's a short article with an overview of [public sharing with zrok](/concepts/sharing-public.mdx).
|
||||
|
||||
## Walkthrough Video
|
||||
|
||||
<iframe width="100%" height="315" src="https://www.youtube.com/embed/ycov--9ZtB4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
|
||||
|
||||
## How it Works
|
||||
|
||||
The Docker Compose project uses your zrok account token to reserve a public subdomain and keep sharing the backend
|
||||
target.
|
||||
|
||||
When the project runs it will:
|
||||
|
||||
1. enable a zrok environment unless `/mnt/.zrok/environment.json` exists in the `zrok_env` volume
|
||||
1. reserve a public subdomain for the service unless `/mnt/.zrok/reserved.json` exists
|
||||
1. start sharing the target specified in the `ZROK_TARGET` environment variable
|
||||
|
||||
## Create the Docker Project
|
||||
|
||||
1. Make a folder on your computer to use as a Docker Compose project for your zrok public share with a reserved subdomain and switch to the new directory in your terminal.
|
||||
1. Download [the reserved public share `compose.yml` project file](pathname:///zrok-public-reserved/compose.yml) into the same directory.
|
||||
1. Copy your zrok account's enable token from the zrok web console to your clipboard and paste it in a file named `.env` in the same folder like this:
|
||||
|
||||
```bash title=".env"
|
||||
ZROK_ENABLE_TOKEN="8UL9-48rN0ua"
|
||||
```
|
||||
|
||||
1. Name the Share
|
||||
|
||||
This unique name becomes part of the domain name of the share, e.g. `https://my-prod-app.in.zrok.io`. A random name is generated if you don't specify one.
|
||||
|
||||
```bash title=".env"
|
||||
ZROK_UNIQUE_NAME="my-prod-app"
|
||||
```
|
||||
|
||||
1. Run the Compose project to start sharing the built-in demo web server. Be sure to `--detach` so the project runs in the background if you want it to auto-restart when your computer reboots.
|
||||
|
||||
```bash
|
||||
docker compose up --detach
|
||||
```
|
||||
|
||||
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 appear in the graph.
|
||||
|
||||
```bash
|
||||
docker compose logs zrok-share
|
||||
```
|
||||
|
||||
```buttonless title="Output"
|
||||
zrok-public-share-1 | https://w6r1vesearkj.in.zrok.io/
|
||||
```
|
||||
|
||||
This concludes the minimum steps to begin sharing the demo web server. Read on to learn how to pivot to sharing any website or web service by leveraging additional zrok backend modes.
|
||||
|
||||
## Proxy Any Web Server
|
||||
|
||||
The simplest way to share your existing HTTP server is to set `ZROK_TARGET` (e.g. `https://example.com`) in the environment of the `docker compose up` command. When you restart the share will auto-configure for that URL.
|
||||
|
||||
```bash title=".env"
|
||||
ZROK_TARGET="http://example.com:8080"
|
||||
```
|
||||
|
||||
```bash
|
||||
docker compose down && docker compose up
|
||||
```
|
||||
|
||||
## Require Authentication
|
||||
|
||||
You can require a password or an OAuth login with certain email addresses.
|
||||
|
||||
### OAuth Email
|
||||
|
||||
You can allow specific email addresse patterns by setting `ZROK_OAUTH_PROVIDER` to `github` or `google` and
|
||||
`ZROK_OAUTH_EMAILS`. Read more about the OAuth features in [this blog
|
||||
post](https://blog.openziti.io/the-zrok-oauth-public-frontend).
|
||||
|
||||
```bash title=".env"
|
||||
ZROK_OAUTH_PROVIDER="github"
|
||||
ZROK_OAUTH_EMAILS="alice@example.com *@acme.example.com"
|
||||
```
|
||||
|
||||
## Caddy is Powerful
|
||||
|
||||
The reserved public share project uses zrok's default backend mode, `proxy`. Another backend mode, `caddy`, accepts a path to [a Caddyfile](https://caddyserver.com/docs/caddyfile) as the value of `ZROK_TARGET` ([zrok Caddyfile examples](https://github.com/openziti/zrok/tree/main/etc/caddy)).
|
||||
|
||||
Caddy is the most powerful and flexible backend mode in zrok. You must reserve a new public subdomain whenever you switch the backend mode, so using `caddy` reduces the risk that you'll have to share a new frontend URL with your users.
|
||||
|
||||
With Caddy, you can balance the workload for websites or web services or share static sites and files or all of the above at the same time. You can update the Caddyfile and restart the Docker Compose project to start sharing the new configuration with the same reserved public subdomain.
|
||||
|
||||
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 load balancing, and mounts the Caddyfile into the container.
|
||||
|
||||
```yaml title="compose.override.yml"
|
||||
services:
|
||||
httpbin1:
|
||||
image: mccutchen/go-httpbin
|
||||
expose: 8080
|
||||
httpbin2:
|
||||
image: mccutchen/go-httpbin
|
||||
expose: 8080
|
||||
zrok-share:
|
||||
volumes:
|
||||
- ./Caddyfile:/mnt/.zrok/Caddyfile
|
||||
```
|
||||
|
||||
1. Start a new Docker Compose project or delete the existing state volume.
|
||||
|
||||
```bash
|
||||
docker compose down --volumes
|
||||
```
|
||||
|
||||
If you prefer to keep using the same zrok environment with the new share then delete `/mnt/.zrok/reserved.json` instead of the entire volume.
|
||||
|
||||
1. Run the project to load the new configuration.
|
||||
|
||||
```bash
|
||||
docker compose up --detach
|
||||
```
|
||||
|
||||
1. Note the new reserved share URL from the log.
|
||||
|
||||
```bash
|
||||
docker compose logs zrok-share
|
||||
```
|
||||
|
||||
```buttonless title="Output"
|
||||
INFO: zrok public URL: https://88s803f2qvao.in.zrok.io/
|
||||
```
|
112
website/versioned_docs/version-0.4/guides/docker-share/index.mdx
Normal file
@ -0,0 +1,112 @@
|
||||
---
|
||||
title: Getting Started with Docker
|
||||
---
|
||||
|
||||
import Details from '@theme/MDXComponents/Details';
|
||||
|
||||
## Overview
|
||||
|
||||
To follow the guides in this section you will need [Docker](https://docs.docker.com/get-docker/).
|
||||
|
||||
You have the option to enable a `zrok` account on the Docker host and mount it on the container or you can use the provided Docker Compose project files (`compose.yml`) to enable a separate `zrok` environment for each project.
|
||||
|
||||
This page provides `docker` and `docker compose` examples of mounting the host's `zrok` environment on the container. You'll need to first [enable zrok on the Docker host](/docs/getting-started/#installing-the-zrok-command) to use this approach.
|
||||
|
||||
## Permanent Public Share
|
||||
|
||||
Let's say you have a `compose.yml` file that defines a web app known within the project's bridge network as `https://myapp:8080` and you want to publish it as a reliable, public site.
|
||||
|
||||
1. Reserve a subdomain by running `zrok reserve public --unique-name "myapp" https://myapp:8080` on the Docker host.
|
||||
1. Merge this YAML with `compose.yml` or save it in the same directory as `compose.override.yml` to let `docker compose up` merge it for you.
|
||||
|
||||
```yaml
|
||||
services:
|
||||
zrok:
|
||||
image: openziti/zrok
|
||||
restart: unless-stopped
|
||||
user: "${UID}"
|
||||
volumes:
|
||||
- ${HOME}/.zrok:/home/ziggy/.zrok
|
||||
environment:
|
||||
PFXLOG_NO_JSON: "true"
|
||||
command: share reserved "myapp" --headless
|
||||
```
|
||||
|
||||
The reserved share will be available at `https://myapp.share.zrok.io` each time the `zrok` container starts up.
|
||||
|
||||
## Temporary Public Share
|
||||
|
||||
Let's say you have a web server running on the host's private network at `https://10.11.12.13:8080`. With one additional `docker` command, you can share the web server publicly as long as the `zrok` container stays running.
|
||||
|
||||
```bash title="BASH"
|
||||
docker run \
|
||||
--rm \
|
||||
--network=host \
|
||||
--volume ~/.zrok:/home/ziggy/.zrok \
|
||||
--user "${UID:-1000}:${GID:-1000}" \
|
||||
openziti/zrok share public \
|
||||
--headless \
|
||||
https://10.11.12.13:8080
|
||||
```
|
||||
|
||||
<Details>
|
||||
<summary>PowerShell</summary>
|
||||
|
||||
```powershell
|
||||
docker.exe run `
|
||||
--rm `
|
||||
--network "host" `
|
||||
--volume "${env:USERPROFILE}\.zrok:/.zrok" `
|
||||
--user "1000" `
|
||||
openziti/zrok share public `
|
||||
--headless `
|
||||
https://10.11.12.13:8080
|
||||
```
|
||||
|
||||
</Details>
|
||||
|
||||
|
||||
<Details>
|
||||
<summary>Command Prompt (batch)</summary>
|
||||
|
||||
```cmd
|
||||
docker.exe run ^
|
||||
--rm ^
|
||||
--network "host" ^
|
||||
--volume "%USERPROFILE%\.zrok:/.zrok" ^
|
||||
--user "1000" ^
|
||||
openziti/zrok share public ^
|
||||
--headless ^
|
||||
https://10.11.12.13:8080
|
||||
```
|
||||
|
||||
</Details>
|
||||
|
||||
<Details>
|
||||
<summary>Windows Subsystem for Linux (WSL)</summary>
|
||||
|
||||
```bash
|
||||
docker run \
|
||||
--rm \
|
||||
--network "host" \
|
||||
--volume "/mnt/c/Users/$(powershell.exe -Command 'Write-Output $env:USERNAME' | tr -d '\r')/.zrok:/home/ziggy/.zrok" \
|
||||
--user "${UID:-1000}:${GID:-1000}" \
|
||||
openziti/zrok share public \
|
||||
--headless \
|
||||
https://10.11.12.13:8080
|
||||
```
|
||||
|
||||
</Details>
|
||||
|
||||
The public share URL appears near the beginning of the container's log.
|
||||
|
||||
Let's break down those options and arguments.
|
||||
|
||||
1. `--rm` don't save this container because it's providing a temporary public share that's destroyed when the container stops
|
||||
1. `--network=host` shares the host's network with the container so that the container can reach the web server directly. This is always necessary when the web server is listening only on the host's loopback interface, e.g., `https://::1:8080`, and may not be strictly necessary if the target is routeable from the default Docker bridge.
|
||||
1. `--volume ~/.zrok:/home/ziggy/.zrok` mounts the `zrok` configuration from the Docker host into the container.
|
||||
1. `--user "${UID:-1000}:${GID:-1000}"` sets the container's user to the current user on the Docker host to avoid permission issues with reading the mounted `zrok` configuration (defaults to `1000:1000`).
|
||||
1. `openziti/zrok` is the `zrok` Docker image.
|
||||
1. `share public` is the `zrok` command to share the target publicly until zrok exits.
|
||||
1. `--headless` runs the `zrok` command without the interactive terminal UI.
|
||||
1. `https://10.11.12.13:8080` is the target web server to share.
|
315
website/versioned_docs/version-0.4/guides/drives.mdx
Normal file
@ -0,0 +1,315 @@
|
||||
|
||||
# Drives
|
||||
|
||||
The zrok drives CLI tools allow for simple, ergonomic management and synchronization of local and remote files.
|
||||
|
||||
## Sharing a Drive
|
||||
|
||||
Virtual drives are shared through the `zrok` CLI using the `--backend-mode drive` flag through the `zrok share` command, using either the `public` or `private` sharing modes. We'll use the `private` sharing mode for this example:
|
||||
|
||||
```
|
||||
$ mkdir /tmp/junk
|
||||
$ zrok share private --headless --backend-mode drive /tmp/junk
|
||||
[ 0.124] INFO sdk-golang/ziti.(*listenerManager).createSessionWithBackoff: {session token=[cf640aac-2706-49ae-9cc9-9a497d67d9c5]} new service session
|
||||
[ 0.145] INFO main.(*sharePrivateCommand).run: allow other to access your share with the following command:
|
||||
zrok access private wkcfb58vj51l
|
||||
```
|
||||
|
||||
The command shown above creates an ephemeral, `private` drive share pointed at the local `/tmp/junk` folder.
|
||||
|
||||
Notice that the share token allocated by `zrok` is `wkcfb58vj51l`. We'll use that share token to identify our virtual drive in the following operations.
|
||||
|
||||
## Working with a Private Drive Share
|
||||
|
||||
First, let's copy a file into our virtual drive using the `zrok copy` command:
|
||||
|
||||
```
|
||||
$ zrok copy LICENSE zrok://wkcfb58vj51l
|
||||
[ 0.119] INFO zrok/drives/sync.OneWay: => /LICENSE
|
||||
copy complete!
|
||||
```
|
||||
|
||||
We used the URL scheme `zrok://<shareToken>` to refer to the private virtual drive we allocated above using the `zrok share private` command. Use `zrok://` URLs with the drives CLI tools to refer to contents of private virtual drives.
|
||||
|
||||
Next, let's get a directory listing of the virtual drive:
|
||||
|
||||
```
|
||||
$ zrok ls zrok://wkcfb58vj51l
|
||||
┌──────┬─────────┬─────────┬───────────────────────────────┐
|
||||
│ TYPE │ NAME │ SIZE │ MODIFIED │
|
||||
├──────┼─────────┼─────────┼───────────────────────────────┤
|
||||
│ │ LICENSE │ 11.3 kB │ 2024-01-19 12:16:46 -0500 EST │
|
||||
└──────┴─────────┴─────────┴───────────────────────────────┘
|
||||
```
|
||||
|
||||
We can make directories on the virtual drive:
|
||||
|
||||
```
|
||||
$ zrok mkdir zrok://wkcfb58vj51l/stuff
|
||||
$ zrok ls zrok://wkcfb58vj51l
|
||||
┌──────┬─────────┬─────────┬───────────────────────────────┐
|
||||
│ TYPE │ NAME │ SIZE │ MODIFIED │
|
||||
├──────┼─────────┼─────────┼───────────────────────────────┤
|
||||
│ │ LICENSE │ 11.3 kB │ 2024-01-19 12:16:46 -0500 EST │
|
||||
│ DIR │ stuff │ │ │
|
||||
└──────┴─────────┴─────────┴───────────────────────────────┘
|
||||
```
|
||||
|
||||
We can copy the contents of a local directory into the new directory on the virtual drive:
|
||||
|
||||
```
|
||||
$ ls -l util/
|
||||
total 20
|
||||
-rw-rw-r-- 1 michael michael 329 Jul 21 13:17 email.go
|
||||
-rw-rw-r-- 1 michael michael 456 Jul 21 13:17 headers.go
|
||||
-rw-rw-r-- 1 michael michael 609 Jul 21 13:17 proxy.go
|
||||
-rw-rw-r-- 1 michael michael 361 Jul 21 13:17 size.go
|
||||
-rw-rw-r-- 1 michael michael 423 Jan 2 11:57 uniqueName.go
|
||||
$ zrok copy util/ zrok://wkcfb58vj51l/stuff
|
||||
[ 0.123] INFO zrok/drives/sync.OneWay: => /email.go
|
||||
[ 0.194] INFO zrok/drives/sync.OneWay: => /headers.go
|
||||
[ 0.267] INFO zrok/drives/sync.OneWay: => /proxy.go
|
||||
[ 0.337] INFO zrok/drives/sync.OneWay: => /size.go
|
||||
[ 0.408] INFO zrok/drives/sync.OneWay: => /uniqueName.go
|
||||
copy complete!
|
||||
$ zrok ls zrok://wkcfb58vj51l/stuff
|
||||
┌──────┬───────────────┬───────┬───────────────────────────────┐
|
||||
│ TYPE │ NAME │ SIZE │ MODIFIED │
|
||||
├──────┼───────────────┼───────┼───────────────────────────────┤
|
||||
│ │ email.go │ 329 B │ 2024-01-19 12:26:45 -0500 EST │
|
||||
│ │ headers.go │ 456 B │ 2024-01-19 12:26:45 -0500 EST │
|
||||
│ │ proxy.go │ 609 B │ 2024-01-19 12:26:45 -0500 EST │
|
||||
│ │ size.go │ 361 B │ 2024-01-19 12:26:45 -0500 EST │
|
||||
│ │ uniqueName.go │ 423 B │ 2024-01-19 12:26:45 -0500 EST │
|
||||
└──────┴───────────────┴───────┴───────────────────────────────┘
|
||||
```
|
||||
|
||||
And we can remove files and directories from the virtual drive:
|
||||
|
||||
```
|
||||
$ zrok rm zrok://wkcfb58vj51l/LICENSE
|
||||
$ zrok ls zrok://wkcfb58vj51l
|
||||
┌──────┬───────┬──────┬──────────┐
|
||||
│ TYPE │ NAME │ SIZE │ MODIFIED │
|
||||
├──────┼───────┼──────┼──────────┤
|
||||
│ DIR │ stuff │ │ │
|
||||
└──────┴───────┴──────┴──────────┘
|
||||
$ zrok rm zrok://wkcfb58vj51l/stuff
|
||||
$ zrok ls zrok://wkcfb58vj51l
|
||||
┌──────┬──────┬──────┬──────────┐
|
||||
│ TYPE │ NAME │ SIZE │ MODIFIED │
|
||||
├──────┼──────┼──────┼──────────┤
|
||||
└──────┴──────┴──────┴──────────┘
|
||||
```
|
||||
|
||||
## Working with Public Shares
|
||||
|
||||
Public shares work very similarly to private shares, they just use a different URL scheme:
|
||||
|
||||
```
|
||||
$ zrok share public --headless --backend-mode drive /tmp/junk
|
||||
[ 0.708] INFO sdk-golang/ziti.(*listenerManager).createSessionWithBackoff: {session token=[05e0f48b-242b-4fd9-8edb-259488535c47]} new service session
|
||||
[ 0.878] INFO main.(*sharePublicCommand).run: access your zrok share at the following endpoints:
|
||||
https://6kiww4bn7iok.share.zrok.io
|
||||
```
|
||||
|
||||
The same commands, with a different URL scheme work with the `zrok` drives CLI:
|
||||
|
||||
```
|
||||
$ zrok copy util/ https://6kiww4bn7iok.share.zrok.io
|
||||
[ 0.268] INFO zrok/drives/sync.OneWay: => /email.go
|
||||
[ 0.406] INFO zrok/drives/sync.OneWay: => /headers.go
|
||||
[ 0.530] INFO zrok/drives/sync.OneWay: => /proxy.go
|
||||
[ 0.655] INFO zrok/drives/sync.OneWay: => /size.go
|
||||
[ 0.714] INFO zrok/drives/sync.OneWay: => /uniqueName.go
|
||||
copy complete!
|
||||
michael@fourtyfour Fri Jan 19 12:42:52 ~/Repos/nf/zrok
|
||||
$ zrok ls https://6kiww4bn7iok.share.zrok.io
|
||||
┌──────┬───────────────┬───────┬───────────────────────────────┐
|
||||
│ TYPE │ NAME │ SIZE │ MODIFIED │
|
||||
├──────┼───────────────┼───────┼───────────────────────────────┤
|
||||
│ │ email.go │ 329 B │ 2023-07-21 13:17:56 -0400 EDT │
|
||||
│ │ headers.go │ 456 B │ 2023-07-21 13:17:56 -0400 EDT │
|
||||
│ │ proxy.go │ 609 B │ 2023-07-21 13:17:56 -0400 EDT │
|
||||
│ │ size.go │ 361 B │ 2023-07-21 13:17:56 -0400 EDT │
|
||||
│ │ uniqueName.go │ 423 B │ 2024-01-02 11:57:14 -0500 EST │
|
||||
└──────┴───────────────┴───────┴───────────────────────────────┘
|
||||
```
|
||||
|
||||
For basic authentication provided by public shares, the `zrok` drives CLI offers the `--basic-auth` flag, which accepts a `<username>:<password>` parameter to specify the authentication for the public virtual drive (if it's required).
|
||||
|
||||
Alternatively, the authentication can be set using the `ZROK_DRIVES_BASIC_AUTH` environment variable:
|
||||
|
||||
```
|
||||
$ export ZROK_DRIVES_BASIC_AUTH=username:password
|
||||
```
|
||||
|
||||
## One-way Synchronization
|
||||
|
||||
The `zrok copy` command includes a `--sync` flag, which only copies files detected as _modified_. `zrok` considers a file with the same modification timestamp and size to be the same. Of course, this is not a strong guarantee that the files are equivalent. Future `zrok` drives versions will provide a cryptographically strong mechanism (a-la `rsync` and friends) to guarantee that files and trees of files are synchronized.
|
||||
|
||||
For now, the `--sync` flag provides a convenience mechanism to allow resuming copies of large file trees and provide a reasonable guarantee that the trees are in sync.
|
||||
|
||||
Let's take a look at `zrok copy --sync` in action:
|
||||
|
||||
```
|
||||
$ zrok copy --sync docs/ https://glmv049c62p7.share.zrok.io
|
||||
[ 0.636] INFO zrok/drives/sync.OneWay: => /_attic/
|
||||
[ 0.760] INFO zrok/drives/sync.OneWay: => /_attic/network/
|
||||
[ 0.816] INFO zrok/drives/sync.OneWay: => /_attic/network/_category_.json
|
||||
[ 0.928] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/
|
||||
[ 0.987] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/ziti-ctrl.service
|
||||
[ 1.048] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/ziti-ctrl.yml
|
||||
[ 1.107] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/ziti-router0.service
|
||||
[ 1.167] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/ziti-router0.yml
|
||||
[ 1.218] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/zrok-access-public.service
|
||||
[ 1.273] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/zrok-ctrl.service
|
||||
[ 1.328] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/zrok-ctrl.yml
|
||||
[ 1.382] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/zrok.io-network-skeleton.md
|
||||
[ 1.447] INFO zrok/drives/sync.OneWay: => /_attic/overview.md
|
||||
[ 1.572] INFO zrok/drives/sync.OneWay: => /_attic/sharing/
|
||||
[ 1.622] INFO zrok/drives/sync.OneWay: => /_attic/sharing/_category_.json
|
||||
[ 1.673] INFO zrok/drives/sync.OneWay: => /_attic/sharing/reserved_services.md
|
||||
[ 1.737] INFO zrok/drives/sync.OneWay: => /_attic/sharing/sharing_modes.md
|
||||
[ 1.793] INFO zrok/drives/sync.OneWay: => /_attic/v0.2_account_requests.md
|
||||
[ 1.902] INFO zrok/drives/sync.OneWay: => /_attic/v0.4_limits.md
|
||||
...
|
||||
[ 9.691] INFO zrok/drives/sync.OneWay: => /images/zrok_web_ui_empty_shares.png
|
||||
[ 9.812] INFO zrok/drives/sync.OneWay: => /images/zrok_web_ui_new_environment.png
|
||||
[ 9.870] INFO zrok/drives/sync.OneWay: => /images/zrok_zoom_to_fit.png
|
||||
copy complete!
|
||||
```
|
||||
|
||||
Because the target drive was empty, `zrok copy --sync` copied the entire contents of the local `docs/` tree into the virtual drive. However, if we run that command again, we get:
|
||||
|
||||
```
|
||||
$ zrok copy --sync docs/ https://glmv049c62p7.share.zrok.io
|
||||
copy complete!
|
||||
```
|
||||
|
||||
The virtual drive contents are already in sync with the local filesystem tree, so there is nothing for it to copy.
|
||||
|
||||
Let's alter the contents of the drive and run the `--sync` again:
|
||||
|
||||
```
|
||||
$ zrok rm https://glmv049c62p7.share.zrok.io/images
|
||||
$ zrok copy --sync docs/ https://glmv049c62p7.share.zrok.io
|
||||
[ 0.364] INFO zrok/drives/sync.OneWay: => /images/
|
||||
[ 0.456] INFO zrok/drives/sync.OneWay: => /images/zrok.png
|
||||
[ 0.795] INFO zrok/drives/sync.OneWay: => /images/zrok_cover.png
|
||||
[ 0.866] INFO zrok/drives/sync.OneWay: => /images/zrok_deployment.drawio
|
||||
...
|
||||
[ 2.254] INFO zrok/drives/sync.OneWay: => /images/zrok_web_ui_empty_shares.png
|
||||
[ 2.340] INFO zrok/drives/sync.OneWay: => /images/zrok_web_ui_new_environment.png
|
||||
[ 2.391] INFO zrok/drives/sync.OneWay: => /images/zrok_zoom_to_fit.png
|
||||
copy complete!
|
||||
```
|
||||
|
||||
Because we removed the `images/` tree from the virtual drive, `zrok copy --sync` detected this and copied the local `images/` tree back onto the virtual drive.
|
||||
|
||||
## Drive-to-Drive Copies and Synchronization
|
||||
|
||||
The `zrok copy` CLI can operate on pairs of virtual drives remotely, without ever having to store files locally. This allow for drive-to-drive copies and synchronization.
|
||||
|
||||
Here are a couple of examples:
|
||||
|
||||
```
|
||||
$ zrok copy --sync https://glmv049c62p7.share.zrok.io https://glmv049c62p7.share.zrok.io
|
||||
copy complete!
|
||||
```
|
||||
|
||||
Specifying the same URL for both the source and the target of a `--sync` operation should always result in nothing being copied... they are the same drive with the same state.
|
||||
|
||||
We can copy files between two virtual drives with a single command:
|
||||
|
||||
```
|
||||
$ zrok copy --sync https://glmv049c62p7.share.zrok.io zrok://hsml272j3xzf
|
||||
[ 1.396] INFO zrok/drives/sync.OneWay: => /_attic/
|
||||
[ 2.083] INFO zrok/drives/sync.OneWay: => /_attic/overview.md
|
||||
[ 2.704] INFO zrok/drives/sync.OneWay: => /_attic/sharing/
|
||||
...
|
||||
[ 118.240] INFO zrok/drives/sync.OneWay: => /images/zrok_web_console_empty.png
|
||||
[ 118.920] INFO zrok/drives/sync.OneWay: => /images/zrok_enable_modal.png
|
||||
[ 119.589] INFO zrok/drives/sync.OneWay: => /images/zrok_cover.png
|
||||
[ 120.214] INFO zrok/drives/sync.OneWay: => /getting-started.mdx
|
||||
copy complete!
|
||||
$ zrok copy --sync https://glmv049c62p7.share.zrok.io zrok://hsml272j3xzf
|
||||
copy complete!
|
||||
```
|
||||
|
||||
## Copying from Drives to the Local Filesystem
|
||||
|
||||
In the current version of the drives CLI, `zrok copy` always assumes the destination is a directory. There is currently no way to do:
|
||||
|
||||
```
|
||||
$ zrok copy somefile someotherfile
|
||||
```
|
||||
|
||||
What you'll end up with on the local filesystem is:
|
||||
|
||||
```
|
||||
somefile
|
||||
someotherfile/somefile
|
||||
```
|
||||
|
||||
It's in the backlog to support file destinations in a future release of `zrok`. So, when using `zrok copy`, always take note of the destination.
|
||||
|
||||
`zrok copy` supports a default destination of `file://.`, so you can do single parameter `zrok copy` commands like this:
|
||||
|
||||
```
|
||||
$ zrok ls https://azc47r3cwjds.share.zrok.io
|
||||
┌──────┬─────────┬─────────┬───────────────────────────────┐
|
||||
│ TYPE │ NAME │ SIZE │ MODIFIED │
|
||||
├──────┼─────────┼─────────┼───────────────────────────────┤
|
||||
│ │ LICENSE │ 11.3 kB │ 2023-07-21 13:17:56 -0400 EDT │
|
||||
└──────┴─────────┴─────────┴───────────────────────────────┘
|
||||
$ zrok copy https://azc47r3cwjds.share.zrok.io/LICENSE
|
||||
[ 0.260] INFO zrok/drives/sync.OneWay: => /LICENSE
|
||||
copy complete!
|
||||
$ ls -l
|
||||
total 12
|
||||
-rw-rw-r-- 1 michael michael 11346 Jan 19 13:29 LICENSE
|
||||
```
|
||||
|
||||
You can also specify a local folder as the destination for your copy:
|
||||
|
||||
```
|
||||
$ zrok copy https://azc47r3cwjds.share.zrok.io/LICENSE /tmp/inbox
|
||||
[ 0.221] INFO zrok/drives/sync.OneWay: => /LICENSE
|
||||
copy complete!
|
||||
$ l /tmp/inbox
|
||||
total 12
|
||||
-rw-rw-r-- 1 michael michael 11346 Jan 19 13:30 LICENSE
|
||||
```
|
||||
|
||||
## Unique Names and Reserved Shares
|
||||
|
||||
Private reserved shares with unque names can be particularly useful with the drives CLI:
|
||||
|
||||
```
|
||||
$ zrok reserve private -b drive --unique-name mydrive /tmp/junk
|
||||
[ 0.315] INFO main.(*reserveCommand).run: your reserved share token is 'mydrive'
|
||||
$ zrok share reserved --headless mydrive
|
||||
[ 0.289] INFO main.(*shareReservedCommand).run: sharing target: '/tmp/junk'
|
||||
[ 0.289] INFO main.(*shareReservedCommand).run: using existing backend target: /tmp/junk
|
||||
[ 0.767] INFO sdk-golang/ziti.(*listenerManager).createSessionWithBackoff: {session token=[d519a436-9fb5-4207-afd5-7cbc28fb779a]} new service session
|
||||
[ 0.927] INFO main.(*shareReservedCommand).run: use this command to access your zrok share: 'zrok access private mydrive'
|
||||
```
|
||||
|
||||
This makes working with `zrok://` URLs particularly convenient:
|
||||
|
||||
```
|
||||
$ zrok ls zrok://mydrive
|
||||
┌──────┬─────────┬─────────┬───────────────────────────────┐
|
||||
│ TYPE │ NAME │ SIZE │ MODIFIED │
|
||||
├──────┼─────────┼─────────┼───────────────────────────────┤
|
||||
│ │ LICENSE │ 11.3 kB │ 2023-07-21 13:17:56 -0400 EDT │
|
||||
└──────┴─────────┴─────────┴───────────────────────────────┘
|
||||
```
|
||||
|
||||
## Future Enhancements
|
||||
|
||||
Coming in a future release of `zrok` drives are features like:
|
||||
|
||||
* two-way synchronization between multiple hosts... allowing for shared "dropbox-like" usage scenarios between multiple environments
|
||||
* better ergonomics for single-file destinations
|
81
website/versioned_docs/version-0.4/guides/frontdoor.mdx
Normal file
@ -0,0 +1,81 @@
|
||||
---
|
||||
title: zrok frontdoor
|
||||
sidebar_label: frontdoor
|
||||
sidebar_position: 20
|
||||
hide_table_of_contents: true
|
||||
---
|
||||
|
||||
import OsTabs from '@theme/OsTabs';
|
||||
import TabItem from '@theme/TabItem';
|
||||
import LinuxService from './_frontdoor-linux.mdx';
|
||||
import ThemedImage from '@theme/ThemedImage';
|
||||
import useBaseUrl from '@docusaurus/useBaseUrl';
|
||||
|
||||
**zrok frontdoor** is the heavy-duty front door to your app or site. It makes your website or app available to your online audience through the shield of zrok.io's hardened, managed frontends.
|
||||
|
||||
<iframe width="100%" height="315" src="https://www.youtube.com/embed/5Vi8GKuTi_I" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
|
||||
|
||||
## Overview
|
||||
|
||||
zrok frontends are the parts of zrok that proxy incoming public web traffic to zrok backend shares via OpenZiti. When you use zrok with a `zrok.io` frontend, you're using **zrok frontdoor**. `zrok.io` is zrok-as-a-service by NetFoundry, the team behind OpenZiti. You need a free account to use **zrok frontdoor**.
|
||||
|
||||
|
||||
<ThemedImage
|
||||
alt="frontdoor diagram"
|
||||
sources={{
|
||||
light: useBaseUrl('/img/zrok-frontdoor-light-mode.svg'),
|
||||
dark: useBaseUrl('/img/zrok-frontdoor-dark-mode.svg'),
|
||||
}}
|
||||
/>
|
||||
|
||||
## Choose your OS
|
||||
|
||||
Choose between installing the Linux package or running zrok with Docker (Linux, macOS, or Windows).
|
||||
|
||||
{/* The OsTabs component must be aligned with these specific values: `Linux`, `Docker` which are auto-selected based on
|
||||
the detected OS of the visitor's browser */}
|
||||
<OsTabs
|
||||
queryString="os"
|
||||
values={[
|
||||
{ label: 'Linux', value: 'Linux', },
|
||||
{ label: 'Docker', value: 'Docker', },
|
||||
]}
|
||||
>
|
||||
|
||||
<TabItem value="Linux">
|
||||
|
||||
On Linux, zrok frontdoor is implemented natively as a system service provided by the `zrok-share` DEB or RPM package.
|
||||
|
||||
## Goal
|
||||
|
||||
Proxy a reserved public subdomain to a backend target with an always-on Linux system service.
|
||||
|
||||
## How it Works
|
||||
|
||||
The `zrok-share` package creates a `zrok-share.service` unit in systemd. The administrator edits the service's configuration file to specify the:
|
||||
|
||||
1. zrok account token
|
||||
1. target URL or files to be shared and backend mode, e.g. `proxy`
|
||||
1. authentication options, if wanted
|
||||
|
||||
When the service starts it will:
|
||||
|
||||
1. enable the zrok environment unless `/var/lib/zrok-share/.zrok/environment.json` exists
|
||||
1. reserve a public subdomain for the service unless `/var/lib/zrok-share/.zrok/reserved.json` exists
|
||||
1. start sharing the target specified as `ZROK_TARGET` in the environment file
|
||||
|
||||
<LinuxService/>
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem value="Docker">
|
||||
|
||||
On macOS and Windows, zrok frontdoor is implemented as a Docker Compose project which reserves a public subdomain for your website or service and manages a zrok environment that's separate from the Docker host. [Link to the Docker Public Share Guide](/guides/docker-share/docker_public_share_guide.md)
|
||||
|
||||
</TabItem>
|
||||
|
||||
</OsTabs>
|
||||
|
||||
## Concepts
|
||||
|
||||
Overview of [zrok reserved shares](/concepts/sharing-reserved.md)
|
@ -0,0 +1,55 @@
|
||||
- name: Set up zrok Package Repo
|
||||
gather_facts: true
|
||||
hosts: all
|
||||
become: true
|
||||
tasks:
|
||||
- name: Set up apt repo
|
||||
when: ansible_os_family == "Debian"
|
||||
block:
|
||||
- name: Install playbook dependencies
|
||||
ansible.builtin.package:
|
||||
name:
|
||||
- gnupg
|
||||
state: present
|
||||
|
||||
- name: Fetch armored pubkey
|
||||
ansible.builtin.uri:
|
||||
url: https://get.openziti.io/tun/package-repos.gpg
|
||||
return_content: yes
|
||||
register: armored_pubkey
|
||||
|
||||
- name: Dearmor pubkey
|
||||
ansible.builtin.shell: |
|
||||
gpg --dearmor --output /usr/share/keyrings/openziti.gpg <<< "{{ armored_pubkey.content }}"
|
||||
args:
|
||||
creates: /usr/share/keyrings/openziti.gpg
|
||||
executable: /bin/bash
|
||||
|
||||
- name: Set pubkey filemode
|
||||
ansible.builtin.file:
|
||||
path: /usr/share/keyrings/openziti.gpg
|
||||
mode: 'a+rX'
|
||||
|
||||
- name: Install OpenZiti repo deb source
|
||||
ansible.builtin.copy:
|
||||
dest: /etc/apt/sources.list.d/openziti-release.list
|
||||
content: |
|
||||
deb [signed-by=/usr/share/keyrings/openziti.gpg] https://packages.openziti.org/zitipax-openziti-deb-stable debian main
|
||||
|
||||
- name: Refresh Repo Sources
|
||||
ansible.builtin.apt:
|
||||
update_cache: yes
|
||||
cache_valid_time: 3600
|
||||
|
||||
- name: Set up yum repo
|
||||
when: ansible_os_family == "RedHat"
|
||||
block:
|
||||
- name: Install OpenZiti repo rpm source
|
||||
ansible.builtin.yum_repository:
|
||||
name: OpenZitiRelease
|
||||
description: OpenZiti Release
|
||||
baseurl: https://packages.openziti.org/zitipax-openziti-rpm-stable/redhat/$basearch
|
||||
enabled: yes
|
||||
gpgkey: https://packages.openziti.org/zitipax-openziti-rpm-stable/redhat/$basearch/repodata/repomd.xml.key
|
||||
repo_gpgcheck: yes
|
||||
gpgcheck: no
|
@ -0,0 +1,8 @@
|
||||
{
|
||||
"label": "Install",
|
||||
"position": 10,
|
||||
"link": {
|
||||
"type": "doc",
|
||||
"id": "guides/install/index"
|
||||
}
|
||||
}
|
31
website/versioned_docs/version-0.4/guides/install/index.mdx
Normal file
@ -0,0 +1,31 @@
|
||||
---
|
||||
title: Install
|
||||
---
|
||||
|
||||
import { AssetsProvider } from '@site/src/components/assets-context';
|
||||
import DownloadCard from '@site/src/components/download-card';
|
||||
import styles from '@site/src/css/download-card.module.css';
|
||||
|
||||
<AssetsProvider>
|
||||
<div className={styles.downloadContainer}>
|
||||
<DownloadCard
|
||||
osName="Windows"
|
||||
osLogo="/img/logo-windows.svg"
|
||||
infoText="Binary executable"
|
||||
guideLink="/docs/guides/install/windows"
|
||||
/>
|
||||
<DownloadCard
|
||||
osName="macOS"
|
||||
osLogo="/img/logo-apple.svg"
|
||||
infoText="Binary executable"
|
||||
guideLink="/docs/guides/install/macos"
|
||||
/>
|
||||
<DownloadCard
|
||||
osName="Linux"
|
||||
osLogo="/img/logo-linux.svg"
|
||||
infoText="DEB, RPM packages"
|
||||
guideLink="/docs/guides/install/linux"
|
||||
/>
|
||||
</div>
|
||||
</AssetsProvider>
|
||||
|
197
website/versioned_docs/version-0.4/guides/install/linux.mdx
Normal file
@ -0,0 +1,197 @@
|
||||
---
|
||||
title: Install zrok in Linux
|
||||
sidebar_label: Linux
|
||||
---
|
||||
|
||||
import { AssetsProvider } from '@site/src/components/assets-context';
|
||||
import DownloadCard from '@site/src/components/download-card';
|
||||
import styles from '@site/src/css/download-card.module.css';
|
||||
import AnsibleRepoSetup from './_ansible_repo_setup.yaml'
|
||||
import ConcatenateYamlSnippets from '@site/src/components/cat-yaml.jsx'
|
||||
|
||||
## Linux Binary
|
||||
|
||||
<AssetsProvider>
|
||||
<div className={styles.downloadContainer}>
|
||||
<DownloadCard
|
||||
osName="Linux"
|
||||
osLogo="/img/logo-linux.svg"
|
||||
/>
|
||||
</div>
|
||||
</AssetsProvider>
|
||||
|
||||
Download the binary distribution for your Linux distribution's architecture or run the install script below to pick the correct CPU architecture automatically. For Intel and AMD 64-bit machines use the `amd64` distribution. For Raspberry Pi use the `arm64` distribution.
|
||||
|
||||
<Details>
|
||||
<summary>Manually install in `~/bin/zrok`</summary>
|
||||
|
||||
1. Unarchive the distribution in a temporary directory.
|
||||
|
||||
```text
|
||||
mkdir /tmp/zrok && tar -xf ./zrok*linux*.tar.gz -C /tmp/zrok
|
||||
```
|
||||
|
||||
1. Install the `zrok` executable.
|
||||
|
||||
```text
|
||||
mkdir -p ~/bin && install /tmp/zrok/zrok ~/bin/
|
||||
```
|
||||
|
||||
1. Add `~/bin` to your shell's executable search path. Optionally add this to your ~/.zshenv to persist the change.
|
||||
|
||||
```text
|
||||
PATH=~/bin:$PATH
|
||||
```
|
||||
|
||||
1. With the `zrok` executable in your path, you can then execute the `zrok` command from your shell:
|
||||
|
||||
```text
|
||||
zrok version
|
||||
```
|
||||
|
||||
```buttonless title="Output"
|
||||
_
|
||||
_____ __ ___ | | __
|
||||
|_ / '__/ _ \| |/ /
|
||||
/ /| | | (_) | <
|
||||
/___|_| \___/|_|\_\
|
||||
|
||||
v0.4.0 [c889005]
|
||||
```
|
||||
|
||||
</Details>
|
||||
|
||||
<Details>
|
||||
<summary>Script to install binary in `/usr/local/bin/zrok`</summary>
|
||||
|
||||
This script auto-selects the correct architecture and may be helpful for Raspberry Pi users.
|
||||
|
||||
```text
|
||||
cd $(mktemp -d);
|
||||
|
||||
ZROK_VERSION=$(
|
||||
curl -sSf https://api.github.com/repos/openziti/zrok/releases/latest \
|
||||
| jq -r '.tag_name'
|
||||
);
|
||||
|
||||
case $(uname -m) in
|
||||
x86_64) GOXARCH=amd64
|
||||
;;
|
||||
aarch64|arm64) GOXARCH=arm64
|
||||
;;
|
||||
arm*) GOXARCH=armv7
|
||||
;;
|
||||
*) echo "ERROR: unknown arch '$(uname -m)'" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac;
|
||||
|
||||
curl -sSfL \
|
||||
"https://github.com/openziti/zrok/releases/download/${ZROK_VERSION}/zrok_${ZROK_VERSION#v}_linux_${GOXARCH}.tar.gz" \
|
||||
| tar -xz -f -;
|
||||
|
||||
sudo install -o root -g root ./zrok /usr/local/bin/;
|
||||
|
||||
zrok version;
|
||||
```
|
||||
|
||||
</Details>
|
||||
## Install `zrok` from the Repository
|
||||
|
||||
We recommend that you install `zrok` from the Linux package repository with the manual steps or the setup script. DEB and RPM packages are available for amd64, arm64, and armv7 architectures.
|
||||
|
||||
:::info
|
||||
|
||||
Check out [zrok frontdoor](/guides/frontdoor.mdx?os=Linux) for running `zrok` as an always-on service.
|
||||
|
||||
:::
|
||||
|
||||
<Details>
|
||||
<summary>Manually set up DEB repository</summary>
|
||||
|
||||
```text
|
||||
(set -euo pipefail;
|
||||
|
||||
curl -sSLf https://get.openziti.io/tun/package-repos.gpg \
|
||||
| sudo gpg --dearmor --output /usr/share/keyrings/openziti.gpg;
|
||||
sudo chmod a+r /usr/share/keyrings/openziti.gpg;
|
||||
|
||||
sudo tee /etc/apt/sources.list.d/openziti-release.list >/dev/null <<EOF;
|
||||
deb [signed-by=/usr/share/keyrings/openziti.gpg] https://packages.openziti.org/zitipax-openziti-deb-stable debian main
|
||||
EOF
|
||||
|
||||
sudo apt update;
|
||||
sudo apt install zrok;
|
||||
zrok version;
|
||||
)
|
||||
```
|
||||
|
||||
</Details>
|
||||
|
||||
<Details>
|
||||
<summary>Manually set up RPM repository</summary>
|
||||
|
||||
```text
|
||||
(set -euo pipefail;
|
||||
|
||||
sudo tee /etc/yum.repos.d/openziti-release.repo >/dev/null <<\EOF;
|
||||
[OpenZitiRelease]
|
||||
name=OpenZiti Release
|
||||
baseurl=https://packages.openziti.org/zitipax-openziti-rpm-stable/redhat/$basearch
|
||||
enabled=1
|
||||
gpgcheck=0
|
||||
gpgkey=https://packages.openziti.org/zitipax-openziti-rpm-stable/redhat/$basearch/repodata/repomd.xml.key
|
||||
repo_gpgcheck=1
|
||||
EOF
|
||||
|
||||
sudo dnf update;
|
||||
sudo dnf install zrok;
|
||||
zrok version;
|
||||
)
|
||||
```
|
||||
|
||||
</Details>
|
||||
|
||||
<Details>
|
||||
<summary>Script to set up DEB or RPM repository</summary>
|
||||
|
||||
1. Download the zrok install script.
|
||||
|
||||
```text
|
||||
curl -sSLfo ./zrok-install.bash https://get.openziti.io/install.bash
|
||||
```
|
||||
|
||||
1. Inspect the script to ensure it is suitable to run as root on your system.
|
||||
|
||||
```text
|
||||
less ./zrok-install.bash
|
||||
```
|
||||
|
||||
1. Run the script as root to add the package repo and install the `zrok` package.
|
||||
|
||||
```text
|
||||
sudo bash ./zrok-install.bash zrok
|
||||
```
|
||||
|
||||
</Details>
|
||||
|
||||
<Details>
|
||||
<summary>Ansible Playbook</summary>
|
||||
|
||||
<ConcatenateYamlSnippets
|
||||
title="Set up package repository and install zrok">
|
||||
{AnsibleRepoSetup}
|
||||
{`
|
||||
- name: Install zrok package
|
||||
gather_facts: false
|
||||
hosts: all
|
||||
become: true
|
||||
tasks:
|
||||
- name: Install zrok
|
||||
ansible.builtin.package:
|
||||
name: zrok
|
||||
state: present
|
||||
`}
|
||||
</ConcatenateYamlSnippets>
|
||||
|
||||
</Details>
|
55
website/versioned_docs/version-0.4/guides/install/macos.mdx
Normal file
@ -0,0 +1,55 @@
|
||||
---
|
||||
title: Install zrok in macOS
|
||||
sidebar_label: macOS
|
||||
---
|
||||
|
||||
import { AssetsProvider } from '@site/src/components/assets-context';
|
||||
import DownloadCard from '@site/src/components/download-card';
|
||||
import styles from '@site/src/css/download-card.module.css';
|
||||
|
||||
## Darwin Binary
|
||||
|
||||
<AssetsProvider>
|
||||
<div className={styles.downloadContainer}>
|
||||
<DownloadCard
|
||||
osName="macOS"
|
||||
osLogo="/img/logo-apple.svg"
|
||||
/>
|
||||
</div>
|
||||
</AssetsProvider>
|
||||
|
||||
Download the binary distribution for your macOS architecture. For Intel Macs use the `amd64` distribution. For Apple Silicon Macs use the `arm64` distribution.
|
||||
|
||||
1. Unarchive the distribution in a temporary directory.
|
||||
|
||||
```text
|
||||
cd ~/Downloads && mkdir -p /tmp/zrok && tar -xf ./zrok*darwin*.tar.gz -C /tmp/zrok
|
||||
```
|
||||
|
||||
1. Install the `zrok` executable.
|
||||
|
||||
```text
|
||||
mkdir -p ~/bin && install /tmp/zrok/zrok ~/bin/
|
||||
```
|
||||
|
||||
1. Add `~/bin` to your shell's executable search path. Optionally add this to your ~/.zshenv to persist the change.
|
||||
|
||||
```text
|
||||
PATH=~/bin:$PATH
|
||||
```
|
||||
|
||||
1. With the `zrok` executable in your path, you can then execute the `zrok` command from your shell:
|
||||
|
||||
```text
|
||||
zrok version
|
||||
```
|
||||
|
||||
```buttonless title="Output"
|
||||
_
|
||||
_____ __ ___ | | __
|
||||
|_ / '__/ _ \| |/ /
|
||||
/ /| | | (_) | <
|
||||
/___|_| \___/|_|\_\
|
||||
|
||||
v0.4.0 [c889005]
|
||||
```
|
@ -0,0 +1,60 @@
|
||||
---
|
||||
title: Install zrok in Windows
|
||||
sidebar_label: Windows
|
||||
---
|
||||
|
||||
import { AssetsProvider } from '@site/src/components/assets-context';
|
||||
import DownloadCard from '@site/src/components/download-card';
|
||||
import styles from '@site/src/css/download-card.module.css';
|
||||
|
||||
## Windows Binary
|
||||
|
||||
<AssetsProvider>
|
||||
<div className={styles.downloadContainer}>
|
||||
<DownloadCard
|
||||
osName="Windows"
|
||||
osLogo="/img/logo-windows.svg"
|
||||
/>
|
||||
</div>
|
||||
</AssetsProvider>
|
||||
|
||||
1. In PowerShell, change to the directory where you downloaded zrok.
|
||||
|
||||
```text
|
||||
cd "$env:USERPROFILE\Downloads"
|
||||
```
|
||||
|
||||
1. In PowerShell, install zrok in your home directory (`bin\zrok.exe`), and permanently set the executable search path.
|
||||
|
||||
```text
|
||||
$binDir = Join-Path -Path $env:USERPROFILE -ChildPath "bin"
|
||||
New-Item -Path $binDir -ItemType Directory -ErrorAction SilentlyContinue
|
||||
$latest = Get-ChildItem -Path .\zrok*windows*.tar.gz | Sort-Object LastWriteTime | Select-Object -Last 1
|
||||
tar -xf $latest.FullName -C $binDir zrok.exe
|
||||
$currentPath = [System.Environment]::GetEnvironmentVariable('PATH', [System.EnvironmentVariableTarget]::User)
|
||||
if ($currentPath -notlike "*$binDir*") {
|
||||
$newPath = "$currentPath;$binDir"
|
||||
[System.Environment]::SetEnvironmentVariable('PATH', $newPath, [System.EnvironmentVariableTarget]::User)
|
||||
$env:Path = $newPath
|
||||
}
|
||||
```
|
||||
|
||||
1. With the `zrok` executable in your path, you can then execute the `zrok` directly.
|
||||
|
||||
```text
|
||||
zrok version
|
||||
```
|
||||
|
||||
```buttonless title="Output"
|
||||
|
||||
_____ __ ___ | | __
|
||||
|_ / '__/ _ \| |/ /
|
||||
/ /| | | (_) | <
|
||||
/___|_| \___/|_|\_\
|
||||
|
||||
v0.4.0 [c889005]
|
||||
```
|
||||
|
||||
## Wintun for zrok VPN
|
||||
|
||||
On Windows, you must install Wintun to use zrok's VPN backend mode. See the [VPN guide](/guides/vpn/vpn.md) for more details.
|
@ -0,0 +1,8 @@
|
||||
{
|
||||
"label": "Linux User Share",
|
||||
"position": 40,
|
||||
"link": {
|
||||
"type": "doc",
|
||||
"id": "guides/linux-user-share/index"
|
||||
}
|
||||
}
|
@ -0,0 +1,44 @@
|
||||
---
|
||||
title: Linux User Share
|
||||
---
|
||||
|
||||
import LinuxShareInstall from '/../docs/guides/_linux-share-install.mdx'
|
||||
|
||||
## Overview
|
||||
|
||||
You can run any number of zrok share services as `systemd --user` units with your Linux user's zrok environment in `~/.zrok`. This is like [zrok frontdoor](/guides/frontdoor.mdx) except that frontdoor is a system service managed by root separately from your user's login. Linux user shares, Linux system services, and Docker shares all use the same configuration environment variables.
|
||||
|
||||
## Install the Linux Package
|
||||
|
||||
The package provides the `zrok` executable and service unit template.
|
||||
|
||||
<LinuxShareInstall />
|
||||
|
||||
## Create a User Share Configuration File
|
||||
|
||||
Substitute a name for your instance in place of `my-instance` in the following example. To avoid character escaping problems, use only letters, numbers, hyphens, and underscores in the instance name, not spaces or other special characters.
|
||||
|
||||
```bash
|
||||
ZROK_INSTANCE="my-instance"
|
||||
cp /opt/openziti/etc/zrok/zrok-share.env ~/.zrok/zrok-share@${ZROK_INSTANCE}.env
|
||||
```
|
||||
|
||||
## Edit the User Share Configuration File
|
||||
|
||||
Edit the configuration file in `~/.zrok/zrok-share@${ZROK_INSTANCE}.env` as you would for [zrok frontdoor](/guides/frontdoor.mdx), except ignore the first section "ZROK ENVIRONMENT" because user shares re-use `~/.zrok` and do not need a separate zrok environment.
|
||||
|
||||
## Start the User Share Service
|
||||
|
||||
```bash
|
||||
systemctl --user enable --now zrok-share@${ZROK_INSTANCE}.service
|
||||
```
|
||||
|
||||
## Check the User Share Journal
|
||||
|
||||
```bash
|
||||
journalctl --user -lfu zrok-share@${ZROK_INSTANCE}.service
|
||||
```
|
||||
|
||||
## Add Another User Share
|
||||
|
||||
To create another user share, choose another instance name, copy the `zrok-share.env` file, edit the configuration file, and start the service.
|
@ -0,0 +1,77 @@
|
||||
---
|
||||
sidebar_position: 22
|
||||
sidebar_label: Permission Modes
|
||||
---
|
||||
|
||||
# Permission Modes
|
||||
|
||||
Shares created in zrok `v0.4.26` and newer now include a choice of _permission mode_.
|
||||
|
||||
Shares created with zrok `v0.4.25` and older were created using what is now called the _open permission mode_. Whether _public_ or _private_, these shares can be accessed by any user of the zrok service instance, as long as they know the _share token_ of the share. Effectively shares with the _open permission mode_ are accessible by any user of the zrok service instance.
|
||||
|
||||
zrok now supports a _closed permission mode_, which allows for more fine-grained control over which zrok users are allowed to privately access your shares using `zrok access private`.
|
||||
|
||||
zrok defaults to continuing to create shares with the _open permission mode_. This will likely change in a future release. We're leaving the default behavior in place to allow users a period of time to get comfortable with the new permission modes.
|
||||
|
||||
## Creating a Share with Closed Permission Mode
|
||||
|
||||
Adding the `--closed` flag to the `zrok share` or `zrok reserve` commands will create shares using the _closed permission mode_:
|
||||
|
||||
```
|
||||
$ zrok share private --headless --closed -b web .
|
||||
[ 0.066] INFO main.(*sharePrivateCommand).run: allow other to access your share with the following command:
|
||||
zrok access private 0vzwzodf0c7g
|
||||
```
|
||||
|
||||
By default any environment owned by the account that created the share is _allowed_ to access the new share. But a user trying to access the share from an environment owned by a different account will enounter the following error message:
|
||||
|
||||
```
|
||||
$ zrok access private 0vzwzodf0c7g
|
||||
[ERROR]: unable to access ([POST /access][401] accessUnauthorized)
|
||||
```
|
||||
|
||||
The `zrok share` and `zrok reserve` commands now include an `--access-grant` flag, which allows you to specify additional zrok accounts that are allowed to access your shares:
|
||||
|
||||
```
|
||||
$ zrok share private --headless --closed --access-grant anotheruser@test.com -b web .
|
||||
[ 0.062] INFO main.(*sharePrivateCommand).run: allow other to access your share with the following command:
|
||||
zrok access private y6h4at5xvn6o
|
||||
```
|
||||
|
||||
And now `anotheruser@test.com` will be allowed to access the share:
|
||||
|
||||
```
|
||||
$ zrok access private --headless y6h4at5xvn6o
|
||||
[ 0.049] INFO main.(*accessPrivateCommand).run: allocated frontend 'VyvrJihAOEHD'
|
||||
[ 0.051] INFO main.(*accessPrivateCommand).run: access the zrok share at the following endpoint: http://127.0.0.1:9191
|
||||
```
|
||||
|
||||
## Adding and Removing Access Grants for Existing Shares
|
||||
|
||||
If you've created a share (either reserved or ephemeral) and you forgot to include an access grant, or want to remove an access grant that was mistakenly added, you can use the `zrok modify share` command to make the adjustments:
|
||||
|
||||
Create a share:
|
||||
|
||||
```
|
||||
$ zrok share private --headless --closed -b web .
|
||||
[ 0.064] INFO main.(*sharePrivateCommand).run: allow other to access your share with the following command:
|
||||
zrok access private s4czjylwk7wa
|
||||
```
|
||||
|
||||
In another shell in the same environment you can execute:
|
||||
|
||||
```
|
||||
$ zrok modify share s4czjylwk7wa --add-access-grant anotheruser@test.com
|
||||
updated
|
||||
```
|
||||
|
||||
And to remove the grant:
|
||||
|
||||
```
|
||||
$ zrok modify share s4czjylwk7wa --remove-access-grant anotheruser@test.com
|
||||
updated
|
||||
```
|
||||
|
||||
## Limitations
|
||||
|
||||
As of `v0.4.26` there is currently no way to _list_ the current access grants. This will be addressed shortly in a subsequent update.
|
@ -0,0 +1,7 @@
|
||||
{
|
||||
"label": "Self Hosting",
|
||||
"position": 80,
|
||||
"link": {
|
||||
"type": "generated-index"
|
||||
}
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
---
|
||||
title: Self-hosting guide for Docker
|
||||
sidebar_label: Docker
|
||||
sidebar_position: 45
|
||||
---
|
||||
|
||||
import DockerInstance from '/../docker/compose/zrok-instance/README.md'
|
||||
|
||||
<DockerInstance />
|
@ -0,0 +1,46 @@
|
||||
---
|
||||
title: Use Another zrok Instance
|
||||
sidebar_label: Instance Config
|
||||
---
|
||||
|
||||
:::note
|
||||
This guide is relevant if you are self-hosting or using a friend's `zrok` instance instead of using zrok-as-a-service from `zrok.io`.
|
||||
:::
|
||||
|
||||
The `zrok` *command* on your computer uses a `zrok` *instance* over the network.
|
||||
|
||||
The default instance API endpoint for the `zrok` command is `api.zrok.io`. Set the API endpoint to another instance's API endpoint:
|
||||
|
||||
```text
|
||||
zrok config set apiEndpoint https://zrok.example.com
|
||||
```
|
||||
|
||||
```buttonless title="Output"
|
||||
[WARNING]: unable to open environment metadata; ignoring
|
||||
|
||||
zrok configuration updated
|
||||
```
|
||||
|
||||
:::note
|
||||
The `WARNING` about `environment metadata` is expected when you run `zrok config set` before `zrok enable`.
|
||||
:::
|
||||
|
||||
You can use the `zrok status` command to inspect the state of your local _environment_. `zrok` refers to each shell where you install and `enable` a copy of `zrok` as an _environment_.
|
||||
|
||||
```text
|
||||
zrok status
|
||||
```
|
||||
|
||||
```buttonless title="Output"
|
||||
Config:
|
||||
|
||||
CONFIG VALUE SOURCE
|
||||
apiEndpoint https://zrok.mydomain.com config
|
||||
|
||||
[WARNING]: Unable to load your local environment!
|
||||
|
||||
To create a local environment use the zrok enable command.
|
||||
```
|
||||
|
||||
The `zrok status` command shows the configured API service that your environment is using, as well as the `SOURCE` where the setting was retrieved. In this case, `config` means that the setting was set into the environment using the `zrok config` command.
|
||||
|
@ -0,0 +1,67 @@
|
||||
---
|
||||
title: Interstitial Pages
|
||||
sidebar_label: Interstitial Pages
|
||||
sidebar_position: 18
|
||||
---
|
||||
|
||||
On large zrok installations that support open registration and shared public frontends, abuse can become an issue. In order to mitigate phishing and other similar forms of abuse, zrok offers an interstitial page that announces to the visiting user that the share is hosted through zrok, and probably isn't their financial institution.
|
||||
|
||||
Interstitial pages can be enabled on a per-frontend basis. This allows the interstitial to be enabled on open public frontends but not closed public frontends (closed public frontends require a grant to use).
|
||||
|
||||
The interstitial page requirement can also be overridden on a per-account basis, allowing shares created by specific accounts to bypass the interstitial requirement on frontends that enable it. This facilitates building infrastructure that grants trusted users additional privileges.
|
||||
|
||||
By default, if you do not specifically enable interstitial pages on a public frontend, then your self-hosted service instance will not offer them.
|
||||
|
||||
Let's take a look at how the interstitial pages mechanism works. The following diagram shows the share configuration rendezvous made between the zrok controller and a zrok frontend:
|
||||
|
||||

|
||||
|
||||
Every zrok share has a _config_ recorded in the underlying OpenZiti network. The config is of type `zrok.proxy.v1`. The frontend uses the information in this config to understand the disposition of the share. The config can contain an `interstitial: true` setting. If the config has this setting, and the frontend is configured to enable interstitial pages, then end users accessing the share will receive the interstitial page on first visit.
|
||||
|
||||
By default the zrok controller will record `interstitial: true` in the share config _unless_ a row is present in the `skip_interstitial_grants` table in the underlying database for the account creating the share. The `skip_interstitial_grants` table is a basic SQL structure that allows inserting a row per account.
|
||||
|
||||
```
|
||||
create table skip_interstitial_grants (
|
||||
id serial primary key,
|
||||
|
||||
account_id integer references accounts (id) not null,
|
||||
|
||||
created_at timestamptz not null default(current_timestamp),
|
||||
updated_at timestamptz not null default(current_timestamp),
|
||||
deleted boolean not null default(false)
|
||||
);
|
||||
```
|
||||
|
||||
If an account has a row present in this table when creating a share, then the controller will write `interstitial: false` into the config for the share, which will bypass the interstitial regardless of frontend configuration. The `skip_interstitial_grants` controls what the zrok controller will store in the share config when creating the share.
|
||||
|
||||
The frontend configuration controls what the frontend will do with the share config it finds in OpenZiti. The new stanza looks like this:
|
||||
|
||||
```
|
||||
# Configure interstitial pages for this frontend. The interstitial page presents a warning to internet users, alerting
|
||||
# them to the fact that they're visiting a zrok share.
|
||||
#
|
||||
#interstitial:
|
||||
# # Enable or disable interstitial pages on this frontend.
|
||||
# #
|
||||
# enabled: true
|
||||
#
|
||||
# # Specify a list of User-Agent prefixes that should receive the interstitial page. If interstitial pages are enabled
|
||||
# # and this list is not set, all user agents will receive an interstitial page.
|
||||
# #
|
||||
# user_agent_prefixes:
|
||||
# - "Mozilla/5.0"
|
||||
```
|
||||
|
||||
Setting `enabled: true` in the `interstitial` stanza of the frontend config will allow the configured frontend to offer an interstitial page if the share config enables the interstitial page for that share. The `user_agent_prefixes` array can be used to specify which specific `User-Agent` types receive the interstitial. User agents that match a prefix in the list will receive the interstitial, while others will not. If the `user_agent_prefixes` list is omitted, _all_ user agents will receive the interstitial page.
|
||||
|
||||
## Bypassing the Interstitial
|
||||
|
||||
The interstitial page will be presented unless the client shows up with a `zrok_interstitial` cookie (depending on `user_agent_prefixes` configuration). When the user is presented with the interstitial page, there is a button they can click which sets the necessary cookie and allows them to visit the site. The cookie is set to expire in one week.
|
||||
|
||||
Typically the `user_agent_prefixes` list contains `Mozilla/5.0`, which matches all typical interactive mobile and desktop browsers. Setting a non-standard `User-Agent` in an interactive browser will bypass the interstitial pages for frontends configured with the usual `Mozilla/5.0` prefix.
|
||||
|
||||
End users can offer an HTTP header of `skip_zrok_interstitial`, set to any value to bypass the interstitial page. Setting this header means that the user most likely understands what a zrok share is and will hopefully not fall for a phishing attack.
|
||||
|
||||
The `skip_zrok_interstitial` header is especially useful for API clients (like `curl`) and other types of non-interactive clients.
|
||||
|
||||
The `drive` backend mode does not currently support `GET` requests and cannot be accessed with a conventional web browser, so it bypasses the interstitial page requirement.
|
@ -0,0 +1,9 @@
|
||||
---
|
||||
title: Self-host a zrok Instance in Kubernetes
|
||||
sidebar_label: Kubernetes
|
||||
sidebar_position: 55
|
||||
---
|
||||
|
||||
The Helm chart for zrok is available from the main OpenZiti charts repo.
|
||||
|
||||
[Link to README in GitHub](https://github.com/openziti/helm-charts/tree/main/charts/zrok#readme)
|
@ -0,0 +1,8 @@
|
||||
{
|
||||
"label": "Linux",
|
||||
"position": 10,
|
||||
"link": {
|
||||
"type": "doc",
|
||||
"id": "index"
|
||||
}
|
||||
}
|
@ -0,0 +1,334 @@
|
||||
---
|
||||
sidebar_position: 40
|
||||
title: Self-Hosting Guide for Linux
|
||||
sidebar_label: Linux
|
||||
---
|
||||
|
||||
## Walkthrough Video
|
||||
|
||||
<iframe width="100%" height="315" src="https://www.youtube.com/embed/870A5dke_u4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
|
||||
|
||||
## Before you Begin
|
||||
|
||||
This will get you up and running with a self-hosted instance of `zrok`. I'll assume you have the following:
|
||||
|
||||
* a Linux server with a public IP
|
||||
* a wildcard DNS record like `*.zrok.quigley.com` that resolves to the server IP
|
||||
|
||||
## OpenZiti
|
||||
|
||||
OpenZiti (a.k.a. "Ziti") provides secure network backhaul for `zrok` public and private shares. You need a Ziti Controller and a Ziti Router. You can run everything on the same Linux VPS.
|
||||
|
||||
|
||||
1. Install the Ziti Controller package by following the [Linux controller deployment guide](https://openziti.io/docs/category/deployments).
|
||||
1. Ensure your answer file (`/opt/openziti/etc/controller/bootstrap.env`) has the FQDN of your Linux server and an admin password defined.
|
||||
1. Ensure your firewall allows the controller port from the answer file.
|
||||
1. Start the controller service (`ziti-controller.service`) and check the status.
|
||||
1. Log in to the Ziti Controller
|
||||
|
||||
```bash
|
||||
ziti edge login localhost:1280 -u admin -p <password>
|
||||
```
|
||||
|
||||
1. Administratively Create a Ziti Router
|
||||
|
||||
```bash
|
||||
ziti edge create edge-router "router1" -o /tmp/router1.jwt
|
||||
```
|
||||
|
||||
1. Install the Ziti Router package by following [the Linux router deployment guide](https://openziti.io/docs/category/deployments).
|
||||
1. Ensure your answer file (`/opt/openziti/etc/router/bootstrap.env`) has the FQDN of your Linux server for both controller and router addresses and the enrollment token from the previous step.
|
||||
1. Ensure your firewall allows the router port from the answer file.
|
||||
1. Start the router service (`ziti-router.service`) and check the status.
|
||||
|
||||
1. Verify the new router is online.
|
||||
|
||||
```bash
|
||||
ziti edge list edge-routers
|
||||
```
|
||||
|
||||
## Install zrok
|
||||
|
||||
Debian and RPM packages are available for `zrok`.
|
||||
|
||||
```bash
|
||||
sudo apt install zrok
|
||||
```
|
||||
|
||||
Follow [the Linux installation guide](/guides/install/linux.mdx) to install the `zrok` package from the repository or manually install the binary for your platform.
|
||||
|
||||
## Configure the Controller
|
||||
|
||||
Create a `zrok` controller configuration file in `etc/ctrl.yml`. The controller can terminate TLS or you may front the server with a reverse proxy that continually renews the necessary wildcard certificate (e.g., Caddy w/ a DNS provider plugin). This example will expose the non-TLS listener for the controller.
|
||||
|
||||
```yaml
|
||||
# _____ __ ___ | | __
|
||||
# |_ / '__/ _ \| |/ /
|
||||
# / /| | | (_) | <
|
||||
# /___|_| \___/|_|\_\
|
||||
# controller configuration
|
||||
|
||||
v: 3
|
||||
|
||||
admin:
|
||||
# generate these admin tokens from a source of randomness, e.g.
|
||||
# LC_ALL=C tr -dc _A-Z-a-z-0-9 < /dev/urandom | head -c32
|
||||
secrets:
|
||||
- Q8V0LqnNb5wNX9kE1fgQ0H6VlcvJybB1 # be sure to change this!
|
||||
|
||||
endpoint:
|
||||
host: 0.0.0.0
|
||||
port: 18080
|
||||
|
||||
invites:
|
||||
invites_open: true
|
||||
|
||||
store:
|
||||
path: zrok.db
|
||||
type: sqlite3
|
||||
|
||||
ziti:
|
||||
api_endpoint: "https://127.0.0.1:1280"
|
||||
username: admin
|
||||
password: "XO0xHp75uuyeireO2xmmVlK91T7B9fpD"
|
||||
|
||||
# you can use certbot to renew the wildcard cert for the controller with a DNS provider API token or front this `zrok` # controller with Caddy
|
||||
#tls:
|
||||
# cert_path: "/Path/To/Cert/zrok.crt"
|
||||
# key_path: "/Path/To/Cert/zrok.key"
|
||||
|
||||
```
|
||||
|
||||
The `admin` section defines privileged administrative credentials and must be set in the `ZROK_ADMIN_TOKEN` environment variable in shells where you want to run `zrok admin`.
|
||||
|
||||
The `endpoint` section defines where your `zrok` controller will listen.
|
||||
|
||||
The `store` section defines the local `sqlite3` database used by the controller.
|
||||
|
||||
The `ziti` section defines how the `zrok` controller should communicate with your OpenZiti installation. When using the OpenZiti quickstart, an administrative password will be generated; the `password` in the `ziti` stanza should reflect this password.
|
||||
|
||||
:::note
|
||||
|
||||
Be sure to see the [reference configuration at `etc/ctrl.yml`](../../../../../../etc/ctrl.yml) for the complete documentation of the current configuration file format for the `zrok` controller and service instance components.
|
||||
|
||||
See the separate guides on [configuring metrics](/guides/self-hosting/metrics-and-limits/configuring-metrics.md) and [configuring limits](/guides/self-hosting/metrics-and-limits/configuring-limits.md) for details about both of these specialized areas of service instance configuration.
|
||||
|
||||
:::
|
||||
|
||||
## Environment Variables
|
||||
|
||||
The `zrok` binaries are configured to work with the global `zrok.io` service, and default to using `api.zrok.io` as the endpoint for communicating with the service.
|
||||
|
||||
To work with a self-hosted `zrok` deployment, you'll need to set the `ZROK_API_ENDPOINT` environment variable to point to the address where your `zrok` controller will be listening, according to `endpoint` in the configuration file above.
|
||||
|
||||
In my case, I've set:
|
||||
|
||||
```bash
|
||||
export ZROK_API_ENDPOINT=http://127.0.0.1:18080
|
||||
```
|
||||
|
||||
[Read more about configuring your self-hosted `zrok` instance](/guides/self-hosting/instance-configuration.mdx).
|
||||
|
||||
## Bootstrap OpenZiti for zrok
|
||||
|
||||
With your OpenZiti network running and your configuration saved to a local file (I refer to mine as `etc/ctrl.yml` in these examples), you're ready to bootstrap the Ziti network.
|
||||
|
||||
Use the `zrok admin bootstrap` command to bootstrap like this:
|
||||
|
||||
```bash
|
||||
$ zrok admin bootstrap etc/ctrl.yml
|
||||
[ 0.002] INFO main.(*adminBootstrap).run: {
|
||||
...
|
||||
}
|
||||
[ 0.002] INFO zrok/controller/store.Open: database connected
|
||||
[ 0.006] INFO zrok/controller/store.(*Store).migrate: applied 0 migrations
|
||||
[ 0.006] INFO zrok/controller.Bootstrap: connecting to the ziti edge management api
|
||||
[ 0.039] INFO zrok/controller.Bootstrap: creating identity for controller ziti access
|
||||
[ 0.071] INFO zrok/controller.Bootstrap: controller identity: jKd8AINSz
|
||||
[ 0.082] INFO zrok/controller.assertIdentity: asserted identity 'jKd8AINSz'
|
||||
[ 0.085] INFO zrok/controller.assertErpForIdentity: asserted erps for 'ctrl' (jKd8AINSz)
|
||||
[ 0.085] INFO zrok/controller.Bootstrap: creating identity for frontend ziti access
|
||||
[ 0.118] INFO zrok/controller.Bootstrap: frontend identity: sqJRAINSiB
|
||||
[ 0.119] INFO zrok/controller.assertIdentity: asserted identity 'sqJRAINSiB'
|
||||
[ 0.120] INFO zrok/controller.assertErpForIdentity: asserted erps for 'frontend' (sqJRAINSiB)
|
||||
[ 0.120] WARNING zrok/controller.Bootstrap: missing public frontend for ziti id 'sqJRAINSiB'; please use 'zrok admin create frontend sqJRAINSiB public https://{token}.your.dns.name' to create a frontend instance
|
||||
[ 0.123] INFO zrok/controller.assertZrokProxyConfigType: found 'zrok.proxy.v1' config type with id '33CyjNbIepkXHN5VzGDA8L'
|
||||
[ 0.124] INFO zrok/controller.assertMetricsService: creating 'metrics' service
|
||||
[ 0.126] INFO zrok/controller.assertMetricsService: asserted 'metrics' service (5RpPZZ7T8bZf1ENjwGiPc3)
|
||||
[ 0.128] INFO zrok/controller.assertMetricsSerp: creating 'metrics' serp
|
||||
[ 0.130] INFO zrok/controller.assertMetricsSerp: asserted 'metrics' serp
|
||||
[ 0.134] INFO zrok/controller.assertCtrlMetricsBind: creating 'ctrl-metrics-bind' service policy
|
||||
[ 0.135] INFO zrok/controller.assertCtrlMetricsBind: asserted 'ctrl-metrics-bind' service policy
|
||||
[ 0.138] INFO zrok/controller.assertFrontendMetricsDial: creating 'frontend-metrics-dial' service policy
|
||||
[ 0.140] INFO zrok/controller.assertFrontendMetricsDial: asserted 'frontend-metrics-dial' service policy
|
||||
[ 0.140] INFO main.(*adminBootstrap).run: bootstrap complete!
|
||||
```
|
||||
|
||||
The `zrok admin bootstrap` command configures the `zrok` database, the necessary OpenZiti identities, and all of the OpenZiti policies required to run a `zrok` service.
|
||||
|
||||
Notice this warning:
|
||||
|
||||
```
|
||||
[ 0.120] WARNING zrok/controller.Bootstrap: missing public frontend for ziti id 'sqJRAINSiB'; please use 'zrok admin create frontend sqJRAINSiB public https://{token}.your.dns.name' to create a frontend instance
|
||||
```
|
||||
|
||||
If you find it necessary to re-run the `zrok admin bootstrap` command, you may need to add the `--skip-frontend` flag to avoid re-creating the default `public` frontend's Ziti identity and router policy.
|
||||
|
||||
## Run zrok Controller
|
||||
|
||||
The `zrok` bootstrap process wants us to create a "public frontend" for our service. `zrok` uses public frontends to allow users to specify where they would like public traffic to ingress from.
|
||||
|
||||
The `zrok admin create frontend` command requires a running `zrok` controller, so let's start that up first:
|
||||
|
||||
```bash
|
||||
$ zrok controller etc/ctrl.yml
|
||||
[ 0.003] INFO main.(*controllerCommand).run: {
|
||||
...
|
||||
}
|
||||
[ 0.016] INFO zrok/controller.inspectZiti: inspecting ziti controller configuration
|
||||
[ 0.048] INFO zrok/controller.findZrokProxyConfigType: found 'zrok.proxy.v1' config type with id '33CyjNbIepkXHN5VzGDA8L'
|
||||
[ 0.048] INFO zrok/controller/store.Open: database connected
|
||||
[ 0.048] INFO zrok/controller/store.(*Store).migrate: applied 0 migrations
|
||||
[ 0.049] INFO zrok/controller.(*metricsAgent).run: starting
|
||||
[ 0.064] INFO zrok/rest_server_zrok.setupGlobalMiddleware: configuring
|
||||
[ 0.064] INFO zrok/ui.StaticBuilder: building
|
||||
[ 0.065] INFO zrok/rest_server_zrok.(*Server).Logf: Serving zrok at http://[::]:18080
|
||||
[ 0.085] INFO zrok/controller.(*metricsAgent).listen: started
|
||||
```
|
||||
|
||||
## Create zrok Frontend
|
||||
|
||||
With our `ZROK_ADMIN_TOKEN` and `ZROK_API_ENDPOINT` environment variables set, we can create our public frontend like this:
|
||||
|
||||
```bash
|
||||
$ zrok admin create frontend sqJRAINSiB public http://{token}.zrok.quigley.com:8080
|
||||
[ 0.037] INFO main.(*adminCreateFrontendCommand).run: created global public frontend 'WEirJNHVlcW9'
|
||||
```
|
||||
|
||||
The id of the frontend was emitted earlier in by the `zrok` controller when we ran the bootstrap command. If you don't have that log message the you can find the id again with the `ziti` CLI like this:
|
||||
|
||||
```bash
|
||||
# log in as admin (example)
|
||||
ziti edge login localhost:1280 -u admin -p XO0xHp75uuyeireO2xmmVlK91T7B9fpD
|
||||
|
||||
# list Ziti identities created by the quickstart and bootstrap
|
||||
ziti edge list identities
|
||||
```
|
||||
|
||||
The id is shown for the frontend identity named "public."
|
||||
|
||||
Nice work! The `zrok` controller is fully configured now that you have created the `zrok` frontend.
|
||||
|
||||
## Configure the Public Frontend
|
||||
|
||||
Create an http frontend configuration file in `etc/http-frontend.yml`.
|
||||
|
||||
```yaml
|
||||
v: 3
|
||||
host_match: zrok.quigley.com
|
||||
address: 0.0.0.0:8080
|
||||
```
|
||||
|
||||
This frontend config file has a `host_match` pattern that represents the DNS zone you're using with this instance of `zrok`. Incoming HTTP requests with a matching `Host` header will be handled by this frontend. You may also specify the interface address where the frontend will listen for public access requests.
|
||||
|
||||
The frontend does not provide server TLS, but you may front the server with a reverse proxy. The reverse proxy must forward the `Host` header supplied by the viewer. This example will expose the non-TLS listener for the frontend.
|
||||
|
||||
You can also specify an `oauth` configuration in this file, full details of are found in [OAuth Public Frontend Configuration](/guides/self-hosting/oauth/configuring-oauth.md#configuring-your-public-frontend).
|
||||
|
||||
## Start Public Frontend
|
||||
|
||||
In another terminal window, run:
|
||||
|
||||
```bash
|
||||
$ zrok access public etc/http-frontend.yml
|
||||
[ 0.002] INFO main.(*accessPublicCommand).run: {
|
||||
...
|
||||
}
|
||||
[ 0.002] INFO zrok/endpoints/public_frontend.newMetricsAgent: loaded 'public' identity
|
||||
```
|
||||
|
||||
The `zrok` frontend uses the `public` identity created during the bootstrap process to securely access zrok backends. to provide public access for the `zrok` deployment. It is expected that the configured listener for this frontend corresponds to the DNS template specified when creating the public frontend record above.
|
||||
|
||||
## Create a User Account
|
||||
|
||||
With our `ZROK_ADMIN_TOKEN` and `ZROK_API_ENDPOINT` environment variables set, we can create our first user account.
|
||||
|
||||
```bash
|
||||
zrok admin create account <email> <password>
|
||||
```
|
||||
|
||||
The output is the account token you will use to enable each device's zrok environment.
|
||||
|
||||
```buttonless title="Example output"
|
||||
SuGzRPjVDIcF
|
||||
```
|
||||
|
||||
## Invite Additional Users
|
||||
|
||||
Offer this onboarding method to your users if you have configured an email-sending service in your `zrok` controller configuration.
|
||||
|
||||
```bash
|
||||
$ zrok invite
|
||||
New Email: user@domain.com
|
||||
Confirm Email: user@domain.com
|
||||
invitation sent to 'user@domain.com'!
|
||||
```
|
||||
|
||||
If you look at the console output from your `zrok` controller, you'll see a message like this:
|
||||
|
||||
```
|
||||
[ 238.168] INFO zrok/controller.(*inviteHandler).Handle: account request for 'user@domain.com' has registration token 'U2Ewt1UCn3ql'
|
||||
```
|
||||
|
||||
You can access your `zrok` controller's registration UI by pointing a web browser at:
|
||||
|
||||
```
|
||||
http://localhost:18080/register/U2Ewt1UCn3ql
|
||||
```
|
||||
|
||||
The UI will ask you to set a password for your new account. Go ahead and do that.
|
||||
|
||||
After doing that, I see the following output in my controller console:
|
||||
|
||||
```
|
||||
[ 516.778] INFO zrok/controller.(*registerHandler).Handle: created account 'user@domain.com' with token 'SuGzRPjVDIcF'
|
||||
```
|
||||
|
||||
Keep track of the token listed above (`SuGzRPjVDIcF`). We'll use this to enable our shell for this `zrok` deployment.
|
||||
|
||||
## Enable Your Environment
|
||||
|
||||
On another device that can reach your Linux server by FQDN, configure the API endpoint and enable the environment with the account token you received when you created the first user account.
|
||||
|
||||
```bash
|
||||
export ZROK_API_ENDPOINT=https://zrok.quigley.com
|
||||
# or
|
||||
zrok config set apiEndpoint https://zrok.quigley.com
|
||||
```
|
||||
|
||||
```bash
|
||||
zrok enable SuGzRPjVDIcF
|
||||
```
|
||||
|
||||
```buttonless title="Example output"
|
||||
zrok environment '2AS1WZ3Sz' enabled for 'SuGzRPjVDIcF'
|
||||
```
|
||||
|
||||
```bash
|
||||
zrok status --secrets
|
||||
```
|
||||
|
||||
```buttonless title="Example output"
|
||||
Config:
|
||||
|
||||
CONFIG VALUE SOURCE
|
||||
apiEndpoint https://zrok.quigley.com env
|
||||
|
||||
Environment:
|
||||
|
||||
PROPERTY VALUE
|
||||
Secret Token SuGzRPjVDIcF
|
||||
Ziti Identity 2AS1WZ3Sz
|
||||
```
|
||||
|
||||
Congratulations. You have a working `zrok` environment!
|
@ -0,0 +1,107 @@
|
||||
---
|
||||
sidebar_position: 50
|
||||
sidebar_label: NGINX TLS
|
||||
---
|
||||
|
||||
# NGINX Reverse Proxy for zrok
|
||||
|
||||
## Walkthrough Video
|
||||
|
||||
<iframe width="100%" height="315" src="https://www.youtube.com/embed/870A5dke_u4?start=1080" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
|
||||
|
||||
## Before You Begin
|
||||
|
||||
I'll assume you have a running `zrok` controller and frontend and wish to front both with NGINX providing server TLS. Go back to [Self-Hosting Guide](/guides/self-hosting/linux/index.mdx) if you still need to spin those up.
|
||||
|
||||
## Choose a Reverse Proxy Address
|
||||
|
||||
I'll use `https://api.zrok.quigley.com:443` in this example, and assume you already set up wildcard DNS like `*.zrok.quigley.com`. This lets us elect `api.zrok.quigley.com` as the controller DNS name, and forward any other incoming requests to the zrok public frontend.
|
||||
|
||||
## Obtain a Wildcard Server Certificate
|
||||
|
||||
You must complete a DNS challenge to obtain a wildcard certificate from Let's Encrypt. I'll assume you know how to create the necessary TXT record in the DNS zone you're using with zrok.
|
||||
|
||||
1. Install certbot: https://eff-certbot.readthedocs.io/en/stable/install.html
|
||||
2. Run certbot with the manual plugin: https://certbot.eff.org/docs/using.html#manual
|
||||
|
||||
```bash
|
||||
# install cert for *.zrok.quigley.com in /etc/letsencrypt
|
||||
sudo certbot certonly --manual
|
||||
````
|
||||
|
||||
## [Install NGINX](https://www.nginx.com/resources/wiki/start/topics/tutorials/install/)
|
||||
|
||||
## Configure NGINX
|
||||
|
||||
```
|
||||
server {
|
||||
listen 443 ssl;
|
||||
server_name api.zrok.quigley.com;
|
||||
ssl_certificate /etc/letsencrypt/live/zrok.quigley.com/fullchain.pem;
|
||||
ssl_certificate_key /etc/letsencrypt/live/zrok.quigley.com/privkey.pem;
|
||||
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
|
||||
ssl_ciphers HIGH:!aNULL:!MD5;
|
||||
|
||||
location / {
|
||||
proxy_pass http://127.0.0.1:18080;
|
||||
error_log /var/log/nginx/zrok-controller.log;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
map $http_upgrade $connection_upgrade {
|
||||
default keep-alive;
|
||||
'websocket' upgrade;
|
||||
'' close;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 443 ssl;
|
||||
server_name *.zrok.quigley.com;
|
||||
ssl_certificate /etc/letsencrypt/live/zrok.quigley.com/fullchain.pem;
|
||||
ssl_certificate_key /etc/letsencrypt/live/zrok.quigley.com/privkey.pem;
|
||||
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
|
||||
ssl_ciphers HIGH:!aNULL:!MD5;
|
||||
|
||||
location / {
|
||||
proxy_pass http://127.0.0.1:8080;
|
||||
proxy_set_header Host $host;
|
||||
error_log /var/log/nginx/zrok-frontend.log;
|
||||
proxy_busy_buffers_size 512k;
|
||||
proxy_buffers 4 512k;
|
||||
proxy_buffer_size 256k;
|
||||
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Restart NGINX
|
||||
|
||||
Load the new configuration by restarting NGINX. Check the logs to make sure it's happy.
|
||||
|
||||
> Started A high performance web server and a reverse proxy server.
|
||||
|
||||
## Check the Firewall
|
||||
|
||||
If you followed the non-TLS quickstart then you may have opened 8080,108080/tcp in your firewall. You can go ahead and replace those exceptions with 443/tcp because only NGINX needs to be reachable for zrok to function.
|
||||
|
||||
## Update the zrok Frontend
|
||||
|
||||
List available frontends to obtain the token identifier of the frontend named "public". You may need to set `ZROK_ADMIN_TOKEN` or `ZROK_API_ENDPOINT` before running `zrok admin`.
|
||||
|
||||
```bash
|
||||
$ zrok admin list frontends
|
||||
|
||||
TOKEN ZID PUBLIC NAME URL TEMPLATE CREATED AT UPDATED AT
|
||||
2NiDTRYUww18 7DsLh9DXG public http://{token}.zrok.quigley.com:8080 2023-01-19 05:29:20.793 +0000 UTC 2023-01-19 06:17:25 +0000 UTC
|
||||
```
|
||||
|
||||
Update the URL template to use NGINX.
|
||||
|
||||
```bash
|
||||
$ zrok admin update frontend 2NiDTRYUww18 --url-template https://{token}.zrok.quigley.com:443
|
||||
[ 0.028] INFO main.(*adminUpdateFrontendCommand).run: updated global frontend '2NiDTRYUww18'
|
||||
```
|
@ -0,0 +1,7 @@
|
||||
{
|
||||
"label": "Metrics and Limits",
|
||||
"position": 60,
|
||||
"link": {
|
||||
"type": "generated-index"
|
||||
}
|
||||
}
|
@ -0,0 +1,210 @@
|
||||
---
|
||||
sidebar_position: 40
|
||||
---
|
||||
|
||||
# Configuring Limits
|
||||
|
||||
:::note
|
||||
This guide is current as of zrok version `v0.4.31`.
|
||||
:::
|
||||
|
||||
:::warning
|
||||
If you have not yet configured [metrics](configuring-metrics.md), please visit the [metrics guide](configuring-metrics.md) first before working through the limits configuration.
|
||||
:::
|
||||
|
||||
## Understanding the zrok Limits Agent
|
||||
|
||||
The limits agent is a component of the zrok controller. It can be enabled and configured through the zrok controller configuration.
|
||||
|
||||
The limits agent is responsible for controlling the number of resources in use (environments, shares, etc.) and also for ensuring that accounts are held below the configured data transfer bandwidth thresholds. The limits agent exists to manage resource consumption for larger, multi-user zrok installations.
|
||||
|
||||
### Types of Limits
|
||||
|
||||
Limits can be specified that control the number of environments, shares, reserved shares, unique names, and frontends per-share that can be created by an account. Limits that control the allowed number of resources are called _resource count limits_.
|
||||
|
||||
Limits can be specified to control the amount of data that can be transferred within a time period. Limits that control the amount of data that can be transferred are called _bandwidth limits_.
|
||||
|
||||
zrok limits can be specified _globally_, applying to all users in a service instance. Limit _classes_ can be created to provide additional levels of resource allocation. Limit classes can then be _applied_ to multiple accounts, to alter their limit allocation beyond what's configured in the global configuration.
|
||||
|
||||
## The Global Configuration
|
||||
|
||||
The reference configuration for the zrok controller (found at [`etc/ctrl.yaml`](https://github.com/openziti/zrok/blob/main/etc/ctrl.yml) in the [repository](https://github.com/openziti/zrok)) contains the global limits configuration, which looks like this:
|
||||
|
||||
```yaml
|
||||
# Service instance limits global configuration.
|
||||
#
|
||||
# See `docs/guides/metrics-and-limits/configuring-limits.md` for details.
|
||||
#
|
||||
limits:
|
||||
environments: -1
|
||||
shares: -1
|
||||
reserved_shares: -1
|
||||
unique_names: -1
|
||||
share_frontends: -1
|
||||
bandwidth:
|
||||
period: 5m
|
||||
warning:
|
||||
rx: -1
|
||||
tx: -1
|
||||
total: 7242880
|
||||
limit:
|
||||
rx: -1
|
||||
tx: -1
|
||||
total: 10485760
|
||||
enforcing: false
|
||||
cycle: 5m
|
||||
```
|
||||
|
||||
:::note
|
||||
A value of `-1` appearing in the limits configuration mean the value is _unlimited_.
|
||||
:::
|
||||
|
||||
The `enforcing` boolean specifies whether or not limits are enabled in the service instance. By default, limits is disabled. No matter what else is configured in this stanza, if `enforcing` is set to `false`, there will be no limits placed on any account in the service instance.
|
||||
|
||||
The `cycle` value controls how frequently the limits agent will evaluate enforced limits. When a user exceeds a limit and has their shares disabled, the limits agent will evaluate their bandwidth usage on this interval looking to "relax" the limit once their usage falls below the threshold.
|
||||
|
||||
### Global Resouce Count Limits
|
||||
|
||||
The `environments`, `shares`, `reserved_shares`, `unique_names`, and `share_frontends` specify the resource count limits, globally for the service instance.
|
||||
|
||||
These resource counts will be applied to all users in the service instance by default.
|
||||
|
||||
### Global Bandwidth Limits
|
||||
|
||||
The `bandwidth` section defines the global bandwidth limits for all users in the service instance.
|
||||
|
||||
There are two levels of bandwidth limits that can be specified in the global configuration. The first limit defines a _warning_ threshold where the user will receive an email that they are using increased data transfer amounts and will ultimately be subject to a limit. If you do not want this warning email to be sent, then configure all of the values to `-1` (unlimited).
|
||||
|
||||
The second limit defines the the actual _limit_ threshold, where the limits agent will disabled traffic for the account's shares.
|
||||
|
||||
Bandwidth limits can be specified in terms of `tx` (or _transmitted_ data), `rx` (or _received_ data), and the `total` bytes that are sent in either direction. If you only want to set the `total` transferred limit, you can set `rx` and `tx` to `-1` (for _unlimited_). You can configure any combination of these these values at either the limit or warning levels.
|
||||
|
||||
The `period` specifies the time window for the bandwidth limit. See the documentation for [`time.Duration.ParseDuration`](https://pkg.go.dev/time#ParseDuration) for details about the format used for these durations. If the `period` is set to 5 minutes, then the limits agent will monitor the transmitted and receivde traffic for the account for the last 5 minutes, and if the amount of data is greater than either the `warning` or the `limit` threshold, action will be taken.
|
||||
|
||||
In the global configuration example above users are allowed to transfer a total of `10485760` bytes in a `5m` period, and they will receive a warning email after they transfer more than `7242880` bytes in a `5m` period.
|
||||
|
||||
## Limit Classes
|
||||
|
||||
The zrok limits agent includes a concept called _limit classes_. Limit classes can be used to define resource count and bandwidth limits that can be selectively applied to individual accounts in a service instance.
|
||||
|
||||
Limit classes are created by creating a record in the `limit_classes` table in the zrok controller database. The table has this schema:
|
||||
|
||||
```sql
|
||||
CREATE TABLE public.limit_classes (
|
||||
id integer NOT NULL,
|
||||
label VARCHAR(32),
|
||||
backend_mode public.backend_mode,
|
||||
environments integer DEFAULT '-1'::integer NOT NULL,
|
||||
shares integer DEFAULT '-1'::integer NOT NULL,
|
||||
reserved_shares integer DEFAULT '-1'::integer NOT NULL,
|
||||
unique_names integer DEFAULT '-1'::integer NOT NULL,
|
||||
share_frontends integer DEFAULT '-1'::integer NOT NULL,
|
||||
period_minutes integer DEFAULT 1440 NOT NULL,
|
||||
rx_bytes bigint DEFAULT '-1'::integer NOT NULL,
|
||||
tx_bytes bigint DEFAULT '-1'::integer NOT NULL,
|
||||
total_bytes bigint DEFAULT '-1'::integer NOT NULL,
|
||||
limit_action public.limit_action DEFAULT 'limit'::public.limit_action NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
|
||||
updated_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
|
||||
deleted boolean DEFAULT false NOT NULL
|
||||
);
|
||||
|
||||
```
|
||||
|
||||
This schema supports constructing the 3 different types of limits classes that the system supports.
|
||||
|
||||
After defining a limit class in the database, it can be applied to specific user accounts (overriding the relevant parts of the global configuration) by inserting a row into the `applied_limit_classes` table:
|
||||
|
||||
```sql
|
||||
CREATE TABLE public.applied_limit_classes (
|
||||
id integer NOT NULL,
|
||||
account_id integer NOT NULL,
|
||||
limit_class_id integer NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
|
||||
updated_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
|
||||
deleted boolean DEFAULT false NOT NULL
|
||||
);
|
||||
```
|
||||
|
||||
Create a row in this table linking the `account_id` to the `limit_class_id` to apply the limit class to a specific user account.
|
||||
|
||||
### Unscoped Resource Count Classes
|
||||
|
||||
To support overriding the resource count limits defined in the global limits configuration, a site administrator can create a limit class by inserting a row into the `limit_classes` table structured like this:
|
||||
|
||||
```sql
|
||||
insert into limit_classes (environments, shares, reserved_shares, unique_names, share_frontends) values (1, 1, 1, 1, 1);
|
||||
```
|
||||
|
||||
This creates a limit class that sets the `environments`, `shares`, `reserved_shares`, and `unique_names` all to `1`.
|
||||
|
||||
When this limit class is applied to a user account those values would override the default resource count values configured globally.
|
||||
|
||||
Applying an unscoped resource count class _does not_ affect the bandwidth limits (either globally configured, or via a limit class).
|
||||
|
||||
### Unscoped Bandwidth Classes
|
||||
|
||||
To support overriding the bandwidth limits defined in the global configuration, a site administrator can create a limit class by inserting a row into the `limit_classes` table structured like this:
|
||||
|
||||
```sql
|
||||
insert into limit_classes (period_minutes, total_bytes, limit_action) values (2, 204800, 'limit');
|
||||
```
|
||||
|
||||
This inserts a limit class that allows for a total bandwidth transfer of `204800` bytes every `2` minutes.
|
||||
|
||||
When this limit class is applied to a user account, those values would override the default bandwidth values configured globally.
|
||||
|
||||
Applying an unscoped bandwidth class _does not_ affect the resource count limits (either globally configured, or via a limit class).
|
||||
|
||||
### Scoped Classes
|
||||
|
||||
A scoped limit class specifies _both_ the resource counts (`shares`, `reserved_shares`, and `unique_names`, but *NOT* `environments`) for a *specific* backend mode. Insert a row like this:
|
||||
|
||||
```sql
|
||||
insert into limit_classes (backend_mode, shares, reserved_shares, unique_names, period_minutes, total_bytes, limit_action) values ('web', 2, 1, 1, 2, 4096000, 'limit');
|
||||
```
|
||||
|
||||
Scoped limits are designed to _increase_ the limits for a specific backend mode beyond what the global configuration and the unscoped classes provide. The general approach is to use the global configuration and the unscoped classes to provide the general account limits, and then the scoped classes can be used to further increase (or potentially _decrease_) the limits for a specific backend mode.
|
||||
|
||||
If a scoped limit class exists for a specific backend mode, then the limits agent will use that limit in making a decision about limiting the resource count or bandwidth. All other types of shares will fall back to the unscoped classes or the global configuration.
|
||||
|
||||
## Limit Actions
|
||||
|
||||
When an account exceeds a bandwidth limit, the limits agent will seek to limit the affected shares (based on the combination of global configuration, unscoped limit classes, and scoped limit classes). It applies the limit by removing the underlying OpenZiti dial policies for any frontends that are trying to access the share.
|
||||
|
||||
This means that public frontends will simply return a `404` as if the share is no longer there. Private frontends will also return `404` errors. When the limit is relaxed, the dial policies are put back in place and the share will continue operating normally.
|
||||
|
||||
## Unlimited Accounts
|
||||
|
||||
The `accounts` table in the database includes a `limitless` column. When this column is set to `true` the account is not subject to any of the limits in the system.
|
||||
|
||||
## Experimental Limits Locking
|
||||
|
||||
zrok versions prior to `v0.4.31` had a potential race condition when enforcing resource count limits. This usually only manifested in cases where shares or environments were being allocated programmatically (and fast enough to win the limits race).
|
||||
|
||||
This occurs due to a lack of transactional database locking around the limited structures. `v0.4.31` includes a pessimistic locking facility that can be enabled _only_ on the PostgreSQL store implemention.
|
||||
|
||||
If you're running PostgreSQL for your service instance and you want to enable the new experimental locking facility that eliminates the potential resource count race condition, add the `enable_locking: true` flag to your `store` definition:
|
||||
|
||||
```yaml
|
||||
store:
|
||||
enable_locking: true
|
||||
```
|
||||
|
||||
## Caveats
|
||||
|
||||
There are a number of caveats that are important to understand when using the limits agent with more complicated limits scenarios:
|
||||
|
||||
### Aggregate Bandwidth
|
||||
|
||||
The zrok limits agent is a work in progress. The system currently does not track bandwidth individually for each backend mode type, which means all bandwidth values are aggregated between all of the share types that an account might be using. This will likely change in an upcoming release.
|
||||
|
||||
### Administration Through SQL
|
||||
|
||||
There are currently no administrative API endpoints (or corresponding CLI tools) to support creating and applying limit classes in the current release. The limits agent infrastructure was designed to support software integrations that directly manipulate the underlying database structures.
|
||||
|
||||
A future release may provide API and CLI tooling to support the human administration of the limits agent.
|
||||
|
||||
### Performance
|
||||
|
||||
Be sure to minimize the number of different periods used for specifying bandwidth limits. Specifying limits in multiple different periods can cause a multiplicity of queries to be executed against the metrics store (InfluxDB). Standardizing on a period like `24h` or `6h` and using that consistently is the best way to to manage the performance of the metrics store.
|
@ -0,0 +1,120 @@
|
||||
---
|
||||
sidebar_position: 20
|
||||
---
|
||||
|
||||
# Configuring Metrics
|
||||
|
||||
A fully configured, production-scale `zrok` service instance looks like this:
|
||||
|
||||

|
||||
|
||||
`zrok` metrics builds on top of the `fabric.usage` event type from OpenZiti. The OpenZiti controller has a number of way to emit events. The `zrok` controller has several ways to consume `fabric.usage` events. Smaller installations could be configured in these ways:
|
||||
|
||||

|
||||
|
||||
Environments that horizontally scale the `zrok` control plane with multiple controllers should use an AMQP-based queue to "fan out" the metrics workload across the entire control plane. Simpler installations that use a single `zrok` controller can collect `fabric.usage` events from the OpenZiti controller by "tailing" the events log file, or collecting them from the OpenZiti controller's websocket implementation.
|
||||
|
||||
## Configuring the OpenZiti Controller
|
||||
|
||||
> This requires a version of OpenZiti with a `fabric` dependency of `v0.22.52` or newer, which is satisfed by the `v0.27.6` release of OpenZiti Controller.
|
||||
|
||||
Emitting `fabric.usage` events to a file is currently the most reliable mechanism to capture usage events into `zrok`. We're going to configure the OpenZiti controller to append `fabric.usage` events to a file, by adding this stanza to the OpenZiti controller configuration:
|
||||
|
||||
```yaml
|
||||
events:
|
||||
jsonLogger:
|
||||
subscriptions:
|
||||
- type: fabric.usage
|
||||
version: 3
|
||||
handler:
|
||||
type: file
|
||||
format: json
|
||||
path: /tmp/fabric-usage.json
|
||||
```
|
||||
|
||||
You'll want to adjust the `events/jsonLogger/handler/path` to wherever you would like to send these events for ingestion into `zrok`. There are additional OpenZiti options that control file rotation. Be sure to consult the OpenZiti docs to tune these settings to be appropriate for your environment.
|
||||
|
||||
By default, the OpenZiti events infrastructure reports and batches events in 1 minute buckets. 1 minute is too large of an interval to provide a snappy `zrok` metrics experience. So, let's increase the frequency to every 5 seconds. Add this to the `network` stanza of your OpenZiti controller's configuration:
|
||||
|
||||
```yaml
|
||||
network:
|
||||
intervalAgeThreshold: 5s
|
||||
metricsReportInterval: 5s
|
||||
```
|
||||
|
||||
And you'll want to add this stanza to the tail-end of the router configuration for every router on your OpenZiti network:
|
||||
|
||||
```yaml
|
||||
metrics:
|
||||
reportInterval: 5s
|
||||
intervalAgeThreshold: 5s
|
||||
```
|
||||
|
||||
Be sure to restart all of the components of your OpenZiti network after making these configuration changes.
|
||||
|
||||
## Configuring the zrok Metrics Bridge
|
||||
|
||||
`zrok` currently uses a "metrics bridge" component (running as a separate process) to consume the `fabric.usage` events from the OpenZiti controller, and publish them onto an AMQP queue. Add a stanza like the following to your `zrok` controller configuration:
|
||||
|
||||
```yaml
|
||||
bridge:
|
||||
source:
|
||||
type: fileSource
|
||||
path: /tmp/fabric-usage.json
|
||||
sink:
|
||||
type: amqpSink
|
||||
url: amqp://guest:guest@localhost:5672
|
||||
queue_name: events
|
||||
```
|
||||
|
||||
This configuration consumes the `fabric.usage` events from the file we previously specified in our OpenZiti controller configuration, and publishes them onto an AMQP queue.
|
||||
|
||||
### RabbitMQ
|
||||
|
||||
For this example, we're going to use RabbitMQ as our AMQP implementation. The stock, default RabbitMQ configuration, launched as a `docker` container will work just fine:
|
||||
|
||||
```
|
||||
$ docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.11-management
|
||||
```
|
||||
|
||||
Once RabbitMQ is running, you can start the `zrok` metrics bridge by pointing it at your `zrok` controller configuration, like this:
|
||||
|
||||
```
|
||||
$ zrok ctrl metrics bridge <path/to/zrok-controller.yaml>
|
||||
```
|
||||
|
||||
## Configuring zrok Metrics
|
||||
|
||||
Configure the `metrics` section of your `zrok` controller. Here is an example:
|
||||
|
||||
```yaml
|
||||
metrics:
|
||||
agent:
|
||||
source:
|
||||
type: amqpSource
|
||||
url: amqp://guest:guest@localhost:5672
|
||||
queue_name: events
|
||||
influx:
|
||||
url: "http://127.0.0.1:8086"
|
||||
bucket: zrok # the bucket and org must be
|
||||
org: zrok # created in advance in InfluxDB
|
||||
token: "<secret token>"
|
||||
```
|
||||
|
||||
This configures the `zrok` controller to consume usage events from the AMQP queue, and configures the InfluxDB metrics store. The InfluxDB organization and bucket must be created in advance. The `zrok` controller will not create these for you.
|
||||
|
||||
## Testing Metrics
|
||||
|
||||
With all of the components configured and running, either use `zrok test loop` or manually create share(s) to generate traffic on the `zrok` instance. If everything is working correctly, you should see log messages from the controller like the following, which indicate that that the controller is processing OpenZiti usage events, and generating `zrok` metrics:
|
||||
|
||||
```
|
||||
[5339.658] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 736z80mr4syu, circuit: Ad1V-6y48 backend {rx: 4.5 kB, tx: 4.6 kB} frontend {rx: 4.6 kB, tx: 4.5 kB}
|
||||
[5349.652] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 736z80mr4syu, circuit: Ad1V-6y48 backend {rx: 2.5 kB, tx: 2.6 kB} frontend {rx: 2.6 kB, tx: 2.5 kB}
|
||||
[5354.657] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 5a4u7lqxb7pa, circuit: iG1--6H4S backend {rx: 13.2 kB, tx: 13.3 kB} frontend {rx: 13.3 kB, tx: 13.2 kB}
|
||||
```
|
||||
|
||||
The `zrok` web console should also be showing activity for your share(s) like the following:
|
||||
|
||||

|
||||
|
||||
With metrics configured, you might be interested in [configuring limits](configuring-limits.md).
|
@ -0,0 +1,70 @@
|
||||
<mxfile host="Electron" modified="2023-04-04T16:56:44.671Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/21.1.2 Chrome/106.0.5249.199 Electron/21.4.3 Safari/537.36" etag="hNOxKmEJVuYIWfjZN-Q2" version="21.1.2" type="device">
|
||||
<diagram name="Page-1" id="IMoEC3u-7S6gkD3jGaqt">
|
||||
<mxGraphModel dx="1030" dy="801" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="600" pageHeight="400" math="0" shadow="0">
|
||||
<root>
|
||||
<mxCell id="0" />
|
||||
<mxCell id="1" parent="0" />
|
||||
<mxCell id="z8BNBxY42kQ6VSPeSeC1-1" value="Ziti<br>Controller" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="40" y="50" width="120" height="80" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="z8BNBxY42kQ6VSPeSeC1-2" value="events.json" style="shape=document;whiteSpace=wrap;html=1;boundedLbl=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="190" y="65" width="80" height="50" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="z8BNBxY42kQ6VSPeSeC1-3" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.875;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="z8BNBxY42kQ6VSPeSeC1-1" target="z8BNBxY42kQ6VSPeSeC1-2">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="280" y="280" as="sourcePoint" />
|
||||
<mxPoint x="330" y="230" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="z8BNBxY42kQ6VSPeSeC1-15" value="zrok<br>Metrics Store<br><font style="font-size: 9px;">(InfluxDB)</font>" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" vertex="1" parent="1">
|
||||
<mxGeometry x="471" y="40" width="90" height="100" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="z8BNBxY42kQ6VSPeSeC1-17" value="" style="endArrow=classic;startArrow=classic;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="z8BNBxY42kQ6VSPeSeC1-15" target="z8BNBxY42kQ6VSPeSeC1-11">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="501" y="284" as="sourcePoint" />
|
||||
<mxPoint x="551" y="234" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="z8BNBxY42kQ6VSPeSeC1-18" value="" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="z8BNBxY42kQ6VSPeSeC1-2" target="z8BNBxY42kQ6VSPeSeC1-11">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="190" y="230" as="sourcePoint" />
|
||||
<mxPoint x="240" y="180" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="z8BNBxY42kQ6VSPeSeC1-19" value="Ziti<br>Controller" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="98" y="270" width="120" height="80" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="z8BNBxY42kQ6VSPeSeC1-24" value="zrok<br>Metrics Store<br><font style="font-size: 9px;">(InfluxDB)</font>" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" vertex="1" parent="1">
|
||||
<mxGeometry x="413" y="260" width="90" height="100" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="z8BNBxY42kQ6VSPeSeC1-25" value="" style="endArrow=classic;startArrow=classic;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="z8BNBxY42kQ6VSPeSeC1-24" target="z8BNBxY42kQ6VSPeSeC1-23">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="443" y="504" as="sourcePoint" />
|
||||
<mxPoint x="493" y="454" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="z8BNBxY42kQ6VSPeSeC1-23" value="zrok<br>Controller" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="252" y="280" width="120" height="60" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="z8BNBxY42kQ6VSPeSeC1-29" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.875;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="z8BNBxY42kQ6VSPeSeC1-19" target="z8BNBxY42kQ6VSPeSeC1-23">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="198" y="462" as="sourcePoint" />
|
||||
<mxPoint x="248" y="412" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="z8BNBxY42kQ6VSPeSeC1-30" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;rounded=0;" edge="1" parent="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="220" y="310" as="sourcePoint" />
|
||||
<mxPoint x="250" y="230" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="z8BNBxY42kQ6VSPeSeC1-31" value="Events over Websocket" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=9;" vertex="1" parent="1">
|
||||
<mxGeometry x="200" y="210" width="100" height="20" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="z8BNBxY42kQ6VSPeSeC1-11" value="zrok<br>Controller" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="310" y="60" width="120" height="60" as="geometry" />
|
||||
</mxCell>
|
||||
</root>
|
||||
</mxGraphModel>
|
||||
</diagram>
|
||||
</mxfile>
|
After Width: | Height: | Size: 33 KiB |
@ -0,0 +1,67 @@
|
||||
<mxfile host="Electron" modified="2023-04-04T15:26:45.884Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/21.1.2 Chrome/106.0.5249.199 Electron/21.4.3 Safari/537.36" etag="WmZNtDHtF91euXotUkS-" version="21.1.2" type="device">
|
||||
<diagram name="Page-1" id="IMoEC3u-7S6gkD3jGaqt">
|
||||
<mxGraphModel dx="1030" dy="801" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="600" pageHeight="600" math="0" shadow="0">
|
||||
<root>
|
||||
<mxCell id="0" />
|
||||
<mxCell id="1" parent="0" />
|
||||
<mxCell id="z8BNBxY42kQ6VSPeSeC1-1" value="Ziti<br>Controller" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="110" y="55" width="120" height="80" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="z8BNBxY42kQ6VSPeSeC1-2" value="events.json" style="shape=document;whiteSpace=wrap;html=1;boundedLbl=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="260" y="70" width="80" height="50" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="z8BNBxY42kQ6VSPeSeC1-3" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.875;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="z8BNBxY42kQ6VSPeSeC1-1" target="z8BNBxY42kQ6VSPeSeC1-2">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="350" y="285" as="sourcePoint" />
|
||||
<mxPoint x="400" y="235" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="z8BNBxY42kQ6VSPeSeC1-4" value="zrok<br>Metrics Bridge" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="370" y="65" width="120" height="60" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="z8BNBxY42kQ6VSPeSeC1-5" value="" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="z8BNBxY42kQ6VSPeSeC1-2" target="z8BNBxY42kQ6VSPeSeC1-4">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="300" y="255" as="sourcePoint" />
|
||||
<mxPoint x="350" y="205" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="z8BNBxY42kQ6VSPeSeC1-6" value="Event Queue<br><font style="font-size: 9px;">(AMQP/RabbitMQ)</font>" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="240" y="175" width="120" height="80" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="z8BNBxY42kQ6VSPeSeC1-12" value="" style="group" vertex="1" connectable="0" parent="1">
|
||||
<mxGeometry x="230.5" y="295" width="139" height="81" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="z8BNBxY42kQ6VSPeSeC1-9" value="" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="z8BNBxY42kQ6VSPeSeC1-12">
|
||||
<mxGeometry width="120" height="60" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="z8BNBxY42kQ6VSPeSeC1-10" value="" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="z8BNBxY42kQ6VSPeSeC1-12">
|
||||
<mxGeometry x="10" y="10" width="120" height="60" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="z8BNBxY42kQ6VSPeSeC1-11" value="zrok<br>Controller(s)" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="z8BNBxY42kQ6VSPeSeC1-12">
|
||||
<mxGeometry x="19" y="21" width="120" height="60" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="z8BNBxY42kQ6VSPeSeC1-13" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.88;entryY=0.25;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="z8BNBxY42kQ6VSPeSeC1-4" target="z8BNBxY42kQ6VSPeSeC1-6">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="430" y="165" as="sourcePoint" />
|
||||
<mxPoint x="470" y="205" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="z8BNBxY42kQ6VSPeSeC1-14" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.55;exitY=0.95;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="z8BNBxY42kQ6VSPeSeC1-6" target="z8BNBxY42kQ6VSPeSeC1-9">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="470" y="355" as="sourcePoint" />
|
||||
<mxPoint x="520" y="305" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="z8BNBxY42kQ6VSPeSeC1-15" value="zrok<br>Metrics Store<br><font style="font-size: 9px;">(InfluxDB)</font>" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" vertex="1" parent="1">
|
||||
<mxGeometry x="250" y="425" width="100" height="120" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="z8BNBxY42kQ6VSPeSeC1-17" value="" style="endArrow=classic;startArrow=classic;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="z8BNBxY42kQ6VSPeSeC1-15" target="z8BNBxY42kQ6VSPeSeC1-11">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="450" y="435" as="sourcePoint" />
|
||||
<mxPoint x="500" y="385" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
</root>
|
||||
</mxGraphModel>
|
||||
</diagram>
|
||||
</mxfile>
|
After Width: | Height: | Size: 35 KiB |
After Width: | Height: | Size: 83 KiB |
@ -0,0 +1,7 @@
|
||||
{
|
||||
"label": "OAuth",
|
||||
"position": 70,
|
||||
"link": {
|
||||
"type": "generated-index"
|
||||
}
|
||||
}
|
@ -0,0 +1,156 @@
|
||||
# OAuth Public Frontend Configuration
|
||||
|
||||
As of `v0.4.7`, `zrok` includes OAuth integration for both Google and GitHub for `zrok access public` public frontends.
|
||||
|
||||
This integration allows you to create public shares and request that the public frontend authenticate your users against either the Google or GitHub OAuth endpoints (using the user's Google or GitHub accounts). Additionally, you can restrict the email address domain associated with the count to a list of domains that you provide when you create the share.
|
||||
|
||||
This is a first step towards a more comprehensive portfolio of user authentication strategies in future `zrok` releases.
|
||||
|
||||
## Planning for the OAuth Frontend
|
||||
|
||||
The current implementation of the OAuth public frontend uses a HTTP listener to handle redirects from OAuth providers. You'll need to configure a DNS name and a port for this listener that is accessible by your end users. We'll refer to this listener as the "OAuth frontend" in this guide.
|
||||
|
||||
We'll use the public DNS address of the OAuth frontend when creating the Google and GitHub OAuth clients below. This address is typically configured into these clients as the "redirect URL" where these clients will send the authenticated users after authentication.
|
||||
|
||||
The `zrok` OAuth frontend will capture the successful authentication and forward the user back to their original destination.
|
||||
|
||||
## Configuring a Google OAuth Client ID
|
||||
|
||||
### OAuth Content Screen
|
||||
|
||||
Before you can configure an OAuth Client ID in Google Cloud, you have to configure the "OAuth content screen".
|
||||
|
||||
In the Google Cloud console, navigate to: `APIs & Services > Credentials > OAuth content screen`
|
||||
|
||||

|
||||
|
||||
Here you can give your `zrok` public frontend an identity and branding to match your deployment.
|
||||
|
||||

|
||||
|
||||
Describe what domains are authorized to access your public frontend and establish contact information.
|
||||
|
||||

|
||||
|
||||
Add a non-sensitive scope for `../auth/userinfo.email`. This is important as it allows the `zrok` OAuth frontend to receive the email address of the authenticated user.
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
Now your OAuth content screen is configured.
|
||||
|
||||
### Create the OAuth 2.0 Client ID
|
||||
|
||||
Next we create the OAuth Client ID for your public frontend.
|
||||
|
||||
In the Google Cloud Console, navigate to: `APIs & Services > Credentials > + Create Credentials`
|
||||
|
||||

|
||||
|
||||
Select `OAuth client ID` from the `+ Create Credentials` dropdown.
|
||||
|
||||

|
||||
|
||||
Application type is `Web Application`.
|
||||
|
||||

|
||||
|
||||
The most important bit here is the "Authorized redirect URIs". You're going to want to put a URL here that matches the `zrok` OAuth frontend address that you configured at the start of this guide, but at the end of the URL you're going to append `/google/oauth` to the URL.
|
||||
|
||||

|
||||
|
||||
Save the client ID and the client secret. You'll configure these into your `frontend.yml`.
|
||||
|
||||
With this your Google OAuth client should be configured and ready.
|
||||
|
||||
## Configuring a GitHub Client ID
|
||||
|
||||
Register a new OAuth application through the GitHub settings for the account that owns the application.
|
||||
|
||||
Navigate to:`Settings > Developer Settings > OAuth Apps > Register a new application`
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
The "Authorized callback URL" should be configured to match the OAuth frontend address you configured at the start of this guide, with `/github/oauth` appended to the end.
|
||||
|
||||

|
||||
|
||||
Create a new client secret.
|
||||
|
||||

|
||||
|
||||
Save the client ID and the client secret. You'll configure these into your `frontend.yml`.
|
||||
|
||||
## Configuring your Public Frontend
|
||||
|
||||
The public frontend configuration includes a new `oauth` section:
|
||||
|
||||
```yaml
|
||||
oauth:
|
||||
bind_address: 0.0.0.0:8181
|
||||
redirect_url: https://oauth.zrok.io
|
||||
cookie_domain: zrok.io
|
||||
hash_key: "the quick brown fox jumped over the lazy dog"
|
||||
providers:
|
||||
- name: google
|
||||
client_id: "<client id from google>"
|
||||
client_secret: "<client secret from google>"
|
||||
- name: github
|
||||
client_id: "<client id from github>"
|
||||
client_secret: "<client secret from github>"
|
||||
|
||||
```
|
||||
|
||||
The `bind_address` parameter determines where the OAuth frontend will bind. Should be in `ip:port` format.
|
||||
|
||||
The `redirect_url` parameter determines the base URL where OAuth frontend requests will be redirected.
|
||||
|
||||
`cookie_domain` is the domain where authentication cookies should be stored.
|
||||
|
||||
`hash_key` is a unique string for your installation that is used to secure the authentication payloads for your public frontend.
|
||||
|
||||
`providers` is a list of configured providers for this public frontend. The current implementation supports `google` and `github` as options.
|
||||
|
||||
Both the `google` and `github` providers accept a `client_id` and `client_secret` parameter. These values are provided when you configure the OAuth clients at Google or GitHub.
|
||||
|
||||
## Enabling OAuth on a Public Share
|
||||
|
||||
With your public frontend configured to support OAuth, you can test this by creating a public share. There are new command line options to support this:
|
||||
|
||||
```text
|
||||
$ zrok share public --help
|
||||
Share a target resource publicly
|
||||
|
||||
Usage:
|
||||
zrok share public <target> [flags]
|
||||
|
||||
Flags:
|
||||
-b, --backend-mode string The backend mode {proxy, web, caddy, drive} (default "proxy")
|
||||
--basic-auth stringArray Basic authentication users (<username:password>,...)
|
||||
--frontends stringArray Selected frontends to use for the share (default [public])
|
||||
--headless Disable TUI and run headless
|
||||
-h, --help help for public
|
||||
--insecure Enable insecure TLS certificate validation for <target>
|
||||
--oauth-check-interval duration Maximum lifetime for OAuth authentication; reauthenticate after expiry (default 3h0m0s)
|
||||
--oauth-email-address-patterns stringArray Allow only these email domain globs to authenticate via OAuth
|
||||
--oauth-provider string Enable OAuth provider [google, github]
|
||||
|
||||
Global Flags:
|
||||
-p, --panic Panic instead of showing pretty errors
|
||||
-v, --verbose Enable verbose logging
|
||||
```
|
||||
|
||||
The `--oauth-provider` flag enables OAuth for the share using the specified provider.
|
||||
|
||||
The `--oauth-email-address-patterns` flag accepts a single glob pattern that matches an authenticated email address that is allowed to access the share. Use this flag multiple times to allow different patterns.
|
||||
|
||||
The `--oauth-check-interval` flag specifies how frequently the authentication must be checked.
|
||||
|
||||
An example public share:
|
||||
|
||||
```text
|
||||
zrok share public --backend-mode web --oauth-provider github --oauth-email-address-patterns '*@zrok.io' ~/public
|
||||
```
|
After Width: | Height: | Size: 42 KiB |
After Width: | Height: | Size: 61 KiB |
After Width: | Height: | Size: 70 KiB |
After Width: | Height: | Size: 90 KiB |
After Width: | Height: | Size: 78 KiB |
After Width: | Height: | Size: 82 KiB |
After Width: | Height: | Size: 66 KiB |
After Width: | Height: | Size: 109 KiB |
After Width: | Height: | Size: 136 KiB |
After Width: | Height: | Size: 90 KiB |
After Width: | Height: | Size: 212 KiB |
After Width: | Height: | Size: 206 KiB |
After Width: | Height: | Size: 110 KiB |
After Width: | Height: | Size: 93 KiB |
After Width: | Height: | Size: 95 KiB |
@ -0,0 +1,145 @@
|
||||
---
|
||||
sidebar_position: 21
|
||||
sidebar_label: Organizations
|
||||
---
|
||||
|
||||
# Organizations
|
||||
|
||||
zrok (starting with `v0.4.45`) includes support for "organizations". Organizations are groups of related accounts that are typically centrally managed in some capacity. A zrok account can be a member of multiple organizations. Organization membership can also include an "admin" permission. As of `v0.4.45` organization admins are able to retrieve an "overview" (`zrok overview`) from any other account in the organization, allowing the admin to see the details of the environments, shares, and accesses created within that account.
|
||||
|
||||
Future zrok releases will include additional organization features, including `--closed` permission sharing functions.
|
||||
|
||||
## Configuring an Organization
|
||||
|
||||
The API endpoints used to manage organizations and their members require a site-level `ZROK_ADMIN_TOKEN` to access. See the [self-hosting guide](linux/index.mdx#configure-the-controller) for details on configuring admin tokens.
|
||||
|
||||
### Create an Organization
|
||||
|
||||
The `zrok admin create organization` command is used to create organizations:
|
||||
|
||||
```
|
||||
$ zrok admin create organization --help
|
||||
Create a new organization
|
||||
|
||||
Usage:
|
||||
zrok admin create organization [flags]
|
||||
|
||||
Aliases:
|
||||
organization, org
|
||||
|
||||
Flags:
|
||||
-d, --description string Organization description
|
||||
-h, --help help for organization
|
||||
|
||||
Global Flags:
|
||||
-p, --panic Panic instead of showing pretty errors
|
||||
-v, --verbose Enable verbose logging
|
||||
```
|
||||
|
||||
Use the `-d` flag to add a description that shows up in end-user membership listings.
|
||||
|
||||
We'll create an example organization:
|
||||
|
||||
```
|
||||
$ zrok admin create organization -d "documentation"
|
||||
[ 0.006] INFO main.(*adminCreateOrganizationCommand).run: created new organization with token 'gK1XRvthq7ci'
|
||||
```
|
||||
|
||||
### List Organizations
|
||||
|
||||
We use the `zrok admin list organizations` command to list our organizations:
|
||||
|
||||
```
|
||||
$ zrok admin list organizations
|
||||
|
||||
ORGANIZATION TOKEN DESCRIPTION
|
||||
gK1XRvthq7ci documentation
|
||||
```
|
||||
|
||||
### Add a Member to an Organization
|
||||
|
||||
We use the `zrok admin create org-member` command to add members to organizations:
|
||||
|
||||
```
|
||||
$ zrok admin create org-member
|
||||
Error: accepts 2 arg(s), received 0
|
||||
Usage:
|
||||
zrok admin create org-member <organizationToken> <accountEmail> [flags]
|
||||
|
||||
Aliases:
|
||||
org-member, member
|
||||
|
||||
Flags:
|
||||
--admin Make the new account an admin of the organization
|
||||
-h, --help help for org-member
|
||||
|
||||
Global Flags:
|
||||
-p, --panic Panic instead of showing pretty errors
|
||||
-v, --verbose Enable verbose logging
|
||||
```
|
||||
|
||||
Like this:
|
||||
|
||||
```
|
||||
$ zrok admin create org-member gK1XRvthq7ci michael.quigley@netfoundry.io
|
||||
[ 0.006] INFO main.(*adminCreateOrgMemberCommand).run: added 'michael.quigley@netfoundry.io' to organization 'gK1XRvthq7ci
|
||||
```
|
||||
|
||||
The `--admin` flag can be added to the `zrok admin create org-member` command to mark the member as an administrator of the organization.
|
||||
|
||||
### List Members of an Organization
|
||||
|
||||
```
|
||||
$ zrok admin list org-members gK1XRvthq7ci
|
||||
|
||||
ACCOUNT EMAIL ADMIN?
|
||||
michael.quigley@netfoundry.io false
|
||||
```
|
||||
|
||||
### Removing Organizations and Members
|
||||
|
||||
The `zrok admin delete org-member` and `zrok admin delete organization` commands are available to clean up organizations and their membership lists.
|
||||
|
||||
## End-user Organization Administrator Commands
|
||||
|
||||
When a zrok account is added to an organization as an administrator it allows them to use the `zrok organization admin` commands, which include:
|
||||
|
||||
```
|
||||
$ zrok organization admin
|
||||
Organization admin commands
|
||||
|
||||
Usage:
|
||||
zrok organization admin [command]
|
||||
|
||||
Available Commands:
|
||||
list List the members of an organization
|
||||
overview Retrieve account overview for organization member account
|
||||
|
||||
Flags:
|
||||
-h, --help help for admin
|
||||
|
||||
Global Flags:
|
||||
-p, --panic Panic instead of showing pretty errors
|
||||
-v, --verbose Enable verbose logging
|
||||
|
||||
Use "zrok organization admin [command] --help" for more information about a command.
|
||||
```
|
||||
|
||||
The `zrok organization admin list` command is used to list the members of an organization.
|
||||
|
||||
The `zrok organization admin overview` command is used to retrieve an overview of an organization member account. This is functionally equivalent to what the `zrok overview` command does, but it allows an organization admin to retrieve the overview for another zrok account.
|
||||
|
||||
## End-user Organization Commands
|
||||
|
||||
All zrok accounts can use the `zrok organization memberships` command to list the organizations they're a member of:
|
||||
|
||||
```
|
||||
$ zrok organization memberships
|
||||
|
||||
ORGANIZATION TOKEN DESCRIPTION ADMIN?
|
||||
gK1XRvthq7ci documentation false
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
@ -0,0 +1,73 @@
|
||||
---
|
||||
title: Personalized Frontend
|
||||
sidebar_label: Personalized Frontend
|
||||
sidebar_position: 22
|
||||
---
|
||||
|
||||
This guide describes an approach that enables a zrok user to use a hosted, shared instance (zrok.io) and configure their own personalized frontend, which enables custom DNS and TLS for their shares.
|
||||
|
||||
In order to accomplish this, the user will need to provide their own minimal VPS instance, or container hosting. The size and capacity of these resources will be entirely dependent on the workload that they will be used to service. But generally, for most modest workloads, the most inexpensive VPS option will suffice.
|
||||
|
||||
This approach gives you complete control over the way that your shares are exposed publicly. This approach works for HTTPS shares, and also for TCP and UDP ports, allowing you to put all of these things onto the public internet, while maintaining strong security for your protected resources.
|
||||
|
||||
This guide isn't a detailed _how to_ with specific steps to follow. This is more of a description of the overall concept. You'll want to figure out your own specific steps to implement this style of deployment in your own environment.
|
||||
|
||||
## Overview
|
||||
|
||||
Let's imagine a hypothetical scenario where you've got 3 different resources shared using zrok. We'll refer to these as `A`, `B`, and `C`. Both `A` and `B` are shares using the `proxy` backend mode, which are used to share private HTTPS resources. Share `C` uses the `tcpTunnel` backend to expose a listening port from a private server (like a game server, or a message queue).
|
||||
|
||||
We're using the shared zrok instance at zrok.io to provide our secure sharing infrastructure.
|
||||
|
||||
Our deployment will end up looking like this:
|
||||
|
||||

|
||||
|
||||
We're using `zrok reserve` to create the `A`, `B`, and `C` shares as reserved shares (using the `--unique-name` option to give them specific names). These shares could be located together in a single environment on a single host, or can be located at completely different spots on the planet on completely different hosts. You could want to use significantly more shares than 3, or less. The secure sharing fabric allows seamless secure connectivity for these shared resources. This implementation will scale up or down as needed (use multiple hosts behind a load balancer for really big workloads).
|
||||
|
||||
Because we're using `private` zrok shares, they'll need to be accessed using a corresponding `zrok access` private command. The `zrok access private` command binds a "network listener" where the share can be accessed on an address and port on the host where the command is executed. You can use `zrok access private` to bind a network listener for a share in as many places as you want (up to the limit configuration of the service).
|
||||
|
||||
:::note
|
||||
When you use `zrok share public`, you are allowing your shared resources to be accessed using the shared, public frontend provided by the service instance (zrok.io). `zrok share private` (or `zrok reserve`/`zrok share reserved`) creates the same kind of share, but does not provision the shared public frontend, and you'll need to use `zrok access private` in order to _bind_ that share to a network address where it can be accessed.
|
||||
:::
|
||||
|
||||
Imagine that we own the domain `example.com`. In our example, we want to expose our HTTPS shares `A` and `B` as `a.example.com` and `b.example.com`. And maybe our `C` share represents a gaming server that we want to expose as `gaming.example.com:25565`.
|
||||
|
||||
We can accomplish this easily with cheap VPS instance. You could also do it with containers through a container hosting service. The VPS will need an IP address exposed to the internet. You'll also need to be able to create DNS entries for the `example.com` domain.
|
||||
|
||||
To accomplish this, we're going to run 3 separate `zrok access private` commands on our VPS (see the [frontdoor guide](../../frontdoor/), or [zrok-private-access Docker Compose guide](../../docker-share/docker_private_share_guide/#access-the-private-share) for details on an approach for setting this up). One command each for shares `A`, `B`, and `C`. The `zrok access private` command works like this:
|
||||
|
||||
```
|
||||
$ zrok access private
|
||||
Error: accepts 1 arg(s), received 0
|
||||
Usage:
|
||||
zrok access private <shareToken> [flags]
|
||||
|
||||
Flags:
|
||||
-b, --bind string The address to bind the private frontend (default "127.0.0.1:9191")
|
||||
--headless Disable TUI and run headless
|
||||
-h, --help help for private
|
||||
|
||||
Global Flags:
|
||||
-p, --panic Panic instead of showing pretty errors
|
||||
-v, --verbose Enable verbose logging
|
||||
```
|
||||
|
||||
Notice the `--bind` flag. That flag is used to bind a network listener to a specific IP address and port on the host we're accessing the shares from. In this case, imagine our VPS node has a public IP address of `1.2.3.4` and a loopback (`127.0.0.1`).
|
||||
|
||||
To expose our HTTPS shares, we're going to use a reverse proxy like nginx. The reverse proxy will be exposed to the internet, terminating TLS and reverse proxying `a.example.com` and `b.example.com` to the network listeners for shares `A` and `B`.
|
||||
|
||||
So, we'll configure our VPS to persistently launch a `zrok access private` for both of these shares. We'll use the `--bind` flag to bind `A` to `127.0.0.1:9191` and `B` to `127.0.0.1:9192`.
|
||||
|
||||
We'll then configure nginx to have a virtual host for `a.example.com`, proxying that to `127.0.0.1:9191` and `b.example.com`, proxying that to `127.0.0.1:9192`.
|
||||
|
||||
Exposing our TCP port for `gaming.example.com` is simply a matter of running a third `zrok access private` with a `--bind` flag configured to point to `1.2.3.4:25565`.
|
||||
|
||||
Once you've created the appropriate DNS entries for `a.example.com`, `b.example.com`, and `gaming.example.com` and worked through the TLS configuration (letsencrypt is your friend here), you'll have a fully functional personalized frontend for your zrok shares that you control.
|
||||
|
||||
Your protected resources remain disconnected from the internet and are only reachable through your personalized endpoint.
|
||||
|
||||
## Privacy
|
||||
|
||||
When you use a public frontend (with a simple `zrok share public`) at a hosted zrok instance (like zrok.io), the operators of that service have some amount of visibility into what traffic you're sending to your shares. The load balancers in front of the public frontend maintain logs describing all of the URLs that were accessed, as well as other information (headers, etc.) that contain information about the resource you're sharing.
|
||||
|
||||
If you create private shares using `zrok share private` and then run your own `zrok access private` from some other location, the operators of the zrok service instance only know that some amount of data moved between the environment running the `zrok share private` and the `zrok access private`. There is no other information available.
|
@ -0,0 +1,54 @@
|
||||
---
|
||||
title: Invitations
|
||||
---
|
||||
|
||||
This is how to set up self-service invitations for your users to get an account on your self-hosted zrok instance.
|
||||
|
||||
## Overview
|
||||
|
||||
- You can create user accounts directly with the `zrok admin create account` CLI or API instead of inviting them.
|
||||
- You can welcome users to invite themselves via email.
|
||||
- To enable self-service invitations you must also configure the controller to send email.
|
||||
- You can require an invitation token if you want to restrict self-service.
|
||||
|
||||
## The Self-Service User Experience
|
||||
|
||||
This is what your users will do.
|
||||
|
||||
```bash
|
||||
zrok invite
|
||||
```
|
||||
|
||||
```buttonless title="Output"
|
||||
enter and confirm your email address...
|
||||
|
||||
> user@domain.com
|
||||
> user@domain.com
|
||||
|
||||
[ Submit ]
|
||||
|
||||
invitation sent to 'user@domain.com'!
|
||||
```
|
||||
|
||||
## How it Works
|
||||
|
||||
The `zrok invite` command presents a small form that allows you to enter (and then confirm) your email address. Tabbing to the `[ Submit ]` button will start the invitation process.
|
||||
|
||||
Next, check the email where you sent the invite. You should receive a message asking you to click a link to create your `zrok` account. When you click that link, you will be brought to a web page that will allow you to set a password for your new account.
|
||||
|
||||

|
||||
|
||||
Enter a password and its confirmation, and click the `Register Account` button. You'll see the following:
|
||||
|
||||

|
||||
|
||||
For now, we'll ignore the "enable your shell for zrok" section. Just click the `zrok web portal` link:
|
||||
|
||||

|
||||
|
||||
After clicking the `Log In` button, you'll be brought into the `zrok` _web console_:
|
||||
|
||||

|
||||
|
||||
Congratulations! Your `zrok` account is ready to go!
|
||||
|
BIN
website/versioned_docs/version-0.4/guides/vpn/vpn-share.png
Normal file
After Width: | Height: | Size: 170 KiB |
131
website/versioned_docs/version-0.4/guides/vpn/vpn.md
Normal file
@ -0,0 +1,131 @@
|
||||
---
|
||||
sidebar_label: VPN
|
||||
---
|
||||
|
||||
# zrok VPN Guide
|
||||
|
||||
zrok VPN backend allows for simple host-to-host VPN setup.
|
||||
|
||||
## Operating System Requirements
|
||||
|
||||
zrok VPN requires elevated privileges to manage network devices.
|
||||
|
||||
### Windows
|
||||
|
||||
On Windows, you must run zrok VPN commands as an administrator and install Wintun by placing `wintun.dll` ([download link](https://www.wintun.net/)) in the same directory as the `zrok.exe` executable.
|
||||
|
||||
### Linux
|
||||
|
||||
On Linux, the simplest way to grant the necessary privileges is to run zrok VPN commands as root. You can enable a separate environment for root by also running `zrok enable` as the root user, or you can prefix the commands like `sudo -E` to allow zrok running as root to use the zrok environment owned by the current user. The minimum privilege is runing zrok VPN commands and the `ip` command with the `NET_ADMIN` kernel capability. The `zrok-share.service` unit has a commented example to grant `NET_ADMIN` as an Ambient Capability.
|
||||
|
||||
### macOS
|
||||
|
||||
On macOS, you must run zrok VPN commands as root. You can prefix the zrok command with `sudo -E` to allow zrok running as root to use the zrok environment owned by the current user.
|
||||
|
||||
## Start the VPN Server
|
||||
|
||||
VPN is shared through the `vpn` backend of `zrok` command.
|
||||
|
||||
```bash
|
||||
eugene@hermes $ sudo -E zrok share private --headless --backend-mode vpn
|
||||
[ 0.542] INFO sdk-golang/ziti.(*listenerManager).createSessionWithBackoff: {session token=[589d443c-f59d-4fc8-8c48-76609b7fb402]} new service session
|
||||
[ 0.705] INFO main.(*sharePrivateCommand).run: allow other to access your share with the following command:
|
||||
zrok access private 3rq7torslq3n
|
||||
[ 0.705] INFO zrok/endpoints/vpn.(*Backend).Run: started
|
||||
```
|
||||
|
||||

|
||||
|
||||
`sudo` or equivalent invocation is required because VPN mode needs to create a virtual network device (`tun`)
|
||||
`-E` option allows `zrok` to find your zrok configuration files (in your `$HOME/.zrok`)
|
||||
|
||||
By default `vpn` backend uses subnet `10.122.0.0/16` and assigns `10.122.0.1` to the host that stared VPN share.
|
||||
|
||||
Example output from `ifconfig`:
|
||||
|
||||
```text
|
||||
tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 16384
|
||||
inet 10.122.0.1 netmask 255.255.0.0 destination 10.122.0.1
|
||||
inet6 fe80::705f:24e4:dcfc:a6b2 prefixlen 64 scopeid 0x20<link>
|
||||
inet6 fd00:7a72:6f6b::1 prefixlen 64 scopeid 0x0<global>
|
||||
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 500 (UNSPEC)
|
||||
RX packets 0 bytes 0 (0.0 B)
|
||||
RX errors 0 dropped 0 overruns 0 frame 0
|
||||
TX packets 27 bytes 3236 (3.2 KB)
|
||||
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
|
||||
```
|
||||
|
||||
Default IP/subnet setting can be overridden by adding `<target>` parameter:
|
||||
|
||||
```bash
|
||||
sudo -E zrok share private --headless --backend-mode vpn 192.168.42.12/24
|
||||
```
|
||||
|
||||
## Reserve a VPN Share Token
|
||||
|
||||
As with all backend modes, you can reserve a share token for a VPN share.
|
||||
|
||||
```bash
|
||||
eugene@hermes $ zrok reserve private --backend-mode vpn
|
||||
[ 0.297] INFO main.(*reserveCommand).run: your reserved share token is 'k77y2cl7jmjl'
|
||||
|
||||
eugene@hermes $ sudo -E zrok share reserved k77y2cl7jmjl --headless
|
||||
[ 0.211] INFO main.(*shareReservedCommand).run: sharing target: '10.122.0.1/16'
|
||||
[ 0.211] INFO main.(*shareReservedCommand).run: using existing backend target: 10.122.0.1/16
|
||||
[ 0.463] INFO sdk-golang/ziti.(*listenerManager).createSessionWithBackoff: {session token=[22c5708d-e2f2-41aa-a507-454055f8bfcc]} new service session
|
||||
[ 0.641] INFO main.(*shareReservedCommand).run: use this command to access your zrok share: 'zrok access private k77y2cl7jmjl'
|
||||
[
|
||||
```
|
||||
|
||||
## Access the VPN Share
|
||||
|
||||
```bash
|
||||
eugene@calculon % sudo -E zrok access private --headless k77y2cl7jmjl
|
||||
[ 0.201] INFO main.(*accessPrivateCommand).run: allocated frontend '50B5hloP1s1X'
|
||||
[ 0.662] INFO main.(*accessPrivateCommand).run: access the zrok share at the following endpoint: VPN:
|
||||
[ 0.662] INFO main.(*accessPrivateCommand).run: 10.122.0.1 -> CONNECTED Welcome to zrok VPN
|
||||
[ 0.662] INFO zrok/endpoints/vpn.(*Frontend).Run: connected:Welcome to zrok VPN
|
||||
```
|
||||
|
||||
zrok creates a virtual network device, i.e., a "tun" interface, when you run `zrok access`.
|
||||
|
||||
Example output from `ifconfig` run on a VPN client device:
|
||||
|
||||
```bash
|
||||
utun5: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
|
||||
inet 10.122.0.3 --> 10.122.0.1 netmask 0xff000000
|
||||
inet6 fe80::ce08:faff:fe8a:7b25%utun5 prefixlen 64 scopeid 0x14
|
||||
nd6 options=201<PERFORMNUD,DAD>
|
||||
```
|
||||
|
||||
At this point a VPN tunnel is active between your server and client.
|
||||
In the example above server is `hermes(10.122.0.1)` and client is `calculon(10.122.0.3)`.
|
||||
All devices in the VPN can access one another by IP address.
|
||||
|
||||
```bash
|
||||
eugene@calculon ~ % ssh eugene@10.122.0.1
|
||||
Welcome to Ubuntu 23.10 (GNU/Linux 6.5.0-27-generic x86_64)
|
||||
|
||||
* Documentation: https://help.ubuntu.com
|
||||
* Management: https://landscape.canonical.com
|
||||
* Support: https://ubuntu.com/pro
|
||||
|
||||
0 updates can be applied immediately.
|
||||
|
||||
Last login: Tue Apr 16 09:27:13 2024 from 127.0.0.1
|
||||
|
||||
eugene@hermes:~$ who am i
|
||||
eugene pts/8 2024-04-16 10:04 (10.122.0.3)
|
||||
|
||||
eugene@hermes:~$
|
||||
```
|
||||
|
||||
You can also make a reverse(server-to-client) connection:
|
||||
|
||||
```bash
|
||||
eugene@hermes:~$ ssh 10.122.0.3
|
||||
Last login: Tue Apr 16 09:57:28 2024
|
||||
|
||||
eugene@calculon ~ % who am i
|
||||
eugene ttys008 Apr 16 10:06 (10.122.0.1)
|
||||
```
|
After Width: | Height: | Size: 59 KiB |
BIN
website/versioned_docs/version-0.4/images/zrok.png
Normal file
After Width: | Height: | Size: 33 KiB |
BIN
website/versioned_docs/version-0.4/images/zrok_cover.png
Normal file
After Width: | Height: | Size: 90 KiB |
@ -0,0 +1 @@
|
||||
<mxfile host="Electron" modified="2023-01-31T16:50:10.306Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.3.0 Chrome/104.0.5112.114 Electron/20.1.3 Safari/537.36" etag="omPMvH-oUaREmM9gGVyL" version="20.3.0" type="device"><diagram id="7Uu1JcSXeUW2rxoxs6Qh" name="Page-1">5Vvfc5s4EP5rPHP3UI+QxK/HJE7TzPWu7qUzae+lQ0CxmWDkEzix89efMMIGSbYJBuxe8hK04AW+/bS72hUDdDVb3jBvPv2TBiQaQBAsB2g0gNDADuL/MslKSKBl5pIJCwMh2wruwlcihEBIF2FAksqFKaVRGs6rQp/GMfHTisxjjL5UL3ukUfWuc29CFMGd70Wq9D4M0mkudQHYyj+RcDIVd7aKEzOvuFYIkqkX0JeSCF0P0BWjNM2PZssrEmXgFbDkv/u44+zmuRiJ0zo/+OPiPv2KJu6/P9l9FPvkQzj6+gE6uZpnL1qIFxZPm64KBBhdxAHJtBgDdPkyDVNyN/f87OwLNzqXTdNZJE4/hlF0RSPK1r9Fj45PfJ/LAy+ZbnQkKaNPpHTZg2NiE/Az6kuJ93wmLCXLkki85A2hM5KyFb9EnDUFvzaEw0MhednaD9rCKtOS7QwshJ7gzGSjfIsrPxDQvgVmq1uYR+a1M8IyzG2ACSU0AVawRFCHpWN0hKXRJZYBefQWUdoOeLjAQICHkaOAZxga8MyueIi7pSExApPYB2e7a9nIs9rB2HAkgpq66Y4dDcpOZ7NdQfmVIzCA1ppYD4wfTbIjz/dJkmQILB6i0D/OFC1gCYGEpa3D0gAaLLHZEZaoJpY8ujJycgRNfH4ImgqCo1XszTK+gb8Jf7eE4wbGjC5XCn78tdMqSNXJHNOYSG5AiLwonMR86HMwCZdfZiCGPK26ECdmYRBkt9FaZWs30EFQQ7KVtCmCYWmshLryGYZipS9zEv8TpqHK9b9I+kLZk2ItfhueFZN8NswzoR/RRdAL81GBzF4/bLi6VAF1RX33cLgjcXCRrRLWYHlJEvpVaKpM5Piw1ffy4Ec2GPIsSYxHy/LZ0UqMdiKcemxC0sMhmwSVZYpqhxLK5p6UgpHIS8Pn6uJGB7y4w5iG/Ik3ZnZ3RttCR0IXzCfiZ+XliKTJljRhRVMOjaJpzYTNix8x40Bf7LDfKTu4o23KDsOUVcF+yaH6447I8V64IefpbnNuyGmq1bvrUDP8euxI+IOljUgzBHaVN/gAb9ajMWEhf9ksAcuFyzD9Lu6UHZcoyEdbTdngIAFze+2BCdYkqnFWREUSvVBzL4asg6q6Zqq6fuqaqW9zbwUjwdAFToWVyEJ7eZkNZH4352pdp4rOiqumFCYRaMxV00VDVFVWVNr64qq6UlW4eiaFPduqIIWL7ORkhT1Drezp6yRXlE8/GkWE/Zb8frbwVteSGGpWkv3Ca/cf8Lerhh9FxK7lR6FZdqN7Xejuyuyuwu4RDhbX9LDwrDwsNEyJi409LJSzAbv3bKBGt69tGpsVGvMwXz8j6JLI2vS4B3afV66LARyC0h88RNDaXHerLpwL+uZ60+LfEVyHDV22/Yu77PNKinHGtS5IjbMa5U7F0IVDu1+OQ7WEOWbhs5cSNfH79O3bWJVex8F883St9BI6ywptQ+owGKauw6DbjNBdp7dpmfCtTkaZ9jkDd5Z04P6aTslnGUgqVtuH3Fa7kRPVTQvBWTkZS6p1I6N5J0RqR8Le65lQXd5s/Ai4jp9DRuMZ0XiJ/2d/2JIqgLa656nf5jBUc5mx2DICbjP8YvJebGNIUcDttXUfWbfLyy+33jJe/gTOExm93txotvt8DCOSKAYpAmlA/cV6Nh2MpQ85lJ8fqo16BS0NprvDKIZDyd8AV4NhUVms+E6rIwhPXaU+2L/XR1m7TudEClitRcndXDxZTDSlRZ9rNo6JQFKFFVXtxUQtkh1vldy3Y/eo+S11BDDQZclQuw8HduUh1cL+L55eHGWhDc6bFal2IdNrDDtBfZsvxKXKIDrkhPe1tN9URWnmmbXIWapn3l34O1lPW8qakCsRqX5HW1IkfzLRsVfuv4Bd5WizPGF/mqAt6V1YJ6IpPilPnSq9bLmjV7tUJ21H3eQTPfFUXbB9pjz6nK4s10Lckkr6WL9ruqv62z5W1/7S4pgEro3IL22CwxipALb0cQAfbr8tzGm9/UITXf8H</diagram></mxfile>
|
BIN
website/versioned_docs/version-0.4/images/zrok_deployment.png
Normal file
After Width: | Height: | Size: 63 KiB |
BIN
website/versioned_docs/version-0.4/images/zrok_enable_modal.png
Normal file
After Width: | Height: | Size: 67 KiB |
@ -0,0 +1 @@
|
||||
<mxfile host="Electron" modified="2022-11-17T18:39:26.490Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.3.0 Chrome/104.0.5112.114 Electron/20.1.3 Safari/537.36" etag="Va4ym45iM5ACQJZKhOlW" version="20.3.0" type="device"><diagram id="oqxypaCZoQuY0yNYre-9" name="Page-1">7VzbcqM4EP0av2zVuAziYj+OPZnsZpJUKp6tnezLlGJkWxuMGCHf8vUjQDIXERtY3xKTSqWkRmpQ91EfqQVpgcFsdU2hP70jDnJbesdZtcCXlq53DZv/DQXrWGDrIBZMKHZikZYIhvgVCWFHSOfYQUGmISPEZdjPCkfE89CIZWSQUrLMNhsTN3tXH06QIhiOoKtK/8EOm4phmZ1E/ifCk6m4s9kRF2ZQthWCYAodskyJwFULDCghLC7NVgPkhqaTZon7fX3j6ua5KPJYmQ7dxafBL+t28C14CP6F8+EC9//7JLQsoDsX4/2jjb32KyUvbUzEg7O1NAYlc89BoUKtBfrLKWZo6MNReHXJvc9lUzZzxWX1AeXdEGVolRKJB75GZIYYXfMm4qreFV3W0uxxdZl4QpNAmaa8YAgZFM6fbDQnBuIFYaMK9jIUez1QvIAMceFXSjzkOWdnNGCf2mqmYjXFSNxwn8PZymsjFwYBHnFjBAxSpopT5kps2+E1tMLsR1hum6L2lLryZZWurGXF4yNMdQqrT0J7VEm6RTXZ701HBWROR2g3hvjYJohtaWfF7ZCTCVCq21NuNQu8KmUUuZDhRTasFbla3OGBYD6yDapM/Q1USRXxuEWvdBzKKQLAbvf0zuYnq1a37bZlZDXHllI0R1Dc2KE+Oi0FnVfeAvPJPEPihmmg8jDuh8UpWsEJ8TgSfEQxfwZEE+mDFOm7Z/wYr5DkvbAexEV9K8gqRAPbyhpYL4gG+hbc7D0adFV7+1M0QxTyrpbLb99/prw0CUsfyRWG0TszV/TeAZ0ZpnFmdCZvdng+q8lNdXiwPp/1SvJZ96z4zOplJyMAObiU5TM7P6u7OUUHpi9N341GGSkZfA5FMRBFoAudzzdPDGIviptaVHdd6Ac4ah23mGLXuYVrMmdSj6ztY5KbesaG0oTpKd61jhgYNVDRqI/hnO5PCcWvoS1dYba8oYMlnrnQ41tG6OREfeLIuciIL0ouGjNRfCaMkZmoUGGDTqGzHEr873I6diJic90BcUnoX4+H9ZAqQzxGZjP7/JcbchCGC5OPbMDrWlLnv2FzygbECxiFOPIyggFboqDY/9uBuhsVu/yum4fyu7rBQ8kK5CdW6VCigA+fYeg+ohGD3iSaZam4XkSTImMBE78RbpqxG7HDFDsO8opdVw0ekaMRvVqg2N/h40AXT7yQg5AXLZZKuxDUcqHWreZCoS2xZXV10OUD8/hKph8yanCQwKtuazUdGB8DIfsHxCrnvZRHrb3io4y2/cLj1+2Pl8HAGvbv9dc+8B+x+XonU2sNYRyDMNZZNx+DPwqdrq7FPDhDHzUkbMP9pVFEoS3UVaQ/f3b5pq8BxIVRRGGA00skEt7b1g3Yp967bYbQ7N32RsUbpJ7x3k26udm7bZ8WFYm5ogt3EXMJdceIvCozX9zerXqo33gv5VG7IEVbHx9ltB0DHmoaqKGQ41HICXZzxY+sZng+8nZu+1RoaIMbQ31X4P7v29sGEA1tRKaxd9NG6mBYeK7E8W8rdfjbadubw+Ad579aK3X6uzkL3vf57+a1zF0HwAI4Z3IArNvZjaup1TwABnpWkWEd9wBYV1+o2b5YOccsgqVljXgGaQT15ZhmDfh/14Dd0rg42aIPqEm5Jo1QMC2a9SDHippq7PUs+2MgZP+AuLT1IFAzkg2FHI9CziWNANRk48WlETZToaENbgw1vXhxaYQKgLg42qj2vVTdNEK9LIJ9qDRC2dfI5XrjTNIIZi+XRqj7Hrll5NIIh3uP/AWD67/mne+fZ97wxllcXz/cPBV8CnoI0Okny11tezdlJ+i0s8KcIT8ylsmSfMapLOYMM6conwPbH+ZuPPJtDG4nAYDDn/d3/fHouVcRc+/pw9AcUuqFRKsKOk8FRmBkPzAE3Rxjls6j5hTpeUW1wciryXf2cfPkfxWAq98=</diagram></mxfile>
|
After Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 28 KiB |
BIN
website/versioned_docs/version-0.4/images/zrok_not_found.png
Normal file
After Width: | Height: | Size: 55 KiB |
BIN
website/versioned_docs/version-0.4/images/zrok_private_share.png
Normal file
After Width: | Height: | Size: 101 KiB |
BIN
website/versioned_docs/version-0.4/images/zrok_public_share.png
Normal file
After Width: | Height: | Size: 102 KiB |
After Width: | Height: | Size: 81 KiB |
After Width: | Height: | Size: 54 KiB |
BIN
website/versioned_docs/version-0.4/images/zrok_share_public.png
Normal file
After Width: | Height: | Size: 291 KiB |