From 54abcf732b6324771a972a27bbb23ae687747a71 Mon Sep 17 00:00:00 2001 From: Vincent Simonin Date: Wed, 9 Oct 2024 18:26:12 +0200 Subject: [PATCH 1/4] :sparkles: Introduce Image Registry Index --- .gitignore | 1 + config.js | 2 +- flows.json | 659 +++++++++++++++++++++++++++++++++++++-------- flows_cred.json | 2 +- public/index.html | 72 +++++ public/openapi.yml | 25 +- 6 files changed, 644 insertions(+), 117 deletions(-) diff --git a/.gitignore b/.gitignore index 56238ea..f4bb8fa 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ npm-debug.log* .npm node_modules .*.json* +registry-index.js diff --git a/config.js b/config.js index ad4cb8c..ccc7852 100644 --- a/config.js +++ b/config.js @@ -1 +1 @@ -{"netbox_url":"","netbox_token":"","ui":1,"id":"","endpoint":"","flows":"0"} +{"netbox_url":"http://192.168.1.105:8000","netbox_token":"0a27a87ad96025411cf88ae218ff4d50a6dfc7f3","ui":1,"flows":"0","id":"5","endpoint":"http://admin:saashup@debian.orb.local:1880"} \ No newline at end of file diff --git a/flows.json b/flows.json index 373823d..af3ced0 100644 --- a/flows.json +++ b/flows.json @@ -165,8 +165,8 @@ "once": false, "onceDelay": "1", "topic": "", - "x": 300, - "y": 400, + "x": 160, + "y": 680, "wires": [ [ "3f489e8a5d253765" @@ -199,8 +199,8 @@ "from": "", "to": "", "reg": false, - "x": 840, - "y": 80, + "x": 660, + "y": 100, "wires": [ [] ] @@ -216,8 +216,8 @@ "createDir": false, "overwriteFile": "true", "encoding": "none", - "x": 650, - "y": 500, + "x": 510, + "y": 780, "wires": [ [] ] @@ -239,8 +239,8 @@ "topic": "", "payload": "", "payloadType": "date", - "x": 280, - "y": 500, + "x": 140, + "y": 780, "wires": [ [ "55c03f8643b324ae" @@ -258,8 +258,8 @@ "syntax": "plain", "template": "data = require(\"./package.json\")\n\nmodule.exports = {\n credentialSecret: \"saashup\",\n flowFile: \"flows.json\",\n flowFilePretty: true,\n adminAuth: {\n type: \"credentials\",\n users: [{\n username: process.env.ADMIN_USERNAME || \"admin\",\n password: process.env.ADMIN_PASSWORD || \"$2a$08$s.NFdSn4Gm4d7gHErya//e6O8RO1/3f7TZ7zflXJ9jfFV0cI6jGwK\",\n permissions: \"*\"\n }]\n },\n /*https: {\n key: require(\"fs\").readFileSync('/data/privkey.pem'),\n cert: require(\"fs\").readFileSync('/data/cert.pem')\n },\n requireHttps: true,*/\n httpNodeAuth: {\n user: process.env.API_USERNAME || \"admin\",\n pass: process.env.API_PASSWORD || \"$2a$08$s.NFdSn4Gm4d7gHErya//e6O8RO1/3f7TZ7zflXJ9jfFV0cI6jGwK\"\n },\n uiPort: process.env.PORT || 1880,\n disableEditor: 'ENABLE_EDITOR' in process.env ? false : true,\n httpStatic: [\n { path: '/usr/src/node-red/public', root: '/' },\n { path: '/usr/src/node-red/public/doc.html', root: '/doc' },\n { path: '/usr/src/node-red/public/openapi.yml', root: '/openapi' }\n ],\n httpAdminRoot: '/nodered',\n diagnostics: {\n enabled: true,\n ui: true,\n },\n runtimeState: {\n enabled: false,\n ui: false,\n },\n logging: {\n console: {\n level: \"info\",\n metrics: false,\n audit: false,\n handler: function(settings) {\n return function(msg) {\n const level = {\n 20: 'error',\n 30: 'warn',\n 40: 'info'\n };\n const lvl = \"level\" in msg ? msg.level : \"40\";\n\n delete msg.type;\n delete msg.z;\n delete msg.path;\n delete msg.name;\n delete msg.id;\n\n let line = `${data.name} level=${level[lvl]} version=${data.version}`;\n\n if (typeof msg.msg === 'object') {\n for (const key of Object.keys(msg.msg)) {\n line += ` ${key}=${JSON.stringify(msg.msg[key])}`;\n }\n } else {\n line += ` msg=` + JSON.stringify(msg.msg);\n }\n\n if (lvl <= 20) {\n return console.error(line);\n }\n\n return console.log(line);\n }\n }\n }\n },\n exportGlobalContextKeys: false,\n externalModules: {\n },\n editorTheme: {\n tours: false,\n palette: {\n },\n projects: {\n enabled: false,\n workflow: {\n mode: \"manual\"\n }\n },\n codeEditor: {\n lib: \"monaco\",\n options: {\n }\n },\n markdownEditor: {\n mermaid: {\n enabled: true\n }\n },\n },\n functionExternalModules: true,\n functionTimeout: 0,\n functionGlobalContext: {\n },\n debugMaxLength: 1000,\n mqttReconnectTime: 15000,\n serialReconnectTime: 15000\n}\n", "output": "str", - "x": 470, - "y": 500, + "x": 330, + "y": 780, "wires": [ [ "deb89a9f64f32d7e" @@ -278,8 +278,8 @@ "winHide": false, "oldrc": false, "name": "Events", - "x": 480, - "y": 600, + "x": 340, + "y": 880, "wires": [ [ "7c210c45ea82059e" @@ -305,8 +305,8 @@ "topic": "", "payload": "", "payloadType": "date", - "x": 290, - "y": 600, + "x": 150, + "y": 880, "wires": [ [ "b3814c680815a25b" @@ -328,8 +328,8 @@ "checkall": "true", "repair": false, "outputs": 1, - "x": 780, - "y": 580, + "x": 640, + "y": 860, "wires": [ [ "8e555efa2728d8b8" @@ -347,8 +347,8 @@ "arraySpltType": "len", "stream": false, "addname": "", - "x": 640, - "y": 580, + "x": 500, + "y": 860, "wires": [ [ "06b0b14f4b337cfe" @@ -385,8 +385,8 @@ "checkall": "true", "repair": false, "outputs": 4, - "x": 1100, - "y": 580, + "x": 960, + "y": 860, "wires": [ [], [], @@ -402,8 +402,8 @@ "property": "payload", "action": "", "pretty": false, - "x": 940, - "y": 580, + "x": 800, + "y": 860, "wires": [ [ "da696e53c1c7431f" @@ -436,8 +436,8 @@ "from": "", "to": "", "reg": false, - "x": 510, - "y": 400, + "x": 370, + "y": 680, "wires": [ [ "d216b6ee68a71932" @@ -455,8 +455,8 @@ "createDir": false, "overwriteFile": "true", "encoding": "none", - "x": 700, - "y": 400, + "x": 560, + "y": 680, "wires": [ [] ] @@ -471,6 +471,11 @@ "p": "filename", "v": "($env(\"DATAPATH\") ? $env(\"DATAPATH\") : \"/data\") & \"/config.js\"", "vt": "jsonata" + }, + { + "p": "registry_index_path", + "v": "($env(\"DATAPATH\") ? $env(\"DATAPATH\") : \"/data\") & \"/registry-index.js\"", + "vt": "jsonata" } ], "repeat": "", @@ -478,11 +483,12 @@ "once": true, "onceDelay": "1", "topic": "", - "x": 300, - "y": 80, + "x": 140, + "y": 100, "wires": [ [ - "4f7dddf957ee0796" + "4f7dddf957ee0796", + "b06c2237b0e8e871" ] ] }, @@ -498,8 +504,8 @@ "sendError": false, "encoding": "none", "allProps": false, - "x": 470, - "y": 80, + "x": 310, + "y": 100, "wires": [ [ "b4754f87e535ecc9" @@ -514,8 +520,8 @@ "property": "payload", "action": "obj", "pretty": false, - "x": 670, - "y": 80, + "x": 450, + "y": 100, "wires": [ [ "82a20fd37e28308d" @@ -530,8 +536,8 @@ "links": [ "53c71fbaf754a819" ], - "x": 685, - "y": 20, + "x": 505, + "y": 40, "wires": [ [ "82a20fd37e28308d" @@ -550,8 +556,8 @@ "sendError": false, "encoding": "none", "allProps": false, - "x": 480, - "y": 160, + "x": 360, + "y": 440, "wires": [ [ "47acfb0f70efb0b1" @@ -566,8 +572,8 @@ "property": "payload", "action": "obj", "pretty": false, - "x": 670, - "y": 160, + "x": 510, + "y": 440, "wires": [ [ "8238525b0e482b59" @@ -593,8 +599,8 @@ "from": "", "to": "", "reg": false, - "x": 850, - "y": 160, + "x": 700, + "y": 440, "wires": [ [] ] @@ -610,8 +616,8 @@ "once": true, "onceDelay": "1", "topic": "", - "x": 310, - "y": 160, + "x": 170, + "y": 440, "wires": [ [ "2b9a4a79e583d72a" @@ -629,8 +635,8 @@ "once": true, "onceDelay": "5", "topic": "", - "x": 290, - "y": 240, + "x": 150, + "y": 520, "wires": [ [ "b96bd464463004a6" @@ -656,8 +662,8 @@ "from": "", "to": "", "reg": false, - "x": 490, - "y": 300, + "x": 350, + "y": 580, "wires": [ [ "af0f2ce79605a0a7" @@ -669,8 +675,8 @@ "type": "subflow:0455d311f0e53c09", "z": "216db6efc0df9bc0", "name": "", - "x": 690, - "y": 300, + "x": 550, + "y": 580, "wires": [] }, { @@ -713,8 +719,8 @@ "from": "", "to": "", "reg": false, - "x": 1280, - "y": 240, + "x": 1140, + "y": 520, "wires": [ [ "63761b3c0cd6b725" @@ -737,8 +743,8 @@ "authType": "", "senderr": false, "headers": [], - "x": 1490, - "y": 240, + "x": 1350, + "y": 520, "wires": [ [] ] @@ -758,8 +764,8 @@ "checkall": "true", "repair": false, "outputs": 1, - "x": 470, - "y": 240, + "x": 330, + "y": 520, "wires": [ [ "53727c59b9fece10", @@ -793,8 +799,8 @@ "from": "", "to": "", "reg": false, - "x": 680, - "y": 240, + "x": 540, + "y": 520, "wires": [ [ "9c7b8352b86756cb" @@ -817,8 +823,8 @@ "authType": "", "senderr": false, "headers": [], - "x": 890, - "y": 240, + "x": 750, + "y": 520, "wires": [ [ "975ed88ff7efae09" @@ -840,14 +846,319 @@ "checkall": "true", "repair": false, "outputs": 1, - "x": 1070, - "y": 240, + "x": 930, + "y": 520, "wires": [ [ "9d463861f76ab37d" ] ] }, + { + "id": "40b7ef3632bf6955", + "type": "catch", + "z": "216db6efc0df9bc0", + "name": "", + "scope": [ + "ae5175e2da9cb7fc" + ], + "uncaught": false, + "x": 280, + "y": 300, + "wires": [ + [ + "bc5755afefb1cb46" + ] + ] + }, + { + "id": "8fe0b93e99d40202", + "type": "debug", + "z": "216db6efc0df9bc0", + "name": "debug 1", + "active": true, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "true", + "targetType": "full", + "statusVal": "", + "statusType": "auto", + "x": 460, + "y": 360, + "wires": [] + }, + { + "id": "bc5755afefb1cb46", + "type": "switch", + "z": "216db6efc0df9bc0", + "name": "", + "property": "config.netbox_url", + "propertyType": "global", + "rules": [ + { + "t": "nempty" + } + ], + "checkall": "true", + "repair": false, + "outputs": 1, + "x": 450, + "y": 300, + "wires": [ + [ + "8fe0b93e99d40202", + "2fd1cfc270927e8d" + ] + ] + }, + { + "id": "2fd1cfc270927e8d", + "type": "change", + "z": "216db6efc0df9bc0", + "name": "", + "rules": [ + { + "t": "set", + "p": "url", + "pt": "msg", + "to": "$globalContext(\"config\").netbox_url & \"/api/plugins/docker/registries/\"", + "tot": "jsonata" + }, + { + "t": "set", + "p": "headers", + "pt": "msg", + "to": "{\t \"Authorization\": \"Token \" & $globalContext(\"config\").netbox_token,\t \"Accept\": \"application/json\"\t\t}", + "tot": "jsonata" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 660, + "y": 300, + "wires": [ + [ + "7a03ca99dfebe08f" + ] + ] + }, + { + "id": "7a03ca99dfebe08f", + "type": "http request", + "z": "216db6efc0df9bc0", + "name": "", + "method": "GET", + "ret": "obj", + "paytoqs": "ignore", + "url": "", + "tls": "", + "persist": false, + "proxy": "", + "insecureHTTPParser": false, + "authType": "", + "senderr": false, + "headers": [], + "x": 870, + "y": 300, + "wires": [ + [ + "fdeb67d0d34aadf4", + "af2aeed6d2f70ef5" + ] + ] + }, + { + "id": "fdeb67d0d34aadf4", + "type": "debug", + "z": "216db6efc0df9bc0", + "name": "debug 2", + "active": true, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "true", + "targetType": "full", + "statusVal": "", + "statusType": "auto", + "x": 1020, + "y": 360, + "wires": [] + }, + { + "id": "af2aeed6d2f70ef5", + "type": "change", + "z": "216db6efc0df9bc0", + "name": "", + "rules": [ + { + "t": "set", + "p": "payload", + "pt": "msg", + "to": "[msg.payload.results.{\t \"id\": id,\t \"name\": name,\t \"serveraddress\": serveraddress,\t \"images\": images.display\t}]", + "tot": "jsonata" + }, + { + "t": "set", + "p": "registry_index", + "pt": "global", + "to": "payload", + "tot": "msg" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 1080, + "y": 300, + "wires": [ + [ + "07dd93a6f08f1177", + "9e00089e9a1d8c44" + ] + ] + }, + { + "id": "07dd93a6f08f1177", + "type": "debug", + "z": "216db6efc0df9bc0", + "name": "debug 3", + "active": true, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "true", + "targetType": "full", + "statusVal": "", + "statusType": "auto", + "x": 1200, + "y": 200, + "wires": [] + }, + { + "id": "9e00089e9a1d8c44", + "type": "file", + "z": "216db6efc0df9bc0", + "name": "", + "filename": "registry_index_path", + "filenameType": "msg", + "appendNewline": true, + "createDir": false, + "overwriteFile": "true", + "encoding": "none", + "x": 1300, + "y": 300, + "wires": [ + [] + ] + }, + { + "id": "b06c2237b0e8e871", + "type": "delay", + "z": "216db6efc0df9bc0", + "name": "", + "pauseType": "delay", + "timeout": "1", + "timeoutUnits": "seconds", + "rate": "1", + "nbRateUnits": "1", + "rateUnits": "second", + "randomFirst": "1", + "randomLast": "5", + "randomUnits": "seconds", + "drop": false, + "allowrate": false, + "outputs": 1, + "x": 120, + "y": 220, + "wires": [ + [ + "ae5175e2da9cb7fc" + ] + ] + }, + { + "id": "ae5175e2da9cb7fc", + "type": "file in", + "z": "216db6efc0df9bc0", + "name": "registry index", + "filename": "registry_index_path", + "filenameType": "msg", + "format": "utf8", + "chunk": false, + "sendError": false, + "encoding": "none", + "allProps": false, + "x": 300, + "y": 220, + "wires": [ + [ + "791c5afdc64fe3f6" + ] + ] + }, + { + "id": "791c5afdc64fe3f6", + "type": "json", + "z": "216db6efc0df9bc0", + "name": "", + "property": "payload", + "action": "obj", + "pretty": false, + "x": 470, + "y": 220, + "wires": [ + [ + "41c47013e0e11ab4" + ] + ] + }, + { + "id": "41c47013e0e11ab4", + "type": "change", + "z": "216db6efc0df9bc0", + "name": "", + "rules": [ + { + "t": "set", + "p": "registry_index", + "pt": "global", + "to": "payload", + "tot": "msg" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 680, + "y": 220, + "wires": [ + [] + ] + }, + { + "id": "017461417ab5cdd8", + "type": "link in", + "z": "216db6efc0df9bc0", + "name": "link in 1", + "links": [ + "e32a8db0e7ec4006" + ], + "x": 505, + "y": 160, + "wires": [ + [ + "41c47013e0e11ab4" + ] + ] + }, { "id": "91e25dba31c28805", "type": "http in", @@ -1659,8 +1970,8 @@ "winHide": false, "oldrc": false, "name": "docker api request: get api version", - "x": 1300, - "y": 940, + "x": 1320, + "y": 1100, "wires": [ [ "cdf0ca856701cd23" @@ -1768,8 +2079,8 @@ "method": "get", "upload": false, "swaggerDoc": "", - "x": 1220, - "y": 880, + "x": 1240, + "y": 1040, "wires": [ [ "ed796f5589c864f7" @@ -1783,8 +2094,8 @@ "name": "", "statusCode": "", "headers": {}, - "x": 2010, - "y": 960, + "x": 2030, + "y": 1120, "wires": [] }, { @@ -1820,8 +2131,8 @@ "from": "", "to": "", "reg": false, - "x": 1350, - "y": 880, + "x": 1370, + "y": 1040, "wires": [ [ "7a4d9d8b863a0612" @@ -1875,8 +2186,8 @@ "authType": "", "senderr": false, "headers": [], - "x": 1540, - "y": 780, + "x": 1560, + "y": 940, "wires": [ [ "0f90d4602b562160" @@ -1930,8 +2241,8 @@ "from": "", "to": "", "reg": false, - "x": 1270, - "y": 780, + "x": 1290, + "y": 940, "wires": [ [ "7cd37714a247d0f3" @@ -2195,8 +2506,8 @@ "property": "payload", "action": "", "pretty": false, - "x": 1510, - "y": 920, + "x": 1530, + "y": 1080, "wires": [ [ "f415bfcc211c0729" @@ -2229,8 +2540,8 @@ "from": "", "to": "", "reg": false, - "x": 1870, - "y": 940, + "x": 1890, + "y": 1100, "wires": [ [ "7581057e6d016ca9" @@ -2259,8 +2570,8 @@ "checkall": "true", "repair": false, "outputs": 2, - "x": 1680, - "y": 920, + "x": 1700, + "y": 1080, "wires": [ [ "5a07511ed7c011d2" @@ -2318,8 +2629,8 @@ "links": [ "36f439d2ba0ac71a" ], - "x": 1695, - "y": 780, + "x": 1715, + "y": 940, "wires": [] }, { @@ -2396,8 +2707,8 @@ "from": "", "to": "", "reg": false, - "x": 1930, - "y": 900, + "x": 1950, + "y": 1060, "wires": [ [ "debd21ad874ab51b" @@ -2420,8 +2731,8 @@ "authType": "", "senderr": false, "headers": [], - "x": 2180, - "y": 900, + "x": 2200, + "y": 1060, "wires": [ [ "466a424beeab3020" @@ -2437,8 +2748,8 @@ "links": [ "36f439d2ba0ac71a" ], - "x": 2335, - "y": 900, + "x": 2355, + "y": 1060, "wires": [] }, { @@ -2636,8 +2947,8 @@ "checkall": "true", "repair": false, "outputs": 1, - "x": 1570, - "y": 980, + "x": 1590, + "y": 1140, "wires": [ [ "d3292e92a3507d2c" @@ -2677,8 +2988,8 @@ "from": "", "to": "", "reg": false, - "x": 1870, - "y": 980, + "x": 1890, + "y": 1140, "wires": [ [ "7581057e6d016ca9" @@ -2691,8 +3002,8 @@ "z": "a827fd671d6a227e", "name": "[get] /api/engine/endpoint", "info": "", - "x": 1270, - "y": 720, + "x": 1290, + "y": 880, "wires": [] }, { @@ -2714,8 +3025,8 @@ "method": "get", "upload": false, "swaggerDoc": "", - "x": 1250, - "y": 1040, + "x": 1270, + "y": 1200, "wires": [ [ "4ebcf591c6c3e73b" @@ -2734,8 +3045,8 @@ "winHide": false, "oldrc": false, "name": "docker api request: system df", - "x": 1280, - "y": 1100, + "x": 1300, + "y": 1260, "wires": [ [ "cd85c0f71cd8a584" @@ -2752,8 +3063,8 @@ "property": "payload", "action": "", "pretty": false, - "x": 1470, - "y": 1100, + "x": 1490, + "y": 1260, "wires": [ [ "e52d4ade08206e43" @@ -2767,8 +3078,8 @@ "name": "", "statusCode": "", "headers": {}, - "x": 1850, - "y": 1100, + "x": 1870, + "y": 1260, "wires": [] }, { @@ -2790,8 +3101,8 @@ "from": "", "to": "", "reg": false, - "x": 1660, - "y": 1100, + "x": 1680, + "y": 1260, "wires": [ [ "dcb8324b28bd0fcd" @@ -2883,8 +3194,8 @@ "links": [ "86e79ca6ba19c6d7" ], - "x": 1095, - "y": 940, + "x": 1085, + "y": 1080, "wires": [ [ "7a4d9d8b863a0612" @@ -2907,6 +3218,97 @@ ] ] }, + { + "id": "97877b8f5f5daed0", + "type": "http in", + "z": "a827fd671d6a227e", + "name": "", + "url": "/api/registries", + "method": "get", + "upload": false, + "swaggerDoc": "", + "x": 1270, + "y": 760, + "wires": [ + [ + "583d67e7c102474e", + "592f43dcc03262b3" + ] + ] + }, + { + "id": "894f65a81c2cdb87", + "type": "http response", + "z": "a827fd671d6a227e", + "name": "", + "statusCode": "", + "headers": {}, + "x": 1670, + "y": 760, + "wires": [] + }, + { + "id": "583d67e7c102474e", + "type": "change", + "z": "a827fd671d6a227e", + "name": "", + "rules": [ + { + "t": "set", + "p": "payload", + "pt": "msg", + "to": "registry_index", + "tot": "global" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 1490, + "y": 760, + "wires": [ + [ + "894f65a81c2cdb87", + "ca2e235a5eeb95dd" + ] + ] + }, + { + "id": "ca2e235a5eeb95dd", + "type": "debug", + "z": "a827fd671d6a227e", + "name": "debug 4", + "active": true, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "true", + "targetType": "full", + "statusVal": "", + "statusType": "auto", + "x": 1620, + "y": 720, + "wires": [] + }, + { + "id": "592f43dcc03262b3", + "type": "debug", + "z": "a827fd671d6a227e", + "name": "debug 5", + "active": true, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "true", + "targetType": "full", + "statusVal": "", + "statusType": "auto", + "x": 1380, + "y": 720, + "wires": [] + }, { "id": "e974d3bd502f614f", "type": "http in", @@ -6108,7 +6510,8 @@ "74282c37e59eb461" ], [ - "00a7f64ecb58e0c8" + "00a7f64ecb58e0c8", + "b5f089d7532c24d8" ] ] }, @@ -6341,7 +6744,7 @@ "from": "", "to": "", "reg": false, - "x": 800, + "x": 810, "y": 380, "wires": [ [ @@ -6450,7 +6853,7 @@ "links": [ "b0765338f9440bd2" ], - "x": 985, + "x": 945, "y": 380, "wires": [] }, @@ -6614,6 +7017,46 @@ [] ] }, + { + "id": "b5f089d7532c24d8", + "type": "change", + "z": "177047e3d7a351be", + "name": "", + "rules": [ + { + "t": "set", + "p": "payload", + "pt": "msg", + "to": "[]", + "tot": "json" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 810, + "y": 440, + "wires": [ + [ + "e32a8db0e7ec4006" + ] + ] + }, + { + "id": "e32a8db0e7ec4006", + "type": "link out", + "z": "177047e3d7a351be", + "name": "link out 18", + "mode": "link", + "links": [ + "017461417ab5cdd8" + ], + "x": 945, + "y": 440, + "wires": [] + }, { "id": "305f23764ca23090", "type": "change", diff --git a/flows_cred.json b/flows_cred.json index 193cd64..b744198 100644 --- a/flows_cred.json +++ b/flows_cred.json @@ -1,3 +1,3 @@ { - "$": "bae7b295253981a73d53f23e8ed29bdbrT+x6n9LcDU4EEqgkkn4CqzBi1PzJqyS9pd1Ql4pM9y6WoS9Sa6KsTnO3WsMjDdCTatjy+e9YPk2lsUdy+HKmq7JL6o1SQFZ0omLQ5nw+R+T/Xs8eiLWPAY=" + "$": "e3cef77dbf3a059eb8bbd3917fcc8476kJ6l7CQ1RS23sLyxFM+t1GQuRJbjta1D2hWctAA/F6egaS7aWhMk0bUiJSg8b9H6EzwNvWblPx5bDg6W5YvkwSpOXIj5th1yBjmOZ+GVIpB08/jzdBouywzg/UYRIZ1nnIKut36qp6xruXcwIebdDHUy7Da/JrhxjpQFpMCJbg1jtDOsAYYKTszcEoXiMlz8fB0/fUiM0rGKMjY=" } \ No newline at end of file diff --git a/public/index.html b/public/index.html index 4779fdd..90d6d57 100644 --- a/public/index.html +++ b/public/index.html @@ -96,6 +96,10 @@ Volumes + @@ -157,6 +161,13 @@
+
+
+ 0 registries +
+
+
+