diff --git a/Makefile b/Makefile index 03faece..9248af7 100644 --- a/Makefile +++ b/Makefile @@ -149,7 +149,8 @@ docker_image: ## docs local server .PHONY: docs docs: - cd docs && hugo server --buildDrafts --disableFastRender + cd docs && hugo server --disableFastRender +## cd docs && hugo server --buildDrafts --disableFastRender # ==================================================================================== # # QUALITY CONTROL diff --git a/docs/content/docs/advanced/_index.md b/docs/content/docs/advanced/_index.md index 47929b5..a5c4118 100644 --- a/docs/content/docs/advanced/_index.md +++ b/docs/content/docs/advanced/_index.md @@ -1,12 +1,13 @@ --- linkTitle: Advanced title: Advanced Topics -prev: /docs/services +prev: /docs/scenarios next: /docs/advanced/dashboard +weight: 5 --- {{< cards >}} {{< card link="dashboard" title="Dashboard" icon="view-boards" >}} {{< card link="docker-secrets" title="Docker secrets" icon="key" >}} - {{< card link="headscale" title="Headscale" icon="server" >}} + {{< card link="host-mode" title="Service with Host Network Mode" icon="view-boards" >}} {{< /cards >}} diff --git a/docs/content/docs/advanced/docker-secrets.md b/docs/content/docs/advanced/docker-secrets.md index a4af0da..b3bf278 100644 --- a/docs/content/docs/advanced/docker-secrets.md +++ b/docs/content/docs/advanced/docker-secrets.md @@ -2,21 +2,24 @@ title: Docker secrets --- -If you want to use Docker secrets to store your Tailscale authkey, you can use the following example: +If you want to use Docker secrets to store your Tailscale authkey, you can use +the following example: {{% steps %}} -### Requirements ### +### Requirements Make sure you have Docker Swarm enabled on your server. -"Docker secrets are only available to swarm services, not to standalone containers. To use this feature, consider adapting your container to run as a service." +"Docker secrets are only available to swarm services, not to standalone +containers. To use this feature, consider adapting your container to run as a service." ### Add a docker secret -We need to create a docker secret, which we can name `authkey` and store the Tailscale authkey in it. We can do that using the following command: +We need to create a docker secret, which we can name `authkey` and store the Tailscale +authkey in it. We can do that using the following command: ```bash printf "Your Tailscale AuthKey" | docker secret create authkey - @@ -26,18 +29,12 @@ printf "Your Tailscale AuthKey" | docker secret create authkey - ```yaml docker-compose.yml services: - tailscale-docker-proxy: + tsdproxy: image: almeidapaulopt/tsdproxy:latest volumes: - /var/run/docker.sock:/var/run/docker.sock - datadir:/data - restart: unless-stopped - environment: - # Get AuthKey from your Tailscale account - - TSDPROXY_AUTHKEYFILE=/run/secrets/authkey - # Address of docker server (access to example.com ports) - - TSDPROXY_HOSTNAME=192.168.1.1 - - DOCKER_HOST=unix:///var/run/docker.sock + - :/config secrets: - authkey @@ -49,6 +46,15 @@ secrets: external: true ``` +### TsDProxy configuration + +```yaml /config/tsdproxy.yaml +tailscale: + providers: + default: # name of the provider + authkeyfile: "/run/secrets/authkey" +``` + ### Restart tsdproxy ``` bash diff --git a/docs/content/docs/advanced/headscale.md b/docs/content/docs/advanced/headscale.md index 14851a5..89e2ed0 100644 --- a/docs/content/docs/advanced/headscale.md +++ b/docs/content/docs/advanced/headscale.md @@ -1,5 +1,6 @@ --- title: Headscale +draft: true --- In case you want to use the Headscale service, please read the following: diff --git a/docs/content/docs/advanced/host-mode.md b/docs/content/docs/advanced/host-mode.md index 31debbf..1d41e25 100644 --- a/docs/content/docs/advanced/host-mode.md +++ b/docs/content/docs/advanced/host-mode.md @@ -1,8 +1,11 @@ --- title: Service with host network_mode +next: /docs/scenarios --- -If you want to run a service in `network_mode: host`, TSDProxy will not detect any port mapping. You need to specify a port in the `tsdproxy.container_port` option. +If you want to run a service in `network_mode: host`, TSDProxy tries to detect how +to proxy the container. In case of not autodetection work for your case, you need +to specify a port in the `tsdproxy.container_port` option. {{% steps %}} @@ -17,6 +20,7 @@ labels: ### Restart your service -After you restart your service, you should be able to access it using the port you specified in the label. +After you restart your service, you should be able to access it using the port +you specified in the label. {{% /steps %}} diff --git a/docs/content/docs/changelog.md b/docs/content/docs/changelog.md new file mode 100644 index 0000000..fb44a88 --- /dev/null +++ b/docs/content/docs/changelog.md @@ -0,0 +1,61 @@ +--- +title: Changelog +prev: /docs/advanced +weight: 200 +--- + + +{{% steps %}} + +### 1.0.0_rc2 + +#### New Autodetection function for containers network + +TSDProxy now tries to connect to the container using docker internal +ip addresses and ports. It's more reliable and faster, even in container without +exposed ports. + +#### New configuration method + +TSDProxy still supports the Environment variable method. But there's much more +power with the new configuration yaml file. + +#### Multiple Tailscale servers + +TSDProxy now supports multiple Tailscale servers. This option is useful if you +have multiple Tailscale accounts, if you want to group containers with the same +AUTHKEY or if you want to use different servers for different containers. + +#### Multiple Docker servers + +TSDProxy now supports multiple Docker servers. This option is useful if you have +multiple Docker instances and don't want to deploy and manage TSDProxy on each one. + +#### New instalation scenarios documentation + +Now there is a new [scenarios](/docs/scenarios) section. + +#### New logs + +Now logs are more readable and easier to read and with context. + +#### New Docker container labels + +**tsdproxy.proxyprovider** is the label that defines the Tailscale proxy +provider. It's optional. + +#### TSDProxy can now run standalone + +With the new configuration file, TSDProxy can be run standalone. +Just run tsdproxyd --config ./config . + +#### New flag --config + +This new flag allows you to specify a configuration file. It's useful if you +want to use as a command line tool instead of a container. + +```bash +tsdproxyd --config ./config/tsdproxy.yaml +``` + +{{% /steps %}} diff --git a/docs/content/docs/getting-started.md b/docs/content/docs/getting-started.md index 9d362d5..30b1b91 100644 --- a/docs/content/docs/getting-started.md +++ b/docs/content/docs/getting-started.md @@ -2,7 +2,6 @@ title: Getting Started weight: 1 prev: /docs -next: /docs/services --- ## Quick Start @@ -15,18 +14,13 @@ Using Docker Compose, you can easily configure the proxy to your Tailscale conta ```yaml docker-compose.yml services: - tailscale-docker-proxy: + tsdproxy: image: almeidapaulopt/tsdproxy:latest volumes: - /var/run/docker.sock:/var/run/docker.sock - datadir:/data + - :/config restart: unless-stopped - environment: - # Get AuthKey from your Tailscale account - - TSDPROXY_AUTHKEY=tskey-auth-SecretKey - # Address of docker server (access to example.com ports) - - TSDPROXY_HOSTNAME=192.168.1.1 - - DOCKER_HOST=unix:///var/run/docker.sock volumes: datadir: @@ -38,14 +32,53 @@ volumes: docker compose up -d ``` +### Configure TSDProxy + +After the TSDProxy container is started, a configuration file +`/config/tsdproxy.yaml` is created and populated with the following: + +```yaml +defaultproxyprovider: default +docker: + local: # name of the docker provider + host: unix:///var/run/docker.sock # host of the docker socket or daemon + targethostname: 172.31.0.1 # hostname or IP of docker server + defaultproxyprovider: default # name of which proxy provider to use +file: {} +tailscale: + providers: + default: # name of the provider + authkey: your-authkey # define authkey here + authkeyfile: "" # use this to load authkey from file. If this is defined, Authkey is ignored + controlurl: https://controlplane.tailscale.com # use this to override the default control URL + datadir: /data/ +http: + hostname: 0.0.0.0 + port: 8080 +log: + level: info # set logging level info, error or trace + json: false # set to true to enable json logging +proxyaccesslog: true # set to true to enable container access log +``` + +#### Edit the configuration file + +1. Set your authkey in the file `/config/tsdproxy.yaml`. +2. Change yout docker host if your are not using the socket. +3. restart the service. + +```bash +docker compose restart +``` + ### Run a sample service Here we’ll use the nginx image to serve a sample service. -The container name is `sample-nginx`, expose port 8181, and add the `tsdproxy.enable` label. +The container name is `sample-nginx`, expose port 8181, and add the +`tsdproxy.enable` label. ```bash -docker run -d --name sample-nginx -p 8181:80 \ ---label "tsdproxy.enable=true" nginx:latest +docker run -d --name sample-nginx -p 8111:80 --label "tsdproxy.enable=true" nginx:latest ``` ### Test the sample service @@ -60,7 +93,8 @@ Note that you need to replace `FUNNY-NAME` with the name of your network. {{< callout type="warning" >}} The first time you run the proxy, it will take a few seconds to start, because it -needs to connect to the Tailscale network, generate the certificates, and start the proxy. +needs to connect to the Tailscale network, generate the certificates, and start +the proxy. {{< /callout >}} {{% /steps %}} diff --git a/docs/content/docs/scenarios/1i-2docker-1tailscale.excalidraw b/docs/content/docs/scenarios/1i-2docker-1tailscale.excalidraw new file mode 100644 index 0000000..96519f8 --- /dev/null +++ b/docs/content/docs/scenarios/1i-2docker-1tailscale.excalidraw @@ -0,0 +1,2278 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.pug-rigel.ts.net", + "elements": [ + { + "type": "rectangle", + "version": 811, + "versionNonce": 718556446, + "isDeleted": false, + "id": "CbdcZ3cBa6pOVaO2SltH4", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 10, + "angle": 0, + "x": 943.2429452474926, + "y": 140.72727183531129, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 322.5141095050148, + "height": 196.54545632937743, + "seed": 801029506, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "Zx", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 981, + "versionNonce": 189331806, + "isDeleted": false, + "id": "W7MFnYV7wzsHawLvDe4cn", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 10, + "angle": 0, + "x": 380.24294524749257, + "y": 145.72727183531129, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 322.5141095050148, + "height": 196.54545632937743, + "seed": 1790431006, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ZxG", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 3483, + "versionNonce": 148774302, + "isDeleted": false, + "id": "_tzjsSJfrk1sDh4hxj_rI", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 956.3408551813005, + "y": 244.60786869652327, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 42.69850085568315, + "height": 42.65761301555882, + "seed": 82980062, + "groupIds": [ + "5Y9-MT2ef2l1a4vbOBSJE", + "v0bMUJdmgyaKFqsImnsjS", + "kT5zAPYnVrh3K0DwNqbJ8", + "OYyDZxjPYOkj_GRJasT_G", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ag", + "frameId": null, + "roundness": null + }, + { + "type": "line", + "version": 2716, + "versionNonce": 415545822, + "isDeleted": false, + "id": "jL6ujppSvKXYSI-jv0fio", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 966.3710903180352, + "y": 268.0260122816117, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 37.5054878170752, + "height": 18.402138929052015, + "seed": 1846862110, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 17.552895492740475, + -0.36798480024263586 + ], + [ + 21.772117076296297, + -0.8953852851198427 + ], + [ + 20.89710448362079, + -4.287538768685753 + ], + [ + 22.287530784141357, + -7.51188300706335 + ], + [ + 24.43309506662601, + -4.503295725566344 + ], + [ + 24.145428110512757, + -2.0820408022280708 + ], + [ + 27.60350947131935, + -4.449357039613003 + ], + [ + 30.306446412147913, + -3.460479923340618 + ], + [ + 28.70026053930358, + -1.2849468875841628 + ], + [ + 25.164265530163796, + 0.387161229238808 + ], + [ + 15.934740346214104, + 9.886388695224293 + ], + [ + 0.11267831954550236, + 10.890255921988665 + ], + [ + -7.199041404927283, + 0.7383606788280613 + ], + [ + -2.3733110342165227, + -0.395550363657971 + ], + [ + -0.1902344971597756, + -0.012946648431517388 + ] + ], + "index": "ah", + "frameId": null, + "roundness": { + "type": 2 + } + }, + { + "type": "rectangle", + "version": 1622, + "versionNonce": 1645071902, + "isDeleted": false, + "id": "GTzrtv916fKphqNSVJTNo", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 962.2079889146238, + "y": 262.85125450073383, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 1096224094, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ai", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1677, + "versionNonce": 27941470, + "isDeleted": false, + "id": "NO4grmSMc1pscNbfiN9ud", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 966.8168663457224, + "y": 262.6822650529964, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 2081010078, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "aj", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1697, + "versionNonce": 1315659422, + "isDeleted": false, + "id": "93_-03EN5WfhWwqB-XaTa", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 971.6408207869226, + "y": 262.75907164016667, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 1230884318, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ak", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1718, + "versionNonce": 486660830, + "isDeleted": false, + "id": "bwve4EfguK739ux_W6sYt", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 976.4494118477994, + "y": 262.5286364069694, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 1180983838, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "al", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1760, + "versionNonce": 67030814, + "isDeleted": false, + "id": "FD8d7vKbtyvfxLObuCQRL", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 981.012196559309, + "y": 262.59008477104095, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 1175350878, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "am", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1664, + "versionNonce": 533936990, + "isDeleted": false, + "id": "2vksAaokR8KYx648dZ8P3", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 966.6862763236493, + "y": 258.21166062343906, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 355267230, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "an", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1688, + "versionNonce": 1456480158, + "isDeleted": false, + "id": "2TbKxwoHQkGeiczKNXR7-", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 971.5255967237898, + "y": 258.273111566124, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 1047588574, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ao", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1712, + "versionNonce": 489061342, + "isDeleted": false, + "id": "bnHZiCdZxiVMDG0TZVFBS", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 976.4263680666174, + "y": 258.2731064088998, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 1315660574, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ap", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1731, + "versionNonce": 954683422, + "isDeleted": false, + "id": "iSuQLnFhxn4HkZuJ5MpJr", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 976.2650512838942, + "y": 253.57205385307606, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 395136862, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "aq", + "frameId": null, + "roundness": null + }, + { + "type": "text", + "version": 2253, + "versionNonce": 100899934, + "isDeleted": false, + "id": "ejJLOnlP3XA4fubbzeIZm", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 955.5, + "y": 290.8323509981469, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 51.03175354003906, + "height": 33.11956061065962, + "seed": 1982313374, + "groupIds": [ + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "fontSize": 13.247824244263846, + "fontFamily": 1, + "text": "Docker\nServer 1", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Docker\nServer 1", + "index": "ar", + "frameId": null, + "roundness": null, + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 3647, + "versionNonce": 978083998, + "isDeleted": false, + "id": "3oE-ul1L7TzrkC2bVbG9i", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 393.3408551813005, + "y": 249.60786869652327, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 42.69850085568315, + "height": 42.65761301555882, + "seed": 1762701634, + "groupIds": [ + "zXJoQjFrH9MeRTWjJxnoj", + "rxrmDzvofOCrtu_9Y6QXz", + "1H9rUl8sBLw-xCor4YKrv", + "GQ-f9FFGBidCD1DGdlakK", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar0G", + "frameId": null, + "roundness": null + }, + { + "type": "line", + "version": 2880, + "versionNonce": 695377118, + "isDeleted": false, + "id": "g89fCQuI1EKJHzF5andu-", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 403.37109031803516, + "y": 273.0260122816117, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 37.5054878170752, + "height": 18.402138929052015, + "seed": 1920957406, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 17.552895492740475, + -0.36798480024263586 + ], + [ + 21.772117076296297, + -0.8953852851198427 + ], + [ + 20.89710448362079, + -4.287538768685753 + ], + [ + 22.287530784141357, + -7.51188300706335 + ], + [ + 24.43309506662601, + -4.503295725566344 + ], + [ + 24.145428110512757, + -2.0820408022280708 + ], + [ + 27.60350947131935, + -4.449357039613003 + ], + [ + 30.306446412147913, + -3.460479923340618 + ], + [ + 28.70026053930358, + -1.2849468875841628 + ], + [ + 25.164265530163796, + 0.387161229238808 + ], + [ + 15.934740346214104, + 9.886388695224293 + ], + [ + 0.11267831954550236, + 10.890255921988665 + ], + [ + -7.199041404927283, + 0.7383606788280613 + ], + [ + -2.3733110342165227, + -0.395550363657971 + ], + [ + -0.1902344971597756, + -0.012946648431517388 + ] + ], + "index": "ar0V", + "frameId": null, + "roundness": { + "type": 2 + } + }, + { + "type": "rectangle", + "version": 1786, + "versionNonce": 151474462, + "isDeleted": false, + "id": "E5xafoKE135qFUga_-E7x", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 399.2079889146238, + "y": 267.85125450073383, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 338508034, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar0l", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1841, + "versionNonce": 880508254, + "isDeleted": false, + "id": "n0wbMwlYZly-FjAWJlj9x", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 403.81686634572236, + "y": 267.6822650529964, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 2065715230, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar1", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1861, + "versionNonce": 1897931166, + "isDeleted": false, + "id": "dNcdasUjjedNOwuXfEvm6", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 408.64082078692263, + "y": 267.75907164016667, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 31639746, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar1G", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1882, + "versionNonce": 841367006, + "isDeleted": false, + "id": "sVisFuMfKDIGX8nucfYrj", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 413.4494118477994, + "y": 267.5286364069694, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 421305438, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar1V", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1924, + "versionNonce": 1553912350, + "isDeleted": false, + "id": "1XJlT5ZHbibd1U8aDdUkI", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 418.012196559309, + "y": 267.59008477104095, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 164651138, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar2", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1828, + "versionNonce": 192601694, + "isDeleted": false, + "id": "M5VgND8EQWX6oPp0-_ryM", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 403.6862763236493, + "y": 263.21166062343906, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 38101150, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar2G", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1852, + "versionNonce": 1401643678, + "isDeleted": false, + "id": "RE_3nuhP_ma9w01y5J6BD", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 408.5255967237898, + "y": 263.273111566124, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 934608962, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar2V", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1876, + "versionNonce": 125918942, + "isDeleted": false, + "id": "q8gR2YIkSDCFBbZW8273m", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 413.42636806661744, + "y": 263.2731064088998, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 172727518, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar3", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1895, + "versionNonce": 2079183646, + "isDeleted": false, + "id": "lThYgQGjyFsJ5YyJE1X0P", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 413.2650512838942, + "y": 258.57205385307606, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 1198499842, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar3G", + "frameId": null, + "roundness": null + }, + { + "type": "text", + "version": 2419, + "versionNonce": 1262600030, + "isDeleted": false, + "id": "ME0L29qT7l6RGIeJ15A4D", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 392.5, + "y": 295.8323509981469, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 57.44523620605469, + "height": 33.11956061065962, + "seed": 1723879710, + "groupIds": [ + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "fontSize": 13.247824244263846, + "fontFamily": 1, + "text": "Docker\nServer 2", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Docker\nServer 2", + "index": "ar3V", + "frameId": null, + "roundness": null, + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "c0uJsIYOtQMJjgnQgSG5s", + "type": "rectangle", + "x": 1049.25, + "y": 151, + "width": 203, + "height": 42, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ax", + "roundness": { + "type": 3 + }, + "seed": 1427099294, + "version": 115, + "versionNonce": 696665758, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "Bavl2otxFsAcNE7VVeJoW" + }, + { + "id": "zPoyNe_C8PsfTkedJ3elc", + "type": "arrow" + }, + { + "id": "0IYZQPIWiO2I1IJv3af26", + "type": "arrow" + }, + { + "id": "rFVkwBQgM9y6Nl9ulf1IV", + "type": "arrow" + }, + { + "id": "73RVuwnM5sCg-BOQgWhd0", + "type": "arrow" + }, + { + "id": "eOia-7JJjPzN_5qw8CTpo", + "type": "arrow" + }, + { + "id": "1eMsUusn5UMt7ItFizCDM", + "type": "arrow" + } + ], + "updated": 1732907643095, + "link": null, + "locked": false + }, + { + "id": "Bavl2otxFsAcNE7VVeJoW", + "type": "text", + "x": 1099.8500366210938, + "y": 159.5, + "width": 101.7999267578125, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ay", + "roundness": null, + "seed": 1853752286, + "version": 57, + "versionNonce": 1506017246, + "isDeleted": false, + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "text": "TSDProxy", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "c0uJsIYOtQMJjgnQgSG5s", + "originalText": "TSDProxy", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "8ll1FgsjNwFMXlQ51cvIW", + "type": "rectangle", + "x": 1049.25, + "y": 276, + "width": 203, + "height": 42, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "az", + "roundness": { + "type": 3 + }, + "seed": 650916930, + "version": 175, + "versionNonce": 2053481438, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "ybJVuRsHYUEOv7S-nUxpc" + }, + { + "id": "0IYZQPIWiO2I1IJv3af26", + "type": "arrow" + } + ], + "updated": 1732889473637, + "link": null, + "locked": false + }, + { + "id": "ybJVuRsHYUEOv7S-nUxpc", + "type": "text", + "x": 1104.2900466918945, + "y": 284.5, + "width": 92.91990661621094, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b00", + "roundness": null, + "seed": 897604610, + "version": 147, + "versionNonce": 103139970, + "isDeleted": false, + "boundElements": [], + "updated": 1732890569820, + "link": null, + "locked": false, + "text": "Portainer", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "8ll1FgsjNwFMXlQ51cvIW", + "originalText": "Portainer", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "7ytJ_f6dC8KN4blL1-FH1", + "type": "rectangle", + "x": 486.25, + "y": 281, + "width": 203, + "height": 42, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b004", + "roundness": { + "type": 3 + }, + "seed": 1417875330, + "version": 341, + "versionNonce": 566452830, + "isDeleted": false, + "boundElements": [ + { + "id": "73RVuwnM5sCg-BOQgWhd0", + "type": "arrow" + }, + { + "type": "text", + "id": "RYLI1zXbD30idqYlTCIqu" + } + ], + "updated": 1732889467525, + "link": null, + "locked": false + }, + { + "id": "RYLI1zXbD30idqYlTCIqu", + "type": "text", + "x": 556.5900192260742, + "y": 289.5, + "width": 62.31996154785156, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b006", + "roundness": null, + "seed": 585741762, + "version": 60, + "versionNonce": 307040450, + "isDeleted": false, + "boundElements": [], + "updated": 1732890573875, + "link": null, + "locked": false, + "text": "Memos", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "7ytJ_f6dC8KN4blL1-FH1", + "originalText": "Memos", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "VD41DOaW4eD7XkyzxLFee", + "type": "rectangle", + "x": 1049.25, + "y": 214, + "width": 203, + "height": 42, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b01", + "roundness": { + "type": 3 + }, + "seed": 490686942, + "version": 253, + "versionNonce": 861198110, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "R7a3NmlQ6h6KObt4ceZzd" + } + ], + "updated": 1732889467526, + "link": null, + "locked": false + }, + { + "id": "R7a3NmlQ6h6KObt4ceZzd", + "type": "text", + "x": 1094.3400573730469, + "y": 222.5, + "width": 112.81988525390625, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b02", + "roundness": null, + "seed": 414604830, + "version": 229, + "versionNonce": 120079198, + "isDeleted": false, + "boundElements": [], + "updated": 1732889467526, + "link": null, + "locked": false, + "text": "Webserver 1", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "VD41DOaW4eD7XkyzxLFee", + "originalText": "Webserver 1", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "0TApF3A7KxKyvw0B-QPkU", + "type": "rectangle", + "x": 486.25, + "y": 219, + "width": 203, + "height": 42, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b02G", + "roundness": { + "type": 3 + }, + "seed": 372887362, + "version": 422, + "versionNonce": 873539294, + "isDeleted": false, + "boundElements": [ + { + "id": "oxU5UzuS2rIb10mfg76q9", + "type": "text" + }, + { + "id": "eOia-7JJjPzN_5qw8CTpo", + "type": "arrow" + } + ], + "updated": 1732907555110, + "link": null, + "locked": false + }, + { + "id": "oxU5UzuS2rIb10mfg76q9", + "type": "text", + "x": 528.1100540161133, + "y": 227.5, + "width": 119.27989196777344, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b02V", + "roundness": null, + "seed": 1585397214, + "version": 396, + "versionNonce": 1759085534, + "isDeleted": false, + "boundElements": [], + "updated": 1732889467526, + "link": null, + "locked": false, + "text": "Webserver 2", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "0TApF3A7KxKyvw0B-QPkU", + "originalText": "Webserver 2", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 1363, + "versionNonce": 488463582, + "isDeleted": false, + "id": "b_hENKtXSVtbdmuteAK9N", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1375.5, + "y": 270.12992166716845, + "strokeColor": "#000000", + "backgroundColor": "white", + "width": 57, + "height": 25, + "seed": 1470176898, + "groupIds": [ + "87ldCbBbEtHhy-moJSzMt" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732907631631, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Users", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Users", + "index": "b05", + "frameId": null, + "roundness": null, + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "ellipse", + "version": 2288, + "versionNonce": 1446277598, + "isDeleted": false, + "id": "LdkrDOpf7dSm3tbLu8m7q", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1415.9428169392195, + "y": 202.87007833283155, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 19.75034363276957, + "height": 17.281550678673437, + "seed": 1220410946, + "groupIds": [ + "NXQlcnsrOLwYHhcXEsXWn", + "Je0v3aQkv2sPoBWmeKSVF", + "87ldCbBbEtHhy-moJSzMt" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732907626225, + "link": null, + "locked": false, + "index": "b06", + "frameId": null, + "roundness": null + }, + { + "type": "ellipse", + "version": 2332, + "versionNonce": 1220970014, + "isDeleted": false, + "id": "lXLHUSgM2Pg9kXLA9POUs", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1372.7591428148976, + "y": 203.45314611646563, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 19.75034363276957, + "height": 17.281550678673437, + "seed": 178841090, + "groupIds": [ + "NXQlcnsrOLwYHhcXEsXWn", + "Je0v3aQkv2sPoBWmeKSVF", + "87ldCbBbEtHhy-moJSzMt" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732907626225, + "link": null, + "locked": false, + "index": "b07", + "frameId": null, + "roundness": null + }, + { + "type": "line", + "version": 2515, + "versionNonce": 9179742, + "isDeleted": false, + "id": "yBJQxoMVeK6dNifpVpA7r", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1383.210962822162, + "y": 262.38418185411524, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 41.80600213253467, + "height": 37.22704429756421, + "seed": 1717622210, + "groupIds": [ + "NXQlcnsrOLwYHhcXEsXWn", + "Je0v3aQkv2sPoBWmeKSVF", + "87ldCbBbEtHhy-moJSzMt" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1732907626225, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 4.682272238843876, + -24.66852332971124 + ], + [ + 20.06688102361667, + -37.22704429756421 + ], + [ + 35.45148980838941, + -27.359634965679646 + ], + [ + 41.80600213253467, + -2.561513547547756 + ], + [ + 0, + 0 + ] + ], + "index": "b08", + "frameId": null, + "roundness": { + "type": 2 + } + }, + { + "type": "ellipse", + "version": 2226, + "versionNonce": 2018907806, + "isDeleted": false, + "id": "JUoB3kNI0DvHPfCXNg10O", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1393.6970849729719, + "y": 205.8096705342782, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 21.404673091857735, + "height": 18.729088955375612, + "seed": 755289474, + "groupIds": [ + "NXQlcnsrOLwYHhcXEsXWn", + "Je0v3aQkv2sPoBWmeKSVF", + "87ldCbBbEtHhy-moJSzMt" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732907626225, + "link": null, + "locked": false, + "index": "b09", + "frameId": null, + "roundness": null + }, + { + "type": "line", + "version": 1628, + "versionNonce": 685085406, + "isDeleted": false, + "id": "87QzJRvE2fjHsNFt1n49O", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1412.3622982766128, + "y": 228.7151171690623, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 33.437317203044365, + "height": 37.41795020340682, + "seed": 869518658, + "groupIds": [ + "Je0v3aQkv2sPoBWmeKSVF", + "87ldCbBbEtHhy-moJSzMt" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1732907626225, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.174822900471103, + -5.57288620050744 + ], + [ + 9.553519200869804, + -8.3593293007612 + ], + [ + 17.116721901558428, + -8.757392600797402 + ], + [ + 22.291544802029577, + -7.563202700688624 + ], + [ + 25.874114502355752, + -3.5825697003262533 + ], + [ + 28.262494302573206, + 1.5922532001448921 + ], + [ + 30.650874102790677, + 7.961266000724821 + ], + [ + 32.64119060297189, + 14.33027880130475 + ], + [ + 33.437317203044365, + 19.50510170177589 + ], + [ + 32.64119060297189, + 24.67992460224705 + ], + [ + 29.45668420268195, + 27.068304402464427 + ], + [ + 25.077987902283255, + 28.26249430257321 + ], + [ + 18.708975101703373, + 28.660557602609412 + ], + [ + 14.728342101340951, + 27.86443100253699 + ], + [ + 14.330278801304704, + 22.291544802029662 + ], + [ + 12.738025601159729, + 18.70897510170331 + ], + [ + 9.951582500906056, + 13.136088901195967 + ], + [ + 5.970949500543595, + 5.572886200507347 + ], + [ + 0, + 0 + ] + ], + "index": "b0A", + "frameId": null, + "roundness": { + "type": 2 + } + }, + { + "type": "line", + "version": 1923, + "versionNonce": 1285261086, + "isDeleted": false, + "id": "6vnWfQzuW1R04RmbhkjKi", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1394.4435118232786, + "y": 228.70324126565788, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 32.24312730293567, + "height": 39.01020340355187, + "seed": 1345115394, + "groupIds": [ + "Je0v3aQkv2sPoBWmeKSVF", + "87ldCbBbEtHhy-moJSzMt" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1732907626225, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -3.980633000362431, + -4.378696300398655 + ], + [ + -8.359329300761118, + -7.165139400652425 + ], + [ + -15.922532001449774, + -7.56320270068861 + ], + [ + -21.097354901920916, + -6.369012800579835 + ], + [ + -24.679924602247063, + -2.388379800217473 + ], + [ + -27.06830440246457, + 2.7864431002536705 + ], + [ + -29.45668420268202, + 9.155455900833594 + ], + [ + -31.4470007028632, + 15.524468701413529 + ], + [ + -32.24312730293567, + 20.699291601884667 + ], + [ + -31.4470007028632, + 25.87411450235582 + ], + [ + -28.262494302573295, + 28.262494302573188 + ], + [ + -24.281861302210807, + 30.25281080275446 + ], + [ + -17.912848501630954, + 31.44700070286316 + ], + [ + -11.145772401014788, + 31.447000702863257 + ], + [ + -10.349645800942298, + 24.281861302210825 + ], + [ + -9.553519200869822, + 20.699291601884582 + ], + [ + -8.359329300761118, + 14.728342101341028 + ], + [ + -4.7767596004349215, + 6.767076100616125 + ], + [ + 0, + 0 + ] + ], + "index": "b0B", + "frameId": null, + "roundness": { + "type": 2 + } + }, + { + "id": "zPoyNe_C8PsfTkedJ3elc", + "type": "arrow", + "x": 1356.3700783328316, + "y": 214.18984658141147, + "width": 114.37007833283155, + "height": 51.18984658141147, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0C", + "roundness": { + "type": 2 + }, + "seed": 1714529374, + "version": 690, + "versionNonce": 962203934, + "isDeleted": false, + "boundElements": [], + "updated": 1732907631631, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -114.37007833283155, + -51.18984658141147 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "c0uJsIYOtQMJjgnQgSG5s", + "focus": -0.7502959379588252, + "gap": 1, + "fixedPoint": null + }, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "0IYZQPIWiO2I1IJv3af26", + "type": "arrow", + "x": 1237, + "y": 176, + "width": 3, + "height": 118, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0D", + "roundness": { + "type": 2 + }, + "seed": 70959682, + "version": 219, + "versionNonce": 358602242, + "isDeleted": false, + "boundElements": [], + "updated": 1732889482540, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 3, + 118 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "c0uJsIYOtQMJjgnQgSG5s", + "focus": -0.8443106312292359, + "gap": 1, + "fixedPoint": null + }, + "endBinding": { + "elementId": "8ll1FgsjNwFMXlQ51cvIW", + "focus": 0.8754568106312292, + "gap": 1, + "fixedPoint": null + }, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "rFVkwBQgM9y6Nl9ulf1IV", + "type": "arrow", + "x": 1222, + "y": 179, + "width": 2, + "height": 61, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0E", + "roundness": { + "type": 2 + }, + "seed": 132846018, + "version": 271, + "versionNonce": 1485476930, + "isDeleted": false, + "boundElements": [], + "updated": 1732889479664, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -2, + 61 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "c0uJsIYOtQMJjgnQgSG5s", + "focus": -0.6994866447421192, + "gap": 1, + "fixedPoint": null + }, + "endBinding": null, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "73RVuwnM5sCg-BOQgWhd0", + "type": "arrow", + "x": 1057, + "y": 185, + "width": 377, + "height": 116, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0F", + "roundness": { + "type": 2 + }, + "seed": 2027787330, + "version": 276, + "versionNonce": 323263262, + "isDeleted": false, + "boundElements": [], + "updated": 1732907555111, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -377, + 116 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "c0uJsIYOtQMJjgnQgSG5s", + "focus": 0.3033873343151693, + "gap": 1, + "fixedPoint": null + }, + "endBinding": { + "elementId": "7ytJ_f6dC8KN4blL1-FH1", + "focus": 0.5243004418262149, + "gap": 1, + "fixedPoint": null + }, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "eOia-7JJjPzN_5qw8CTpo", + "type": "arrow", + "x": 1053, + "y": 172, + "width": 379, + "height": 68, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0G", + "roundness": { + "type": 2 + }, + "seed": 2095403230, + "version": 191, + "versionNonce": 624733634, + "isDeleted": false, + "boundElements": [], + "updated": 1732907555111, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -379, + 68 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "c0uJsIYOtQMJjgnQgSG5s", + "focus": 0.4472781104905457, + "gap": 1, + "fixedPoint": null + }, + "endBinding": { + "elementId": "0TApF3A7KxKyvw0B-QPkU", + "focus": 0.3946571563151874, + "gap": 1, + "fixedPoint": null + }, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "pu9ypaVkDHypbRsPAAimz", + "type": "rectangle", + "x": 695, + "y": 28.071403248760134, + "width": 314, + "height": 59.00000000000001, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0H", + "roundness": { + "type": 3 + }, + "seed": 1242420354, + "version": 174, + "versionNonce": 658683422, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "J7I44BDVyUqYI_aRb4Lsj" + }, + { + "id": "1eMsUusn5UMt7ItFizCDM", + "type": "arrow" + } + ], + "updated": 1732907643095, + "link": null, + "locked": false + }, + { + "id": "J7I44BDVyUqYI_aRb4Lsj", + "type": "text", + "x": 768.0200881958008, + "y": 45.071403248760134, + "width": 167.95982360839844, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0I", + "roundness": null, + "seed": 837836418, + "version": 87, + "versionNonce": 325663326, + "isDeleted": false, + "boundElements": null, + "updated": 1732907637385, + "link": null, + "locked": false, + "text": "Tailscale account", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "pu9ypaVkDHypbRsPAAimz", + "originalText": "Tailscale account", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "1eMsUusn5UMt7ItFizCDM", + "type": "arrow", + "x": 855, + "y": 84.07140324876013, + "width": 205, + "height": 68, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0J", + "roundness": { + "type": 2 + }, + "seed": 881375966, + "version": 201, + "versionNonce": 132494402, + "isDeleted": false, + "boundElements": null, + "updated": 1732907676798, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 205, + 68 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "pu9ypaVkDHypbRsPAAimz", + "focus": 0.31264388435435164, + "gap": 1, + "fixedPoint": null + }, + "endBinding": { + "elementId": "c0uJsIYOtQMJjgnQgSG5s", + "focus": -0.18610133541499313, + "gap": 1, + "fixedPoint": null + }, + "startArrowhead": null, + "endArrowhead": null, + "elbowed": false + } + ], + "appState": { + "gridSize": 20, + "gridStep": 5, + "gridModeEnabled": false, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/docs/content/docs/scenarios/1i-2docker-1tailscale.md b/docs/content/docs/scenarios/1i-2docker-1tailscale.md new file mode 100644 index 0000000..9e57304 --- /dev/null +++ b/docs/content/docs/scenarios/1i-2docker-1tailscale.md @@ -0,0 +1,103 @@ +--- +title: One TSDProxy instance, two Docker servers and one Tailscale provider +prev: /docs/scenarios/ +--- +## Description + +In this scenario, we will have: + +1. one TSDProxy instance. +2. two Docker servers. +3. one Tailscale configuration. + +## Scenario + +![multiple docker server with a single TSDProxy instance](1i-2docker-1tailscale.svg) + +### Server 1 + +```yaml {filename="docker-compose.yaml"} +services: + tsdproxy: + image: tsdproxy:latest + user: root + ports: + - "8080:8080" + volumes: + - :/config + - data:/data + - /var/run/docker.sock:/var/run/docker.sock + restart: unless-stopped + + webserver1: + image: nginx + ports: + - 81:80 + labels: + tsdproxy.enable: true + tsdproxy.name: webserver1 + + portainer: + image: portainer/portainer-ee:2.21.4 + ports: + - "9443:9443" + - "9000:9000" + - "8000:8000" + volumes: + - portainer_data:/data + - /var/run/docker.sock:/var/run/docker.sock + labels: + tsdproxy.enable: true + tsdproxy.name: portainer + tsdproxy.container_port: 9000 + +volumes: + data: + postainer_data: +``` + +### Server 2 + +```yaml {filename="docker-compose.yaml"} +services: + webserver2: + image: nginx + ports: + - 81:80 + labels: + tsdproxy.enable: true + tsdproxy.name: webserver2 + + memos: + image: neosmemo/memos:stable + container_name: memos + volumes: + - memos:/var/opt/memos + ports: + - 5230:5230 + labels: + tsdproxy.enable: true + tsdproxy.name: memos + tsdproxy.container_port: 5230 + +volumes: + memos: +``` + +## TSDProxy Configuration + +```yaml {filename="/config/tsdproxy.yaml"} +defaultproxyprovider: default +docker: + srv1: + host: unix:///var/run/docker.sock + defaultproxyprovider: default + srv2: + host: tcp://174.17.0.1:2376 + targethostname: 174.17.0.1 + defaultproxyprovider: default +tailscale: + providers: + default: + authkey: "sdfsdgsdfgdfg" +``` diff --git a/docs/content/docs/scenarios/1i-2docker-1tailscale.svg b/docs/content/docs/scenarios/1i-2docker-1tailscale.svg new file mode 100644 index 0000000..1d04339 --- /dev/null +++ b/docs/content/docs/scenarios/1i-2docker-1tailscale.svg @@ -0,0 +1,11 @@ + + + + + + + + DockerServer 1DockerServer 2TSDProxyPortainerMemosWebserver 1Webserver 2UsersTailscale account \ No newline at end of file diff --git a/docs/content/docs/scenarios/1i-2docker-3tailscale.excalidraw b/docs/content/docs/scenarios/1i-2docker-3tailscale.excalidraw new file mode 100644 index 0000000..2ef0fb4 --- /dev/null +++ b/docs/content/docs/scenarios/1i-2docker-3tailscale.excalidraw @@ -0,0 +1,2520 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.pug-rigel.ts.net", + "elements": [ + { + "type": "rectangle", + "version": 811, + "versionNonce": 718556446, + "isDeleted": false, + "id": "CbdcZ3cBa6pOVaO2SltH4", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 10, + "angle": 0, + "x": 943.2429452474926, + "y": 140.72727183531129, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 322.5141095050148, + "height": 196.54545632937743, + "seed": 801029506, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "Zx", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 981, + "versionNonce": 189331806, + "isDeleted": false, + "id": "W7MFnYV7wzsHawLvDe4cn", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 10, + "angle": 0, + "x": 380.24294524749257, + "y": 145.72727183531129, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 322.5141095050148, + "height": 196.54545632937743, + "seed": 1790431006, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ZxG", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 3483, + "versionNonce": 148774302, + "isDeleted": false, + "id": "_tzjsSJfrk1sDh4hxj_rI", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 956.3408551813005, + "y": 244.60786869652327, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 42.69850085568315, + "height": 42.65761301555882, + "seed": 82980062, + "groupIds": [ + "5Y9-MT2ef2l1a4vbOBSJE", + "v0bMUJdmgyaKFqsImnsjS", + "kT5zAPYnVrh3K0DwNqbJ8", + "OYyDZxjPYOkj_GRJasT_G", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ag", + "frameId": null, + "roundness": null + }, + { + "type": "line", + "version": 2716, + "versionNonce": 415545822, + "isDeleted": false, + "id": "jL6ujppSvKXYSI-jv0fio", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 966.3710903180352, + "y": 268.0260122816117, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 37.5054878170752, + "height": 18.402138929052015, + "seed": 1846862110, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 17.552895492740475, + -0.36798480024263586 + ], + [ + 21.772117076296297, + -0.8953852851198427 + ], + [ + 20.89710448362079, + -4.287538768685753 + ], + [ + 22.287530784141357, + -7.51188300706335 + ], + [ + 24.43309506662601, + -4.503295725566344 + ], + [ + 24.145428110512757, + -2.0820408022280708 + ], + [ + 27.60350947131935, + -4.449357039613003 + ], + [ + 30.306446412147913, + -3.460479923340618 + ], + [ + 28.70026053930358, + -1.2849468875841628 + ], + [ + 25.164265530163796, + 0.387161229238808 + ], + [ + 15.934740346214104, + 9.886388695224293 + ], + [ + 0.11267831954550236, + 10.890255921988665 + ], + [ + -7.199041404927283, + 0.7383606788280613 + ], + [ + -2.3733110342165227, + -0.395550363657971 + ], + [ + -0.1902344971597756, + -0.012946648431517388 + ] + ], + "index": "ah", + "frameId": null, + "roundness": { + "type": 2 + } + }, + { + "type": "rectangle", + "version": 1622, + "versionNonce": 1645071902, + "isDeleted": false, + "id": "GTzrtv916fKphqNSVJTNo", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 962.2079889146238, + "y": 262.85125450073383, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 1096224094, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ai", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1677, + "versionNonce": 27941470, + "isDeleted": false, + "id": "NO4grmSMc1pscNbfiN9ud", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 966.8168663457224, + "y": 262.6822650529964, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 2081010078, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "aj", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1697, + "versionNonce": 1315659422, + "isDeleted": false, + "id": "93_-03EN5WfhWwqB-XaTa", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 971.6408207869226, + "y": 262.75907164016667, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 1230884318, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ak", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1718, + "versionNonce": 486660830, + "isDeleted": false, + "id": "bwve4EfguK739ux_W6sYt", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 976.4494118477994, + "y": 262.5286364069694, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 1180983838, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "al", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1760, + "versionNonce": 67030814, + "isDeleted": false, + "id": "FD8d7vKbtyvfxLObuCQRL", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 981.012196559309, + "y": 262.59008477104095, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 1175350878, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "am", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1664, + "versionNonce": 533936990, + "isDeleted": false, + "id": "2vksAaokR8KYx648dZ8P3", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 966.6862763236493, + "y": 258.21166062343906, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 355267230, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "an", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1688, + "versionNonce": 1456480158, + "isDeleted": false, + "id": "2TbKxwoHQkGeiczKNXR7-", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 971.5255967237898, + "y": 258.273111566124, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 1047588574, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ao", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1712, + "versionNonce": 489061342, + "isDeleted": false, + "id": "bnHZiCdZxiVMDG0TZVFBS", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 976.4263680666174, + "y": 258.2731064088998, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 1315660574, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ap", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1731, + "versionNonce": 954683422, + "isDeleted": false, + "id": "iSuQLnFhxn4HkZuJ5MpJr", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 976.2650512838942, + "y": 253.57205385307606, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 395136862, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "aq", + "frameId": null, + "roundness": null + }, + { + "type": "text", + "version": 2253, + "versionNonce": 100899934, + "isDeleted": false, + "id": "ejJLOnlP3XA4fubbzeIZm", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 955.5, + "y": 290.8323509981469, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 51.03175354003906, + "height": 33.11956061065962, + "seed": 1982313374, + "groupIds": [ + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "fontSize": 13.247824244263846, + "fontFamily": 1, + "text": "Docker\nServer 1", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Docker\nServer 1", + "index": "ar", + "frameId": null, + "roundness": null, + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 3647, + "versionNonce": 978083998, + "isDeleted": false, + "id": "3oE-ul1L7TzrkC2bVbG9i", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 393.3408551813005, + "y": 249.60786869652327, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 42.69850085568315, + "height": 42.65761301555882, + "seed": 1762701634, + "groupIds": [ + "zXJoQjFrH9MeRTWjJxnoj", + "rxrmDzvofOCrtu_9Y6QXz", + "1H9rUl8sBLw-xCor4YKrv", + "GQ-f9FFGBidCD1DGdlakK", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar0G", + "frameId": null, + "roundness": null + }, + { + "type": "line", + "version": 2880, + "versionNonce": 695377118, + "isDeleted": false, + "id": "g89fCQuI1EKJHzF5andu-", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 403.37109031803516, + "y": 273.0260122816117, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 37.5054878170752, + "height": 18.402138929052015, + "seed": 1920957406, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 17.552895492740475, + -0.36798480024263586 + ], + [ + 21.772117076296297, + -0.8953852851198427 + ], + [ + 20.89710448362079, + -4.287538768685753 + ], + [ + 22.287530784141357, + -7.51188300706335 + ], + [ + 24.43309506662601, + -4.503295725566344 + ], + [ + 24.145428110512757, + -2.0820408022280708 + ], + [ + 27.60350947131935, + -4.449357039613003 + ], + [ + 30.306446412147913, + -3.460479923340618 + ], + [ + 28.70026053930358, + -1.2849468875841628 + ], + [ + 25.164265530163796, + 0.387161229238808 + ], + [ + 15.934740346214104, + 9.886388695224293 + ], + [ + 0.11267831954550236, + 10.890255921988665 + ], + [ + -7.199041404927283, + 0.7383606788280613 + ], + [ + -2.3733110342165227, + -0.395550363657971 + ], + [ + -0.1902344971597756, + -0.012946648431517388 + ] + ], + "index": "ar0V", + "frameId": null, + "roundness": { + "type": 2 + } + }, + { + "type": "rectangle", + "version": 1786, + "versionNonce": 151474462, + "isDeleted": false, + "id": "E5xafoKE135qFUga_-E7x", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 399.2079889146238, + "y": 267.85125450073383, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 338508034, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar0l", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1841, + "versionNonce": 880508254, + "isDeleted": false, + "id": "n0wbMwlYZly-FjAWJlj9x", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 403.81686634572236, + "y": 267.6822650529964, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 2065715230, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar1", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1861, + "versionNonce": 1897931166, + "isDeleted": false, + "id": "dNcdasUjjedNOwuXfEvm6", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 408.64082078692263, + "y": 267.75907164016667, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 31639746, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar1G", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1882, + "versionNonce": 841367006, + "isDeleted": false, + "id": "sVisFuMfKDIGX8nucfYrj", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 413.4494118477994, + "y": 267.5286364069694, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 421305438, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar1V", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1924, + "versionNonce": 1553912350, + "isDeleted": false, + "id": "1XJlT5ZHbibd1U8aDdUkI", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 418.012196559309, + "y": 267.59008477104095, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 164651138, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar2", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1828, + "versionNonce": 192601694, + "isDeleted": false, + "id": "M5VgND8EQWX6oPp0-_ryM", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 403.6862763236493, + "y": 263.21166062343906, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 38101150, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar2G", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1852, + "versionNonce": 1401643678, + "isDeleted": false, + "id": "RE_3nuhP_ma9w01y5J6BD", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 408.5255967237898, + "y": 263.273111566124, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 934608962, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar2V", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1876, + "versionNonce": 125918942, + "isDeleted": false, + "id": "q8gR2YIkSDCFBbZW8273m", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 413.42636806661744, + "y": 263.2731064088998, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 172727518, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar3", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1895, + "versionNonce": 2079183646, + "isDeleted": false, + "id": "lThYgQGjyFsJ5YyJE1X0P", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 413.2650512838942, + "y": 258.57205385307606, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 1198499842, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar3G", + "frameId": null, + "roundness": null + }, + { + "type": "text", + "version": 2419, + "versionNonce": 1262600030, + "isDeleted": false, + "id": "ME0L29qT7l6RGIeJ15A4D", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 392.5, + "y": 295.8323509981469, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 57.44523620605469, + "height": 33.11956061065962, + "seed": 1723879710, + "groupIds": [ + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "fontSize": 13.247824244263846, + "fontFamily": 1, + "text": "Docker\nServer 2", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Docker\nServer 2", + "index": "ar3V", + "frameId": null, + "roundness": null, + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "c0uJsIYOtQMJjgnQgSG5s", + "type": "rectangle", + "x": 1049.25, + "y": 151, + "width": 203, + "height": 42, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ax", + "roundness": { + "type": 3 + }, + "seed": 1427099294, + "version": 115, + "versionNonce": 696665758, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "Bavl2otxFsAcNE7VVeJoW" + }, + { + "id": "zPoyNe_C8PsfTkedJ3elc", + "type": "arrow" + }, + { + "id": "0IYZQPIWiO2I1IJv3af26", + "type": "arrow" + }, + { + "id": "rFVkwBQgM9y6Nl9ulf1IV", + "type": "arrow" + }, + { + "id": "73RVuwnM5sCg-BOQgWhd0", + "type": "arrow" + }, + { + "id": "eOia-7JJjPzN_5qw8CTpo", + "type": "arrow" + }, + { + "id": "1eMsUusn5UMt7ItFizCDM", + "type": "arrow" + } + ], + "updated": 1732907643095, + "link": null, + "locked": false + }, + { + "id": "Bavl2otxFsAcNE7VVeJoW", + "type": "text", + "x": 1099.8500366210938, + "y": 159.5, + "width": 101.7999267578125, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ay", + "roundness": null, + "seed": 1853752286, + "version": 57, + "versionNonce": 1506017246, + "isDeleted": false, + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "text": "TSDProxy", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "c0uJsIYOtQMJjgnQgSG5s", + "originalText": "TSDProxy", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "8ll1FgsjNwFMXlQ51cvIW", + "type": "rectangle", + "x": 1049.25, + "y": 276, + "width": 203, + "height": 42, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "az", + "roundness": { + "type": 3 + }, + "seed": 650916930, + "version": 175, + "versionNonce": 2053481438, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "ybJVuRsHYUEOv7S-nUxpc" + }, + { + "id": "0IYZQPIWiO2I1IJv3af26", + "type": "arrow" + } + ], + "updated": 1732889473637, + "link": null, + "locked": false + }, + { + "id": "ybJVuRsHYUEOv7S-nUxpc", + "type": "text", + "x": 1104.2900466918945, + "y": 284.5, + "width": 92.91990661621094, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b00", + "roundness": null, + "seed": 897604610, + "version": 147, + "versionNonce": 103139970, + "isDeleted": false, + "boundElements": [], + "updated": 1732890569820, + "link": null, + "locked": false, + "text": "Portainer", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "8ll1FgsjNwFMXlQ51cvIW", + "originalText": "Portainer", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "7ytJ_f6dC8KN4blL1-FH1", + "type": "rectangle", + "x": 486.25, + "y": 281, + "width": 203, + "height": 42, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b004", + "roundness": { + "type": 3 + }, + "seed": 1417875330, + "version": 341, + "versionNonce": 566452830, + "isDeleted": false, + "boundElements": [ + { + "id": "73RVuwnM5sCg-BOQgWhd0", + "type": "arrow" + }, + { + "type": "text", + "id": "RYLI1zXbD30idqYlTCIqu" + } + ], + "updated": 1732889467525, + "link": null, + "locked": false + }, + { + "id": "RYLI1zXbD30idqYlTCIqu", + "type": "text", + "x": 556.5900192260742, + "y": 289.5, + "width": 62.31996154785156, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b006", + "roundness": null, + "seed": 585741762, + "version": 60, + "versionNonce": 307040450, + "isDeleted": false, + "boundElements": [], + "updated": 1732890573875, + "link": null, + "locked": false, + "text": "Memos", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "7ytJ_f6dC8KN4blL1-FH1", + "originalText": "Memos", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "VD41DOaW4eD7XkyzxLFee", + "type": "rectangle", + "x": 1049.25, + "y": 214, + "width": 203, + "height": 42, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b01", + "roundness": { + "type": 3 + }, + "seed": 490686942, + "version": 253, + "versionNonce": 861198110, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "R7a3NmlQ6h6KObt4ceZzd" + } + ], + "updated": 1732889467526, + "link": null, + "locked": false + }, + { + "id": "R7a3NmlQ6h6KObt4ceZzd", + "type": "text", + "x": 1094.3400573730469, + "y": 222.5, + "width": 112.81988525390625, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b02", + "roundness": null, + "seed": 414604830, + "version": 229, + "versionNonce": 120079198, + "isDeleted": false, + "boundElements": [], + "updated": 1732889467526, + "link": null, + "locked": false, + "text": "Webserver 1", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "VD41DOaW4eD7XkyzxLFee", + "originalText": "Webserver 1", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "0TApF3A7KxKyvw0B-QPkU", + "type": "rectangle", + "x": 486.25, + "y": 219, + "width": 203, + "height": 42, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b02G", + "roundness": { + "type": 3 + }, + "seed": 372887362, + "version": 422, + "versionNonce": 873539294, + "isDeleted": false, + "boundElements": [ + { + "id": "oxU5UzuS2rIb10mfg76q9", + "type": "text" + }, + { + "id": "eOia-7JJjPzN_5qw8CTpo", + "type": "arrow" + } + ], + "updated": 1732907555110, + "link": null, + "locked": false + }, + { + "id": "oxU5UzuS2rIb10mfg76q9", + "type": "text", + "x": 528.1100540161133, + "y": 227.5, + "width": 119.27989196777344, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b02V", + "roundness": null, + "seed": 1585397214, + "version": 396, + "versionNonce": 1759085534, + "isDeleted": false, + "boundElements": [], + "updated": 1732889467526, + "link": null, + "locked": false, + "text": "Webserver 2", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "0TApF3A7KxKyvw0B-QPkU", + "originalText": "Webserver 2", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 1531, + "versionNonce": 478759646, + "isDeleted": false, + "id": "b_hENKtXSVtbdmuteAK9N", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1373.5, + "y": 266.12992166716845, + "strokeColor": "#000000", + "backgroundColor": "white", + "width": 57, + "height": 25, + "seed": 1470176898, + "groupIds": [ + "87ldCbBbEtHhy-moJSzMt" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732956318106, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Users", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Users", + "index": "b05", + "frameId": null, + "roundness": null, + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "ellipse", + "version": 2456, + "versionNonce": 18366238, + "isDeleted": false, + "id": "LdkrDOpf7dSm3tbLu8m7q", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1413.9428169392195, + "y": 198.87007833283155, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 19.75034363276957, + "height": 17.281550678673437, + "seed": 1220410946, + "groupIds": [ + "NXQlcnsrOLwYHhcXEsXWn", + "Je0v3aQkv2sPoBWmeKSVF", + "87ldCbBbEtHhy-moJSzMt" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732956318106, + "link": null, + "locked": false, + "index": "b06", + "frameId": null, + "roundness": null + }, + { + "type": "ellipse", + "version": 2500, + "versionNonce": 406760286, + "isDeleted": false, + "id": "lXLHUSgM2Pg9kXLA9POUs", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1370.7591428148976, + "y": 199.45314611646563, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 19.75034363276957, + "height": 17.281550678673437, + "seed": 178841090, + "groupIds": [ + "NXQlcnsrOLwYHhcXEsXWn", + "Je0v3aQkv2sPoBWmeKSVF", + "87ldCbBbEtHhy-moJSzMt" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732956318106, + "link": null, + "locked": false, + "index": "b07", + "frameId": null, + "roundness": null + }, + { + "type": "line", + "version": 2683, + "versionNonce": 273518494, + "isDeleted": false, + "id": "yBJQxoMVeK6dNifpVpA7r", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1381.210962822162, + "y": 258.38418185411524, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 41.80600213253467, + "height": 37.22704429756421, + "seed": 1717622210, + "groupIds": [ + "NXQlcnsrOLwYHhcXEsXWn", + "Je0v3aQkv2sPoBWmeKSVF", + "87ldCbBbEtHhy-moJSzMt" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1732956318106, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 4.682272238843876, + -24.66852332971124 + ], + [ + 20.06688102361667, + -37.22704429756421 + ], + [ + 35.45148980838941, + -27.359634965679646 + ], + [ + 41.80600213253467, + -2.561513547547756 + ], + [ + 0, + 0 + ] + ], + "index": "b08", + "frameId": null, + "roundness": { + "type": 2 + } + }, + { + "type": "ellipse", + "version": 2394, + "versionNonce": 628485086, + "isDeleted": false, + "id": "JUoB3kNI0DvHPfCXNg10O", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1391.6970849729719, + "y": 201.8096705342782, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 21.404673091857735, + "height": 18.729088955375612, + "seed": 755289474, + "groupIds": [ + "NXQlcnsrOLwYHhcXEsXWn", + "Je0v3aQkv2sPoBWmeKSVF", + "87ldCbBbEtHhy-moJSzMt" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732956318106, + "link": null, + "locked": false, + "index": "b09", + "frameId": null, + "roundness": null + }, + { + "type": "line", + "version": 1796, + "versionNonce": 1707655198, + "isDeleted": false, + "id": "87QzJRvE2fjHsNFt1n49O", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1410.3622982766128, + "y": 224.7151171690623, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 33.437317203044365, + "height": 37.41795020340682, + "seed": 869518658, + "groupIds": [ + "Je0v3aQkv2sPoBWmeKSVF", + "87ldCbBbEtHhy-moJSzMt" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1732956318106, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.174822900471103, + -5.57288620050744 + ], + [ + 9.553519200869804, + -8.3593293007612 + ], + [ + 17.116721901558428, + -8.757392600797402 + ], + [ + 22.291544802029577, + -7.563202700688624 + ], + [ + 25.874114502355752, + -3.5825697003262533 + ], + [ + 28.262494302573206, + 1.5922532001448921 + ], + [ + 30.650874102790677, + 7.961266000724821 + ], + [ + 32.64119060297189, + 14.33027880130475 + ], + [ + 33.437317203044365, + 19.50510170177589 + ], + [ + 32.64119060297189, + 24.67992460224705 + ], + [ + 29.45668420268195, + 27.068304402464427 + ], + [ + 25.077987902283255, + 28.26249430257321 + ], + [ + 18.708975101703373, + 28.660557602609412 + ], + [ + 14.728342101340951, + 27.86443100253699 + ], + [ + 14.330278801304704, + 22.291544802029662 + ], + [ + 12.738025601159729, + 18.70897510170331 + ], + [ + 9.951582500906056, + 13.136088901195967 + ], + [ + 5.970949500543595, + 5.572886200507347 + ], + [ + 0, + 0 + ] + ], + "index": "b0A", + "frameId": null, + "roundness": { + "type": 2 + } + }, + { + "type": "line", + "version": 2091, + "versionNonce": 1966541918, + "isDeleted": false, + "id": "6vnWfQzuW1R04RmbhkjKi", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1392.4435118232786, + "y": 224.70324126565788, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 32.24312730293567, + "height": 39.01020340355187, + "seed": 1345115394, + "groupIds": [ + "Je0v3aQkv2sPoBWmeKSVF", + "87ldCbBbEtHhy-moJSzMt" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1732956318106, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -3.980633000362431, + -4.378696300398655 + ], + [ + -8.359329300761118, + -7.165139400652425 + ], + [ + -15.922532001449774, + -7.56320270068861 + ], + [ + -21.097354901920916, + -6.369012800579835 + ], + [ + -24.679924602247063, + -2.388379800217473 + ], + [ + -27.06830440246457, + 2.7864431002536705 + ], + [ + -29.45668420268202, + 9.155455900833594 + ], + [ + -31.4470007028632, + 15.524468701413529 + ], + [ + -32.24312730293567, + 20.699291601884667 + ], + [ + -31.4470007028632, + 25.87411450235582 + ], + [ + -28.262494302573295, + 28.262494302573188 + ], + [ + -24.281861302210807, + 30.25281080275446 + ], + [ + -17.912848501630954, + 31.44700070286316 + ], + [ + -11.145772401014788, + 31.447000702863257 + ], + [ + -10.349645800942298, + 24.281861302210825 + ], + [ + -9.553519200869822, + 20.699291601884582 + ], + [ + -8.359329300761118, + 14.728342101341028 + ], + [ + -4.7767596004349215, + 6.767076100616125 + ], + [ + 0, + 0 + ] + ], + "index": "b0B", + "frameId": null, + "roundness": { + "type": 2 + } + }, + { + "id": "zPoyNe_C8PsfTkedJ3elc", + "type": "arrow", + "x": 1356.3700783328316, + "y": 214.18984658141147, + "width": 114.37007833283155, + "height": 51.18984658141147, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0C", + "roundness": { + "type": 2 + }, + "seed": 1714529374, + "version": 690, + "versionNonce": 962203934, + "isDeleted": false, + "boundElements": [], + "updated": 1732907631631, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -114.37007833283155, + -51.18984658141147 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "c0uJsIYOtQMJjgnQgSG5s", + "focus": -0.7502959379588252, + "gap": 1, + "fixedPoint": null + }, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "0IYZQPIWiO2I1IJv3af26", + "type": "arrow", + "x": 1237, + "y": 176, + "width": 3, + "height": 118, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0D", + "roundness": { + "type": 2 + }, + "seed": 70959682, + "version": 219, + "versionNonce": 358602242, + "isDeleted": false, + "boundElements": [], + "updated": 1732889482540, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 3, + 118 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "c0uJsIYOtQMJjgnQgSG5s", + "focus": -0.8443106312292359, + "gap": 1, + "fixedPoint": null + }, + "endBinding": { + "elementId": "8ll1FgsjNwFMXlQ51cvIW", + "focus": 0.8754568106312292, + "gap": 1, + "fixedPoint": null + }, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "rFVkwBQgM9y6Nl9ulf1IV", + "type": "arrow", + "x": 1222, + "y": 179, + "width": 2, + "height": 61, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0E", + "roundness": { + "type": 2 + }, + "seed": 132846018, + "version": 271, + "versionNonce": 1485476930, + "isDeleted": false, + "boundElements": [], + "updated": 1732889479664, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -2, + 61 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "c0uJsIYOtQMJjgnQgSG5s", + "focus": -0.6994866447421192, + "gap": 1, + "fixedPoint": null + }, + "endBinding": null, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "73RVuwnM5sCg-BOQgWhd0", + "type": "arrow", + "x": 1057, + "y": 185, + "width": 377, + "height": 116, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0F", + "roundness": { + "type": 2 + }, + "seed": 2027787330, + "version": 276, + "versionNonce": 323263262, + "isDeleted": false, + "boundElements": [], + "updated": 1732907555111, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -377, + 116 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "c0uJsIYOtQMJjgnQgSG5s", + "focus": 0.3033873343151693, + "gap": 1, + "fixedPoint": null + }, + "endBinding": { + "elementId": "7ytJ_f6dC8KN4blL1-FH1", + "focus": 0.5243004418262149, + "gap": 1, + "fixedPoint": null + }, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "eOia-7JJjPzN_5qw8CTpo", + "type": "arrow", + "x": 1053, + "y": 172, + "width": 379, + "height": 68, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0G", + "roundness": { + "type": 2 + }, + "seed": 2095403230, + "version": 191, + "versionNonce": 624733634, + "isDeleted": false, + "boundElements": [], + "updated": 1732907555111, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -379, + 68 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "c0uJsIYOtQMJjgnQgSG5s", + "focus": 0.4472781104905457, + "gap": 1, + "fixedPoint": null + }, + "endBinding": { + "elementId": "0TApF3A7KxKyvw0B-QPkU", + "focus": 0.3946571563151874, + "gap": 1, + "fixedPoint": null + }, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "pu9ypaVkDHypbRsPAAimz", + "type": "rectangle", + "x": 1043, + "y": 22.071403248760134, + "width": 207.00000000000003, + "height": 58.00000000000001, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0H", + "roundness": { + "type": 3 + }, + "seed": 1242420354, + "version": 315, + "versionNonce": 522022338, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "J7I44BDVyUqYI_aRb4Lsj" + }, + { + "id": "1eMsUusn5UMt7ItFizCDM", + "type": "arrow" + } + ], + "updated": 1732956210087, + "link": null, + "locked": false + }, + { + "id": "J7I44BDVyUqYI_aRb4Lsj", + "type": "text", + "x": 1054.2500915527344, + "y": 38.571403248760134, + "width": 184.49981689453125, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0I", + "roundness": null, + "seed": 837836418, + "version": 230, + "versionNonce": 675964226, + "isDeleted": false, + "boundElements": null, + "updated": 1732956210087, + "link": null, + "locked": false, + "text": "Tailscale account 1", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "pu9ypaVkDHypbRsPAAimz", + "originalText": "Tailscale account 1", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "_kzXC3A_2nRPAvwZks1Zw", + "type": "rectangle", + "x": 718, + "y": 17.071403248760134, + "width": 215, + "height": 60, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0IG", + "roundness": { + "type": 3 + }, + "seed": 1982864642, + "version": 465, + "versionNonce": 1782138398, + "isDeleted": false, + "boundElements": [ + { + "id": "r7aOyUmFqPjzKqtwBbIFQ", + "type": "text" + }, + { + "id": "1eMsUusn5UMt7ItFizCDM", + "type": "arrow" + } + ], + "updated": 1732956548472, + "link": null, + "locked": false + }, + { + "id": "r7aOyUmFqPjzKqtwBbIFQ", + "type": "text", + "x": 733.2500915527344, + "y": 22.071403248760134, + "width": 184.49981689453125, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0IV", + "roundness": null, + "seed": 1512942622, + "version": 391, + "versionNonce": 956422302, + "isDeleted": false, + "boundElements": null, + "updated": 1732956553050, + "link": null, + "locked": false, + "text": "Tailscale account 1\nwith tags", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "_kzXC3A_2nRPAvwZks1Zw", + "originalText": "Tailscale account 1 with tags", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "YX8UShw6cJ92oueqwMU8z", + "type": "rectangle", + "x": 386, + "y": 16.071403248760134, + "width": 222, + "height": 61.00000000000001, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0Id", + "roundness": { + "type": 3 + }, + "seed": 329112158, + "version": 482, + "versionNonce": 42355614, + "isDeleted": false, + "boundElements": [ + { + "id": "oMfpiDEgT4EfNds_pFkqu", + "type": "text" + }, + { + "id": "1eMsUusn5UMt7ItFizCDM", + "type": "arrow" + } + ], + "updated": 1732956220492, + "link": null, + "locked": false + }, + { + "id": "oMfpiDEgT4EfNds_pFkqu", + "type": "text", + "x": 402.0200881958008, + "y": 34.071403248760134, + "width": 189.95982360839844, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0Il", + "roundness": null, + "seed": 1636434562, + "version": 397, + "versionNonce": 2098217502, + "isDeleted": false, + "boundElements": null, + "updated": 1732956326129, + "link": null, + "locked": false, + "text": "Tailscale account 2", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "YX8UShw6cJ92oueqwMU8z", + "originalText": "Tailscale account 2", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "1eMsUusn5UMt7ItFizCDM", + "type": "arrow", + "x": 1094.9246172651708, + "y": 81.07140324876012, + "width": 38.92461726517081, + "height": 69.00000000000001, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0J", + "roundness": { + "type": 2 + }, + "seed": 881375966, + "version": 412, + "versionNonce": 1497157378, + "isDeleted": false, + "boundElements": null, + "updated": 1732956260259, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -38.92461726517081, + 69.00000000000001 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "pu9ypaVkDHypbRsPAAimz", + "focus": 0.2891018308928544, + "gap": 1, + "fixedPoint": null + }, + "endBinding": { + "elementId": "c0uJsIYOtQMJjgnQgSG5s", + "focus": -0.9450697752040556, + "gap": 1, + "fixedPoint": null + }, + "startArrowhead": null, + "endArrowhead": null, + "elbowed": false + }, + { + "id": "tU0vT0fGAFhdBoEnCmz0I", + "type": "line", + "x": 834, + "y": 72.07140324876013, + "width": 222, + "height": 77, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0K", + "roundness": { + "type": 2 + }, + "seed": 1322862686, + "version": 70, + "versionNonce": 1347061022, + "isDeleted": false, + "boundElements": null, + "updated": 1732956244568, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 222, + 77 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "SF3KgVGqUQHVa34edBvLc", + "type": "line", + "x": 494, + "y": 77.07140324876013, + "width": 562, + "height": 73, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0L", + "roundness": { + "type": 2 + }, + "seed": 356004190, + "version": 84, + "versionNonce": 1891810270, + "isDeleted": false, + "boundElements": null, + "updated": 1732956251652, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 562, + 73 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + } + ], + "appState": { + "gridSize": 20, + "gridStep": 5, + "gridModeEnabled": false, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/docs/content/docs/scenarios/1i-2docker-3tailscale.md b/docs/content/docs/scenarios/1i-2docker-3tailscale.md new file mode 100644 index 0000000..5902e5a --- /dev/null +++ b/docs/content/docs/scenarios/1i-2docker-3tailscale.md @@ -0,0 +1,113 @@ +--- +title: One TSDProxy instance, two Docker servers and thee Tailscale providers +--- +## Description + +In this scenario, we will have : + +1. two Docker servers. +2. only one TSDProxy instance. +3. three Tailscale providers. +4. Containers in SRV1 will use the 'default' provider. +5. Containers in SRV2 will use the 'account2' provider. +6. webserver1 is running in SRV1 but will use the 'withtags' provider. +7. memos is running in SRV2 but will use the 'withtags' provider. + +## Scenario + +![1 TSDProxy instance, 2 Docker servers and 3 Tailscale providers](1i-2docker-3tailscale.svg) + +### Server 1 + +```yaml {filename="docker-compose.yaml"} +services: + tsdproxy: + image: tsdproxy:latest + user: root + ports: + - "8080:8080" + volumes: + - :/config + - data:/data + - /var/run/docker.sock:/var/run/docker.sock + restart: unless-stopped + + webserver1: + image: nginx + ports: + - 81:80 + labels: + tsdproxy.enable: true + tsdproxy.name: webserver1 + tsdproxy.provider: withtags + + + portainer: + image: portainer/portainer-ee:2.21.4 + ports: + - "9443:9443" + - "9000:9000" + - "8000:8000" + volumes: + - portainer_data:/data + - /var/run/docker.sock:/var/run/docker.sock + labels: + tsdproxy.enable: true + tsdproxy.name: portainer + tsdproxy.container_port: 9000 + +volumes: + data: + portainer_data: +``` + +### Server 2 + +```yaml {filename="docker-compose.yaml"} +services: + webserver2: + image: nginx + ports: + - 81:80 + labels: + - tsdproxy.enable=true + - tsdproxy.name=webserver2 + + memos: + image: neosmemo/memos:stable + container_name: memos + volumes: + - memos:/var/opt/memos + ports: + - 5230:5230 + labels: + tsdproxy.enable: true + tsdproxy.name: memos + tsdproxy.container_port: 5230 + tsdproxy.provider: withtags + +volumes: + memos: +``` + +## TSDProxy Configuration + +```yaml {filename="/config/tsdproxy.yaml"} +defaultproxyprovider: default +docker: + srv1: + host: unix:///var/run/docker.sock + defaultproxyprovider: default + srv2: + host: tcp://174.17.0.1:2376 + targethostname: 174.17.0.1 + defaultproxyprovider: account2 +tailscale: + providers: + default: + authkey: "sdfsdgsdfgdfg" + withtags: + authkey: "jujgnndvds" + account2: + authkey: "nnnnnnndndnddd" +``` diff --git a/docs/content/docs/scenarios/1i-2docker-3tailscale.svg b/docs/content/docs/scenarios/1i-2docker-3tailscale.svg new file mode 100644 index 0000000..c88d236 --- /dev/null +++ b/docs/content/docs/scenarios/1i-2docker-3tailscale.svg @@ -0,0 +1,11 @@ + + + + + + + + DockerServer 1DockerServer 2TSDProxyPortainerMemosWebserver 1Webserver 2UsersTailscale account 1Tailscale account 1with tagsTailscale account 2 \ No newline at end of file diff --git a/docs/content/docs/scenarios/2i-2docker-1tailscale.excalidraw b/docs/content/docs/scenarios/2i-2docker-1tailscale.excalidraw new file mode 100644 index 0000000..7762597 --- /dev/null +++ b/docs/content/docs/scenarios/2i-2docker-1tailscale.excalidraw @@ -0,0 +1,2493 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.pug-rigel.ts.net", + "elements": [ + { + "type": "rectangle", + "version": 811, + "versionNonce": 718556446, + "isDeleted": false, + "id": "CbdcZ3cBa6pOVaO2SltH4", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 10, + "angle": 0, + "x": 943.2429452474926, + "y": 140.72727183531129, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 322.5141095050148, + "height": 196.54545632937743, + "seed": 801029506, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "Zx", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 981, + "versionNonce": 189331806, + "isDeleted": false, + "id": "W7MFnYV7wzsHawLvDe4cn", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 10, + "angle": 0, + "x": 380.24294524749257, + "y": 145.72727183531129, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 322.5141095050148, + "height": 196.54545632937743, + "seed": 1790431006, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ZxG", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 3483, + "versionNonce": 148774302, + "isDeleted": false, + "id": "_tzjsSJfrk1sDh4hxj_rI", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 956.3408551813005, + "y": 244.60786869652327, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 42.69850085568315, + "height": 42.65761301555882, + "seed": 82980062, + "groupIds": [ + "5Y9-MT2ef2l1a4vbOBSJE", + "v0bMUJdmgyaKFqsImnsjS", + "kT5zAPYnVrh3K0DwNqbJ8", + "OYyDZxjPYOkj_GRJasT_G", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ag", + "frameId": null, + "roundness": null + }, + { + "type": "line", + "version": 2716, + "versionNonce": 415545822, + "isDeleted": false, + "id": "jL6ujppSvKXYSI-jv0fio", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 966.3710903180352, + "y": 268.0260122816117, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 37.5054878170752, + "height": 18.402138929052015, + "seed": 1846862110, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 17.552895492740475, + -0.36798480024263586 + ], + [ + 21.772117076296297, + -0.8953852851198427 + ], + [ + 20.89710448362079, + -4.287538768685753 + ], + [ + 22.287530784141357, + -7.51188300706335 + ], + [ + 24.43309506662601, + -4.503295725566344 + ], + [ + 24.145428110512757, + -2.0820408022280708 + ], + [ + 27.60350947131935, + -4.449357039613003 + ], + [ + 30.306446412147913, + -3.460479923340618 + ], + [ + 28.70026053930358, + -1.2849468875841628 + ], + [ + 25.164265530163796, + 0.387161229238808 + ], + [ + 15.934740346214104, + 9.886388695224293 + ], + [ + 0.11267831954550236, + 10.890255921988665 + ], + [ + -7.199041404927283, + 0.7383606788280613 + ], + [ + -2.3733110342165227, + -0.395550363657971 + ], + [ + -0.1902344971597756, + -0.012946648431517388 + ] + ], + "index": "ah", + "frameId": null, + "roundness": { + "type": 2 + } + }, + { + "type": "rectangle", + "version": 1622, + "versionNonce": 1645071902, + "isDeleted": false, + "id": "GTzrtv916fKphqNSVJTNo", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 962.2079889146238, + "y": 262.85125450073383, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 1096224094, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ai", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1677, + "versionNonce": 27941470, + "isDeleted": false, + "id": "NO4grmSMc1pscNbfiN9ud", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 966.8168663457224, + "y": 262.6822650529964, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 2081010078, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "aj", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1697, + "versionNonce": 1315659422, + "isDeleted": false, + "id": "93_-03EN5WfhWwqB-XaTa", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 971.6408207869226, + "y": 262.75907164016667, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 1230884318, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ak", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1718, + "versionNonce": 486660830, + "isDeleted": false, + "id": "bwve4EfguK739ux_W6sYt", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 976.4494118477994, + "y": 262.5286364069694, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 1180983838, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "al", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1760, + "versionNonce": 67030814, + "isDeleted": false, + "id": "FD8d7vKbtyvfxLObuCQRL", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 981.012196559309, + "y": 262.59008477104095, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 1175350878, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "am", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1664, + "versionNonce": 533936990, + "isDeleted": false, + "id": "2vksAaokR8KYx648dZ8P3", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 966.6862763236493, + "y": 258.21166062343906, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 355267230, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "an", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1688, + "versionNonce": 1456480158, + "isDeleted": false, + "id": "2TbKxwoHQkGeiczKNXR7-", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 971.5255967237898, + "y": 258.273111566124, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 1047588574, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ao", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1712, + "versionNonce": 489061342, + "isDeleted": false, + "id": "bnHZiCdZxiVMDG0TZVFBS", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 976.4263680666174, + "y": 258.2731064088998, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 1315660574, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ap", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1731, + "versionNonce": 954683422, + "isDeleted": false, + "id": "iSuQLnFhxn4HkZuJ5MpJr", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 976.2650512838942, + "y": 253.57205385307606, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 395136862, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "aq", + "frameId": null, + "roundness": null + }, + { + "type": "text", + "version": 2253, + "versionNonce": 100899934, + "isDeleted": false, + "id": "ejJLOnlP3XA4fubbzeIZm", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 955.5, + "y": 290.8323509981469, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 51.03175354003906, + "height": 33.11956061065962, + "seed": 1982313374, + "groupIds": [ + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "fontSize": 13.247824244263846, + "fontFamily": 1, + "text": "Docker\nServer 1", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Docker\nServer 1", + "index": "ar", + "frameId": null, + "roundness": null, + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 3647, + "versionNonce": 978083998, + "isDeleted": false, + "id": "3oE-ul1L7TzrkC2bVbG9i", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 393.3408551813005, + "y": 249.60786869652327, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 42.69850085568315, + "height": 42.65761301555882, + "seed": 1762701634, + "groupIds": [ + "zXJoQjFrH9MeRTWjJxnoj", + "rxrmDzvofOCrtu_9Y6QXz", + "1H9rUl8sBLw-xCor4YKrv", + "GQ-f9FFGBidCD1DGdlakK", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar0G", + "frameId": null, + "roundness": null + }, + { + "type": "line", + "version": 2880, + "versionNonce": 695377118, + "isDeleted": false, + "id": "g89fCQuI1EKJHzF5andu-", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 403.37109031803516, + "y": 273.0260122816117, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 37.5054878170752, + "height": 18.402138929052015, + "seed": 1920957406, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 17.552895492740475, + -0.36798480024263586 + ], + [ + 21.772117076296297, + -0.8953852851198427 + ], + [ + 20.89710448362079, + -4.287538768685753 + ], + [ + 22.287530784141357, + -7.51188300706335 + ], + [ + 24.43309506662601, + -4.503295725566344 + ], + [ + 24.145428110512757, + -2.0820408022280708 + ], + [ + 27.60350947131935, + -4.449357039613003 + ], + [ + 30.306446412147913, + -3.460479923340618 + ], + [ + 28.70026053930358, + -1.2849468875841628 + ], + [ + 25.164265530163796, + 0.387161229238808 + ], + [ + 15.934740346214104, + 9.886388695224293 + ], + [ + 0.11267831954550236, + 10.890255921988665 + ], + [ + -7.199041404927283, + 0.7383606788280613 + ], + [ + -2.3733110342165227, + -0.395550363657971 + ], + [ + -0.1902344971597756, + -0.012946648431517388 + ] + ], + "index": "ar0V", + "frameId": null, + "roundness": { + "type": 2 + } + }, + { + "type": "rectangle", + "version": 1786, + "versionNonce": 151474462, + "isDeleted": false, + "id": "E5xafoKE135qFUga_-E7x", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 399.2079889146238, + "y": 267.85125450073383, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 338508034, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar0l", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1841, + "versionNonce": 880508254, + "isDeleted": false, + "id": "n0wbMwlYZly-FjAWJlj9x", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 403.81686634572236, + "y": 267.6822650529964, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 2065715230, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar1", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1861, + "versionNonce": 1897931166, + "isDeleted": false, + "id": "dNcdasUjjedNOwuXfEvm6", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 408.64082078692263, + "y": 267.75907164016667, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 31639746, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar1G", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1882, + "versionNonce": 841367006, + "isDeleted": false, + "id": "sVisFuMfKDIGX8nucfYrj", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 413.4494118477994, + "y": 267.5286364069694, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 421305438, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar1V", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1924, + "versionNonce": 1553912350, + "isDeleted": false, + "id": "1XJlT5ZHbibd1U8aDdUkI", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 418.012196559309, + "y": 267.59008477104095, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 164651138, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar2", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1828, + "versionNonce": 192601694, + "isDeleted": false, + "id": "M5VgND8EQWX6oPp0-_ryM", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 403.6862763236493, + "y": 263.21166062343906, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 38101150, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar2G", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1852, + "versionNonce": 1401643678, + "isDeleted": false, + "id": "RE_3nuhP_ma9w01y5J6BD", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 408.5255967237898, + "y": 263.273111566124, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 934608962, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar2V", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1876, + "versionNonce": 125918942, + "isDeleted": false, + "id": "q8gR2YIkSDCFBbZW8273m", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 413.42636806661744, + "y": 263.2731064088998, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 172727518, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar3", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1895, + "versionNonce": 2079183646, + "isDeleted": false, + "id": "lThYgQGjyFsJ5YyJE1X0P", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 413.2650512838942, + "y": 258.57205385307606, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 1198499842, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar3G", + "frameId": null, + "roundness": null + }, + { + "type": "text", + "version": 2419, + "versionNonce": 1262600030, + "isDeleted": false, + "id": "ME0L29qT7l6RGIeJ15A4D", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 392.5, + "y": 295.8323509981469, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 57.44523620605469, + "height": 33.11956061065962, + "seed": 1723879710, + "groupIds": [ + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "fontSize": 13.247824244263846, + "fontFamily": 1, + "text": "Docker\nServer 2", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Docker\nServer 2", + "index": "ar3V", + "frameId": null, + "roundness": null, + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "c0uJsIYOtQMJjgnQgSG5s", + "type": "rectangle", + "x": 1049.25, + "y": 151, + "width": 203, + "height": 42, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ax", + "roundness": { + "type": 3 + }, + "seed": 1427099294, + "version": 115, + "versionNonce": 696665758, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "Bavl2otxFsAcNE7VVeJoW" + }, + { + "id": "zPoyNe_C8PsfTkedJ3elc", + "type": "arrow" + }, + { + "id": "0IYZQPIWiO2I1IJv3af26", + "type": "arrow" + }, + { + "id": "rFVkwBQgM9y6Nl9ulf1IV", + "type": "arrow" + }, + { + "id": "73RVuwnM5sCg-BOQgWhd0", + "type": "arrow" + }, + { + "id": "eOia-7JJjPzN_5qw8CTpo", + "type": "arrow" + }, + { + "id": "1eMsUusn5UMt7ItFizCDM", + "type": "arrow" + } + ], + "updated": 1732907643095, + "link": null, + "locked": false + }, + { + "id": "Bavl2otxFsAcNE7VVeJoW", + "type": "text", + "x": 1099.8500366210938, + "y": 159.5, + "width": 101.7999267578125, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ay", + "roundness": null, + "seed": 1853752286, + "version": 57, + "versionNonce": 1506017246, + "isDeleted": false, + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "text": "TSDProxy", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "c0uJsIYOtQMJjgnQgSG5s", + "originalText": "TSDProxy", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "GQxfjjiplK5p4dUf3tIU9", + "type": "rectangle", + "x": 483.25, + "y": 156, + "width": 203, + "height": 42, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ayG", + "roundness": { + "type": 3 + }, + "seed": 872826498, + "version": 219, + "versionNonce": 71228420, + "isDeleted": false, + "boundElements": [ + { + "id": "IF74IOTes9x1bKEv5PhtW", + "type": "text" + }, + { + "id": "zPoyNe_C8PsfTkedJ3elc", + "type": "arrow" + }, + { + "id": "0IYZQPIWiO2I1IJv3af26", + "type": "arrow" + }, + { + "id": "rFVkwBQgM9y6Nl9ulf1IV", + "type": "arrow" + }, + { + "id": "73RVuwnM5sCg-BOQgWhd0", + "type": "arrow" + }, + { + "id": "eOia-7JJjPzN_5qw8CTpo", + "type": "arrow" + }, + { + "id": "1eMsUusn5UMt7ItFizCDM", + "type": "arrow" + }, + { + "id": "bsxhaJURM12ychP1gaXUD", + "type": "arrow" + } + ], + "updated": 1732958209011, + "link": null, + "locked": false + }, + { + "id": "IF74IOTes9x1bKEv5PhtW", + "type": "text", + "x": 533.8500366210938, + "y": 164.5, + "width": 101.7999267578125, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ayV", + "roundness": null, + "seed": 726194846, + "version": 159, + "versionNonce": 1737271646, + "isDeleted": false, + "boundElements": [], + "updated": 1732957257331, + "link": null, + "locked": false, + "text": "TSDProxy", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "GQxfjjiplK5p4dUf3tIU9", + "originalText": "TSDProxy", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "8ll1FgsjNwFMXlQ51cvIW", + "type": "rectangle", + "x": 1049.25, + "y": 276, + "width": 203, + "height": 42, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "az", + "roundness": { + "type": 3 + }, + "seed": 650916930, + "version": 175, + "versionNonce": 2053481438, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "ybJVuRsHYUEOv7S-nUxpc" + }, + { + "id": "0IYZQPIWiO2I1IJv3af26", + "type": "arrow" + } + ], + "updated": 1732889473637, + "link": null, + "locked": false + }, + { + "id": "ybJVuRsHYUEOv7S-nUxpc", + "type": "text", + "x": 1104.2900466918945, + "y": 284.5, + "width": 92.91990661621094, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b00", + "roundness": null, + "seed": 897604610, + "version": 147, + "versionNonce": 103139970, + "isDeleted": false, + "boundElements": [], + "updated": 1732890569820, + "link": null, + "locked": false, + "text": "Portainer", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "8ll1FgsjNwFMXlQ51cvIW", + "originalText": "Portainer", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "7ytJ_f6dC8KN4blL1-FH1", + "type": "rectangle", + "x": 486.25, + "y": 281, + "width": 203, + "height": 42, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b004", + "roundness": { + "type": 3 + }, + "seed": 1417875330, + "version": 341, + "versionNonce": 566452830, + "isDeleted": false, + "boundElements": [ + { + "id": "73RVuwnM5sCg-BOQgWhd0", + "type": "arrow" + }, + { + "type": "text", + "id": "RYLI1zXbD30idqYlTCIqu" + } + ], + "updated": 1732889467525, + "link": null, + "locked": false + }, + { + "id": "RYLI1zXbD30idqYlTCIqu", + "type": "text", + "x": 556.5900192260742, + "y": 289.5, + "width": 62.31996154785156, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b006", + "roundness": null, + "seed": 585741762, + "version": 60, + "versionNonce": 307040450, + "isDeleted": false, + "boundElements": [], + "updated": 1732890573875, + "link": null, + "locked": false, + "text": "Memos", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "7ytJ_f6dC8KN4blL1-FH1", + "originalText": "Memos", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "VD41DOaW4eD7XkyzxLFee", + "type": "rectangle", + "x": 1049.25, + "y": 214, + "width": 203, + "height": 42, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b01", + "roundness": { + "type": 3 + }, + "seed": 490686942, + "version": 253, + "versionNonce": 861198110, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "R7a3NmlQ6h6KObt4ceZzd" + } + ], + "updated": 1732889467526, + "link": null, + "locked": false + }, + { + "id": "R7a3NmlQ6h6KObt4ceZzd", + "type": "text", + "x": 1094.3400573730469, + "y": 222.5, + "width": 112.81988525390625, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b02", + "roundness": null, + "seed": 414604830, + "version": 229, + "versionNonce": 120079198, + "isDeleted": false, + "boundElements": [], + "updated": 1732889467526, + "link": null, + "locked": false, + "text": "Webserver 1", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "VD41DOaW4eD7XkyzxLFee", + "originalText": "Webserver 1", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "0TApF3A7KxKyvw0B-QPkU", + "type": "rectangle", + "x": 486.25, + "y": 219, + "width": 203, + "height": 42, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b02G", + "roundness": { + "type": 3 + }, + "seed": 372887362, + "version": 422, + "versionNonce": 873539294, + "isDeleted": false, + "boundElements": [ + { + "id": "oxU5UzuS2rIb10mfg76q9", + "type": "text" + }, + { + "id": "eOia-7JJjPzN_5qw8CTpo", + "type": "arrow" + } + ], + "updated": 1732907555110, + "link": null, + "locked": false + }, + { + "id": "oxU5UzuS2rIb10mfg76q9", + "type": "text", + "x": 528.1100540161133, + "y": 227.5, + "width": 119.27989196777344, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b02V", + "roundness": null, + "seed": 1585397214, + "version": 396, + "versionNonce": 1759085534, + "isDeleted": false, + "boundElements": [], + "updated": 1732889467526, + "link": null, + "locked": false, + "text": "Webserver 2", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "0TApF3A7KxKyvw0B-QPkU", + "originalText": "Webserver 2", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 1672, + "versionNonce": 1728618812, + "isDeleted": false, + "id": "b_hENKtXSVtbdmuteAK9N", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 780.5, + "y": 447.12992166716845, + "strokeColor": "#000000", + "backgroundColor": "white", + "width": 57, + "height": 25, + "seed": 1470176898, + "groupIds": [ + "87ldCbBbEtHhy-moJSzMt" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732958174649, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Users", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Users", + "index": "b05", + "frameId": null, + "roundness": null, + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "ellipse", + "version": 2597, + "versionNonce": 744036796, + "isDeleted": false, + "id": "LdkrDOpf7dSm3tbLu8m7q", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 820.9428169392195, + "y": 379.87007833283155, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 19.75034363276957, + "height": 17.281550678673437, + "seed": 1220410946, + "groupIds": [ + "NXQlcnsrOLwYHhcXEsXWn", + "Je0v3aQkv2sPoBWmeKSVF", + "87ldCbBbEtHhy-moJSzMt" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732958174649, + "link": null, + "locked": false, + "index": "b06", + "frameId": null, + "roundness": null + }, + { + "type": "ellipse", + "version": 2641, + "versionNonce": 1376158268, + "isDeleted": false, + "id": "lXLHUSgM2Pg9kXLA9POUs", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 777.7591428148976, + "y": 380.45314611646563, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 19.75034363276957, + "height": 17.281550678673437, + "seed": 178841090, + "groupIds": [ + "NXQlcnsrOLwYHhcXEsXWn", + "Je0v3aQkv2sPoBWmeKSVF", + "87ldCbBbEtHhy-moJSzMt" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732958174649, + "link": null, + "locked": false, + "index": "b07", + "frameId": null, + "roundness": null + }, + { + "type": "line", + "version": 2824, + "versionNonce": 519232188, + "isDeleted": false, + "id": "yBJQxoMVeK6dNifpVpA7r", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 788.210962822162, + "y": 439.38418185411524, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 41.80600213253467, + "height": 37.22704429756421, + "seed": 1717622210, + "groupIds": [ + "NXQlcnsrOLwYHhcXEsXWn", + "Je0v3aQkv2sPoBWmeKSVF", + "87ldCbBbEtHhy-moJSzMt" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1732958174649, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 4.682272238843876, + -24.66852332971124 + ], + [ + 20.06688102361667, + -37.22704429756421 + ], + [ + 35.45148980838941, + -27.359634965679646 + ], + [ + 41.80600213253467, + -2.561513547547756 + ], + [ + 0, + 0 + ] + ], + "index": "b08", + "frameId": null, + "roundness": { + "type": 2 + } + }, + { + "type": "ellipse", + "version": 2537, + "versionNonce": 485665540, + "isDeleted": false, + "id": "JUoB3kNI0DvHPfCXNg10O", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 798.6970849729719, + "y": 382.8096705342782, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 21.404673091857735, + "height": 18.729088955375612, + "seed": 755289474, + "groupIds": [ + "NXQlcnsrOLwYHhcXEsXWn", + "Je0v3aQkv2sPoBWmeKSVF", + "87ldCbBbEtHhy-moJSzMt" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "zPoyNe_C8PsfTkedJ3elc", + "type": "arrow" + }, + { + "id": "bsxhaJURM12ychP1gaXUD", + "type": "arrow" + } + ], + "updated": 1732958209012, + "link": null, + "locked": false, + "index": "b09", + "frameId": null, + "roundness": null + }, + { + "type": "line", + "version": 1937, + "versionNonce": 1959812028, + "isDeleted": false, + "id": "87QzJRvE2fjHsNFt1n49O", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 817.3622982766128, + "y": 405.7151171690623, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 33.437317203044365, + "height": 37.41795020340682, + "seed": 869518658, + "groupIds": [ + "Je0v3aQkv2sPoBWmeKSVF", + "87ldCbBbEtHhy-moJSzMt" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1732958174649, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.174822900471103, + -5.57288620050744 + ], + [ + 9.553519200869804, + -8.3593293007612 + ], + [ + 17.116721901558428, + -8.757392600797402 + ], + [ + 22.291544802029577, + -7.563202700688624 + ], + [ + 25.874114502355752, + -3.5825697003262533 + ], + [ + 28.262494302573206, + 1.5922532001448921 + ], + [ + 30.650874102790677, + 7.961266000724821 + ], + [ + 32.64119060297189, + 14.33027880130475 + ], + [ + 33.437317203044365, + 19.50510170177589 + ], + [ + 32.64119060297189, + 24.67992460224705 + ], + [ + 29.45668420268195, + 27.068304402464427 + ], + [ + 25.077987902283255, + 28.26249430257321 + ], + [ + 18.708975101703373, + 28.660557602609412 + ], + [ + 14.728342101340951, + 27.86443100253699 + ], + [ + 14.330278801304704, + 22.291544802029662 + ], + [ + 12.738025601159729, + 18.70897510170331 + ], + [ + 9.951582500906056, + 13.136088901195967 + ], + [ + 5.970949500543595, + 5.572886200507347 + ], + [ + 0, + 0 + ] + ], + "index": "b0A", + "frameId": null, + "roundness": { + "type": 2 + } + }, + { + "type": "line", + "version": 2232, + "versionNonce": 1313178684, + "isDeleted": false, + "id": "6vnWfQzuW1R04RmbhkjKi", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 799.4435118232786, + "y": 405.7032412656579, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 32.24312730293567, + "height": 39.01020340355187, + "seed": 1345115394, + "groupIds": [ + "Je0v3aQkv2sPoBWmeKSVF", + "87ldCbBbEtHhy-moJSzMt" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1732958174649, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -3.980633000362431, + -4.378696300398655 + ], + [ + -8.359329300761118, + -7.165139400652425 + ], + [ + -15.922532001449774, + -7.56320270068861 + ], + [ + -21.097354901920916, + -6.369012800579835 + ], + [ + -24.679924602247063, + -2.388379800217473 + ], + [ + -27.06830440246457, + 2.7864431002536705 + ], + [ + -29.45668420268202, + 9.155455900833594 + ], + [ + -31.4470007028632, + 15.524468701413529 + ], + [ + -32.24312730293567, + 20.699291601884667 + ], + [ + -31.4470007028632, + 25.87411450235582 + ], + [ + -28.262494302573295, + 28.262494302573188 + ], + [ + -24.281861302210807, + 30.25281080275446 + ], + [ + -17.912848501630954, + 31.44700070286316 + ], + [ + -11.145772401014788, + 31.447000702863257 + ], + [ + -10.349645800942298, + 24.281861302210825 + ], + [ + -9.553519200869822, + 20.699291601884582 + ], + [ + -8.359329300761118, + 14.728342101341028 + ], + [ + -4.7767596004349215, + 6.767076100616125 + ], + [ + 0, + 0 + ] + ], + "index": "b0B", + "frameId": null, + "roundness": { + "type": 2 + } + }, + { + "id": "zPoyNe_C8PsfTkedJ3elc", + "type": "arrow", + "x": 812.3700783328316, + "y": 379.1898465814115, + "width": 233.62992166716845, + "height": 184.18984658141147, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0C", + "roundness": { + "type": 2 + }, + "seed": 1714529374, + "version": 818, + "versionNonce": 1062988164, + "isDeleted": false, + "boundElements": [], + "updated": 1732958190228, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 233.62992166716845, + -184.18984658141147 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "JUoB3kNI0DvHPfCXNg10O", + "focus": -0.8442941967444932, + "gap": 3.896337566928443, + "fixedPoint": null + }, + "endBinding": { + "elementId": "c0uJsIYOtQMJjgnQgSG5s", + "focus": 0.5898099501579392, + "gap": 3.25, + "fixedPoint": null + }, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "0IYZQPIWiO2I1IJv3af26", + "type": "arrow", + "x": 1237, + "y": 176, + "width": 3, + "height": 118, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0D", + "roundness": { + "type": 2 + }, + "seed": 70959682, + "version": 219, + "versionNonce": 358602242, + "isDeleted": false, + "boundElements": [], + "updated": 1732889482540, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 3, + 118 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "c0uJsIYOtQMJjgnQgSG5s", + "focus": -0.8443106312292359, + "gap": 1, + "fixedPoint": null + }, + "endBinding": { + "elementId": "8ll1FgsjNwFMXlQ51cvIW", + "focus": 0.8754568106312292, + "gap": 1, + "fixedPoint": null + }, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "rFVkwBQgM9y6Nl9ulf1IV", + "type": "arrow", + "x": 1222, + "y": 179, + "width": 2, + "height": 61, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0E", + "roundness": { + "type": 2 + }, + "seed": 132846018, + "version": 271, + "versionNonce": 1485476930, + "isDeleted": false, + "boundElements": [], + "updated": 1732889479664, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -2, + 61 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "c0uJsIYOtQMJjgnQgSG5s", + "focus": -0.6994866447421192, + "gap": 1, + "fixedPoint": null + }, + "endBinding": null, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "73RVuwnM5sCg-BOQgWhd0", + "type": "arrow", + "x": 677, + "y": 181, + "width": 3, + "height": 120, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0F", + "roundness": { + "type": 2 + }, + "seed": 2027787330, + "version": 327, + "versionNonce": 81465026, + "isDeleted": false, + "boundElements": [], + "updated": 1732957275445, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 3, + 120 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "GQxfjjiplK5p4dUf3tIU9", + "focus": -0.9032099975496201, + "gap": 1, + "fixedPoint": null + }, + "endBinding": { + "elementId": "7ytJ_f6dC8KN4blL1-FH1", + "focus": 0.9044351874540553, + "gap": 1, + "fixedPoint": null + }, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "eOia-7JJjPzN_5qw8CTpo", + "type": "arrow", + "x": 649, + "y": 188, + "width": 9, + "height": 59, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0G", + "roundness": { + "type": 2 + }, + "seed": 2095403230, + "version": 315, + "versionNonce": 696655134, + "isDeleted": false, + "boundElements": [], + "updated": 1732957270903, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 9, + 59 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "GQxfjjiplK5p4dUf3tIU9", + "focus": -0.5976123027114528, + "gap": 1, + "fixedPoint": null + }, + "endBinding": { + "elementId": "0TApF3A7KxKyvw0B-QPkU", + "focus": 0.6607446377984622, + "gap": 1, + "fixedPoint": null + }, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "pu9ypaVkDHypbRsPAAimz", + "type": "rectangle", + "x": 753, + "y": 12.071403248760134, + "width": 207.00000000000003, + "height": 58.00000000000001, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0H", + "roundness": { + "type": 3 + }, + "seed": 1242420354, + "version": 461, + "versionNonce": 464481602, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "J7I44BDVyUqYI_aRb4Lsj" + }, + { + "id": "1eMsUusn5UMt7ItFizCDM", + "type": "arrow" + } + ], + "updated": 1732957451606, + "link": null, + "locked": false + }, + { + "id": "J7I44BDVyUqYI_aRb4Lsj", + "type": "text", + "x": 764.2500915527344, + "y": 28.571403248760134, + "width": 184.49981689453125, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0I", + "roundness": null, + "seed": 837836418, + "version": 376, + "versionNonce": 2073326850, + "isDeleted": false, + "boundElements": [], + "updated": 1732957451606, + "link": null, + "locked": false, + "text": "Tailscale account 1", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "pu9ypaVkDHypbRsPAAimz", + "originalText": "Tailscale account 1", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "1eMsUusn5UMt7ItFizCDM", + "type": "arrow", + "x": 875.8662968982578, + "y": 71.07140324876013, + "width": 180.13370310174219, + "height": 79, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0J", + "roundness": { + "type": 2 + }, + "seed": 881375966, + "version": 579, + "versionNonce": 1398334466, + "isDeleted": false, + "boundElements": [], + "updated": 1732957451682, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 180.13370310174219, + 79 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "pu9ypaVkDHypbRsPAAimz", + "focus": 0.2891018308928544, + "gap": 1, + "fixedPoint": null + }, + "endBinding": { + "elementId": "c0uJsIYOtQMJjgnQgSG5s", + "focus": -0.9450697752040556, + "gap": 1, + "fixedPoint": null + }, + "startArrowhead": null, + "endArrowhead": null, + "elbowed": false + }, + { + "id": "3XLUd18mBcn-ilJXZnxCF", + "type": "line", + "x": 873, + "y": 67.07140324876013, + "width": 298, + "height": 86, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0O", + "roundness": { + "type": 2 + }, + "seed": 559998942, + "version": 356, + "versionNonce": 848090014, + "isDeleted": false, + "boundElements": [], + "updated": 1732957458549, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -298, + 86 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "bsxhaJURM12ychP1gaXUD", + "type": "arrow", + "x": 684, + "y": 172.07140324876013, + "width": 126, + "height": 210, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0R", + "roundness": { + "type": 2 + }, + "seed": 2096112316, + "version": 44, + "versionNonce": 2072820612, + "isDeleted": false, + "boundElements": null, + "updated": 1732958209012, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 126, + 210 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "GQxfjjiplK5p4dUf3tIU9", + "focus": -0.8957682563605953, + "gap": 1, + "fixedPoint": null + }, + "endBinding": { + "elementId": "JUoB3kNI0DvHPfCXNg10O", + "focus": 0.5511652442516566, + "gap": 1, + "fixedPoint": null + }, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "elbowed": false + } + ], + "appState": { + "gridSize": 20, + "gridStep": 5, + "gridModeEnabled": false, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/docs/content/docs/scenarios/2i-2docker-1tailscale.md b/docs/content/docs/scenarios/2i-2docker-1tailscale.md new file mode 100644 index 0000000..66f0816 --- /dev/null +++ b/docs/content/docs/scenarios/2i-2docker-1tailscale.md @@ -0,0 +1,123 @@ +--- +title: Two TSDProxy instances, two Docker servers and one Tailscale provider +--- +## Description + +In this scenario, we will have: + +1. two TSDProxy instances +2. two Docker servers running +3. one Tailscale provider. + +## Scenario + +![2 tsdproxy instances, 2 docker servers, 1 tailscale provider](2i-2docker-1tailscale.svg) + +### Server 1 + +```yaml {filename="docker-compose.yaml"} +services: + tsdproxy: + image: tsdproxy:latest + user: root + ports: + - "8080:8080" + volumes: + - :/config + - data:/data + - /var/run/docker.sock:/var/run/docker.sock + restart: unless-stopped + + webserver1: + image: nginx + ports: + - 81:80 + labels: + - tsdproxy.enable=true + - tsdproxy.name=webserver1 + + portainer: + image: portainer/portainer-ee:2.21.4 + ports: + - "9443:9443" + - "9000:9000" + - "8000:8000" + volumes: + - portainer_data:/data + - /var/run/docker.sock:/var/run/docker.sock + labels: + tsdproxy.enable: "true" + tsdproxy.name: "portainer" + tsdproxy.container_port: 9000 + +volumes: + data: + postainer_data: +``` + +### Server 2 + +```yaml {filename="docker-compose.yaml"} +services: + tsdproxy: + image: tsdproxy:latest + user: root + ports: + - "8080:8080" + volumes: + - :/config + - data:/data + - /var/run/docker.sock:/var/run/docker.sock + restart: unless-stopped + + webserver2: + image: nginx + ports: + - 81:80 + labels: + - tsdproxy.enable=true + - tsdproxy.name=webserver2 + + memos: + image: neosmemo/memos:stable + container_name: memos + volumes: + - memos:/var/opt/memos + ports: + - 5230:5230 + labels: + tsdproxy.enable: "true" + tsdproxy.name: "memos" + tsdproxy.container_port: 5230 + +volumes: + memos: +``` + +## TSDProxy Configuration of SRV1 + +```yaml {filename="/config/tsdproxy.yaml"} +defaultproxyprovider: default +docker: + srv1: + host: unix:///var/run/docker.sock + defaultproxyprovider: default +tailscale: + providers: + default: + authkey: "SAMEKEY" +``` + +## TSDProxy Configuration of SRV2 + +```yaml {filename="/config/tsdproxy.yaml"} +defaultproxyprovider: default +docker: + srv2: + host: unix:///var/run/docker.sock + defaultproxyprovider: default +tailscale: + providers: + default: + authkey: "SAMEKEY" +``` diff --git a/docs/content/docs/scenarios/2i-2docker-1tailscale.svg b/docs/content/docs/scenarios/2i-2docker-1tailscale.svg new file mode 100644 index 0000000..afae889 --- /dev/null +++ b/docs/content/docs/scenarios/2i-2docker-1tailscale.svg @@ -0,0 +1,11 @@ + + + + + + + + DockerServer 1DockerServer 2TSDProxyTSDProxyPortainerMemosWebserver 1Webserver 2UsersTailscale account 1 \ No newline at end of file diff --git a/docs/content/docs/scenarios/2i-2docker-3tailscale.excalidraw b/docs/content/docs/scenarios/2i-2docker-3tailscale.excalidraw new file mode 100644 index 0000000..b88c334 --- /dev/null +++ b/docs/content/docs/scenarios/2i-2docker-3tailscale.excalidraw @@ -0,0 +1,2825 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.pug-rigel.ts.net", + "elements": [ + { + "type": "rectangle", + "version": 811, + "versionNonce": 718556446, + "isDeleted": false, + "id": "CbdcZ3cBa6pOVaO2SltH4", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 10, + "angle": 0, + "x": 943.2429452474926, + "y": 140.72727183531129, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 322.5141095050148, + "height": 196.54545632937743, + "seed": 801029506, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "Zx", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 981, + "versionNonce": 189331806, + "isDeleted": false, + "id": "W7MFnYV7wzsHawLvDe4cn", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 10, + "angle": 0, + "x": 380.24294524749257, + "y": 145.72727183531129, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 322.5141095050148, + "height": 196.54545632937743, + "seed": 1790431006, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ZxG", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 3483, + "versionNonce": 148774302, + "isDeleted": false, + "id": "_tzjsSJfrk1sDh4hxj_rI", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 956.3408551813005, + "y": 244.60786869652327, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 42.69850085568315, + "height": 42.65761301555882, + "seed": 82980062, + "groupIds": [ + "5Y9-MT2ef2l1a4vbOBSJE", + "v0bMUJdmgyaKFqsImnsjS", + "kT5zAPYnVrh3K0DwNqbJ8", + "OYyDZxjPYOkj_GRJasT_G", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ag", + "frameId": null, + "roundness": null + }, + { + "type": "line", + "version": 2716, + "versionNonce": 415545822, + "isDeleted": false, + "id": "jL6ujppSvKXYSI-jv0fio", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 966.3710903180352, + "y": 268.0260122816117, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 37.5054878170752, + "height": 18.402138929052015, + "seed": 1846862110, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 17.552895492740475, + -0.36798480024263586 + ], + [ + 21.772117076296297, + -0.8953852851198427 + ], + [ + 20.89710448362079, + -4.287538768685753 + ], + [ + 22.287530784141357, + -7.51188300706335 + ], + [ + 24.43309506662601, + -4.503295725566344 + ], + [ + 24.145428110512757, + -2.0820408022280708 + ], + [ + 27.60350947131935, + -4.449357039613003 + ], + [ + 30.306446412147913, + -3.460479923340618 + ], + [ + 28.70026053930358, + -1.2849468875841628 + ], + [ + 25.164265530163796, + 0.387161229238808 + ], + [ + 15.934740346214104, + 9.886388695224293 + ], + [ + 0.11267831954550236, + 10.890255921988665 + ], + [ + -7.199041404927283, + 0.7383606788280613 + ], + [ + -2.3733110342165227, + -0.395550363657971 + ], + [ + -0.1902344971597756, + -0.012946648431517388 + ] + ], + "index": "ah", + "frameId": null, + "roundness": { + "type": 2 + } + }, + { + "type": "rectangle", + "version": 1622, + "versionNonce": 1645071902, + "isDeleted": false, + "id": "GTzrtv916fKphqNSVJTNo", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 962.2079889146238, + "y": 262.85125450073383, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 1096224094, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ai", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1677, + "versionNonce": 27941470, + "isDeleted": false, + "id": "NO4grmSMc1pscNbfiN9ud", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 966.8168663457224, + "y": 262.6822650529964, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 2081010078, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "aj", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1697, + "versionNonce": 1315659422, + "isDeleted": false, + "id": "93_-03EN5WfhWwqB-XaTa", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 971.6408207869226, + "y": 262.75907164016667, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 1230884318, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ak", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1718, + "versionNonce": 486660830, + "isDeleted": false, + "id": "bwve4EfguK739ux_W6sYt", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 976.4494118477994, + "y": 262.5286364069694, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 1180983838, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "al", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1760, + "versionNonce": 67030814, + "isDeleted": false, + "id": "FD8d7vKbtyvfxLObuCQRL", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 981.012196559309, + "y": 262.59008477104095, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 1175350878, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "am", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1664, + "versionNonce": 533936990, + "isDeleted": false, + "id": "2vksAaokR8KYx648dZ8P3", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 966.6862763236493, + "y": 258.21166062343906, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 355267230, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "an", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1688, + "versionNonce": 1456480158, + "isDeleted": false, + "id": "2TbKxwoHQkGeiczKNXR7-", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 971.5255967237898, + "y": 258.273111566124, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 1047588574, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ao", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1712, + "versionNonce": 489061342, + "isDeleted": false, + "id": "bnHZiCdZxiVMDG0TZVFBS", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 976.4263680666174, + "y": 258.2731064088998, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 1315660574, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ap", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1731, + "versionNonce": 954683422, + "isDeleted": false, + "id": "iSuQLnFhxn4HkZuJ5MpJr", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 976.2650512838942, + "y": 253.57205385307606, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 395136862, + "groupIds": [ + "SxS2XsKuFRkjE0iWrPiwY", + "B3pTkFu2yOm66j6yUC9NB", + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "aq", + "frameId": null, + "roundness": null + }, + { + "type": "text", + "version": 2253, + "versionNonce": 100899934, + "isDeleted": false, + "id": "ejJLOnlP3XA4fubbzeIZm", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 955.5, + "y": 290.8323509981469, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 51.03175354003906, + "height": 33.11956061065962, + "seed": 1982313374, + "groupIds": [ + "E8R1piXfCQ3N0A7y92BqT" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "fontSize": 13.247824244263846, + "fontFamily": 1, + "text": "Docker\nServer 1", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Docker\nServer 1", + "index": "ar", + "frameId": null, + "roundness": null, + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 3647, + "versionNonce": 978083998, + "isDeleted": false, + "id": "3oE-ul1L7TzrkC2bVbG9i", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 393.3408551813005, + "y": 249.60786869652327, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 42.69850085568315, + "height": 42.65761301555882, + "seed": 1762701634, + "groupIds": [ + "zXJoQjFrH9MeRTWjJxnoj", + "rxrmDzvofOCrtu_9Y6QXz", + "1H9rUl8sBLw-xCor4YKrv", + "GQ-f9FFGBidCD1DGdlakK", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar0G", + "frameId": null, + "roundness": null + }, + { + "type": "line", + "version": 2880, + "versionNonce": 695377118, + "isDeleted": false, + "id": "g89fCQuI1EKJHzF5andu-", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 403.37109031803516, + "y": 273.0260122816117, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 37.5054878170752, + "height": 18.402138929052015, + "seed": 1920957406, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 17.552895492740475, + -0.36798480024263586 + ], + [ + 21.772117076296297, + -0.8953852851198427 + ], + [ + 20.89710448362079, + -4.287538768685753 + ], + [ + 22.287530784141357, + -7.51188300706335 + ], + [ + 24.43309506662601, + -4.503295725566344 + ], + [ + 24.145428110512757, + -2.0820408022280708 + ], + [ + 27.60350947131935, + -4.449357039613003 + ], + [ + 30.306446412147913, + -3.460479923340618 + ], + [ + 28.70026053930358, + -1.2849468875841628 + ], + [ + 25.164265530163796, + 0.387161229238808 + ], + [ + 15.934740346214104, + 9.886388695224293 + ], + [ + 0.11267831954550236, + 10.890255921988665 + ], + [ + -7.199041404927283, + 0.7383606788280613 + ], + [ + -2.3733110342165227, + -0.395550363657971 + ], + [ + -0.1902344971597756, + -0.012946648431517388 + ] + ], + "index": "ar0V", + "frameId": null, + "roundness": { + "type": 2 + } + }, + { + "type": "rectangle", + "version": 1786, + "versionNonce": 151474462, + "isDeleted": false, + "id": "E5xafoKE135qFUga_-E7x", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 399.2079889146238, + "y": 267.85125450073383, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 338508034, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar0l", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1841, + "versionNonce": 880508254, + "isDeleted": false, + "id": "n0wbMwlYZly-FjAWJlj9x", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 403.81686634572236, + "y": 267.6822650529964, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 2065715230, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar1", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1861, + "versionNonce": 1897931166, + "isDeleted": false, + "id": "dNcdasUjjedNOwuXfEvm6", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 408.64082078692263, + "y": 267.75907164016667, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 31639746, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar1G", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1882, + "versionNonce": 841367006, + "isDeleted": false, + "id": "sVisFuMfKDIGX8nucfYrj", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 413.4494118477994, + "y": 267.5286364069694, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 421305438, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar1V", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1924, + "versionNonce": 1553912350, + "isDeleted": false, + "id": "1XJlT5ZHbibd1U8aDdUkI", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 418.012196559309, + "y": 267.59008477104095, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 164651138, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar2", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1828, + "versionNonce": 192601694, + "isDeleted": false, + "id": "M5VgND8EQWX6oPp0-_ryM", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 403.6862763236493, + "y": 263.21166062343906, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 38101150, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar2G", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1852, + "versionNonce": 1401643678, + "isDeleted": false, + "id": "RE_3nuhP_ma9w01y5J6BD", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 408.5255967237898, + "y": 263.273111566124, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 934608962, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar2V", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1876, + "versionNonce": 125918942, + "isDeleted": false, + "id": "q8gR2YIkSDCFBbZW8273m", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 413.42636806661744, + "y": 263.2731064088998, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 172727518, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar3", + "frameId": null, + "roundness": null + }, + { + "type": "rectangle", + "version": 1895, + "versionNonce": 2079183646, + "isDeleted": false, + "id": "lThYgQGjyFsJ5YyJE1X0P", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 413.2650512838942, + "y": 258.57205385307606, + "strokeColor": "#0091e2", + "backgroundColor": "#0091e2", + "width": 3.6871029763252126, + "height": 3.6871029763252126, + "seed": 1198499842, + "groupIds": [ + "Ucj5tyEvOZmG23dufVkuj", + "HHs0KbFVI1_q15SqrI_nK", + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "index": "ar3G", + "frameId": null, + "roundness": null + }, + { + "type": "text", + "version": 2419, + "versionNonce": 1262600030, + "isDeleted": false, + "id": "ME0L29qT7l6RGIeJ15A4D", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 392.5, + "y": 295.8323509981469, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 57.44523620605469, + "height": 33.11956061065962, + "seed": 1723879710, + "groupIds": [ + "78IkTAKuWggwB_APpNs3F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "fontSize": 13.247824244263846, + "fontFamily": 1, + "text": "Docker\nServer 2", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Docker\nServer 2", + "index": "ar3V", + "frameId": null, + "roundness": null, + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "c0uJsIYOtQMJjgnQgSG5s", + "type": "rectangle", + "x": 1049.25, + "y": 151, + "width": 203, + "height": 42, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ax", + "roundness": { + "type": 3 + }, + "seed": 1427099294, + "version": 115, + "versionNonce": 696665758, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "Bavl2otxFsAcNE7VVeJoW" + }, + { + "id": "zPoyNe_C8PsfTkedJ3elc", + "type": "arrow" + }, + { + "id": "0IYZQPIWiO2I1IJv3af26", + "type": "arrow" + }, + { + "id": "rFVkwBQgM9y6Nl9ulf1IV", + "type": "arrow" + }, + { + "id": "73RVuwnM5sCg-BOQgWhd0", + "type": "arrow" + }, + { + "id": "eOia-7JJjPzN_5qw8CTpo", + "type": "arrow" + }, + { + "id": "1eMsUusn5UMt7ItFizCDM", + "type": "arrow" + } + ], + "updated": 1732907643095, + "link": null, + "locked": false + }, + { + "id": "Bavl2otxFsAcNE7VVeJoW", + "type": "text", + "x": 1099.8500366210938, + "y": 159.5, + "width": 101.7999267578125, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ay", + "roundness": null, + "seed": 1853752286, + "version": 57, + "versionNonce": 1506017246, + "isDeleted": false, + "boundElements": [], + "updated": 1732889467525, + "link": null, + "locked": false, + "text": "TSDProxy", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "c0uJsIYOtQMJjgnQgSG5s", + "originalText": "TSDProxy", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "GQxfjjiplK5p4dUf3tIU9", + "type": "rectangle", + "x": 483.25, + "y": 156, + "width": 203, + "height": 42, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ayG", + "roundness": { + "type": 3 + }, + "seed": 872826498, + "version": 221, + "versionNonce": 782769468, + "isDeleted": false, + "boundElements": [ + { + "id": "IF74IOTes9x1bKEv5PhtW", + "type": "text" + }, + { + "id": "zPoyNe_C8PsfTkedJ3elc", + "type": "arrow" + }, + { + "id": "0IYZQPIWiO2I1IJv3af26", + "type": "arrow" + }, + { + "id": "rFVkwBQgM9y6Nl9ulf1IV", + "type": "arrow" + }, + { + "id": "73RVuwnM5sCg-BOQgWhd0", + "type": "arrow" + }, + { + "id": "eOia-7JJjPzN_5qw8CTpo", + "type": "arrow" + }, + { + "id": "1eMsUusn5UMt7ItFizCDM", + "type": "arrow" + }, + { + "id": "XcaYy7dmLB5uYiY5JLuTN", + "type": "arrow" + } + ], + "updated": 1732958351889, + "link": null, + "locked": false + }, + { + "id": "IF74IOTes9x1bKEv5PhtW", + "type": "text", + "x": 533.8500366210938, + "y": 164.5, + "width": 101.7999267578125, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ayV", + "roundness": null, + "seed": 726194846, + "version": 159, + "versionNonce": 1737271646, + "isDeleted": false, + "boundElements": [], + "updated": 1732957257331, + "link": null, + "locked": false, + "text": "TSDProxy", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "GQxfjjiplK5p4dUf3tIU9", + "originalText": "TSDProxy", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "8ll1FgsjNwFMXlQ51cvIW", + "type": "rectangle", + "x": 1049.25, + "y": 276, + "width": 203, + "height": 42, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "az", + "roundness": { + "type": 3 + }, + "seed": 650916930, + "version": 175, + "versionNonce": 2053481438, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "ybJVuRsHYUEOv7S-nUxpc" + }, + { + "id": "0IYZQPIWiO2I1IJv3af26", + "type": "arrow" + } + ], + "updated": 1732889473637, + "link": null, + "locked": false + }, + { + "id": "ybJVuRsHYUEOv7S-nUxpc", + "type": "text", + "x": 1104.2900466918945, + "y": 284.5, + "width": 92.91990661621094, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b00", + "roundness": null, + "seed": 897604610, + "version": 147, + "versionNonce": 103139970, + "isDeleted": false, + "boundElements": [], + "updated": 1732890569820, + "link": null, + "locked": false, + "text": "Portainer", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "8ll1FgsjNwFMXlQ51cvIW", + "originalText": "Portainer", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "7ytJ_f6dC8KN4blL1-FH1", + "type": "rectangle", + "x": 486.25, + "y": 281, + "width": 203, + "height": 42, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b004", + "roundness": { + "type": 3 + }, + "seed": 1417875330, + "version": 341, + "versionNonce": 566452830, + "isDeleted": false, + "boundElements": [ + { + "id": "73RVuwnM5sCg-BOQgWhd0", + "type": "arrow" + }, + { + "type": "text", + "id": "RYLI1zXbD30idqYlTCIqu" + } + ], + "updated": 1732889467525, + "link": null, + "locked": false + }, + { + "id": "RYLI1zXbD30idqYlTCIqu", + "type": "text", + "x": 556.5900192260742, + "y": 289.5, + "width": 62.31996154785156, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b006", + "roundness": null, + "seed": 585741762, + "version": 60, + "versionNonce": 307040450, + "isDeleted": false, + "boundElements": [], + "updated": 1732890573875, + "link": null, + "locked": false, + "text": "Memos", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "7ytJ_f6dC8KN4blL1-FH1", + "originalText": "Memos", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "VD41DOaW4eD7XkyzxLFee", + "type": "rectangle", + "x": 1049.25, + "y": 214, + "width": 203, + "height": 42, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b01", + "roundness": { + "type": 3 + }, + "seed": 490686942, + "version": 253, + "versionNonce": 861198110, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "R7a3NmlQ6h6KObt4ceZzd" + } + ], + "updated": 1732889467526, + "link": null, + "locked": false + }, + { + "id": "R7a3NmlQ6h6KObt4ceZzd", + "type": "text", + "x": 1094.3400573730469, + "y": 222.5, + "width": 112.81988525390625, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b02", + "roundness": null, + "seed": 414604830, + "version": 229, + "versionNonce": 120079198, + "isDeleted": false, + "boundElements": [], + "updated": 1732889467526, + "link": null, + "locked": false, + "text": "Webserver 1", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "VD41DOaW4eD7XkyzxLFee", + "originalText": "Webserver 1", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "0TApF3A7KxKyvw0B-QPkU", + "type": "rectangle", + "x": 486.25, + "y": 219, + "width": 203, + "height": 42, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b02G", + "roundness": { + "type": 3 + }, + "seed": 372887362, + "version": 422, + "versionNonce": 873539294, + "isDeleted": false, + "boundElements": [ + { + "id": "oxU5UzuS2rIb10mfg76q9", + "type": "text" + }, + { + "id": "eOia-7JJjPzN_5qw8CTpo", + "type": "arrow" + } + ], + "updated": 1732907555110, + "link": null, + "locked": false + }, + { + "id": "oxU5UzuS2rIb10mfg76q9", + "type": "text", + "x": 528.1100540161133, + "y": 227.5, + "width": 119.27989196777344, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b02V", + "roundness": null, + "seed": 1585397214, + "version": 396, + "versionNonce": 1759085534, + "isDeleted": false, + "boundElements": [], + "updated": 1732889467526, + "link": null, + "locked": false, + "text": "Webserver 2", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "0TApF3A7KxKyvw0B-QPkU", + "originalText": "Webserver 2", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 1781, + "versionNonce": 1814580868, + "isDeleted": false, + "id": "b_hENKtXSVtbdmuteAK9N", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 791.4999999999999, + "y": 399.12992166716845, + "strokeColor": "#000000", + "backgroundColor": "white", + "width": 57, + "height": 25, + "seed": 1470176898, + "groupIds": [ + "87ldCbBbEtHhy-moJSzMt" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732958354797, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Users", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Users", + "index": "b05", + "frameId": null, + "roundness": null, + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "ellipse", + "version": 2706, + "versionNonce": 983817732, + "isDeleted": false, + "id": "LdkrDOpf7dSm3tbLu8m7q", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 831.9428169392194, + "y": 331.87007833283155, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 19.75034363276957, + "height": 17.281550678673437, + "seed": 1220410946, + "groupIds": [ + "NXQlcnsrOLwYHhcXEsXWn", + "Je0v3aQkv2sPoBWmeKSVF", + "87ldCbBbEtHhy-moJSzMt" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732958354797, + "link": null, + "locked": false, + "index": "b06", + "frameId": null, + "roundness": null + }, + { + "type": "ellipse", + "version": 2750, + "versionNonce": 1644264836, + "isDeleted": false, + "id": "lXLHUSgM2Pg9kXLA9POUs", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 788.7591428148975, + "y": 332.45314611646563, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 19.75034363276957, + "height": 17.281550678673437, + "seed": 178841090, + "groupIds": [ + "NXQlcnsrOLwYHhcXEsXWn", + "Je0v3aQkv2sPoBWmeKSVF", + "87ldCbBbEtHhy-moJSzMt" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1732958354797, + "link": null, + "locked": false, + "index": "b07", + "frameId": null, + "roundness": null + }, + { + "type": "line", + "version": 2933, + "versionNonce": 461319428, + "isDeleted": false, + "id": "yBJQxoMVeK6dNifpVpA7r", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 799.2109628221618, + "y": 391.38418185411524, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 41.80600213253467, + "height": 37.22704429756421, + "seed": 1717622210, + "groupIds": [ + "NXQlcnsrOLwYHhcXEsXWn", + "Je0v3aQkv2sPoBWmeKSVF", + "87ldCbBbEtHhy-moJSzMt" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1732958354797, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 4.682272238843876, + -24.66852332971124 + ], + [ + 20.06688102361667, + -37.22704429756421 + ], + [ + 35.45148980838941, + -27.359634965679646 + ], + [ + 41.80600213253467, + -2.561513547547756 + ], + [ + 0, + 0 + ] + ], + "index": "b08", + "frameId": null, + "roundness": { + "type": 2 + } + }, + { + "type": "ellipse", + "version": 2648, + "versionNonce": 1218112644, + "isDeleted": false, + "id": "JUoB3kNI0DvHPfCXNg10O", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 809.6970849729718, + "y": 334.8096705342782, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 21.404673091857735, + "height": 18.729088955375612, + "seed": 755289474, + "groupIds": [ + "NXQlcnsrOLwYHhcXEsXWn", + "Je0v3aQkv2sPoBWmeKSVF", + "87ldCbBbEtHhy-moJSzMt" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "zPoyNe_C8PsfTkedJ3elc", + "type": "arrow" + }, + { + "id": "XcaYy7dmLB5uYiY5JLuTN", + "type": "arrow" + } + ], + "updated": 1732958354797, + "link": null, + "locked": false, + "index": "b09", + "frameId": null, + "roundness": null + }, + { + "type": "line", + "version": 2046, + "versionNonce": 139365124, + "isDeleted": false, + "id": "87QzJRvE2fjHsNFt1n49O", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 828.3622982766127, + "y": 357.7151171690623, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 33.437317203044365, + "height": 37.41795020340682, + "seed": 869518658, + "groupIds": [ + "Je0v3aQkv2sPoBWmeKSVF", + "87ldCbBbEtHhy-moJSzMt" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1732958354797, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.174822900471103, + -5.57288620050744 + ], + [ + 9.553519200869804, + -8.3593293007612 + ], + [ + 17.116721901558428, + -8.757392600797402 + ], + [ + 22.291544802029577, + -7.563202700688624 + ], + [ + 25.874114502355752, + -3.5825697003262533 + ], + [ + 28.262494302573206, + 1.5922532001448921 + ], + [ + 30.650874102790677, + 7.961266000724821 + ], + [ + 32.64119060297189, + 14.33027880130475 + ], + [ + 33.437317203044365, + 19.50510170177589 + ], + [ + 32.64119060297189, + 24.67992460224705 + ], + [ + 29.45668420268195, + 27.068304402464427 + ], + [ + 25.077987902283255, + 28.26249430257321 + ], + [ + 18.708975101703373, + 28.660557602609412 + ], + [ + 14.728342101340951, + 27.86443100253699 + ], + [ + 14.330278801304704, + 22.291544802029662 + ], + [ + 12.738025601159729, + 18.70897510170331 + ], + [ + 9.951582500906056, + 13.136088901195967 + ], + [ + 5.970949500543595, + 5.572886200507347 + ], + [ + 0, + 0 + ] + ], + "index": "b0A", + "frameId": null, + "roundness": { + "type": 2 + } + }, + { + "type": "line", + "version": 2341, + "versionNonce": 1607371396, + "isDeleted": false, + "id": "6vnWfQzuW1R04RmbhkjKi", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 810.4435118232785, + "y": 357.7032412656579, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 32.24312730293567, + "height": 39.01020340355187, + "seed": 1345115394, + "groupIds": [ + "Je0v3aQkv2sPoBWmeKSVF", + "87ldCbBbEtHhy-moJSzMt" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1732958354797, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -3.980633000362431, + -4.378696300398655 + ], + [ + -8.359329300761118, + -7.165139400652425 + ], + [ + -15.922532001449774, + -7.56320270068861 + ], + [ + -21.097354901920916, + -6.369012800579835 + ], + [ + -24.679924602247063, + -2.388379800217473 + ], + [ + -27.06830440246457, + 2.7864431002536705 + ], + [ + -29.45668420268202, + 9.155455900833594 + ], + [ + -31.4470007028632, + 15.524468701413529 + ], + [ + -32.24312730293567, + 20.699291601884667 + ], + [ + -31.4470007028632, + 25.87411450235582 + ], + [ + -28.262494302573295, + 28.262494302573188 + ], + [ + -24.281861302210807, + 30.25281080275446 + ], + [ + -17.912848501630954, + 31.44700070286316 + ], + [ + -11.145772401014788, + 31.447000702863257 + ], + [ + -10.349645800942298, + 24.281861302210825 + ], + [ + -9.553519200869822, + 20.699291601884582 + ], + [ + -8.359329300761118, + 14.728342101341028 + ], + [ + -4.7767596004349215, + 6.767076100616125 + ], + [ + 0, + 0 + ] + ], + "index": "b0B", + "frameId": null, + "roundness": { + "type": 2 + } + }, + { + "id": "zPoyNe_C8PsfTkedJ3elc", + "type": "arrow", + "x": 823.5599454355449, + "y": 333.2330007673273, + "width": 218.44005456445507, + "height": 153.23300076732733, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0C", + "roundness": { + "type": 2 + }, + "seed": 1714529374, + "version": 978, + "versionNonce": 1796389892, + "isDeleted": false, + "boundElements": [], + "updated": 1732958354797, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 218.44005456445507, + -153.23300076732733 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "JUoB3kNI0DvHPfCXNg10O", + "focus": -0.7268655145844305, + "gap": 1.9357330385365312, + "fixedPoint": null + }, + "endBinding": { + "elementId": "c0uJsIYOtQMJjgnQgSG5s", + "focus": 0.7485799080665727, + "gap": 7.25, + "fixedPoint": null + }, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "0IYZQPIWiO2I1IJv3af26", + "type": "arrow", + "x": 1237, + "y": 176, + "width": 3, + "height": 118, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0D", + "roundness": { + "type": 2 + }, + "seed": 70959682, + "version": 219, + "versionNonce": 358602242, + "isDeleted": false, + "boundElements": [], + "updated": 1732889482540, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 3, + 118 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "c0uJsIYOtQMJjgnQgSG5s", + "focus": -0.8443106312292359, + "gap": 1, + "fixedPoint": null + }, + "endBinding": { + "elementId": "8ll1FgsjNwFMXlQ51cvIW", + "focus": 0.8754568106312292, + "gap": 1, + "fixedPoint": null + }, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "rFVkwBQgM9y6Nl9ulf1IV", + "type": "arrow", + "x": 1222, + "y": 179, + "width": 2, + "height": 61, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0E", + "roundness": { + "type": 2 + }, + "seed": 132846018, + "version": 271, + "versionNonce": 1485476930, + "isDeleted": false, + "boundElements": [], + "updated": 1732889479664, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -2, + 61 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "c0uJsIYOtQMJjgnQgSG5s", + "focus": -0.6994866447421192, + "gap": 1, + "fixedPoint": null + }, + "endBinding": null, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "73RVuwnM5sCg-BOQgWhd0", + "type": "arrow", + "x": 677, + "y": 181, + "width": 3, + "height": 120, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0F", + "roundness": { + "type": 2 + }, + "seed": 2027787330, + "version": 327, + "versionNonce": 81465026, + "isDeleted": false, + "boundElements": [], + "updated": 1732957275445, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 3, + 120 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "GQxfjjiplK5p4dUf3tIU9", + "focus": -0.9032099975496201, + "gap": 1, + "fixedPoint": null + }, + "endBinding": { + "elementId": "7ytJ_f6dC8KN4blL1-FH1", + "focus": 0.9044351874540553, + "gap": 1, + "fixedPoint": null + }, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "eOia-7JJjPzN_5qw8CTpo", + "type": "arrow", + "x": 649, + "y": 188, + "width": 9, + "height": 59, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0G", + "roundness": { + "type": 2 + }, + "seed": 2095403230, + "version": 315, + "versionNonce": 696655134, + "isDeleted": false, + "boundElements": [], + "updated": 1732957270903, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 9, + 59 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "GQxfjjiplK5p4dUf3tIU9", + "focus": -0.5976123027114528, + "gap": 1, + "fixedPoint": null + }, + "endBinding": { + "elementId": "0TApF3A7KxKyvw0B-QPkU", + "focus": 0.6607446377984622, + "gap": 1, + "fixedPoint": null + }, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "pu9ypaVkDHypbRsPAAimz", + "type": "rectangle", + "x": 1043, + "y": 22.071403248760134, + "width": 207.00000000000003, + "height": 58.00000000000001, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0H", + "roundness": { + "type": 3 + }, + "seed": 1242420354, + "version": 462, + "versionNonce": 1299768964, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "J7I44BDVyUqYI_aRb4Lsj" + }, + { + "id": "1eMsUusn5UMt7ItFizCDM", + "type": "arrow" + } + ], + "updated": 1732958330194, + "link": null, + "locked": false + }, + { + "id": "J7I44BDVyUqYI_aRb4Lsj", + "type": "text", + "x": 1054.2500915527344, + "y": 38.571403248760134, + "width": 184.49981689453125, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0I", + "roundness": null, + "seed": 837836418, + "version": 377, + "versionNonce": 265401276, + "isDeleted": false, + "boundElements": [], + "updated": 1732958330194, + "link": null, + "locked": false, + "text": "Tailscale account 1", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "pu9ypaVkDHypbRsPAAimz", + "originalText": "Tailscale account 1", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "_kzXC3A_2nRPAvwZks1Zw", + "type": "rectangle", + "x": 718, + "y": 17.071403248760134, + "width": 215, + "height": 60, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0IG", + "roundness": { + "type": 3 + }, + "seed": 1982864642, + "version": 465, + "versionNonce": 1782138398, + "isDeleted": false, + "boundElements": [ + { + "id": "r7aOyUmFqPjzKqtwBbIFQ", + "type": "text" + }, + { + "id": "1eMsUusn5UMt7ItFizCDM", + "type": "arrow" + } + ], + "updated": 1732956548472, + "link": null, + "locked": false + }, + { + "id": "r7aOyUmFqPjzKqtwBbIFQ", + "type": "text", + "x": 733.2500915527344, + "y": 22.071403248760134, + "width": 184.49981689453125, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0IV", + "roundness": null, + "seed": 1512942622, + "version": 391, + "versionNonce": 956422302, + "isDeleted": false, + "boundElements": [], + "updated": 1732956553050, + "link": null, + "locked": false, + "text": "Tailscale account 1\nwith tags", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "_kzXC3A_2nRPAvwZks1Zw", + "originalText": "Tailscale account 1 with tags", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "YX8UShw6cJ92oueqwMU8z", + "type": "rectangle", + "x": 386, + "y": 16.071403248760134, + "width": 222, + "height": 61.00000000000001, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0Id", + "roundness": { + "type": 3 + }, + "seed": 329112158, + "version": 482, + "versionNonce": 42355614, + "isDeleted": false, + "boundElements": [ + { + "id": "oMfpiDEgT4EfNds_pFkqu", + "type": "text" + }, + { + "id": "1eMsUusn5UMt7ItFizCDM", + "type": "arrow" + } + ], + "updated": 1732956220492, + "link": null, + "locked": false + }, + { + "id": "oMfpiDEgT4EfNds_pFkqu", + "type": "text", + "x": 402.0200881958008, + "y": 34.071403248760134, + "width": 189.95982360839844, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0Il", + "roundness": null, + "seed": 1636434562, + "version": 397, + "versionNonce": 2098217502, + "isDeleted": false, + "boundElements": [], + "updated": 1732956326129, + "link": null, + "locked": false, + "text": "Tailscale account 2", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "YX8UShw6cJ92oueqwMU8z", + "originalText": "Tailscale account 2", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "1eMsUusn5UMt7ItFizCDM", + "type": "arrow", + "x": 1094.9246172651708, + "y": 81.07140324876012, + "width": 38.92461726517081, + "height": 69.00000000000001, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0J", + "roundness": { + "type": 2 + }, + "seed": 881375966, + "version": 580, + "versionNonce": 1445033476, + "isDeleted": false, + "boundElements": [], + "updated": 1732958330194, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -38.92461726517081, + 69.00000000000001 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "pu9ypaVkDHypbRsPAAimz", + "focus": 0.2891018308928544, + "gap": 1, + "fixedPoint": null + }, + "endBinding": { + "elementId": "c0uJsIYOtQMJjgnQgSG5s", + "focus": -0.9450697752040556, + "gap": 1, + "fixedPoint": null + }, + "startArrowhead": null, + "endArrowhead": null, + "elbowed": false + }, + { + "id": "tU0vT0fGAFhdBoEnCmz0I", + "type": "line", + "x": 834, + "y": 72.07140324876013, + "width": 222, + "height": 77, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0K", + "roundness": { + "type": 2 + }, + "seed": 1322862686, + "version": 70, + "versionNonce": 1347061022, + "isDeleted": false, + "boundElements": [], + "updated": 1732956244568, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 222, + 77 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "SF3KgVGqUQHVa34edBvLc", + "type": "line", + "x": 494, + "y": 77.07140324876013, + "width": 562, + "height": 73, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0L", + "roundness": { + "type": 2 + }, + "seed": 356004190, + "version": 84, + "versionNonce": 1891810270, + "isDeleted": false, + "boundElements": [], + "updated": 1732956251652, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 562, + 73 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "l8IsAfBoS5FL1v3NK5wLi", + "type": "line", + "x": 496, + "y": 78.07140324876013, + "width": 78, + "height": 74, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0M", + "roundness": { + "type": 2 + }, + "seed": 1617509022, + "version": 75, + "versionNonce": 855053570, + "isDeleted": false, + "boundElements": [], + "updated": 1732957282187, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 78, + 74 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "wgbnopTVPRl6w9GcrjoyA", + "type": "line", + "x": 840, + "y": 76.07140324876013, + "width": 265, + "height": 78, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0N", + "roundness": { + "type": 2 + }, + "seed": 1662067906, + "version": 59, + "versionNonce": 216533918, + "isDeleted": false, + "boundElements": [], + "updated": 1732957288080, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -265, + 78 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "3XLUd18mBcn-ilJXZnxCF", + "type": "line", + "x": 1094, + "y": 80.07140324876013, + "width": 519, + "height": 73, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0O", + "roundness": { + "type": 2 + }, + "seed": 559998942, + "version": 357, + "versionNonce": 794549308, + "isDeleted": false, + "boundElements": [], + "updated": 1732958330194, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -519, + 73 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "XcaYy7dmLB5uYiY5JLuTN", + "type": "arrow", + "x": 687.0212803635749, + "y": 176.17206570672442, + "width": 128.23631014914588, + "height": 158.69169087311195, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0P", + "roundness": { + "type": 2 + }, + "seed": 1693790852, + "version": 245, + "versionNonce": 484744068, + "isDeleted": false, + "boundElements": null, + "updated": 1732958354797, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 128.23631014914588, + 158.69169087311195 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "GQxfjjiplK5p4dUf3tIU9", + "focus": -0.8627986972170851, + "gap": 1, + "fixedPoint": null + }, + "endBinding": { + "elementId": "JUoB3kNI0DvHPfCXNg10O", + "focus": 0.1817142725766627, + "gap": 1, + "fixedPoint": null + }, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "elbowed": false + } + ], + "appState": { + "gridSize": 20, + "gridStep": 5, + "gridModeEnabled": false, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/docs/content/docs/scenarios/2i-2docker-3tailscale.md b/docs/content/docs/scenarios/2i-2docker-3tailscale.md new file mode 100644 index 0000000..b0b7a77 --- /dev/null +++ b/docs/content/docs/scenarios/2i-2docker-3tailscale.md @@ -0,0 +1,128 @@ +--- +title: Two TSDProxy instances, two Docker servers and three Tailscale providers +next: changelog +--- +## Description + +In this scenario, we will have : + +1. two Docker servers. +2. one TSDProxy instance in each docker server. +3. three Tailscale providers. +4. Containers in SRV1 will use the 'default' provider. +5. Containers in SRV2 will use the 'account2' provider. +6. webserver1 is running in SRV1 but will use the 'withtags' provider. +7. memos is running in SRV2 but will use the 'withtags' provider. + +## Scenario + +![2 tsdproxy instances, 2 Docker servers and 3 Tailscale providers](2i-2docker-3tailscale.svg) + +### Server 1 + +```yaml {filename="docker-compose.yaml"} +services: + tsdproxy: + image: tsdproxy:latest + user: root + ports: + - "8080:8080" + volumes: + - :/config + - data:/data + - /var/run/docker.sock:/var/run/docker.sock + restart: unless-stopped + + webserver1: + image: nginx + ports: + - 81:80 + labels: + tsdproxy.enable: true + tsdproxy.name: webserver1 + tsdproxy.provider: withtags + + + portainer: + image: portainer/portainer-ee:2.21.4 + ports: + - "9443:9443" + - "9000:9000" + - "8000:8000" + volumes: + - portainer_data:/data + - /var/run/docker.sock:/var/run/docker.sock + labels: + tsdproxy.enable: true + tsdproxy.name: portainer + tsdproxy.container_port: 9000 + +volumes: + data: + portainer_data: +``` + +### Server 2 + +```yaml {filename="docker-compose.yaml"} +services: + webserver2: + image: nginx + ports: + - 81:80 + labels: + - tsdproxy.enable=true + - tsdproxy.name=webserver2 + + memos: + image: neosmemo/memos:stable + container_name: memos + volumes: + - memos:/var/opt/memos + ports: + - 5230:5230 + labels: + tsdproxy.enable: true + tsdproxy.name: memos + tsdproxy.container_port: 5230 + tsdproxy.provider: withtags + +volumes: + memos: +``` + +## TSDProxy Configuration of SRV1 + +```yaml {filename="/config/tsdproxy.yaml"} +defaultproxyprovider: default +docker: + srv1: + host: unix:///var/run/docker.sock + defaultproxyprovider: default +tailscale: + providers: + default: + authkey: "sdfsdgsdfgdfg" + withtags: + authkey: "jujgnndvds" + account2: + authkey: "nnnnnnndndnddd" +``` + +## TSDProxy Configuration of SRV2 + +```yaml {filename="/config/tsdproxy.yaml"} +defaultproxyprovider: default +docker: + srv2: + host: unix:///var/run/docker.sock + defaultproxyprovider: account2 +tailscale: + providers: + default: + authkey: "sdfsdgsdfgdfg" + withtags: + authkey: "jujgnndvds" + account2: + authkey: "nnnnnnndndnddd" +``` diff --git a/docs/content/docs/scenarios/2i-2docker-3tailscale.svg b/docs/content/docs/scenarios/2i-2docker-3tailscale.svg new file mode 100644 index 0000000..5913715 --- /dev/null +++ b/docs/content/docs/scenarios/2i-2docker-3tailscale.svg @@ -0,0 +1,11 @@ + + + + + + + + DockerServer 1DockerServer 2TSDProxyTSDProxyPortainerMemosWebserver 1Webserver 2UsersTailscale account 1Tailscale account 1with tagsTailscale account 2 \ No newline at end of file diff --git a/docs/content/docs/scenarios/_index.md b/docs/content/docs/scenarios/_index.md new file mode 100644 index 0000000..daeb570 --- /dev/null +++ b/docs/content/docs/scenarios/_index.md @@ -0,0 +1,12 @@ +--- +linkTitle: Scenarios +title: Configuration scenarios +prev: /docs/services +next: 1i-2docker-1tailscale +weight: 10 +--- + +1. [One TSDProxy instance, two Docker servers, one Tailscale provider](1i-2docker-1tailscale) +2. [One TSDProxy instance, two Docker servers, three Tailscale providers](1i-2docker-3tailscale) +3. [Two TSDProxy instances, two Docker servers, one Tailscale providers](2i-2docker-1tailscale) +4. [Two TSDProxy instances,two Docker servers, three Tailscale providers](2i-2docker-3tailscale) diff --git a/docs/content/docs/serverconfig.md b/docs/content/docs/serverconfig.md new file mode 100644 index 0000000..622fba8 --- /dev/null +++ b/docs/content/docs/serverconfig.md @@ -0,0 +1,141 @@ +--- +title: Server configuration +weight: 2 +--- + + +TSDProxy use the configuration file `/config/tsdproxy.yaml` + +{{< callout type="warning" >}} +The environment variables configuration used until v0.6.0 is deprecated and +will be removed in the future. +{{< /callout >}} + +{{% steps %}} + +### Sample configuration File + +```yaml {filename="/config/tsdproxy.yaml"} +defaultproxyprovider: default +docker: + local: # name of the docker provider + host: unix:///var/run/docker.sock # host of the docker socket or daemon + targethostname: 172.31.0.1 # hostname or IP of docker server + defaultproxyprovider: default # name of which proxy provider to use +file: {} +tailscale: + providers: + default: # name of the provider + authkey: your-authkey # define authkey here + authkeyfile: "" # use this to load authkey from file. If this is defined, Authkey is ignored + controlurl: https://controlplane.tailscale.com # use this to override the default control URL + datadir: /data/ +http: + hostname: 0.0.0.0 + port: 8080 +log: + level: info # set logging level info, error or trace + json: false # set to true to enable json logging +proxyaccesslog: true # set to true to enable container access log +``` + +### Log section + +#### level + +Define the logging level. The default is info. + +#### json + +Set to true if what logging in json format. + +### Tailscale section + +You can use the following options to configure Tailscale: + +#### datadir + +Define the data directory used by Tailscale. The default is `/data/`. + +#### providers + +Here you can define multiple Tailscale providers. Each provider is configured +with the following options: + +```yaml {filename="/config/tsdproxy.yaml"} + default: # name of the provider + authkey: your-authkey # define authkey here + authkeyfile: "" # use this to load authkey from file. + controlurl: https://controlplane.tailscale.com +``` + +Look at next example with multiple providers. + +```yaml {filename="/config/tsdproxy.yaml"} +tailscale: + providers: + default: + authkey: your-authkey + authkeyfile: "" + controlurl: https://controlplane.tailscale.com + + server1: + authkey: authkey-server1 + authkeyfile: "" + controlurl: http://server1 + + diferentkey: + authkey: authkey-with-diferent-tags + authkeyfile: "" + controlurl: https://controlplane.tailscale.com +``` + +TSDProxy is configured with 3 tailscale providers. Provider 'default' with tailscale +servers, Provider 'server1' with a different tailscale server and provider 'diferentkey' +using de default tailscale server with a different authkey where you can add any +tags. + +### Docker section + +TSDProxy can use multiple docker servers. Each docker server can be configured +like this: + +```yaml {filename="/config/tsdproxy.yaml"} + local: # name of the docker provider + host: unix:///var/run/docker.sock # host of the docker socket or daemon + targethostname: 172.31.0.1 # hostname or IP of docker server + defaultproxyprovider: default # name of which proxy provider to use +``` + +Look ate next example of using a multiple docker servers configuration. + +```yaml {filename="/config/tsdproxy.yaml"} +docker: + local: + host: unix:///var/run/docker.sock + defaultproxyprovider: default + srv1: + host: tcp://174.17.0.1:2376 + targethostname: 174.17.0.1 + defaultproxyprovider: server1 +``` + +TSDProxy is configured with a local server and a server remote 'srv1' + +#### host + +host is the address of the docker socket or daemon. The default is `unix:///var/run/docker.sock` + +#### targethostname + +Is the ip address or dns name of docker server. TSDProxy has a autodetect system +to connect with containers, but there's some cases where it's necessary to use +the other interfaces besides the docker internals. + +#### defaultproxyprovider + +Defaultproxyprovider is the name of the proxy provider to use. (defined in tailscale +providers section). Any container defined to be proxied will use this provider +unless it has a specific provider defined label. + +{{% /steps %}} diff --git a/docs/content/docs/services.md b/docs/content/docs/services.md index 2fc0002..7ffeed0 100644 --- a/docs/content/docs/services.md +++ b/docs/content/docs/services.md @@ -1,9 +1,7 @@ --- title: Services configuration -prev: /docs/getting-started next: /docs/advanced -weight: 2 - +weight: 3 --- To add a service to your TSDProxy instance, you need to add a label to your service cobtainer. @@ -12,18 +10,21 @@ To add a service to your TSDProxy instance, you need to add a label to your serv ### tsdproxy.enable -Just add the label `tsdproxy.enable` to true and restart you service. The container will be started and TSDProxy will be enabled. +Just add the label `tsdproxy.enable` to true and restart you service. The +container will be started and TSDProxy will be enabled. ```yaml labels: tsdproxy.enable: "true" ``` -TSProxy will use container name as Tailscale server, and will use one exposed port to proxy traffic. +TSProxy will use container name as Tailscale server, and will use one exposed +port to proxy traffic. ### tsdproxy.name -If you define a name different from the container name, you can define it with the label `tsdproxy.name` and it will be used as the Tailscale server name. +If you define a name different from the container name, you can define it with +the label `tsdproxy.name` and it will be used as the Tailscale server name. ```yaml labels: @@ -33,8 +34,10 @@ labels: ### tsdproxy.container_port -If you want to define a different port than the default one, you can define it with the label `tsdproxy.container_port`. -This is useful if the container has multiple exposed ports or if the container is running in network_mode=host. +If you want to define a different port than the default one, you can define it +with the label `tsdproxy.container_port`. +This is useful if the container has multiple exposed ports or if the container +is running in network_mode=host. ```yaml ports: @@ -47,7 +50,8 @@ labels: ``` {{< callout emoji="❓" >}} -Note that the port used in the `tsdproxy.container_port` label is the port used internal in the container and not the exposed port. +Note that the port used in the `tsdproxy.container_port` label is the port used +internal in the container and not the exposed port. {{< /callout >}} ### tsdproxy.ephemeral @@ -63,7 +67,8 @@ labels: ### tsdproxy.webclient -If you want to enable the Tailscale webclient (port 5252), you can define it with the label `tsdproxy.webclient`. +If you want to enable the Tailscale webclient (port 5252), you can define it +with the label `tsdproxy.webclient`. ```yaml labels: @@ -74,7 +79,8 @@ labels: ### tsdproxy.tsnet_verbose -If you want to enable Tailscale's verbose mode, you can define it with the label `tsdproxy.tsnet_verbose`. +If you want to enable Tailscale's verbose mode, you can define it with the label +`tsdproxy.tsnet_verbose`. ```yaml labels: @@ -117,4 +123,15 @@ labels: tsdproxy.authkey: "/run/secrets/authkey" ``` +### tsdproxy.proxyprovider + +If you want to use a proxy provider other than the default one, you can define +it with the label `tsdproxy.proxyprovider`. + +```yaml +labels: + tsdproxy.enable: "true" + tsdproxy.proxyprovider: "providername" +``` + {{% /steps %}}